[Home] [Help]
PACKAGE BODY: APPS.PN_VAR_RENT_PKG
Source
1 package body PN_VAR_RENT_PKG AS
2 /* $Header: PNVRFUNB.pls 120.51.12020000.3 2013/04/14 23:03:24 smahapat ship $ */
3
4 /*===========================================================================+
5 -- NAME : INSERT_PERIODS_ROW
6 -- DESCRIPTION : Create recORds IN the PN_VAR_PERIODS table based on
7 -- VALUES IN PN_VAR_RENT_DATES
8 -- PURPOSE :
9 -- INVOKED FROM :
10 -- ARGUMENTS : IN:
11 -- X_ROWID
12 -- X_PERIOD_ID
13 -- X_PERIOD_NUM
14 -- X_VAR_RENT_ID
15 -- X_START_DATE
16 -- X_END_DATE
17 --
18 -- OUT:
19 -- X_ROWID
20 -- X_PERIOD_ID
21 -- X_PERIOD_NUM
22 -- REFERENCE : PN_COMMON.debug()
23 -- NOTES : Create recORds IN the PN_VAR_PERIODS table bASed on VALUES IN
24 -- PN_VAR_RENT_DATESurrently beINg used IN view
25 -- "PN_PAYMENT_SCHEDULES_V"
26 -- HISTORY :
27 --
28 -- 31-AUG-01 DThota o Created
29 -- 20-JUN-02 DThota o Added ORg_id FOR multi-ORg changes
30 -- 14-JUL-05 hareesha o Bug 4284035 - Replaced PN_VAR_PERIODS with _ALL table.
31 -- 26-OCT-05 piagrawa o Bug#4702709 - Passed org id in insert row handler.
32 -- 01-DEC-05 pikhar o Fetched org_id using cursor
33 +===========================================================================*/
34 PROCEDURE INSERT_PERIODS_ROW
35 (X_ROWID IN OUT NOCOPY VARCHAR2,
36 X_PERIOD_ID IN OUT NOCOPY NUMBER,
37 X_PERIOD_NUM IN OUT NOCOPY NUMBER,
38 X_VAR_RENT_ID IN NUMBER,
39 X_START_DATE IN DATE,
40 X_END_DATE IN DATE,
41 X_PRORATION_FACTOR IN NUMBER,
42 X_PARTIAL_PERIOD IN VARCHAR2,
43 X_ATTRIBUTE_CATEGORY IN VARCHAR2,
44 X_ATTRIBUTE1 IN VARCHAR2,
45 X_ATTRIBUTE2 IN VARCHAR2,
46 X_ATTRIBUTE3 IN VARCHAR2,
47 X_ATTRIBUTE4 IN VARCHAR2,
48 X_ATTRIBUTE5 IN VARCHAR2,
49 X_ATTRIBUTE6 IN VARCHAR2,
50 X_ATTRIBUTE7 IN VARCHAR2,
51 X_ATTRIBUTE8 IN VARCHAR2,
52 X_ATTRIBUTE9 IN VARCHAR2,
53 X_ATTRIBUTE10 IN VARCHAR2,
54 X_ATTRIBUTE11 IN VARCHAR2,
55 X_ATTRIBUTE12 IN VARCHAR2,
56 X_ATTRIBUTE13 IN VARCHAR2,
57 X_ATTRIBUTE14 IN VARCHAR2,
58 X_ATTRIBUTE15 IN VARCHAR2,
59 X_CREATION_DATE IN DATE,
60 X_CREATED_BY IN NUMBER,
61 X_LAST_UPDATE_DATE IN DATE,
62 X_LAST_UPDATED_BY IN NUMBER,
63 X_LAST_UPDATE_LOGIN IN NUMBER,
64 X_ORG_ID NUMBER
65 ) IS
66
67 CURSOR C IS
68 SELECT ROWID
69 FROM PN_VAR_PERIODS_ALL
70 WHERE PERIOD_ID = X_PERIOD_ID;
71
72 CURSOR org_id_cur IS
73 SELECT org_id
74 FROM PN_VAR_RENTS_ALL
75 WHERE VAR_RENT_ID = X_VAR_RENT_ID;
76
77 l_org_id NUMBER;
78
79 BEGIN
80
81 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.INSERT_PERIODS_ROW (+)');
82
83 -------------------------------------------------------
84 -- We need to generate the period number
85 -------------------------------------------------------
86 SELECT NVL(MAX(pnp.PERIOD_NUM),0)
87 INTO X_PERIOD_NUM
88 FROM PN_VAR_PERIODS_ALL pnp
89 WHERE pnp.VAR_RENT_ID = X_VAR_RENT_ID;
90
91 X_PERIOD_NUM := X_PERIOD_NUM + 1;
92
93 -------------------------------------------------------
94 -- SELECT the nextval FOR period id
95 -------------------------------------------------------
96 IF ( X_PERIOD_ID IS NULL) THEN
97 SELECT pn_var_periods_s.nextval
98 INTO X_PERIOD_ID
99 FROM dual;
100 END IF;
101
102 IF X_ORG_ID IS NULL THEN
103 FOR org_id_rec IN org_id_cur LOOP
104 l_org_id := org_id_rec.org_id;
105 END LOOP;
106 ELSE
107 l_org_id := X_ORG_ID;
108 END IF;
109
110 INSERT INTO PN_VAR_PERIODS_ALL
111 (
112 PERIOD_ID,
113 PERIOD_NUM,
114 LAST_UPDATE_DATE,
115 LAST_UPDATED_BY,
116 CREATION_DATE,
117 CREATED_BY,
118 LAST_UPDATE_LOGIN,
119 VAR_RENT_ID,
120 START_DATE,
121 END_DATE,
122 PRORATION_FACTOR,
123 PARTIAL_PERIOD,
124 ATTRIBUTE_CATEGORY,
125 ATTRIBUTE1,
126 ATTRIBUTE2,
127 ATTRIBUTE3,
128 ATTRIBUTE4,
129 ATTRIBUTE5,
130 ATTRIBUTE6,
131 ATTRIBUTE7,
132 ATTRIBUTE8,
133 ATTRIBUTE9,
134 ATTRIBUTE10,
135 ATTRIBUTE11,
136 ATTRIBUTE12,
137 ATTRIBUTE13,
138 ATTRIBUTE14,
139 ATTRIBUTE15,
140 ORG_ID
141 )
142 VALUES
143 (
144 X_PERIOD_ID,
145 X_PERIOD_NUM,
146 X_LAST_UPDATE_DATE,
147 X_LAST_UPDATED_BY,
148 X_CREATION_DATE,
149 X_CREATED_BY,
150 X_LAST_UPDATE_LOGIN,
151 X_VAR_RENT_ID,
152 X_START_DATE,
153 X_END_DATE,
154 X_PRORATION_FACTOR,
155 X_PARTIAL_PERIOD,
156 X_ATTRIBUTE_CATEGORY,
157 X_ATTRIBUTE1,
158 X_ATTRIBUTE2,
159 X_ATTRIBUTE3,
160 X_ATTRIBUTE4,
161 X_ATTRIBUTE5,
162 X_ATTRIBUTE6,
163 X_ATTRIBUTE7,
164 X_ATTRIBUTE8,
165 X_ATTRIBUTE9,
166 X_ATTRIBUTE10,
167 X_ATTRIBUTE11,
168 X_ATTRIBUTE12,
169 X_ATTRIBUTE13,
170 X_ATTRIBUTE14,
171 X_ATTRIBUTE15,
172 l_org_id
173 );
174
175 OPEN c;
176 FETCH c INTO X_ROWID;
177 IF (c%NOTFOUND) THEN
178 CLOSE c;
179 RAISE NO_DATA_FOUND;
180 END IF;
181 CLOSE c;
182
183 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.INSERT_PERIODS_ROW (-)');
184
185 END INSERT_PERIODS_ROW;
186
187 /*===========================================================================+
188 | PROCEDURE
189 | DELETE_PERIODS_ROW
190 |
191 | DESCRIPTION
192 | DELETE recORds FROM the PN_VAR_PERIODS
193 |
194 | SCOPE - PUBLIC
195 |
196 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
197 |
198 | ARGUMENTS : IN:
199 | X_VAR_RENT_ID
200 |
201 | OUT:
202 |
203 | RETURNS : None
204 |
205 | NOTES : DELETE recORds FROM the PN_VAR_PERIODS table
206 |
207 | MODIFICATION HISTORY
208 |
209 | 03-SEP-2001 Daniel Thota o Created
210 | 27-DEC-2001 Daniel Thota o INcluded parameter x_term_date
211 | 14-JUL-05 hareesha o Bug 4284035 - Replaced PN_VAR_PERIODS with _ALL table.
212 +===========================================================================*/
213 PROCEDURE DELETE_PERIODS_ROW (
214 X_VAR_RENT_ID IN NUMBER,
215 X_TERM_DATE IN DATE
216 ) IS
217
218 l_date DATE;
219
220 BEGIN
221
222 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.DELETE_PERIODS_ROW (+)');
223
224 l_date := NVL(x_term_date,(TO_DATE('01/01/1776','mm/dd/yyyy')));
225
226 DELETE FROM PN_VAR_PERIODS_ALL
227 WHERE VAR_RENT_ID = X_VAR_RENT_ID
228 AND START_DATE > l_date
229 AND END_DATE > l_date;
230
231 /* IN cASe OF a no data found FOR a given date */
232 IF x_term_date IS NULL THEN
233 IF (SQL%NOTFOUND) THEN
234 RAISE NO_DATA_FOUND;
235 END IF;
236 END IF;
237
238 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.DELETE_PERIODS_ROW (-)');
239
240 END DELETE_PERIODS_ROW;
241
242
243
244 /*===========================================================================+
245 | PROCEDURE
246 | CREATE_REPORT_DATES
247 |
248 | DESCRIPTION
249 | Inserts the records into PN_VAR_REPORT_DATES_ALL
250 |
251 | SCOPE - PUBLIC
252 |
253 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
254 |
255 | ARGUMENTS : IN:
256 | X_VAR_RENT_ID
257 |
258 | OUT:
259 |
260 | RETURNS : None
261 |
262 | NOTES : Inserts the records into PN_VAR_REPORT_DATES_ALL
263 |
264 | MODIFICATION HISTORY
265 |
266 | 10-JAN-2006 Prabhakar o Created.
267 +===========================================================================*/
268 PROCEDURE CREATE_REPORT_DATES (p_var_rent_id IN NUMBER) IS
269
270 CURSOR get_group_details IS
271 SELECT GRP_DATE_ID,
272 GRP_START_DATE,
273 GRP_END_DATE,
274 ORG_ID
275 FROM pn_var_grp_dates_all
276 WHERE var_rent_id = p_var_rent_id;
277
278
279 CURSOR get_dates_frequency IS
280 SELECT decode(vrg_reptg_freq_code, 'MON', 1,
281 'QTR', 3,
282 'SA', 6,
283 'YR', 12,
284 null) report_frequency,
285 decode(reptg_freq_code, 'MON', 1,
286 'QTR', 3,
287 'SA', 6,
288 'YR', 12,
289 null) group_frequency
290 FROM pn_var_rent_dates_all
291 WHERE var_rent_id = p_var_rent_id;
292
293
294 p_creation_date DATE := SYSDATE;
295 p_created_by NUMBER := NVL (fnd_profile.VALUE ('USER_ID'), 0);
296 l_group_frequency NUMBER := NULL;
297 l_report_frequency NUMBER := NULL;
298 l_report_date_id NUMBER := NULL;
299 l_row_id VARCHAR2(18) := NULL;
300 l_group_date_id NUMBER := NULL;
301 l_group_start_date DATE := NULL;
302 l_group_end_date DATE := NULL;
303 l_report_start_date DATE := NULL;
304 l_report_end_date DATE := NULL;
305 l_org_id NUMBER := NULL;
306
307
308 BEGIN
309
310 FOR rec1 IN get_dates_frequency LOOP
311 l_group_frequency := rec1.group_frequency;
312 l_report_frequency := rec1.report_frequency;
313 END LOOP;
314
315 FOR rec2 IN get_group_details LOOP
316
317 l_group_date_id := rec2.grp_date_id;
318 l_group_start_date := rec2.grp_start_date;
319 l_group_end_date := rec2.grp_end_date;
320 l_org_id := rec2.org_id;
321
322 WHILE l_group_start_date <= l_group_end_date LOOP
323
324 l_report_start_date := l_group_start_date;
325 l_report_end_date := least(l_group_end_date,
326 add_months(l_report_start_date,l_report_frequency)-1);
327 l_row_id := NULL;
328 l_report_date_id := NULL;
329 PN_VAR_RENT_PKG.INSERT_REPORT_DATE_ROW
330 (
331 X_ROWID => l_row_id
332 ,X_REPORT_DATE_ID => l_report_date_id
333 ,X_GRP_DATE_ID => l_group_date_id
334 ,X_VAR_RENT_ID => p_var_rent_id
335 ,X_REPORT_START_DATE => l_report_start_date
336 ,X_REPORT_END_DATE => l_report_end_date
337 ,X_CREATION_DATE => p_creation_date
338 ,X_CREATED_BY => p_created_by
339 ,X_LAST_UPDATE_DATE => p_creation_date
340 ,X_LAST_UPDATED_BY => p_created_by
341 ,X_LAST_UPDATE_LOGIN => p_created_by
342 ,X_ATTRIBUTE_CATEGORY => NULL
343 ,X_ATTRIBUTE1 => NULL
344 ,X_ATTRIBUTE2 => NULL
345 ,X_ATTRIBUTE3 => NULL
346 ,X_ATTRIBUTE4 => NULL
347 ,X_ATTRIBUTE5 => NULL
348 ,X_ATTRIBUTE6 => NULL
349 ,X_ATTRIBUTE7 => NULL
350 ,X_ATTRIBUTE8 => NULL
351 ,X_ATTRIBUTE9 => NULL
352 ,X_ATTRIBUTE10 => NULL
353 ,X_ATTRIBUTE11 => NULL
354 ,X_ATTRIBUTE12 => NULL
355 ,X_ATTRIBUTE13 => NULL
356 ,X_ATTRIBUTE14 => NULL
357 ,X_ATTRIBUTE15 => NULL
358 ,X_ORG_ID => l_org_id
359 );
360 l_group_start_date := l_report_end_date + 1;
361 END LOOP;
362 END LOOP;
363
364 END CREATE_REPORT_DATES;
365
366 /*============================================================================+
367 -- NAME : INSERT_REPORT_DATE_ROW
368 -- DESCRIPTION : create records in the pn_var_report_dates table based on
369 -- values in pn_var_grp_dates_all
370 -- PURPOSE :
371 -- INVOKED FROM :
372 -- ARGUMENTS : IN:
373 -- X_ROWID
374 -- X_REOPRT_DATE_ID
375 -- X_GRP_DATE_ID
376 -- x_VAR_RENT_ID
377 -- X_REPORT_START_DATE
378 -- X_REPORT_END_DATE
379 -- X_CREATION_DATE
380 -- X_CREATED_BY
381 -- X_LAST_UPDATE_DATE
382 -- X_LAST_UPDATED_BY
383 -- X_LAST_UPDATE_LOGIN
384 -- X_ORG_ID
385 -- X_ATTRIBUTE_CATEGORY
386 -- X_ATTRIBUTE1
387 -- X_ATTRIBUTE2
388 -- X_ATTRIBUTE3
389 -- X_ATTRIBUTE4
390 -- X_ATTRIBUTE5
391 -- X_ATTRIBUTE6
392 -- X_ATTRIBUTE7
393 -- X_ATTRIBUTE8
394 -- X_ATTRIBUTE9
395 -- X_ATTRIBUTE10
396 -- X_ATTRIBUTE11
397 -- X_ATTRIBUTE12
398 -- X_ATTRIBUTE13
399 -- X_ATTRIBUTE14
400 -- X_ATTRIBUTE15
401 -- OUT:
402 -- X_ROWID
403 -- X_REPORT_DATE_ID
404 --
405 -- REFERENCE : PN_COMMON.debug()
406 -- NOTES : create records in the pn_var_report_dates table based on values
407 -- in pn_var_grp_dates_all
408 -- HISTORY :
409 --
410 -- 09-JAN-2006 Prabhakar o Created.
411 +=============================================================================*/
412 PROCEDURE INSERT_REPORT_DATE_ROW
413 (
414 X_ROWID IN OUT NOCOPY VARCHAR2,
415 X_REPORT_DATE_ID IN OUT NOCOPY NUMBER,
416 X_GRP_DATE_ID IN NUMBER,
417 X_VAR_RENT_ID IN NUMBER,
418 X_REPORT_START_DATE IN DATE,
419 X_REPORT_END_DATE IN DATE,
420 X_CREATION_DATE IN DATE,
421 X_CREATED_BY IN NUMBER,
422 X_LAST_UPDATE_DATE IN DATE,
423 X_LAST_UPDATED_BY IN NUMBER,
424 X_LAST_UPDATE_LOGIN IN NUMBER,
425 X_ATTRIBUTE_CATEGORY IN VARCHAR2,
426 X_ATTRIBUTE1 IN VARCHAR2,
427 X_ATTRIBUTE2 IN VARCHAR2,
428 X_ATTRIBUTE3 IN VARCHAR2,
429 X_ATTRIBUTE4 IN VARCHAR2,
430 X_ATTRIBUTE5 IN VARCHAR2,
431 X_ATTRIBUTE6 IN VARCHAR2,
432 X_ATTRIBUTE7 IN VARCHAR2,
433 X_ATTRIBUTE8 IN VARCHAR2,
434 X_ATTRIBUTE9 IN VARCHAR2,
435 X_ATTRIBUTE10 IN VARCHAR2,
436 X_ATTRIBUTE11 IN VARCHAR2,
437 X_ATTRIBUTE12 IN VARCHAR2,
438 X_ATTRIBUTE13 IN VARCHAR2,
439 X_ATTRIBUTE14 IN VARCHAR2,
440 X_ATTRIBUTE15 IN VARCHAR2,
441 X_ORG_ID IN NUMBER
442 ) IS
443
444 CURSOR C IS
445 SELECT ROWID
446 FROM PN_VAR_REPORT_DATES_ALL
447 WHERE REPORT_DATE_ID = X_REPORT_DATE_ID;
448
449 CURSOR org_id_cur IS
450 SELECT org_id
451 FROM PN_VAR_RENTS_ALL
452 WHERE VAR_RENT_ID = X_VAR_RENT_ID;
453
454 l_org_id NUMBER ;
455
456 BEGIN
457
458 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.INSERT_REPORT_DATE_ROW (+)');
459
460 -------------------------------------------------------
461 -- SELECT the nextval FOR report date id
462 -------------------------------------------------------
463 IF ( X_REPORT_DATE_ID IS NULL) THEN
464 SELECT pn_var_report_dates_s.nextval
465 INTO X_REPORT_DATE_ID
466 FROM dual;
467 END IF;
468
469 IF X_ORG_ID IS NULL THEN
470 FOR org_id_rec IN org_id_cur LOOP
471 l_org_id := org_id_rec.org_id;
472 END LOOP;
473 ELSE
474 l_org_id := X_ORG_ID;
475 END IF;
476
477 INSERT INTO PN_VAR_REPORT_DATES_ALL
478 (
479 REPORT_DATE_ID,
480 GRP_DATE_ID,
481 VAR_RENT_ID,
482 REPORT_START_DATE,
483 REPORT_END_DATE,
484 CREATION_DATE,
485 CREATED_BY,
486 LAST_UPDATE_DATE,
487 LAST_UPDATED_BY,
488 LAST_UPDATE_LOGIN,
489 ATTRIBUTE_CATEGORY,
490 ATTRIBUTE1,
491 ATTRIBUTE2,
492 ATTRIBUTE3,
493 ATTRIBUTE4,
494 ATTRIBUTE5,
495 ATTRIBUTE6,
496 ATTRIBUTE7,
497 ATTRIBUTE8,
498 ATTRIBUTE9,
499 ATTRIBUTE10,
500 ATTRIBUTE11,
501 ATTRIBUTE12,
502 ATTRIBUTE13,
503 ATTRIBUTE14,
504 ATTRIBUTE15,
505 ORG_ID
506 )
507 VALUES
508 (
509 X_REPORT_DATE_ID,
510 X_GRP_DATE_ID,
511 X_VAR_RENT_ID,
512 X_REPORT_START_DATE,
513 X_REPORT_END_DATE,
514 X_CREATION_DATE,
515 X_CREATED_BY,
516 X_LAST_UPDATE_DATE,
517 X_LAST_UPDATED_BY,
518 X_LAST_UPDATE_LOGIN,
519 X_ATTRIBUTE_CATEGORY,
520 X_ATTRIBUTE1,
521 X_ATTRIBUTE2,
522 X_ATTRIBUTE3,
523 X_ATTRIBUTE4,
524 X_ATTRIBUTE5,
525 X_ATTRIBUTE6,
526 X_ATTRIBUTE7,
527 X_ATTRIBUTE8,
528 X_ATTRIBUTE9,
529 X_ATTRIBUTE10,
530 X_ATTRIBUTE11,
531 X_ATTRIBUTE12,
532 X_ATTRIBUTE13,
533 X_ATTRIBUTE14,
534 X_ATTRIBUTE15,
535 X_ORG_ID
536 );
537
538 OPEN c;
539 FETCH c INTO X_ROWID;
540 IF (c%NOTFOUND) THEN
541 CLOSE c;
542 RAISE NO_DATA_FOUND;
543 END IF;
544 CLOSE c;
545
546 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.INSERT_REPORT_DATE_ROW (-)');
547
548 END INSERT_REPORT_DATE_ROW;
549
550
551 /*===========================================================================+
552 | PROCEDURE
553 | DELETE_REPORT_DATE_ROW
554 |
555 | DESCRIPTION
556 | DELETE records FROM the PN_VAR_REPORT_DATES
557 |
558 | SCOPE - PUBLIC
559 |
560 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
561 |
562 | ARGUMENTS : IN:
563 | X_GRP_DATE_ID
564 |
565 | OUT:
566 |
567 | RETURNS : None
568 |
569 | NOTES : DELETE records FROM the PN_VAR_REPORT_DATES table
570 |
571 | MODIFICATION HISTORY
572 |
573 | 10-JAN_2006 Prabhakar o Created.
574 +===========================================================================*/
575 PROCEDURE DELETE_REPORT_DATE_ROW (
576 X_VAR_RENT_ID IN NUMBER,
577 X_END_DATE IN DATE
578 ) IS
579
580 l_date DATE;
581
582 BEGIN
583
584 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.DELETE_REPORT_DATE_ROW (+)');
585
586 l_date := NVL(X_END_DATE,(TO_DATE('01/01/1776','mm/dd/yyyy')));
587
588 DELETE FROM PN_VAR_REPORT_DATES_ALL
589 WHERE VAR_RENT_ID = X_VAR_RENT_ID
590 AND REPORT_START_DATE > l_date
591 AND REPORT_END_DATE > l_date;
592
593 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.DELETE_REPORT_DATE_ROW (-)');
594
595 END DELETE_REPORT_DATE_ROW;
596
597
598 /*============================================================================+
599 -- NAME : INSERT_GRP_DATE_ROW
600 -- DESCRIPTION : create records in the pn_var_grp_dates table based on
601 -- values in pn_var_periods
602 -- PURPOSE :
603 -- INVOKED FROM :
604 -- ARGUMENTS : IN:
605 -- X_ROWID
606 -- X_GRP_DATE_ID
607 -- X_VAR_RENT_ID
608 -- X_PERIOD_ID
609 -- X_GRP_START_DATE
610 -- X_GRP_END_DATE
611 -- X_GROUP_DATE
612 -- X_REPTG_DUE_DATE
613 -- X_INV_START_DATE
614 -- X_INV_END_DATE
615 -- X_INVOICE_DATE
616 -- X_INV_SCHEDULE_DATE
617 -- X_PRORATION_FACTOR
618 -- X_ACTUAL_EXP_CODE
619 -- X_FORECASTED_EXP_CODE
620 -- X_VARIANCE_EXP_CODE
621 -- OUT:
622 -- X_ROWID
623 -- X_GRP_DATE_ID
624 --
625 -- REFERENCE : PN_COMMON.debug()
626 -- NOTES : create records in the pn_var_grp_dates table based on values
627 -- in pn_var_periods
628 -- HISTORY :
629 --
630 -- 31-AUG-01 DThota o Created
631 -- 01-NOV-01 DThota o Added columns PRORATION_FACTOR,ACTUAL_EXP_CODE,
632 -- FORECASTED_EXP_CODE,VARIANCE_EXP_CODE
633 -- 19-DEC-01 DThota o Added columns REPTG_DUE_DATE,INV_SCHEDULE_DATE
634 -- 14-JUL-05 hareesha o Bug 4284035 - Replaced PN_VAR_GRP_DATES with _ALL table.
635 -- 26-OCT-05 piagrawa o Bug#4702709 - Replaced select statement with cursor
636 -- and added org id to signature
637 +=============================================================================*/
638 PROCEDURE INSERT_GRP_DATE_ROW
639 (
640 X_ROWID IN OUT NOCOPY VARCHAR2,
641 X_GRP_DATE_ID IN OUT NOCOPY NUMBER,
642 X_VAR_RENT_ID IN NUMBER,
643 X_PERIOD_ID IN NUMBER,
644 X_GRP_START_DATE IN DATE,
645 X_GRP_END_DATE IN DATE,
646 X_GROUP_DATE IN DATE,
647 X_REPTG_DUE_DATE IN DATE,
648 X_INV_START_DATE IN DATE,
649 X_INV_END_DATE IN DATE,
650 X_INVOICE_DATE IN DATE,
651 X_INV_SCHEDULE_DATE IN DATE,
652 X_PRORATION_FACTOR IN NUMBER,
653 X_ACTUAL_EXP_CODE IN VARCHAR2,
654 X_FORECASTED_EXP_CODE IN VARCHAR2,
655 X_VARIANCE_EXP_CODE IN VARCHAR2,
656 X_CREATION_DATE IN DATE,
657 X_CREATED_BY IN NUMBER,
658 X_LAST_UPDATE_DATE IN DATE,
659 X_LAST_UPDATED_BY IN NUMBER,
660 X_LAST_UPDATE_LOGIN IN NUMBER,
661 X_ORG_ID NUMBER
662 ) IS
663
664 CURSOR C IS
665 SELECT ROWID
666 FROM PN_VAR_GRP_DATES_ALL
667 WHERE GRP_DATE_ID = X_GRP_DATE_ID;
668
669 CURSOR org_id_cur IS
670 SELECT org_id
671 FROM PN_VAR_RENTS_ALL
672 WHERE VAR_RENT_ID = X_VAR_RENT_ID;
673
674 l_org_id NUMBER ;
675
676 BEGIN
677
678 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.INSERT_GRP_DATE_ROW (+)');
679
680 -------------------------------------------------------
681 -- SELECT the nextval FOR group date id
682 -------------------------------------------------------
683 IF ( X_GRP_DATE_ID IS NULL) THEN
684 SELECT pn_var_grp_dates_s.nextval
685 INTO X_GRP_DATE_ID
686 FROM dual;
687 END IF;
688
689 IF X_ORG_ID IS NULL THEN
690 FOR org_id_rec IN org_id_cur LOOP
691 l_org_id := org_id_rec.org_id;
692 END LOOP;
693 ELSE
694 l_org_id := X_ORG_ID;
695 END IF;
696
697 INSERT INTO PN_VAR_GRP_DATES_ALL
698 (
699 GRP_DATE_ID,
700 LAST_UPDATE_DATE,
701 LAST_UPDATED_BY,
702 CREATION_DATE,
703 CREATED_BY,
704 LAST_UPDATE_LOGIN,
705 VAR_RENT_ID,
706 PERIOD_ID,
707 GRP_START_DATE,
708 GRP_END_DATE,
709 GROUP_DATE,
710 REPTG_DUE_DATE,
711 INV_START_DATE,
712 INV_END_DATE,
713 INVOICE_DATE,
714 INV_SCHEDULE_DATE,
715 PRORATION_FACTOR,
716 ACTUAL_EXP_CODE,
717 FORECASTED_EXP_CODE,
718 VARIANCE_EXP_CODE,
719 ORG_ID
720 )
721 VALUES
722 (
723 X_GRP_DATE_ID,
724 X_LAST_UPDATE_DATE,
725 X_LAST_UPDATED_BY,
726 X_CREATION_DATE,
727 X_CREATED_BY,
728 X_LAST_UPDATE_LOGIN,
729 X_VAR_RENT_ID,
730 X_PERIOD_ID,
731 X_GRP_START_DATE,
732 X_GRP_END_DATE,
733 X_GROUP_DATE,
734 X_REPTG_DUE_DATE,
735 X_INV_START_DATE,
736 X_INV_END_DATE,
737 X_INVOICE_DATE,
738 X_INV_SCHEDULE_DATE,
739 round(X_PRORATION_FACTOR,10),
740 X_ACTUAL_EXP_CODE,
741 X_FORECASTED_EXP_CODE,
742 X_VARIANCE_EXP_CODE,
743 l_org_id
744 );
745
746 OPEN c;
747 FETCH c INTO X_ROWID;
748 IF (c%NOTFOUND) THEN
749 CLOSE c;
750 RAISE NO_DATA_FOUND;
751 END IF;
752 CLOSE c;
753
754 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.INSERT_GRP_DATE_ROW (-)');
755
756 END INSERT_GRP_DATE_ROW;
757
758 /*===========================================================================+
759 | PROCEDURE
760 | DELETE_GRP_DATE_ROW
761 |
762 | DESCRIPTION
763 | DELETE recORds FROM the PN_VAR_GRP_DATES
764 |
765 | SCOPE - PUBLIC
766 |
767 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
768 |
769 | ARGUMENTS : IN:
770 | X_VAR_RENT_ID
771 |
772 | OUT:
773 |
774 | RETURNS : None
775 |
776 | NOTES : DELETE recORds FROM the PN_VAR_GRP_DATES table
777 |
778 | MODIFICATION HISTORY
779 |
780 | 03-SEP-2001 Daniel Thota o Created
781 | 27-DEC-2001 Daniel Thota o INcluded parameter x_term_date
782 | 14-JUL-05 hareesha o Bug 4284035 - Replaced PN_VAR_GRP_DATES with _ALL table.
783 +===========================================================================*/
784 PROCEDURE DELETE_GRP_DATE_ROW (
785 X_VAR_RENT_ID IN NUMBER,
786 X_TERM_DATE IN DATE
787 ) IS
788
789 l_date DATE;
790
791 BEGIN
792
793 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.DELETE_GRP_DATE_ROW (+)');
794
795 l_date := NVL(x_term_date,(TO_DATE('01/01/1776','mm/dd/yyyy')));
796
797 DELETE FROM PN_VAR_GRP_DATES_ALL
798 WHERE VAR_RENT_ID = X_VAR_RENT_ID
799 AND GRP_START_DATE > l_date
800 AND GRP_END_DATE > l_date;
801
802
803 /* in case of a no data found for a given date */
804 IF x_term_date IS NULL THEN
805 IF (SQL%NOTFOUND) THEN
806 RAISE NO_DATA_FOUND;
807 END IF;
808 END IF;
809
810 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.DELETE_GRP_DATE_ROW (-)');
811
812 END DELETE_GRP_DATE_ROW;
813
814 /*=============================================================================+
815 -- NAME : CREATE_VAR_RENT_PERIODS
816 -- DESCRIPTION : create variable rent periods record in PN_VAR_PERIODS and
817 -- corresponding group date/invoice date records in the
818 -- PN_VAR_GRP_DATES table for a variable rent record.
819 --
820 -- PURPOSE :
821 -- INVOKED FROM :
822 -- ARGUMENTS : IN:
823 -- p_var_rent_id
824 -- p_cumulative_vol
825 -- p_comm_date
826 -- p_term_date
827 -- OUT:
828 --
829 -- REFERENCE : PN_COMMON.debug()
830 -- NOTES : create variable rent periods record in pn_var_periods and
831 -- corresponding group date/invoice date records in the
832 -- pn_var_grp_dates table for a variable rent record.
833 -- calls insert_periods_row and insert_grp_date_row procedures
834 -- HISTORY :
835 --
836 -- 31-AUG-01 Daniel o Created
837 -- 17-DEC-01 Daniel o INcluded parameters p_comm_date
838 -- p_term_date to INclude expansion
839 -- 01-MAR-02 Daniel o INcluded an additional condition IN the
840 -- WHERE clause OF the CURSOR cal_periods
841 -- to check FOR the PERIOD_YEAR
842 -- 31-May-02 AShISh Fix FOR BUG#2337610, added the condition to validate
843 -- GL CalENDar start date should be beFORe Variable Rent
844 -- Commencement date
845 -- 15-SEP-02 Kiran o Changed the CURSORs FOR creatINg periods, group dates.
846 -- Fix FOR bug 2392799.
847 -- 16-nov-02 Kiran o Replaced (substr(TO_CHAR(p_schedule_date),1,2)) with
848 -- to_number(TO_CHAR(p_schedule_date,'dd') WHEREever it
849 -- occurs.
850 -- 16-Mar-20 Srini o Added p_create_flag with default 'Y' for VR extension
851 -- support
852 -- 01-MAR-04 Vivek o Fix FOR bug#4215699. ModIFied the WHERE clause OF
853 -- CURSOR cal_periods to add END_date >= p_vr_comm_date
854 -- AND remove the period_year condition.
855 -- 14-JUL-05 hareesha o Bug 4284035 - Replaced pn_var_grp_dates with _ALL tbl
856 -- 26-OCT-05 piagrawa o Bug#4702709 - Passed org id in insert row handler.
857 -- pass org id to PN_VAR_RENT_PKG.INSERT_GRP_DATE_ROW
858 -- 28-nov-05 pikhar o Replaced pn_var_periods with _ALL table
859 -- 11-JAN-07 Pseeram o Added the call to cretae_report_dates
860 -- 21-MAR-07 Lbala o Bug # 5937888 - added code to change reptg_due_date
861 --05-apr-2013 pcheruvu Bug 16362059:Changed se;ect query in cusor cal_periods
862 +=============================================================================*/
863 PROCEDURE CREATE_VAR_RENT_PERIODS(p_var_rent_id in NUMBER,
864 p_cumulative_vol in VARCHAR2,
865 p_comm_date in DATE,
866 p_term_date in DATE,
867 p_create_flag IN VARCHAR2 DEFAULT 'Y' )
868 IS
869
870 p_creation_date DATE := SYSDATE;
871 p_created_by NUMBER := NVL (fnd_profile.VALUE ('USER_ID'), 0);
872 p_cal_start_date DATE := TO_DATE('01/01/1776','mm/dd/yyyy'); --dates from calendar
873 p_cal_end_date DATE := TO_DATE('01/01/1776','mm/dd/yyyy'); --dates from calendar
874 p_cal_start_date_orig DATE := TO_DATE('01/01/1776','mm/dd/yyyy');
875 -- to later update start date if date set up in calendar is different from
876 -- actual start date in the variable rent
877 p_cal_end_date_orig DATE := TO_DATE('01/01/1776','mm/dd/yyyy');
878 p_period_id NUMBER := null;
879 p_start_date DATE := TO_DATE('01/01/1776','mm/dd/yyyy'); --dates from periods
880 /* first day of the month of p_start_date*/
881 p_start_date1 DATE := TO_DATE('01/01/1776','mm/dd/yyyy'); --dates from periods
882 /* first day of the quarter of p_start_date*/
883 p_start_date3 DATE := TO_DATE('01/01/1776','mm/dd/yyyy'); --dates from periods
884 /* first day of the semiannual period of p_start_date*/
885 p_start_date6 DATE := TO_DATE('01/01/1776','mm/dd/yyyy'); --dates from periods
886 /* first day of the annual period of p_start_date*/
887 p_start_date12 DATE := TO_DATE('01/01/1776','mm/dd/yyyy'); --dates from periods
888 p_end_date DATE := TO_DATE('01/01/1776','mm/dd/yyyy'); --dates from periods
889 p_per_start_date DATE := TO_DATE('01/01/1776','mm/dd/yyyy');
890 p_per_end_date DATE := TO_DATE('01/01/1776','mm/dd/yyyy');
891 p_grp_start_date DATE := TO_DATE('01/01/1776','mm/dd/yyyy');
892 p_grp_end_date DATE := TO_DATE('01/01/1776','mm/dd/yyyy');
893 p_group_date DATE := TO_DATE('01/01/1776','mm/dd/yyyy');
894 p_inv_start_date DATE := TO_DATE('01/01/1776','mm/dd/yyyy');
895 p_inv_end_date DATE := TO_DATE('01/01/1776','mm/dd/yyyy');
896 p_invoice_date DATE := TO_DATE('01/01/1776','mm/dd/yyyy');
897 p_vr_comm_date DATE := TO_DATE('01/01/1776','mm/dd/yyyy');
898 /* first day of the month given VR commencement date p_vr_comm_date*/
899 p_vr_comm_date1 DATE := TO_DATE('01/01/1776','mm/dd/yyyy');
900 /* first day of the quarter given VR commencement date p_vr_comm_date*/
901 p_vr_comm_date3 DATE := TO_DATE('01/01/1776','mm/dd/yyyy');
902 /* first day of the semiannual period given VR commencement date p_vr_comm_date*/
903 p_vr_comm_date6 DATE := TO_DATE('01/01/1776','mm/dd/yyyy');
904 /* first day of the annual period given VR commencement date p_vr_comm_date*/
905 p_vr_comm_date12 DATE := TO_DATE('01/01/1776','mm/dd/yyyy');
906 p_vr_term_date DATE := TO_DATE('01/01/1776','mm/dd/yyyy');
907 /* first day of the month given VR termination date p_vr_term_date*/
908 p_vr_term_date1 DATE := TO_DATE('01/01/1776','mm/dd/yyyy');
909
910 p_period_set_name VARCHAR2(30):= NULL;
911 p_period_type VARCHAR2(15):= NULL;
912 p_per_freq_code NUMBER := NULL;
913 p_reptg_freq_code NUMBER := NULL;
914 p_reptg_day_of_month NUMBER := 0;
915 p_reptg_days_after NUMBER := 0;
916 p_due_date DATE := TO_DATE('01/01/1776','mm/dd/yyyy');
917 p_invg_freq_code NUMBER := NULL;
918 p_invg_day_of_month NUMBER := 0;
919 p_invg_days_after NUMBER := 0;
920 p_schedule_date DATE := TO_DATE('01/01/1776','mm/dd/yyyy');
921
922 l_rowId VARCHAR2(18):= NULL;
923 l_periodId NUMBER := NULL;
924 l_grpDateId NUMBER := NULL;
925 l_periodNum NUMBER := NULL;
926 l_counter NUMBER := 0;
927 l_notfound BOOLEAN;
928 tot_per_proration_days NUMBER := 0;
929 per_proration_days NUMBER := 0;
930 tot_grp_proration_days NUMBER := 0;
931 grp_proration_days NUMBER := 0;
932 p_proration_factor NUMBER := 0;
933
934 l_use_gl_calendar VARCHAR2(1) := NULL;
935 l_year_start_date DATE := NULL;
936 l_is_partial_period BOOLEAN := FALSE;
937 l_partial_period VARCHAR2(1) := 'N';
938
939 CURSOR cal_periods IS
940 SELECT MIN(start_date) start_date, MAX(end_date) end_date
941 FROM gl_periods
942 WHERE period_set_name = p_period_set_name
943 AND start_date <= p_vr_term_date
944 AND period_type = p_period_type
945 and start_date > p_vr_comm_date1
946
947 GROUP BY period_year
948 ORDER BY start_date;
949
950 CURSOR group_date_mon IS
951 SELECT MIN(start_date) start_date, MAX(END_date) END_date
952 FROM gl_periods
953 WHERE period_set_name = p_period_set_name
954 AND start_date <= p_vr_term_date
955 AND end_date >= p_vr_comm_date
956 AND period_type = p_period_type
957 AND adjustment_period_flag = 'N'
958 GROUP BY period_year, quarter_num, period_num
959 ORDER BY start_date,end_date;
960
961 CURSOR group_date_qtr IS
962 SELECT MIN(start_date) start_date, MAX(end_date) end_date
963 FROM gl_periods
964 WHERE period_set_name = p_period_set_name
965 AND start_date <= p_vr_term_date
966 AND end_date >= p_vr_comm_date
967 AND quarter_num IN(1,2,3,4)
968 AND period_type = p_period_type
969 GROUP BY period_year, quarter_num
970 ORDER BY start_date;
971
972 CURSOR group_date_sa IS
973 SELECT MIN(g1.start_date) start_date
974 ,MAX(g2.end_date) end_date
975 FROM gl_periods g1, gl_periods g2
976 WHERE g1.period_set_name(+) = p_period_set_name
977 AND g2.period_set_name = p_period_set_name
978 AND g1.start_date(+) <= p_vr_term_date
979 AND g2.end_date >= p_vr_comm_date
980 AND g1.quarter_num(+) = 1
981 AND g2.quarter_num = 2
982 AND g1.period_year(+) = g2.period_year
983 AND g1.start_date IS NOT NULL
984 AND g2.end_date IS NOT NULL
985 AND g1.period_type = p_period_type
986 AND g2.period_type = p_period_type
987 GROUP BY g2.period_year
988 UNION
989 SELECT MIN(g1.start_date) start_date
990 ,MAX(g2.end_date) end_date
991 FROM gl_periods g1, gl_periods g2
992 WHERE g1.period_set_name(+) = p_period_set_name
993 AND g2.period_set_name = p_period_set_name
994 AND g1.start_date(+) <= p_vr_term_date
995 AND g2.end_date >= p_vr_comm_date
996 AND g1.quarter_num(+) = 3
997 AND g2.quarter_num = 4
998 AND g1.period_year (+)= g2.period_year
999 AND g1.start_date IS NOT NULL
1000 AND g2.end_date IS NOT NULL
1001 AND g1.period_type = p_period_type
1002 AND g2.period_type = p_period_type
1003 GROUP BY g2.period_year
1004 ORDER BY 1;
1005
1006 CURSOR group_date_ann IS
1007 --Fix for bug#13398393
1008 --SELECT MIN(start_date) start_date,MAX(end_date) end_date
1009 SELECT MIN(year_start_date) start_date,MAX(end_date) end_date
1010 FROM gl_periods
1011 WHERE period_set_name = p_period_set_name
1012 AND start_date <= p_vr_term_date
1013 AND end_date >= p_vr_comm_date
1014 AND period_type = p_period_type
1015 GROUP BY period_year
1016 ORDER BY start_date;
1017
1018 CURSOR period_dates IS
1019 SELECT period_id,start_date, end_date, proration_factor
1020 FROM pn_var_periods
1021 WHERE var_rent_id = p_var_rent_id
1022 AND start_date <= p_vr_term_date
1023 AND end_date >= p_vr_comm_date
1024 ORDER BY start_date;
1025
1026 /* Fetches the group id which starts on a specified date for a VR agreement */
1027 CURSOR group_cur (p_start_date DATE) IS
1028 SELECT grp_end_date, grp_date_id
1029 FROM pn_var_grp_dates_all
1030 WHERE var_rent_id = p_var_rent_id
1031 AND grp_start_date = p_start_date;
1032
1033 /* Fetches the period id which starts on a specified date for a VR agreement */
1034 CURSOR period_cur (p_start_date DATE) IS
1035 SELECT period_id, end_date, status
1036 FROM pn_var_periods_all
1037 WHERE var_rent_id = p_var_rent_id
1038 AND start_date = p_start_date;
1039
1040 /* Fetches the group id in which a specified invoice date lies for a VR agreement */
1041 CURSOR invoice_cur(p_inv_start_date DATE, p_inv_end_date DATE, p_period_id NUMBER) IS
1042 SELECT inv_start_date, inv_end_date
1043 FROM pn_var_grp_dates_all
1044 WHERE inv_start_date = p_inv_start_date
1045 AND inv_end_date = p_inv_end_date
1046 AND period_id = p_period_id;
1047
1048 l_org_id NUMBER;
1049 l_period_exists VARCHAR2(1) := 'N';
1050 l_group_exists VARCHAR2(1) := 'N';
1051 l_invoice_exists VARCHAR2(1) := 'N';
1052 l_period_id NUMBER := NULL;
1053 l_end_date DATE := NULL;
1054 l_status pn_var_periods_all.status%TYPE;
1055 l_grp_date_id NUMBER;
1056 l_grp_end_date DATE := NULL;
1057
1058
1059 BEGIN
1060
1061 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.CREATE_VAR_RENT_PERIODS (+)');
1062 pnp_debug_pkg.debug ('p_var_rent_id '||p_var_rent_id);
1063 pnp_debug_pkg.debug ('p_cumulative_vol'||p_cumulative_vol);
1064 pnp_debug_pkg.debug ('p_comm_date '||p_comm_date);
1065 pnp_debug_pkg.debug ('p_term_date '||p_term_date);
1066 pnp_debug_pkg.debug ('p_create_flag '||p_create_flag);
1067
1068 -- Get dates/info, GL calendar used from Variable Rent record
1069
1070 SELECT vr.commencement_date,
1071 vr.termination_date,
1072 decode(vr.proration_days,'999',365,
1073 vr.proration_days),
1074 decode(cal.period_freq_code,'MON', 1,
1075 'QTR', 3,
1076 'SA', 6,
1077 'YR', 12,
1078 null),
1079 decode(cal.reptg_freq_code, 'MON', 1,
1080 'QTR', 3,
1081 'SA', 6,
1082 'YR', 12,
1083 null),
1084 cal.reptg_day_of_month,
1085 cal.reptg_days_after,
1086 decode(cal.invg_freq_code, 'MON', 1,
1087 'QTR', 3,
1088 'SA', 6,
1089 'YR', 12,
1090 null),
1091 cal.invg_day_of_month,
1092 cal.invg_days_after,
1093 cal.gl_period_set_name,
1094 cal.period_type,
1095 cal.use_gl_calendar,
1096 cal.year_start_date,
1097 vr.org_id
1098 INTO p_vr_comm_date,
1099 p_vr_term_date,
1100 tot_per_proration_days,
1101 p_per_freq_code,
1102 p_reptg_freq_code,
1103 p_reptg_day_of_month,
1104 p_reptg_days_after,
1105 p_invg_freq_code,
1106 p_invg_day_of_month,
1107 p_invg_days_after,
1108 p_period_set_name,
1109 p_period_type,
1110 l_use_gl_calendar,
1111 l_year_start_date,
1112 l_org_id
1113 FROM PN_VAR_RENTS_ALL vr, PN_VAR_RENT_DATES_ALL cal
1114 WHERE vr.var_rent_id = p_var_rent_id
1115 AND cal.var_rent_id = vr.var_rent_id;
1116
1117 ----------------------------------
1118 -- FOR expansion OF VR
1119 ----------------------------------
1120 IF (p_comm_date IS NOT NULL) THEN
1121 p_vr_comm_date := p_comm_date;
1122 END IF;
1123
1124 IF (p_term_date IS NOT NULL) THEN
1125 p_vr_term_date := p_term_date;
1126 END IF;
1127
1128 p_vr_comm_date1 := FIRST_DAY(p_vr_comm_date);
1129 p_vr_term_date1 := FIRST_DAY(p_vr_term_date);
1130 IF (p_comm_date IS NOT NULL) THEN
1131 p_vr_comm_date3 := p_vr_comm_date1-80;
1132 p_vr_comm_date6 := p_vr_comm_date1-170;
1133 p_vr_comm_date12:= p_vr_comm_date1-360;
1134 ELSE
1135 p_vr_comm_date3 := p_vr_comm_date1;
1136 p_vr_comm_date6 := p_vr_comm_date1;
1137 p_vr_comm_date12:= p_vr_comm_date1;
1138 END IF;
1139
1140 -- Get dates from associated GL Calendar
1141
1142 SELECT MIN(start_date), MAX(end_date)
1143 INTO p_cal_start_date, p_cal_end_date
1144 FROM gl_periods
1145 WHERE period_set_name = p_period_set_name
1146 AND period_type = p_period_type;
1147
1148 ----------------------------------
1149 -- For expansion of VR
1150 ----------------------------------
1151 IF (p_comm_date IS NOT NULL) THEN
1152
1153 SELECT MIN(start_date), MAX(end_date)
1154 INTO p_cal_start_date, p_cal_end_date
1155 FROM gl_periods
1156 WHERE period_set_name = p_period_set_name
1157 AND period_type = p_period_type
1158 AND start_date >= p_comm_date
1159 AND end_date >= p_comm_date
1160 AND start_date <= p_term_date;
1161
1162 END IF;
1163 ----------------------------------
1164
1165 p_cal_start_date_orig := p_cal_start_date;
1166 p_cal_end_date_orig := p_cal_end_date;
1167
1168 IF p_cal_end_date < p_vr_term_date THEN
1169 fnd_message.set_name ('PN','PN_VAR_GLCAL_SHORT');
1170 APP_EXCEPTION.Raise_Exception;
1171 END IF;
1172
1173 IF p_cal_start_date > p_vr_comm_date THEN
1174 fnd_message.set_name ('PN','PN_VAR_GLCAL_LATER');
1175 APP_EXCEPTION.Raise_Exception;
1176 END IF;
1177
1178 IF p_vr_term_date < p_cal_end_date THEN
1179 p_cal_end_date := p_vr_term_date;
1180 END IF;
1181 p_cal_start_date := p_vr_comm_date;
1182
1183 -- Create the period records
1184
1185 IF NVL(p_create_flag, 'Y') = 'Y' THEN
1186
1187 WHILE p_per_end_date < p_cal_end_date LOOP
1188
1189 l_counter := 0;
1190 FOR cal_periods_rec in cal_periods LOOP
1191
1192 l_counter := cal_periods%ROWCOUNT;
1193 l_period_exists := 'N';
1194 p_proration_factor := (cal_periods_rec.end_date-cal_periods_rec.start_date)+1;
1195
1196 IF (l_counter = 1) THEN
1197 p_per_start_date := p_cal_start_date;
1198 ELSE
1199 p_per_start_date := cal_periods_rec.start_date;
1200 END IF;
1201
1202 IF (cal_periods_rec.end_date > p_vr_term_date) THEN
1203 p_per_end_date := p_cal_end_date;
1204 l_partial_period := 'Y';
1205 ELSE
1206 p_per_end_date := cal_periods_rec.end_date;
1207 l_partial_period := 'N';
1208 END IF;
1209
1210 /* Check if the period with calculated start date as above
1211 already exists in database */
1212 FOR period_rec IN period_cur(p_per_start_date) LOOP
1213 l_period_id := period_rec.period_id;
1214 l_end_date := period_rec.end_date;
1215 l_status := period_rec.status;
1216 l_period_exists := 'Y';
1217 pnp_debug_pkg.debug(' period exists ...'||l_periodId);
1218 pnp_debug_pkg.debug('');
1219 END LOOP;
1220
1221 IF l_period_exists = 'N' THEN /* Insert the period if it does not exist */
1222 --call to insert into PN_VAR_PERIODS;
1223
1224 pnp_debug_pkg.debug(' period exists ...N');
1225 PN_VAR_RENT_PKG.INSERT_PERIODS_ROW
1226 (X_ROWID => l_rowId,
1227 X_PERIOD_ID => l_periodId,
1228 X_PERIOD_NUM => l_periodNum,
1229 X_VAR_RENT_ID => p_var_rent_id,
1230 X_START_DATE => p_per_start_date,
1231 X_END_DATE => p_per_end_date,
1232 X_PRORATION_FACTOR => p_proration_factor,
1233 X_PARTIAL_PERIOD => l_partial_period,
1234 X_ATTRIBUTE_CATEGORY => NULL,
1235 X_ATTRIBUTE1 => NULL,
1236 X_ATTRIBUTE2 => NULL,
1237 X_ATTRIBUTE3 => NULL,
1238 X_ATTRIBUTE4 => NULL,
1239 X_ATTRIBUTE5 => NULL,
1240 X_ATTRIBUTE6 => NULL,
1241 X_ATTRIBUTE7 => NULL,
1242 X_ATTRIBUTE8 => NULL,
1243 X_ATTRIBUTE9 => NULL,
1244 X_ATTRIBUTE10 => NULL,
1245 X_ATTRIBUTE11 => NULL,
1246 X_ATTRIBUTE12 => NULL,
1247 X_ATTRIBUTE13 => NULL,
1248 X_ATTRIBUTE14 => NULL,
1249 X_ATTRIBUTE15 => NULL,
1250 X_CREATION_DATE => p_creation_date,
1251 X_CREATED_BY => p_created_by,
1252 X_LAST_UPDATE_DATE => p_creation_date,
1253 X_LAST_UPDATED_BY => p_created_by,
1254 X_LAST_UPDATE_LOGIN => p_created_by
1255 );
1256
1257 l_rowId := NULL;
1258 l_periodId := NULL;
1259 l_periodNum := NULL;
1260 pnp_debug_pkg.debug('period inserted is ...'||l_periodId);
1261
1262 ELSE /* period exists in the database */
1263
1264 pnp_debug_pkg.debug('New Period Start Date:'||p_per_start_date);
1265 pnp_debug_pkg.debug('New Period End Date:'||p_per_end_date);
1266 pnp_debug_pkg.debug('l_end_date:'||l_end_date);
1267
1268 /* Check if the period in the database is a partial period */
1269 IF p_per_end_date = l_end_date THEN
1270
1271 pnp_debug_pkg.debug('period end date is equsal to period in data base ..');
1272
1273 /* Make the period as active if it is inactive */
1274 IF l_status = pn_var_rent_pkg.status THEN
1275
1276 pnp_debug_pkg.debug('period is inactive ..'||l_period_id);
1277 UPDATE pn_var_periods_all
1278 SET status = NULL
1279 WHERE period_id = l_period_id;
1280
1281 END IF;
1282
1283 ELSIF p_per_end_date > l_end_date THEN /* period is partial */
1284
1285 /* Updte the end date and partial flag for the period */
1286 UPDATE pn_var_periods_all
1287 SET end_date = p_per_end_date,
1288 partial_period = l_partial_period,
1289 status = NULL
1290 WHERE period_id = l_period_id;
1291
1292 END IF;
1293
1294 END IF;
1295
1296 END LOOP;
1297
1298 END LOOP;
1299
1300 -- for each period record created above create corresponding group date records
1301
1302 FOR per_date_rec IN period_dates LOOP
1303 p_start_date := per_date_rec.start_date;
1304 p_start_date1:= FIRST_DAY(per_date_rec.start_date);
1305 ----------------------------------
1306 -- For expansion of VR
1307 ----------------------------------
1308 IF (p_comm_date IS NOT NULL) THEN
1309 p_start_date3 := p_start_date1-80;
1310 p_start_date6 := p_start_date1-170;
1311 p_start_date12:= p_start_date1-360;
1312 ELSE
1313 p_start_date3 := p_start_date1;
1314 p_start_date6 := p_start_date1;
1315 p_start_date12:= p_start_date1;
1316 END IF;
1317 ----------------------------------
1318 p_end_date := per_date_rec.end_date;
1319 p_period_id := per_date_rec.period_id;
1320 p_proration_factor := per_date_rec.proration_factor;
1321
1322 WHILE p_grp_end_date < per_date_rec.end_date LOOP
1323 -- Open appropriate cursors based on the reporting frequency to insert group_date
1324
1325 IF (p_reptg_freq_code = 1) THEN
1326
1327 /* l_counter :=0; */
1328
1329 FOR group_date_mon_rec IN group_date_mon LOOP
1330
1331 /* l_counter := group_date_mon%ROWCOUNT; */
1332 l_group_exists := 'N';
1333
1334 IF group_date_mon_rec.start_date < per_date_rec.start_date THEN
1335 p_grp_start_date := p_start_date;
1336 ELSE
1337 p_grp_start_date := group_date_mon_rec.start_date;
1338 END IF;
1339
1340 IF (group_date_mon_rec.end_date >= p_vr_term_date) THEN
1341 p_grp_end_date := per_date_rec.end_date;
1342 ELSE
1343 p_grp_end_date := group_date_mon_rec.end_date;
1344 END IF;
1345
1346 p_group_date := group_date_mon_rec.start_date;
1347
1348 IF (p_reptg_day_of_month IS NOT NULL) THEN
1349 p_due_date := (ADD_MONTHS(FIRST_DAY(p_grp_end_date),1)-1)+p_reptg_day_of_month;
1350 ELSE
1351 p_due_date := p_grp_end_date+nvl(p_reptg_days_after,0);
1352 END IF;
1353
1354 p_proration_factor := ((p_grp_end_date - p_grp_start_date) + 1)/
1355 ((group_date_mon_rec.end_date - group_date_mon_rec.start_date) + 1);
1356
1357 ------------------------------------------------------------
1358 --Eliminates all other records from the group_date_mon cursor
1359 --which do not belong to the period in period_dates cursor
1360 ------------------------------------------------------------
1361
1362 IF ((group_date_mon_rec.start_date <= per_date_rec.end_date) AND
1363 (group_date_mon_rec.end_date >= p_start_date)) THEN
1364
1365 /* Check if the group in PL/SQL table with a specified start date
1366 already exists in database */
1367 FOR group_rec IN group_cur(p_grp_start_date) LOOP
1368 l_grp_date_id := group_rec.grp_date_id;
1369 l_grp_end_date := group_rec.grp_end_date;
1370 l_group_exists := 'Y';
1371 END LOOP;
1372
1373 IF l_group_exists = 'N' THEN
1374
1375 /* group does not exist in the database and needs to be added */
1376 pnp_debug_pkg.debug ('l_group_exists = N');
1377 ------------------------------------------------------------
1378 --call to insert into PN_VAR_GRP_DATES;
1379 ------------------------------------------------------------
1380 PN_VAR_RENT_PKG.INSERT_GRP_DATE_ROW
1381 (X_ROWID => l_rowId,
1382 X_GRP_DATE_ID => l_grpDateId,
1383 X_VAR_RENT_ID => p_var_rent_id,
1384 X_PERIOD_ID => p_period_id,
1385 X_GRP_START_DATE => p_grp_start_date,
1386 X_GRP_END_DATE => p_grp_end_date,
1387 X_GROUP_DATE => p_group_date,
1388 X_REPTG_DUE_DATE => p_due_date,
1389 X_INV_START_DATE => p_inv_start_date,
1390 X_INV_END_DATE => p_inv_end_date,
1391 X_INVOICE_DATE => p_invoice_date,
1392 X_INV_SCHEDULE_DATE => p_schedule_date,
1393 X_PRORATION_FACTOR => p_proration_factor,
1394 X_ACTUAL_EXP_CODE => 'N',
1395 X_FORECASTED_EXP_CODE => 'N',
1396 X_VARIANCE_EXP_CODE => 'N',
1397 X_CREATION_DATE => p_creation_date,
1398 X_CREATED_BY => p_created_by,
1399 X_LAST_UPDATE_DATE => p_creation_date,
1400 X_LAST_UPDATED_BY => p_created_by,
1401 X_LAST_UPDATE_LOGIN => p_created_by
1402 );
1403
1404 pnp_debug_pkg.debug ('group dte id of group added ....'||l_grpDateId);
1405 l_rowId := NULL;
1406 l_grpDateId := NULL;
1407
1408 ELSE
1409 pnp_debug_pkg.debug ('l_group_exists = Y');
1410 /* Check if the group in the database is a partial or if the new group is partial */
1411 IF p_grp_end_date <> l_grp_end_date THEN
1412
1413 pnp_debug_pkg.debug ('updating end date of group '||l_grp_date_id);
1414 pnp_debug_pkg.debug ('updating end date as '||p_grp_end_date);
1415 pnp_debug_pkg.debug ('updating proration factor as '||p_proration_factor);
1416 pnp_debug_pkg.debug ('updating due date as '||p_due_date);
1417 /* Updte the end date and proration factor for the group */
1418 UPDATE pn_var_grp_dates_all
1419 SET grp_end_date = p_grp_end_date,
1420 proration_Factor = round(p_proration_factor,10),
1421 reptg_due_date = p_due_date --Bug # 5937888
1422 WHERE grp_date_id = l_grp_date_id;
1423
1424 END IF;
1425 END IF;
1426
1427 END IF;
1428
1429 END LOOP;
1430
1431 ELSIF (p_reptg_freq_code = 3) THEN
1432
1433 /* l_counter := 0; */
1434
1435 FOR group_date_qtr_rec IN group_date_qtr LOOP
1436
1437 /* l_counter := group_date_qtr%ROWCOUNT; */
1438
1439 l_group_exists := 'N';
1440
1441 IF group_date_qtr_rec.start_date < per_date_rec.start_date THEN
1442 p_grp_start_date := p_start_date;
1443 ELSE
1444 p_grp_start_date := group_date_qtr_rec.start_date;
1445 END IF;
1446
1447 IF (group_date_qtr_rec.end_date >= p_vr_term_date) THEN
1448 p_grp_end_date := per_date_rec.end_date;
1449 ELSE
1450 p_grp_end_date := group_date_qtr_rec.end_date;
1451 END IF;
1452
1453 p_group_date := group_date_qtr_rec.start_date;
1454
1455 IF (p_reptg_day_of_month IS NOT NULL) THEN
1456 p_due_date := (ADD_MONTHS(FIRST_DAY(p_grp_end_date),1)-1)+p_reptg_day_of_month;
1457 ELSE
1458 p_due_date := p_grp_end_date+nvl(p_reptg_days_after,0);
1459 END IF;
1460
1461 p_proration_factor := ((p_grp_end_date - p_grp_start_date) + 1)/
1462 ((group_date_qtr_rec.end_date - group_date_qtr_rec.start_date) + 1);
1463
1464 ------------------------------------------------------------
1465 --Eliminates all other records from the group_date_qtr cursor
1466 --which do not belong to the period in period_dates cursor
1467 ------------------------------------------------------------
1468 IF ((group_date_qtr_rec.start_date <= per_date_rec.end_date) AND
1469 (group_date_qtr_rec.end_date >= p_start_date)) THEN
1470
1471 /* Check if the group in PL/SQL table with a specified start date
1472 already exists in database */
1473 FOR group_rec IN group_cur(p_grp_start_date) LOOP
1474 l_grp_date_id := group_rec.grp_date_id;
1475 l_grp_end_date := group_rec.grp_end_date;
1476 l_group_exists := 'Y';
1477 END LOOP;
1478
1479 IF l_group_exists = 'N' THEN
1480
1481 /* group does not exist in the database and needs to be added */
1482 pnp_debug_pkg.debug ('l_group_exists = N');
1483
1484 ------------------------------------------------------------
1485 --call to insert into PN_VAR_GRP_DATES;
1486 ------------------------------------------------------------
1487 PN_VAR_RENT_PKG.INSERT_GRP_DATE_ROW
1488 (X_ROWID => l_rowId,
1489 X_GRP_DATE_ID => l_grpDateId,
1490 X_VAR_RENT_ID => p_var_rent_id,
1491 X_PERIOD_ID => p_period_id,
1492 X_GRP_START_DATE => p_grp_start_date,
1493 X_GRP_END_DATE => p_grp_end_date,
1494 X_GROUP_DATE => p_group_date,
1495 X_REPTG_DUE_DATE => p_due_date,
1496 X_INV_START_DATE => p_inv_start_date,
1497 X_INV_END_DATE => p_inv_end_date,
1498 X_INVOICE_DATE => p_invoice_date,
1499 X_INV_SCHEDULE_DATE => p_schedule_date,
1500 X_PRORATION_FACTOR => p_proration_factor,
1501 X_ACTUAL_EXP_CODE => 'N',
1502 X_FORECASTED_EXP_CODE => 'N',
1503 X_VARIANCE_EXP_CODE => 'N',
1504 X_CREATION_DATE => p_creation_date,
1505 X_CREATED_BY => p_created_by,
1506 X_LAST_UPDATE_DATE => p_creation_date,
1507 X_LAST_UPDATED_BY => p_created_by,
1508 X_LAST_UPDATE_LOGIN => p_created_by
1509 );
1510
1511 pnp_debug_pkg.debug ('group dte id of group added ....'||l_grpDateId);
1512 l_rowId := NULL;
1513 l_grpDateId := NULL;
1514
1515 ELSE
1516 pnp_debug_pkg.debug ('l_group_exists = Y');
1517 /* Check if the group in the database is a partial or if the new group is partial */
1518 IF p_grp_end_date <> l_grp_end_date THEN
1519
1520 pnp_debug_pkg.debug ('updating end date of group '||l_grp_date_id);
1521 pnp_debug_pkg.debug ('updating end date as '||p_grp_end_date);
1522 pnp_debug_pkg.debug ('updating proration factor as '||p_proration_factor);
1523 pnp_debug_pkg.debug ('updating due date as '||p_due_date);
1524 /* Updte the end date and proration factor for the group */
1525 UPDATE pn_var_grp_dates_all
1526 SET grp_end_date = p_grp_end_date,
1527 proration_Factor = round(p_proration_factor,10),
1528 reptg_due_date = p_due_date --Bug # 5937888
1529 WHERE grp_date_id = l_grp_date_id;
1530
1531 END IF;
1532
1533 END IF;
1534
1535 END IF;
1536
1537 END LOOP;
1538
1539 ELSIF (p_reptg_freq_code = 6) THEN
1540
1541 /* l_counter := 0; */
1542
1543 FOR group_date_sa_rec IN group_date_sa LOOP
1544
1545 /* l_counter := group_date_sa%ROWCOUNT; */
1546
1547 l_group_exists := 'N';
1548
1549 IF group_date_sa_rec.start_date < per_date_rec.start_date THEN
1550 p_grp_start_date := p_start_date;
1551 ELSE
1552 p_grp_start_date := group_date_sa_rec.start_date;
1553 END IF;
1554
1555 IF (group_date_sa_rec.end_date > p_end_date) THEN
1556 p_grp_end_date := per_date_rec.end_date;
1557 ELSE
1558 p_grp_end_date := group_date_sa_rec.end_date;
1559 END IF;
1560
1561 p_group_date := group_date_sa_rec.start_date;
1562
1563 IF (p_reptg_day_of_month IS NOT NULL) THEN
1564 p_due_date := (ADD_MONTHS(FIRST_DAY(p_grp_end_date),1)-1)+p_reptg_day_of_month;
1565 ELSE
1566 p_due_date := p_grp_end_date+nvl(p_reptg_days_after,0);
1567 END IF;
1568
1569 p_proration_factor := ((p_grp_end_date - p_grp_start_date) + 1)/
1570 ((group_date_sa_rec.end_date - group_date_sa_rec.start_date) + 1);
1571
1572 ------------------------------------------------------------
1573 --Eliminates all other records from the group_date_sa cursor
1574 --which do not belong to the period in period_dates cursor
1575 ------------------------------------------------------------
1576 IF ((group_date_sa_rec.start_date <= per_date_rec.end_date) AND
1577 (group_date_sa_rec.end_date >= p_start_date)) THEN
1578
1579 /* Check if the group in PL/SQL table with a specified start date
1580 already exists in database */
1581 FOR group_rec IN group_cur(p_grp_start_date) LOOP
1582 l_grp_date_id := group_rec.grp_date_id;
1583 l_grp_end_date := group_rec.grp_end_date;
1584 l_group_exists := 'Y';
1585 END LOOP;
1586
1587 IF l_group_exists = 'N' THEN
1588
1589 /* group does not exist in the database and needs to be added */
1590 pnp_debug_pkg.debug ('l_group_exists = N');
1591
1592 ------------------------------------------------------------
1593 --call to insert into PN_VAR_GRP_DATES;
1594 ------------------------------------------------------------
1595
1596 PN_VAR_RENT_PKG.INSERT_GRP_DATE_ROW
1597 (X_ROWID => l_rowId,
1598 X_GRP_DATE_ID => l_grpDateId,
1599 X_VAR_RENT_ID => p_var_rent_id,
1600 X_PERIOD_ID => p_period_id,
1601 X_GRP_START_DATE => p_grp_start_date,
1602 X_GRP_END_DATE => p_grp_end_date,
1603 X_GROUP_DATE => p_group_date,
1604 X_REPTG_DUE_DATE => p_due_date,
1605 X_INV_START_DATE => p_inv_start_date,
1606 X_INV_END_DATE => p_inv_end_date,
1607 X_INVOICE_DATE => p_invoice_date,
1608 X_INV_SCHEDULE_DATE => p_schedule_date,
1609 X_PRORATION_FACTOR => p_proration_factor,
1610 X_ACTUAL_EXP_CODE => 'N',
1611 X_FORECASTED_EXP_CODE => 'N',
1612 X_VARIANCE_EXP_CODE => 'N',
1613 X_CREATION_DATE => p_creation_date,
1614 X_CREATED_BY => p_created_by,
1615 X_LAST_UPDATE_DATE => p_creation_date,
1616 X_LAST_UPDATED_BY => p_created_by,
1617 X_LAST_UPDATE_LOGIN => p_created_by
1618 );
1619
1620 pnp_debug_pkg.debug ('group dte id of group added ....'||l_grpDateId);
1621 l_rowId := NULL;
1622 l_grpDateId := NULL;
1623
1624 ELSE
1625 pnp_debug_pkg.debug ('l_group_exists = Y');
1626 /* Check if the group in the database is a partial or if the new group is partial */
1627 IF p_grp_end_date <> l_grp_end_date THEN
1628
1629 pnp_debug_pkg.debug ('updating end date of group '||l_grp_date_id);
1630 pnp_debug_pkg.debug ('updating end date as '||p_grp_end_date);
1631 pnp_debug_pkg.debug ('updating proration factor as '||p_proration_factor);
1632 pnp_debug_pkg.debug ('updating due date as '||p_due_date);
1633 /* Updte the end date and proration factor for the group */
1634 UPDATE pn_var_grp_dates_all
1635 SET grp_end_date = p_grp_end_date,
1636 proration_Factor = round(p_proration_factor,10),
1637 reptg_due_date = p_due_date --Bug # 5937888
1638 WHERE grp_date_id = l_grp_date_id;
1639
1640 END IF;
1641
1642 END IF;
1643
1644 END IF;
1645
1646 END LOOP;
1647
1648 ELSE
1649
1650 /* l_counter := 0; */
1651
1652 FOR group_date_ann_rec IN group_date_ann LOOP
1653
1654 /* l_counter := group_date_ann%ROWCOUNT; */
1655
1656 l_group_exists := 'N';
1657
1658 IF group_date_ann_rec.start_date < per_date_rec.start_date THEN
1659 p_grp_start_date := p_start_date;
1660 ELSE
1661 p_grp_start_date := group_date_ann_rec.start_date;
1662 END IF;
1663
1664 IF (group_date_ann_rec.end_date > p_end_date) THEN
1665 p_grp_end_date := per_date_rec.end_date;
1666 ELSE
1667 p_grp_end_date := group_date_ann_rec.end_date;
1668 END IF;
1669
1670 p_group_date := group_date_ann_rec.start_date;
1671
1672 IF (p_reptg_day_of_month IS NOT NULL) THEN
1673 p_due_date := (ADD_MONTHS(FIRST_DAY(p_grp_end_date),1)-1)+p_reptg_day_of_month;
1674 ELSE
1675 p_due_date := p_grp_end_date+nvl(p_reptg_days_after,0);
1676 END IF;
1677
1678 p_proration_factor := ((p_grp_end_date - p_grp_start_date) + 1)/
1679 ((group_date_ann_rec.end_date - group_date_ann_rec.start_date) + 1);
1680
1681 ------------------------------------------------------------
1682 --Eliminates all other records from the group_date_ann cursor
1683 --which do not belong to the period in period_dates cursor
1684 ------------------------------------------------------------
1685 IF ((group_date_ann_rec.start_date <= per_date_rec.end_date) AND
1686 (group_date_ann_rec.end_date >= p_start_date)) THEN
1687
1688 /* Check if the group in PL/SQL table with a specified start date
1689 already exists in database */
1690 FOR group_rec IN group_cur(p_grp_start_date) LOOP
1691 l_grp_date_id := group_rec.grp_date_id;
1692 l_grp_end_date := group_rec.grp_end_date;
1693 l_group_exists := 'Y';
1694 END LOOP;
1695
1696 IF l_group_exists = 'N' THEN
1697
1698 /* group does not exist in the database and needs to be added */
1699 pnp_debug_pkg.debug ('l_group_exists = N');
1700
1701 ------------------------------------------------------------
1702 --call to insert into PN_VAR_GRP_DATES;
1703 ------------------------------------------------------------
1704 PN_VAR_RENT_PKG.INSERT_GRP_DATE_ROW
1705 (X_ROWID => l_rowId,
1706 X_GRP_DATE_ID => l_grpDateId,
1707 X_VAR_RENT_ID => p_var_rent_id,
1708 X_PERIOD_ID => p_period_id,
1709 X_GRP_START_DATE => p_grp_start_date,
1710 X_GRP_END_DATE => p_grp_end_date,
1711 X_GROUP_DATE => p_group_date,
1712 X_REPTG_DUE_DATE => p_due_date,
1713 X_INV_START_DATE => p_inv_start_date,
1714 X_INV_END_DATE => p_inv_end_date,
1715 X_INVOICE_DATE => p_invoice_date,
1716 X_INV_SCHEDULE_DATE => p_schedule_date,
1717 X_PRORATION_FACTOR => p_proration_factor,
1718 X_ACTUAL_EXP_CODE => 'N',
1719 X_FORECASTED_EXP_CODE => 'N',
1720 X_VARIANCE_EXP_CODE => 'N',
1721 X_CREATION_DATE => p_creation_date,
1722 X_CREATED_BY => p_created_by,
1723 X_LAST_UPDATE_DATE => p_creation_date,
1724 X_LAST_UPDATED_BY => p_created_by,
1725 X_LAST_UPDATE_LOGIN => p_created_by
1726 );
1727
1728 pnp_debug_pkg.debug ('group dte id of group added ....'||l_grpDateId);
1729 l_rowId := NULL;
1730 l_grpDateId := NULL;
1731
1732 ELSE
1733 pnp_debug_pkg.debug ('l_group_exists = Y');
1734 /* Check if the group in the database is a partial or if the new group is partial */
1735 IF p_grp_end_date <> l_grp_end_date THEN
1736
1737 pnp_debug_pkg.debug ('updating end date of group '||l_grp_date_id);
1738 pnp_debug_pkg.debug ('updating end date as '||p_grp_end_date);
1739 pnp_debug_pkg.debug ('updating proration factor as '||p_proration_factor);
1740 pnp_debug_pkg.debug ('updating due date as '||p_due_date);
1741 /* Updte the end date and proration factor for the group */
1742 UPDATE pn_var_grp_dates_all
1743 SET grp_end_date = p_grp_end_date,
1744 proration_Factor = round(p_proration_factor,10),
1745 reptg_due_date = p_due_date --Bug # 5937888
1746 WHERE grp_date_id = l_grp_date_id;
1747
1748 END IF;
1749
1750 END IF;
1751
1752 END IF;
1753
1754 END LOOP;
1755
1756 END IF;
1757
1758 END LOOP;
1759
1760 END LOOP;
1761
1762 PN_VAR_RENT_PKG.delete_report_date_row(p_var_rent_id, NULL);
1763 PN_VAR_RENT_PKG.create_report_dates (p_var_rent_id);
1764
1765 END IF; --p_create_flag
1766
1767 -- for each group date record created above update with corresponding invoice dates
1768
1769 FOR per_date_rec IN period_dates LOOP
1770
1771 p_start_date := per_date_rec.start_date;
1772 p_start_date1:= FIRST_DAY(per_date_rec.start_date);
1773 IF (p_comm_date IS NOT NULL) THEN
1774 p_start_date3 := p_start_date1-80;
1775 p_start_date6 := p_start_date1-170;
1776 p_start_date12:= p_start_date1-360;
1777 ELSE
1778 p_start_date3 := p_start_date1;
1779 p_start_date6 := p_start_date1;
1780 p_start_date12:= p_start_date1;
1781 END IF;
1782 p_period_id := per_date_rec.period_id;
1783
1784 WHILE p_inv_end_date < per_date_rec.end_date LOOP
1785 -- Open appropriate cursors based on the invoicing frequency to update invoice_date
1786
1787 IF (p_invg_freq_code = 1) THEN
1788
1789 /* l_counter :=0;*/
1790
1791 FOR group_date_mon_rec IN group_date_mon LOOP
1792
1793 l_invoice_exists := 'N';
1794 /* l_counter := group_date_mon%ROWCOUNT; */
1795
1796 IF group_date_mon_rec.start_date < per_date_rec.start_date THEN
1797 p_inv_start_date := p_start_date;
1798 ELSE
1799 p_inv_start_date := group_date_mon_rec.start_date;
1800 END IF;
1801 IF (group_date_mon_rec.end_date >= p_vr_term_date) THEN
1802 p_inv_end_date := per_date_rec.end_date;
1803 ELSE
1804 p_inv_end_date := group_date_mon_rec.end_date;
1805 END IF;
1806
1807 p_invoice_date := group_date_mon_rec.start_date;
1808 ------------------------------------------------------------
1809 -- calculation of schedule day taking the day of month or
1810 -- number of days after
1811 ------------------------------------------------------------
1812 IF (p_invg_day_of_month IS NOT NULL) THEN
1813 p_schedule_date:= (ADD_MONTHS(FIRST_DAY(p_inv_end_date),1)-1)+p_invg_day_of_month;
1814 ELSE
1815 p_schedule_date:= p_inv_end_date+nvl(p_invg_days_after,0);
1816 END IF;
1817 ------------------------------------------------------------
1818 -- takes care of the only 28 days for the schedule day
1819 ------------------------------------------------------------
1820 IF to_number(to_char(p_schedule_date,'dd')) in (29,30,31) THEN
1821 p_schedule_date:= (FIRST_DAY(p_schedule_date)+27);
1822 END IF;
1823 ------------------------------------------------------------
1824 --Eliminates all other records from the group_date_mon cursor
1825 --which do not belong to the period in period_dates cursor
1826 ------------------------------------------------------------
1827
1828 IF ((group_date_mon_rec.start_date <= per_date_rec.end_date) AND
1829 (group_date_mon_rec.end_date >= p_start_date)) THEN
1830
1831 FOR rec IN invoice_cur(p_inv_start_date, p_inv_end_date, p_period_id ) LOOP
1832 l_invoice_exists := 'Y';
1833 END LOOP;
1834
1835 IF l_invoice_exists = 'N' THEN
1836 ------------------------------------------------------------
1837 --call to update PN_VAR_GRP_DATES;
1838 ------------------------------------------------------------
1839
1840 UPDATE PN_VAR_GRP_DATES
1841 SET inv_start_date = p_inv_start_date,
1842 inv_end_date = p_inv_end_date,
1843 invoice_date = p_invoice_date,
1844 inv_schedule_date = p_schedule_date
1845 WHERE grp_date_id in (SELECT grp_date_id
1846 FROM pn_var_grp_dates
1847 WHERE grp_start_date <= p_inv_end_date
1848 AND grp_end_date >= p_inv_start_date
1849 AND period_id = p_period_id
1850 AND var_rent_id = p_var_rent_id)
1851 AND period_id = p_period_id
1852 AND var_rent_id = p_var_rent_id;
1853
1854 END IF;
1855
1856 END IF;
1857
1858 END LOOP;
1859
1860 ELSIF (p_invg_freq_code = 3) THEN
1861
1862 /* l_counter := 0; */
1863
1864 FOR group_date_qtr_rec IN group_date_qtr LOOP
1865
1866 l_invoice_exists := 'N';
1867 /* l_counter := group_date_qtr%ROWCOUNT; */
1868
1869 IF group_date_qtr_rec.start_date < per_date_rec.start_date THEN
1870 p_inv_start_date := p_start_date;
1871 ELSE
1872 p_inv_start_date := group_date_qtr_rec.start_date;
1873 END IF;
1874
1875 IF (group_date_qtr_rec.end_date >= p_vr_term_date) THEN
1876 p_inv_end_date := per_date_rec.end_date;
1877 ELSE
1878 p_inv_end_date := group_date_qtr_rec.end_date;
1879 END IF;
1880
1881 p_invoice_date := group_date_qtr_rec.start_date;
1882 ------------------------------------------------------------
1883 -- calculation of schedule day taking the day of month or
1884 -- number of days after
1885 ------------------------------------------------------------
1886 IF (p_invg_day_of_month IS NOT NULL) THEN
1887 p_schedule_date:= (ADD_MONTHS(FIRST_DAY(p_inv_end_date),1)-1)+p_invg_day_of_month;
1888 ELSE
1889 p_schedule_date:= p_inv_end_date+nvl(p_invg_days_after,0);
1890 END IF;
1891 ------------------------------------------------------------
1892 -- takes care of the only 28 days for the schedule day
1893 ------------------------------------------------------------
1894 IF to_number(to_char(p_schedule_date,'dd')) in (29,30,31) THEN
1895 p_schedule_date:= (FIRST_DAY(p_schedule_date)+27);
1896 END IF;
1897 ------------------------------------------------------------
1898 --Eliminates all other records from the group_date_qtr cursor
1899 --which do not belong to the period in period_dates cursor
1900 ------------------------------------------------------------
1901 IF ((group_date_qtr_rec.start_date <= per_date_rec.end_date) AND
1902 (group_date_qtr_rec.end_date >= p_start_date)) THEN
1903
1904 FOR rec IN invoice_cur(p_inv_start_date, p_inv_end_date, p_period_id ) LOOP
1905 l_invoice_exists := 'Y';
1906 END LOOP;
1907
1908 IF l_invoice_exists = 'N' THEN
1909 ------------------------------------------------------------
1910 --call to update PN_VAR_GRP_DATES;
1911 ------------------------------------------------------------
1912 UPDATE PN_VAR_GRP_DATES
1913 SET inv_start_date = p_inv_start_date,
1914 inv_end_date = p_inv_end_date,
1915 invoice_date = p_invoice_date,
1916 inv_schedule_date = p_schedule_date
1917 WHERE grp_date_id in (SELECT grp_date_id
1918 FROM pn_var_grp_dates
1919 WHERE grp_start_date <= p_inv_end_date
1920 AND grp_end_date >= p_inv_start_date
1921 AND period_id = p_period_id
1922 AND var_rent_id = p_var_rent_id)
1923 AND period_id = p_period_id
1924 AND var_rent_id = p_var_rent_id;
1925
1926 END IF;
1927
1928 END IF;
1929
1930 END LOOP;
1931
1932 ELSIF (p_invg_freq_code = 6) THEN
1933
1934 /* l_counter := 0; */
1935
1936 FOR group_date_sa_rec IN group_date_sa LOOP
1937
1938 l_invoice_exists := 'N';
1939 /* l_counter := group_date_sa%ROWCOUNT; */
1940
1941 IF group_date_sa_rec.start_date < per_date_rec.start_date THEN
1942 p_inv_start_date := p_start_date;
1943 ELSE
1944 p_inv_start_date := group_date_sa_rec.start_date;
1945 END IF;
1946 IF (group_date_sa_rec.end_date >= p_end_date) THEN
1947 p_inv_end_date := per_date_rec.end_date;
1948 ELSE
1949 p_inv_end_date := group_date_sa_rec.end_date;
1950 END IF;
1951
1952 p_invoice_date := group_date_sa_rec.start_date;
1953 ------------------------------------------------------------
1954 -- calculation of schedule day taking the day of month or
1955 -- number of days after
1956 ------------------------------------------------------------
1957 IF (p_invg_day_of_month IS NOT NULL) THEN
1958 p_schedule_date:= (ADD_MONTHS(FIRST_DAY(p_inv_end_date),1)-1)+p_invg_day_of_month;
1959 ELSE
1960 p_schedule_date:= p_inv_end_date + NVL(p_invg_days_after,0);
1961 END IF;
1962 ------------------------------------------------------------
1963 -- takes care of the only 28 days for the schedule day
1964 ------------------------------------------------------------
1965 IF TO_NUMBER(TO_CHAR(p_schedule_date,'dd')) in (29,30,31) THEN
1966 p_schedule_date:= (FIRST_DAY(p_schedule_date)+27);
1967 END IF;
1968 ------------------------------------------------------------
1969 --Eliminates all other records from the group_date_sa cursor
1970 --which do not belong to the period in period_dates cursor
1971 ------------------------------------------------------------
1972 IF ((group_date_sa_rec.start_date <= per_date_rec.end_date) AND
1973 (group_date_sa_rec.end_date >= p_start_date)) THEN
1974
1975 FOR rec IN invoice_cur(p_inv_start_date, p_inv_end_date, p_period_id ) LOOP
1976 l_invoice_exists := 'Y';
1977 END LOOP;
1978
1979 IF l_invoice_exists = 'N' THEN
1980 ------------------------------------------------------------
1981 --call to update PN_VAR_GRP_DATES;
1982 ------------------------------------------------------------
1983 UPDATE PN_VAR_GRP_DATES
1984 SET inv_start_date = p_inv_start_date,
1985 inv_end_date = p_inv_end_date,
1986 invoice_date = p_invoice_date,
1987 inv_schedule_date = p_schedule_date
1988 WHERE grp_date_id in (SELECT grp_date_id
1989 FROM pn_var_grp_dates
1990 WHERE grp_start_date <= p_inv_end_date
1991 AND grp_end_date >= p_inv_start_date
1992 AND period_id = p_period_id
1993 AND var_rent_id = p_var_rent_id)
1994 AND period_id = p_period_id
1995 AND var_rent_id = p_var_rent_id;
1996
1997 END IF;
1998
1999 END IF;
2000
2001 END LOOP;
2002
2003 ELSE
2004
2005 /* l_counter := 0; */
2006 FOR group_date_ann_rec IN group_date_ann LOOP
2007
2008 /* l_counter := group_date_ann%ROWCOUNT; */
2009 l_invoice_exists := 'N';
2010
2011 IF group_date_ann_rec.start_date < per_date_rec.start_date THEN
2012 p_inv_start_date := p_start_date;
2013 ELSE
2014 p_inv_start_date := group_date_ann_rec.start_date;
2015 END IF;
2016 IF (group_date_ann_rec.end_date >= p_end_date) THEN
2017 p_inv_end_date := per_date_rec.end_date;
2018 ELSE
2019 p_inv_end_date := group_date_ann_rec.end_date;
2020 END IF;
2021
2022 p_invoice_date := group_date_ann_rec.start_date;
2023 ------------------------------------------------------------
2024 -- calculation of schedule day taking the day of month or
2025 -- number of days after
2026 ------------------------------------------------------------
2027 IF (p_invg_day_of_month IS NOT NULL) THEN
2028 p_schedule_date:= (ADD_MONTHS(FIRST_DAY(p_inv_end_date),1)-1)+p_invg_day_of_month;
2029 ELSE
2030 p_schedule_date:= p_inv_end_date+nvl(p_invg_days_after,0);
2031 END IF;
2032 ------------------------------------------------------------
2033 -- takes care of the only 28 days for the schedule day
2034 ------------------------------------------------------------
2035 IF to_number(to_char(p_schedule_date,'dd')) in (29,30,31) THEN
2036 p_schedule_date:= (FIRST_DAY(p_schedule_date)+27);
2037 END IF;
2038 ------------------------------------------------------------
2039 --Eliminates all other records from the group_date_ann cursor
2040 --which do not belong to the period in period_dates cursor
2041 ------------------------------------------------------------
2042 IF ((group_date_ann_rec.start_date <= per_date_rec.end_date) AND
2043 (group_date_ann_rec.end_date >= p_start_date)) THEN
2044
2045 FOR rec IN invoice_cur(p_inv_start_date, p_inv_end_date, p_period_id ) LOOP
2046 l_invoice_exists := 'Y';
2047 END LOOP;
2048
2049 IF l_invoice_exists = 'N' THEN
2050 ------------------------------------------------------------
2051 --call to update PN_VAR_GRP_DATES;
2052 ------------------------------------------------------------
2053
2054 UPDATE PN_VAR_GRP_DATES
2055 SET inv_start_date = p_inv_start_date,
2056 inv_end_date = p_inv_end_date,
2057 invoice_date = p_invoice_date,
2058 inv_schedule_date = p_schedule_date
2059 WHERE grp_date_id in (SELECT grp_date_id
2060 FROM pn_var_grp_dates
2061 WHERE grp_start_date <= p_inv_end_date
2062 AND grp_end_date >= p_inv_start_date
2063 AND period_id = p_period_id
2064 AND var_rent_id = p_var_rent_id)
2065 AND period_id = p_period_id
2066 AND var_rent_id = p_var_rent_id;
2067
2068 END IF;
2069
2070 END IF;
2071
2072 END LOOP;
2073
2074 END IF;
2075
2076 END LOOP;
2077
2078 END LOOP;
2079
2080 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.CREATE_VAR_RENT_PERIODS (-)');
2081
2082 END CREATE_VAR_RENT_PERIODS;
2083
2084 /*=============================================================================+
2085 -- NAME : CREATE_VAR_RENT_PERIODS_NOCAL
2086 -- DESCRIPTION : Create variable rent periods recORd IN PN_VAR_PERIODS AND
2087 -- corresponding group date/invoice date records in the
2088 -- PN_VAR_GRP_DATES table for a variable rent recORd when a
2089 -- GL calendar is not specified in the VR agreement.
2090 -- PURPOSE :
2091 -- INVOKED FROM :
2092 -- ARGUMENTS : IN:
2093 -- p_var_rent_id
2094 -- p_cumulative_vol
2095 -- p_comm_date
2096 -- p_term_date
2097 -- OUT:
2098 --
2099 -- REFERENCE : PN_COMMON.debug()
2100 -- NOTES : Create variable rent periods recORd IN PN_VAR_PERIODS AND
2101 -- corresponding group date/invoice date records in the
2102 -- PN_VAR_GRP_DATES table for a variable rent record for
2103 -- yearly VR periods depending on the year start date.
2104 -- Calls INSERT_PERIODS_ROW AND INSERT_GRP_DATE_ROW procedures
2105 -- HISTORY :
2106 -- 02-SEP-02 kkhegde o Created
2107 -- 14-nov-02 kkhegde o Replaced (substr(TO_CHAR(p_schedule_date),1,2)) with
2108 -- to_number(TO_CHAR(p_schedule_date,'dd') WHEREever it
2109 -- occurs.
2110 -- 31-MAY-05 Ajay Solanki
2111 -- B88A - TEST - 37161: When using an Annual Reporting method, the
2112 -- breakpoints for the last partial period are not being prorated.
2113 -- We prorate for the first partial period, but use a annual
2114 -- breakpoint in the last period.
2115 --
2116 -- 26-OCT-05 piagrawa o Bug#4702709 - Passed org id in insert row handler.
2117 -- Pass org id to PN_VAR_RENT_PKG.INSERT_GRP_DATE_ROW
2118 -- 05-jan-06 piagrawa o Bug #4630098 - added handling for passing correct
2119 -- proration factor to insert_grp_date_row.
2120 -- 11-JAN-07 Pseeram o Added the call create_report_dates
2121 -- 21-MAR-07 Lbala o Bug # 5937888 - added code to change reptg_due_date
2122 +=============================================================================*/
2123
2124 PROCEDURE CREATE_VAR_RENT_PERIODS_NOCAL( p_var_rent_id IN NUMBER,
2125 p_cumulative_vol IN VARCHAR2,
2126 p_yr_start_date IN DATE) IS
2127
2128 TYPE period_rec is RECORD ( l_period_start_date DATE,
2129 l_period_end_date DATE,
2130 l_proration_factor NUMBER,
2131 l_period_id NUMBER );
2132
2133 TYPE grp_date_rec is RECORD ( l_grp_start_date DATE,
2134 l_grp_end_date DATE,
2135 l_group_date DATE,
2136 l_reptg_due_date DATE,
2137 l_inv_start_date DATE,
2138 l_inv_end_date DATE,
2139 l_invoice_date DATE,
2140 l_inv_schedule_date DATE,
2141 l_proration_factor NUMBER);
2142
2143 TYPE period_table_type is TABLE OF period_rec INDEX BY BINARY_INTEGER;
2144 TYPE grp_date_table_type is TABLE OF grp_date_rec INDEX BY BINARY_INTEGER;
2145
2146 VR_periods period_table_type;
2147 VR_grp_dates grp_date_table_type;
2148
2149 l_vr_comm_date DATE;
2150 l_vr_term_date DATE;
2151 l_total_per_proration_days NUMBER;
2152 l_period_freq_code NUMBER;
2153 l_reptg_freq_code NUMBER;
2154 l_reptg_day_of_month NUMBER;
2155 l_reptg_days_after NUMBER;
2156 l_invg_freq_code NUMBER;
2157 l_invg_day_of_month NUMBER;
2158 l_invg_days_after NUMBER;
2159
2160 l_per_proration_factor NUMBER;
2161 l_grp_proration_factor NUMBER;
2162 -- variables for normal calendar year
2163 l_period_start_date1 DATE;
2164 l_period_end_date1 DATE;
2165 l_grp_start_date1 DATE;
2166 l_grp_end_date1 DATE;
2167 l_inv_start_date1 DATE;
2168 l_inv_end_date1 DATE := TO_DATE('01/01/0001','mm/dd/yyyy');
2169 l_invoice_date1 DATE;
2170 l_inv_schedule_date1 DATE;
2171 -- variables for custom year
2172 l_days_to_add NUMBER := NULL;
2173 -- counters
2174 l_per_counter NUMBER := 0;
2175 l_grp_counter NUMBER := 0;
2176 l_inv_counter NUMBER := 0;
2177 l_grp_inv_counter NUMBER := 0;
2178 -- for insert routines
2179 l_rowId VARCHAR2(18) := NULL;
2180 l_periodId NUMBER := NULL;
2181 l_grpDateId NUMBER := NULL;
2182 l_periodNum NUMBER := NULL;
2183 l_creation_date DATE := sysdate;
2184 l_created_by NUMBER := NVL (fnd_profile.VALUE ('USER_ID'), 0);
2185 l_partial_period VARCHAR2(1) := NULL;
2186 l_period_exists VARCHAR2(1) := 'N';
2187 l_proration_factor NUMBER;
2188
2189 l_org_id NUMBER;
2190 l_add_flag VARCHAR2(1) := 'N';
2191 l_end_date DATE := NULL;
2192 l_status pn_var_periods_all.status%TYPE;
2193 l_dummy VARCHAR2(1) := NULL;
2194 l_group_exists VARCHAR2(1) := 'N';
2195 l_grp_date_id NUMBER;
2196 l_grp_end_date DATE := NULL;
2197
2198 l_hyp_first_grp_st_dt DATE := NULL;
2199 l_hyp_first_grp_ed_dt DATE := NULL;
2200 l_hyp_last_grp_st_dt DATE := NULL;
2201 l_hyp_last_grp_ed_dt DATE := NULL;
2202
2203 /* Fetches the group id which starts on a specified date for a VR agreement */
2204 CURSOR group_cur (p_start_date DATE) IS
2205 SELECT grp_end_date, grp_date_id
2206 FROM pn_var_grp_dates_all
2207 WHERE var_rent_id = p_var_rent_id
2208 AND grp_start_date = p_start_date;
2209
2210 /* Fetches the period id which starts on a specified date for a VR agreement */
2211 CURSOR period_cur (p_start_date DATE) IS
2212 SELECT period_id, end_date, status
2213 FROM pn_var_periods_all
2214 WHERE var_rent_id = p_var_rent_id
2215 AND start_date = p_start_date;
2216
2217 BEGIN
2218
2219 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.CREATE_VAR_RENT_PERIODS_NOCAL (+)');
2220 put_log('PN_VAR_RENT_PKG.CREATE_VAR_RENT_PERIODS_NOCAL (+)');
2221
2222 SELECT VR.commencement_date,
2223 VR.termination_date,
2224 DECODE(VR.proration_days,'999',365,VR.proration_days),
2225 DECODE(CAL.period_freq_code,'MON',1
2226 ,'QTR',3
2227 ,'SA' ,6
2228 ,'YR' ,12
2229 ,NULL),
2230 DECODE(CAL.reptg_freq_code,'MON',1
2231 ,'QTR',3
2232 ,'SA' ,6
2233 ,'YR' ,12
2234 ,NULL),
2235 CAL.reptg_day_of_month,
2236 CAL.reptg_days_after,
2237 DECODE(CAL.invg_freq_code,'MON',1
2238 ,'QTR',3
2239 ,'SA' ,6
2240 ,'YR' ,12
2241 ,NULL),
2242 CAL.invg_day_of_month,
2243 CAL.invg_days_after,
2244 VR.org_id
2245 INTO l_vr_comm_date,
2246 l_vr_term_date,
2247 l_total_per_proration_days,
2248 l_period_freq_code,
2249 l_reptg_freq_code,
2250 l_reptg_day_of_month,
2251 l_reptg_days_after,
2252 l_invg_freq_code,
2253 l_invg_day_of_month,
2254 l_invg_days_after,
2255 l_org_id
2256 FROM PN_VAR_RENTS_ALL VR, PN_VAR_RENT_DATES_ALL CAL
2257 WHERE VR.var_rent_id = p_var_rent_id
2258 AND CAL.var_rent_id = VR.var_rent_id;
2259
2260 -- generate periods
2261
2262 l_period_start_date1 := p_yr_start_date;
2263 l_period_end_date1 := ADD_MONTHS(l_period_start_date1,12)-1;
2264
2265 WHILE l_period_end_date1 < l_vr_comm_date LOOP
2266 l_period_start_date1 := l_period_end_date1 + 1;
2267 l_period_end_date1 := ADD_MONTHS(l_period_start_date1,12)-1;
2268 END LOOP;
2269
2270 VR_periods(l_per_counter).l_period_start_date := l_vr_comm_date;
2271 VR_periods(l_per_counter).l_period_end_date := l_period_end_date1;
2272 VR_periods(l_per_counter).l_proration_factor := l_period_end_date1 - l_period_start_date1 + 1;
2273 l_per_proration_factor := VR_periods(l_per_counter).l_proration_factor;
2274
2275 WHILE VR_periods(l_per_counter).l_period_end_date < l_vr_term_date LOOP
2276
2277 l_per_counter := l_per_counter + 1;
2278 VR_periods(l_per_counter).l_period_start_date := VR_periods(l_per_counter-1).l_period_end_date + 1;
2279 VR_periods(l_per_counter).l_period_end_date := ADD_MONTHS(VR_periods(l_per_counter).l_period_start_date,12) - 1;
2280 VR_periods(l_per_counter).l_proration_factor := VR_periods(l_per_counter).l_period_end_date
2281 - VR_periods(l_per_counter).l_period_start_date + 1;
2282 END LOOP;
2283
2284 VR_periods(l_per_counter).l_period_end_date := l_vr_term_date;
2285
2286 -- insert period rows
2287
2288 FOR i IN 0..VR_periods.COUNT-1 LOOP
2289
2290 l_period_exists := 'N';
2291
2292 /* Check if the period in PL/SQL table with a specified start date
2293 already exists in database */
2294 FOR period_rec IN period_cur(vr_periods(i).l_period_start_date) LOOP
2295 l_periodId := period_rec.period_id;
2296 l_end_date := period_rec.end_date;
2297 l_status := period_rec.status;
2298 l_period_exists := 'Y';
2299 pnp_debug_pkg.debug(' period exists ...'||l_periodId);
2300 pnp_debug_pkg.debug('');
2301 END LOOP;
2302
2303 IF l_period_exists = 'N' THEN /* Insert the period if it does not exist */
2304
2305 IF (vr_periods(i).l_period_end_date - vr_periods(i).l_period_start_date+1) >=365 THEN
2306 l_partial_period := 'N';
2307 ELSE
2308 l_partial_period := 'Y';
2309 END IF;
2310
2311 pnp_debug_pkg.debug('New Period Start Date:'||vr_periods(i).l_period_start_date);
2312 pnp_debug_pkg.debug('New Period End Date:'||vr_periods(i).l_period_end_date);
2313 pnp_debug_pkg.debug('partial period ...'||l_partial_period);
2314
2315 PN_VAR_RENT_PKG.INSERT_PERIODS_ROW
2316 ( X_ROWID => l_rowId,
2317 X_PERIOD_ID => VR_periods(i).l_period_id,
2318 X_PERIOD_NUM => l_periodNum,
2319 X_VAR_RENT_ID => p_var_rent_id,
2320 X_START_DATE => VR_periods(i).l_period_start_date,
2321 X_END_DATE => VR_periods(i).l_period_end_date,
2322 X_PRORATION_FACTOR => VR_periods(i).l_proration_factor,
2323 X_PARTIAL_PERIOD => l_partial_period,
2324 X_ATTRIBUTE_CATEGORY => NULL,
2325 X_ATTRIBUTE1 => NULL,
2326 X_ATTRIBUTE2 => NULL,
2327 X_ATTRIBUTE3 => NULL,
2328 X_ATTRIBUTE4 => NULL,
2329 X_ATTRIBUTE5 => NULL,
2330 X_ATTRIBUTE6 => NULL,
2331 X_ATTRIBUTE7 => NULL,
2332 X_ATTRIBUTE8 => NULL,
2333 X_ATTRIBUTE9 => NULL,
2334 X_ATTRIBUTE10 => NULL,
2335 X_ATTRIBUTE11 => NULL,
2336 X_ATTRIBUTE12 => NULL,
2337 X_ATTRIBUTE13 => NULL,
2338 X_ATTRIBUTE14 => NULL,
2339 X_ATTRIBUTE15 => NULL,
2340 X_CREATION_DATE => l_creation_date,
2341 X_CREATED_BY => l_created_by,
2342 X_LAST_UPDATE_DATE => l_creation_date,
2343 X_LAST_UPDATED_BY => l_created_by,
2344 X_LAST_UPDATE_LOGIN => l_created_by
2345 );
2346
2347 pnp_debug_pkg.debug('period inserted is ...'||VR_periods(i).l_period_id);
2348 l_rowId := NULL;
2349 l_periodNum := NULL;
2350
2351 ELSE /* period exists in the database */
2352
2353 pnp_debug_pkg.debug('New Period Start Date:'||vr_periods(i).l_period_start_date);
2354 pnp_debug_pkg.debug('New Period End Date:'||vr_periods(i).l_period_end_date);
2355 pnp_debug_pkg.debug('l_end_date:'||l_end_date);
2356
2357 VR_periods(i).l_period_id := l_periodId;
2358
2359 /* Check if the period in the database is a partial period */
2360 IF vr_periods(i).l_period_end_date = l_end_date THEN
2361
2362 pnp_debug_pkg.debug('period end date is equsal to period in data base ..');
2363
2364 /* Make the period as active if it is inactive */
2365 IF l_status = pn_var_rent_pkg.status THEN
2366
2367 pnp_debug_pkg.debug('period is inactive ..'||l_periodId);
2368
2369 UPDATE pn_var_periods_all
2370 SET status = NULL
2371 WHERE period_id = l_periodId;
2372
2373 END IF;
2374
2375 ELSIF vr_periods(i).l_period_end_date <> l_end_date THEN
2376
2377 pnp_debug_pkg.debug('Need to update the period end date '||l_periodId);
2378
2379 IF (vr_periods(i).l_period_end_date
2380 - vr_periods(i).l_period_start_date) + 1 >= 365 THEN
2381
2382 l_partial_period := 'N';
2383 ELSE
2384
2385 l_partial_period := 'Y';
2386 END IF;
2387
2388 /* Updte the end date and partial flag for the period */
2389 UPDATE pn_var_periods_all
2390 SET
2391 end_date = vr_periods(i).l_period_end_date,
2392 partial_period = l_partial_period,
2393 status = NULL
2394 WHERE period_id = l_periodId;
2395
2396 END IF;
2397
2398 END IF;
2399
2400 END LOOP;
2401
2402 -- generate group dates, invoice dates
2403
2404 -- first generate group dates
2405
2406 l_grp_start_date1 := l_period_start_date1;
2407 l_grp_end_date1 := ADD_MONTHS(l_grp_start_date1,l_reptg_freq_code)-1;
2408
2409 WHILE l_grp_end_date1 < l_vr_comm_date LOOP
2410 l_grp_start_date1 := l_grp_end_date1 + 1;
2411 l_grp_end_date1 := ADD_MONTHS(l_grp_start_date1,l_reptg_freq_code)-1;
2412 END LOOP;
2413
2414 VR_grp_dates(l_grp_counter).l_grp_start_date := l_vr_comm_date;
2415 VR_grp_dates(l_grp_counter).l_grp_end_date := l_grp_end_date1;
2416 VR_grp_dates(l_grp_counter).l_group_date := l_grp_start_date1;
2417 VR_grp_dates(l_grp_counter).l_reptg_due_date
2418 := NVL( ((ADD_MONTHS(FIRST_DAY(VR_grp_dates(l_grp_counter).l_grp_end_date),1)-1) + l_reptg_day_of_month),
2419 (VR_grp_dates(l_grp_counter).l_grp_end_date + NVL(l_reptg_days_after,0)) );
2420 VR_grp_dates(l_grp_counter).l_proration_factor
2421 := ((l_grp_end_date1-l_vr_comm_date)+1)/((l_grp_end_date1-l_grp_start_date1)+1);
2422
2423 l_hyp_first_grp_st_dt := l_grp_start_date1;
2424 l_hyp_first_grp_ed_dt := l_grp_end_date1;
2425
2426 WHILE VR_grp_dates(l_grp_counter).l_grp_end_date < l_vr_term_date LOOP
2427 l_grp_counter := l_grp_counter + 1;
2428 VR_grp_dates(l_grp_counter).l_grp_start_date := VR_grp_dates(l_grp_counter-1).l_grp_end_date + 1;
2429 VR_grp_dates(l_grp_counter).l_grp_end_date := ADD_MONTHS(VR_grp_dates(l_grp_counter).l_grp_start_date,
2430 l_reptg_freq_code) - 1;
2431 VR_grp_dates(l_grp_counter).l_group_date := VR_grp_dates(l_grp_counter).l_grp_start_date;
2432 VR_grp_dates(l_grp_counter).l_reptg_due_date :=
2433 NVL( ((ADD_MONTHS(FIRST_DAY(VR_grp_dates(l_grp_counter).l_grp_end_date),1)-1) + l_reptg_day_of_month),
2434 (VR_grp_dates(l_grp_counter).l_grp_end_date + nvl(l_reptg_days_after,0)) );
2435 VR_grp_dates(l_grp_counter).l_proration_factor := 1;
2436 END LOOP;
2437
2438 l_hyp_last_grp_st_dt := vr_grp_dates(l_grp_counter).l_grp_start_date;
2439 l_hyp_last_grp_ed_dt := vr_grp_dates(l_grp_counter).l_grp_end_date;
2440
2441 VR_grp_dates(l_grp_counter).l_grp_end_date := l_vr_term_date;
2442
2443 -- now, generate invoice dates
2444
2445 WHILE l_inv_end_date1 < l_vr_term_date LOOP
2446
2447 IF l_inv_counter = 0 THEN
2448 l_inv_start_date1 := l_period_start_date1;
2449 l_inv_end_date1 := ADD_MONTHS(l_inv_start_date1,l_invg_freq_code)-1;
2450
2451 WHILE l_inv_end_date1 < l_vr_comm_date LOOP
2452 l_inv_start_date1 := l_inv_end_date1 + 1;
2453 l_inv_end_date1 := ADD_MONTHS(l_inv_start_date1,l_invg_freq_code)-1;
2454 END LOOP;
2455
2456 l_invoice_date1 := l_inv_start_date1;
2457 l_inv_start_date1 := l_vr_comm_date;
2458 ELSE
2459 l_inv_start_date1 := l_inv_end_date1 + 1;
2460 l_inv_end_date1 := ADD_MONTHS(l_inv_start_date1,l_invg_freq_code)-1;
2461 l_invoice_date1 := l_inv_start_date1;
2462 END IF;
2463
2464 l_inv_schedule_date1 :=
2465 NVL( ((ADD_MONTHS(FIRST_DAY(l_inv_end_date1),1)-1) + l_invg_day_of_month),
2466 (l_inv_end_date1 + nvl(l_invg_days_after,0)) );
2467
2468 IF l_inv_end_date1 > l_vr_term_date THEN
2469 l_inv_end_date1 := l_vr_term_date;
2470 END IF;
2471 ------------------------------------------------------------
2472 -- takes care of the only 28 days for the schedule day
2473 ------------------------------------------------------------
2474 IF TO_NUMBER(TO_CHAR(l_inv_schedule_date1,'dd')) in (29,30,31) THEN
2475 l_inv_schedule_date1:= (FIRST_DAY(l_inv_schedule_date1)+27);
2476 END IF;
2477 ------------------------------------------------------------
2478
2479 FOR i IN l_grp_inv_counter..VR_grp_dates.COUNT-1 LOOP
2480 EXIT WHEN VR_grp_dates(i).l_grp_start_date > l_inv_end_date1;
2481 VR_grp_dates(i).l_inv_start_date := l_inv_start_date1;
2482 VR_grp_dates(i).l_inv_end_date := l_inv_end_date1;
2483 VR_grp_dates(i).l_invoice_date := l_invoice_date1;
2484 VR_grp_dates(i).l_inv_schedule_date := l_inv_schedule_date1;
2485 l_grp_inv_counter := l_grp_inv_counter + 1;
2486 END LOOP;
2487
2488 l_inv_counter := l_inv_counter + 1;
2489
2490 END LOOP;
2491
2492 -- now, insert the group dates and the invoice dates....
2493
2494 l_grp_counter := 0;
2495
2496 FOR i IN 0..VR_periods.COUNT - 1 LOOP
2497
2498 FOR j IN l_grp_counter..(VR_grp_dates.COUNT - 1) LOOP
2499
2500 l_group_exists := 'N';
2501
2502 pnp_debug_pkg.debug(' group start date ...'||VR_grp_dates(j).l_grp_start_date);
2503 pnp_debug_pkg.debug(' group end date ...'||VR_periods(i).l_period_end_date);
2504
2505 EXIT WHEN VR_grp_dates(j).l_grp_start_date > VR_periods(i).l_period_end_date;
2506
2507 /* Check if the group in PL/SQL table with a specified start date
2508 already exists in database */
2509 FOR group_rec IN group_cur(VR_grp_dates(j).l_grp_start_date) LOOP
2510 l_grp_date_id := group_rec.grp_date_id;
2511 l_grp_end_date := group_rec.grp_end_date;
2512 l_group_exists := 'Y';
2513 END LOOP;
2514
2515 IF l_group_exists = 'N' THEN
2516
2517 /* group does not exist in the database and needs to be added */
2518 pnp_debug_pkg.debug (' Group does not exist - to insert group ');
2519
2520 /*l_proration_Factor
2521 := ((vr_grp_dates(j).l_grp_end_date - vr_grp_dates(j).l_grp_start_date) + 1 )
2522 / ((LAST_DAY(ADD_MONTHS(LAST_DAY(vr_grp_dates(j).l_group_date),l_reptg_freq_code-1))
2523 - vr_grp_dates(j).l_group_date)+1);*/
2524
2525 IF VR_grp_dates(j).l_grp_start_date
2526 BETWEEN l_hyp_first_grp_st_dt AND l_hyp_first_grp_ed_dt
2527 THEN
2528
2529 l_proration_Factor
2530 := ((vr_grp_dates(j).l_grp_end_date - vr_grp_dates(j).l_grp_start_date) + 1)
2531 / ((l_hyp_first_grp_ed_dt - l_hyp_first_grp_st_dt) + 1);
2532
2533 ELSIF VR_grp_dates(j).l_grp_end_date
2534 BETWEEN l_hyp_last_grp_st_dt AND l_hyp_last_grp_ed_dt
2535 THEN
2536
2537 l_proration_factor
2538 := ((vr_grp_dates(j).l_grp_end_date - vr_grp_dates(j).l_grp_start_date) + 1 )
2539 / ((l_hyp_last_grp_ed_dt - l_hyp_last_grp_st_dt) + 1);
2540
2541 ELSE
2542
2543 l_proration_Factor := 1;
2544
2545 END IF;
2546
2547 PN_VAR_RENT_PKG.INSERT_GRP_DATE_ROW
2548 ( X_ROWID => l_rowId,
2549 X_GRP_DATE_ID => l_grpDateId,
2550 X_VAR_RENT_ID => p_var_rent_id,
2551 X_PERIOD_ID => VR_periods(i).l_period_id,
2552 X_GRP_START_DATE => VR_grp_dates(j).l_grp_start_date,
2553 X_GRP_END_DATE => VR_grp_dates(j).l_grp_end_date,
2554 X_GROUP_DATE => VR_grp_dates(j).l_group_date,
2555 X_REPTG_DUE_DATE => VR_grp_dates(j).l_reptg_due_date,
2556 X_INV_START_DATE => VR_grp_dates(j).l_inv_start_date,
2557 X_INV_END_DATE => VR_grp_dates(j).l_inv_end_date,
2558 X_INVOICE_DATE => VR_grp_dates(j).l_invoice_date,
2559 X_INV_SCHEDULE_DATE => VR_grp_dates(j).l_inv_schedule_date,
2560 X_PRORATION_FACTOR => l_proration_factor,
2561 X_ACTUAL_EXP_CODE => 'N',
2562 X_FORECASTED_EXP_CODE => 'N',
2563 X_VARIANCE_EXP_CODE => 'N',
2564 X_CREATION_DATE => l_creation_date,
2565 X_CREATED_BY => l_created_by,
2566 X_LAST_UPDATE_DATE => l_creation_date,
2567 X_LAST_UPDATED_BY => l_created_by,
2568 X_LAST_UPDATE_LOGIN => l_created_by
2569 );
2570
2571 pnp_debug_pkg.debug ('group dte id of group added ....'||l_grpDateId);
2572 l_rowId := NULL;
2573 l_grpDateId := NULL;
2574
2575 ELSE
2576
2577 pnp_debug_pkg.debug (' group exists - update it ');
2578 /* Check if the group in the database is a partial or if the new group is partial */
2579
2580 IF VR_grp_dates(j).l_grp_end_date <> l_grp_end_date THEN
2581
2582 /*l_proration_Factor := ((vr_grp_dates(j).l_grp_end_date - vr_grp_dates(j).l_grp_start_date) +1 )/
2583 ((LAST_DAY(ADD_MONTHS(LAST_DAY(vr_grp_dates(j).l_group_date),l_reptg_freq_code-1))
2584 - vr_grp_dates(j).l_group_date)+1);*/
2585
2586 IF VR_grp_dates(j).l_grp_start_date
2587 BETWEEN l_hyp_first_grp_st_dt AND l_hyp_first_grp_ed_dt
2588 THEN
2589
2590 l_proration_Factor
2591 := ((vr_grp_dates(j).l_grp_end_date - vr_grp_dates(j).l_grp_start_date) + 1)
2592 / ((l_hyp_first_grp_ed_dt - l_hyp_first_grp_st_dt) + 1);
2593
2594 ELSIF VR_grp_dates(j).l_grp_end_date
2595 BETWEEN l_hyp_last_grp_st_dt AND l_hyp_last_grp_ed_dt
2596 THEN
2597
2598 l_proration_factor
2599 := ((vr_grp_dates(j).l_grp_end_date - vr_grp_dates(j).l_grp_start_date) + 1 )
2600 / ((l_hyp_last_grp_ed_dt - l_hyp_last_grp_st_dt) + 1);
2601
2602 ELSE
2603
2604 l_proration_Factor := 1;
2605
2606 END IF;
2607
2608 pnp_debug_pkg.debug ('updating end date of group '||VR_grp_dates(j).l_grp_end_date);
2609 pnp_debug_pkg.debug ('updating proration factor as '||l_proration_Factor);
2610 pnp_debug_pkg.debug ('updating due date of group '||VR_grp_dates(j).l_reptg_due_date);
2611 /* Updte the end date and proration factor for the group */
2612
2613 UPDATE pn_var_grp_dates_all
2614 SET grp_end_date = VR_grp_dates(j).l_grp_end_date,
2615 proration_Factor = round(l_proration_Factor,10),
2616 reptg_due_date = VR_grp_dates(j).l_reptg_due_date --Bug # 5937888
2617 WHERE grp_date_id = l_grp_date_id;
2618
2619 END IF;
2620
2621 END IF;
2622
2623 l_grp_counter := l_grp_counter + 1;
2624
2625 END LOOP;
2626
2627 END LOOP;
2628
2629 PN_VAR_RENT_PKG.delete_report_date_row(p_var_rent_id, NULL);
2630 PN_VAR_RENT_PKG.create_report_dates (p_var_rent_id);
2631
2632 put_log('PN_VAR_RENT_PKG.CREATE_VAR_RENT_PERIODS_NOCAL (-)');
2633 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.CREATE_VAR_RENT_PERIODS_NOCAL (-)');
2634
2635 END CREATE_VAR_RENT_PERIODS_NOCAL;
2636
2637 /*=============================================================================+
2638 | PROCEDURE
2639 | DELETE_VAR_RENT_PERIODS
2640 |
2641 | DESCRIPTION
2642 | Delete variable rent periods record in PN_VAR_PERIODS, corresponding
2643 | group date/invoice date records in the PN_VAR_GRP_DATES table,
2644 | corresponding line items in the PN_VAR_LINES table
2645 | for a variable rent record
2646 |
2647 | SCOPE - PUBLIC
2648 |
2649 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
2650 |
2651 | ARGUMENTS : IN:
2652 | p_var_rent_id
2653 | p_term_date
2654 |
2655 | OUT:
2656 |
2657 | RETURNS : None
2658 |
2659 | NOTES : Delete variable rent periods record in PN_VAR_PERIODS,
2660 | corresponding group date/invoice date records in the
2661 | PN_VAR_GRP_DATES table, corresponding line items in the
2662 | PN_VAR_LINES table for a variable rent record
2663 | Calls DELETE_PERIODS_ROW, DELETE_GRP_DATE_ROW,
2664 | DELETE_VAR_RENT_LINES procedures
2665 |
2666 | MODIFICATION HISTORY
2667 |
2668 | 03-SEP-01 Daniel o Created
2669 | 27-DEC-01 Daniel o included parameter p_term_date for contraction.
2670 | 14-JUL-05 hareesha o Bug 4284035 - Replaced PN_VAR_RENT_SUMM with _ALL tbl.
2671 | 11-JAN-07 Pseeram o Added the call delete_report_date_row to delete
2672 | report dates records after undo periods.
2673 | 09-FEB-07 Lokesh o Bug # 5874461, Added NVL for export_to_ar_flag
2674 +=============================================================================*/
2675 PROCEDURE DELETE_VAR_RENT_PERIODS(p_var_rent_id IN NUMBER,
2676 p_term_date IN DATE ) IS
2677
2678 l_lines_exist NUMBER := NULL;
2679 l_constr_exist NUMBER := NULL;
2680 l_date DATE;
2681
2682 BEGIN
2683
2684 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.DELETE_VAR_RENT_PERIODS (+)');
2685
2686 l_lines_exist := PN_VAR_RENT_PKG.find_if_lines_exist(p_var_rent_id, NULL, l_date);
2687
2688 l_constr_exist:= PN_VAR_RENT_PKG.find_if_constr_exist(p_var_rent_id, l_date);
2689
2690 l_date := NVL(p_term_date,(TO_DATE('01/01/1776','mm/dd/yyyy')));
2691
2692 -- Added by Sathesh K 15-APR-2005 to delete schedules and items records
2693 -- Mac Trac Issue M30106
2694
2695 DELETE FROM pn_payment_schedules_all
2696 WHERE payment_schedule_id IN
2697 (SELECT payment_schedule_id
2698 FROM pn_payment_items_all
2699 WHERE NVL(export_to_ar_flag,'N') <>'Y'
2700 AND payment_term_id IN
2701 (SELECT payment_term_id
2702 FROM pn_payment_terms
2703 WHERE VAR_RENT_INV_ID IN
2704 (SELECT var_rent_inv_id
2705 FROM pn_var_rent_inv_all
2706 WHERE var_rent_id = p_var_rent_id
2707 )
2708 )
2709 )
2710 AND payment_status_lookup_code <>'APPROVED';
2711
2712 DELETE FROM pn_payment_items_all
2713 WHERE payment_term_id IN
2714 (SELECT payment_term_id
2715 FROM pn_payment_terms_all
2716 WHERE var_rent_inv_id IN
2717 (SELECT var_rent_inv_id
2718 FROM pn_var_rent_inv_all
2719 WHERE var_rent_id = p_var_rent_id
2720 )
2721 )
2722 AND NVL(export_to_ar_flag,'N') <>'Y' ;
2723
2724 ---Mac Trac Issue M30106 ends here -----
2725
2726 DELETE FROM pn_var_rent_summ
2727 WHERE var_rent_id = p_var_rent_id;
2728
2729 IF SQL%NOTFOUND THEN
2730 NULL;
2731 END IF;
2732
2733 DELETE FROM pn_payment_terms
2734 WHERE var_rent_inv_id IN
2735 (SELECT var_rent_inv_id
2736 FROM pn_var_rent_inv_all
2737 WHERE var_rent_id = p_var_rent_id)
2738 AND NOT EXISTS
2739 (SELECT 1
2740 FROM pn_payment_items
2741 WHERE export_to_ar_flag ='Y'
2742 AND payment_term_id IN
2743 (SELECT payment_term_id
2744 FROM pn_payment_terms
2745 WHERE VAR_RENT_INV_ID IN
2746 (SELECT VAR_RENT_INV_ID
2747 FROM PN_VAR_RENT_INV_ALL
2748 WHERE VAR_RENT_ID = p_var_rent_id
2749 )
2750 )
2751 );
2752
2753 IF SQL%NOTFOUND THEN
2754 NULL;
2755 END IF;
2756
2757 DELETE FROM pn_var_rent_inv
2758 WHERE var_rent_id = p_var_rent_id;
2759
2760 IF SQL%NOTFOUND THEN
2761 NULL;
2762 END IF;
2763
2764 pn_var_rent_pkg.delete_report_date_row(p_var_rent_id,l_date);
2765
2766 pn_var_rent_pkg.delete_grp_date_row(p_var_rent_id,l_date);
2767
2768 IF l_lines_exist IS NOT NULL THEN
2769 pn_var_rent_pkg.delete_var_rent_lines(p_var_rent_id,l_date);
2770 END IF;
2771
2772 IF l_constr_exist IS NOT NULL THEN
2773 pn_var_rent_pkg.delete_var_rent_constr(p_var_rent_id,l_date);
2774 END IF;
2775
2776 pn_var_rent_pkg.delete_periods_row(p_var_rent_id,l_date);
2777
2778 /*DELETE FROM pn_var_transactions_all
2779 WHERE var_rent_id = p_var_rent_id;*/
2780
2781 DELETE FROM pn_var_abat_defaults_all
2782 where var_rent_id = p_var_rent_id;
2783
2784 DELETE FROM pn_var_abatements_all abat
2785 where abat.var_rent_id=p_var_rent_id;
2786
2787 DELETE FROM pn_var_bkdt_defaults_all
2788 WHERE var_rent_id = p_var_rent_id;
2789
2790 DELETE pn_var_bkhd_defaults_all
2791 WHERE var_rent_id = p_var_rent_id;
2792
2793 DELETE pn_var_line_defaults_all
2794 WHERE var_rent_id = p_var_rent_id;
2795
2796 DELETE pn_var_constr_defaults_all
2797 WHERE var_rent_id = p_var_rent_id;
2798
2799 IF SQL%NOTFOUND THEN
2800 NULL;
2801 END IF;
2802
2803 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.DELETE_VAR_RENT_PERIODS (-)');
2804
2805 END DELETE_VAR_RENT_PERIODS;
2806
2807 /*=============================================================================+
2808 | PROCEDURE
2809 | UPDATE_VAR_RENT_PERIODS
2810 |
2811 | DESCRIPTION
2812 | Update variable rent periods record in PN_VAR_PERIODS, corresponding
2813 | group date/invoice date records in the PN_VAR_GRP_DATES table
2814 | for a variable rent record contraction
2815 |
2816 | SCOPE - PUBLIC
2817 |
2818 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
2819 |
2820 | ARGUMENTS : IN:
2821 | p_var_rent_id
2822 | p_term_date
2823 |
2824 | OUT:
2825 |
2826 | RETURNS : None
2827 |
2828 | NOTES : Update variable rent periods record in PN_VAR_PERIODS, corresponding
2829 | group date/invoice date records in the PN_VAR_GRP_DATES table
2830 | for a variable rent record contraction
2831 |
2832 | MODIFICATION HISTORY
2833 |
2834 | 29-DEC-01 Daniel o Created
2835 | 04-JUL-05 hareesha o Bug 4284035 - Replaced PN_VAR_PERIODS with _ALL table
2836 +=============================================================================*/
2837 PROCEDURE UPDATE_VAR_RENT_PERIODS(p_var_rent_id IN NUMBER,
2838 p_term_date IN DATE ) IS
2839
2840 p_last_update_date DATE := SYSDATE;
2841 p_last_updated_by NUMBER := NVL (fnd_profile.VALUE ('USER_ID'), 0);
2842 p_per_start_date DATE := TO_DATE('01/01/1776','mm/dd/yyyy');
2843 p_per_end_date DATE := TO_DATE('01/01/1776','mm/dd/yyyy');
2844 p_grp_start_date DATE := TO_DATE('01/01/1776','mm/dd/yyyy');
2845 p_grp_end_date DATE := TO_DATE('01/01/1776','mm/dd/yyyy');
2846 p_reptg_freq_code NUMBER := NULL;
2847 tot_per_proration_days NUMBER := 0;
2848 per_proration_days NUMBER := 0;
2849 tot_grp_proration_days NUMBER := 0;
2850 grp_proration_days NUMBER := 0;
2851 p_proration_factor NUMBER := 0;
2852 p_cumulative_vol VARCHAR2(1);
2853
2854 BEGIN
2855
2856 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.UPDATE_VAR_RENT_PERIODS (+)');
2857
2858 -- Get dates/info, GL calendar used from Variable Rent record
2859
2860 SELECT DECODE(cal.reptg_freq_code,'MON', 1,
2861 'QTR', 3,
2862 'SA', 6,
2863 'YR', 12,
2864 null)
2865 INTO p_reptg_freq_code
2866 FROM PN_VAR_RENT_DATES_ALL cal
2867 WHERE cal.var_rent_id = p_var_rent_id;
2868
2869 -- Get period start date for the last period which has to be
2870 -- updated with the new proration factor after lease contraction
2871
2872 SELECT per.start_date
2873 INTO p_per_start_date
2874 FROM PN_VAR_PERIODS_ALL per
2875 WHERE per.var_rent_id = p_var_rent_id
2876 AND per.start_date <= p_term_date
2877 AND per.end_date >= p_term_date
2878 AND rownum < 2;
2879
2880 -- Get proration days info from the main VR record
2881
2882 SELECT decode(proration_days,999,365,proration_days)
2883 INTO tot_per_proration_days
2884 FROM pn_var_rents_ALL
2885 WHERE var_rent_id = p_var_rent_id;
2886
2887 -- Get group start date for the last group which has to be
2888 -- updated with the new proration factor after lease contraction
2889
2890 SELECT grp.grp_start_date
2891 INTO p_grp_start_date
2892 FROM pn_var_grp_dates_all grp
2893 WHERE grp.var_rent_id = p_var_rent_id
2894 AND grp.grp_start_date <= p_term_date
2895 AND grp.grp_end_date >= p_term_date
2896 AND rownum < 2;
2897
2898 per_proration_days := (p_term_date-p_per_start_date)+1;
2899 p_proration_factor := ROUND((per_proration_days/tot_per_proration_days),2);
2900 IF p_proration_factor > 1 THEN
2901 p_proration_factor := 1;
2902 END IF;
2903
2904 --call to update PN_VAR_PERIODS;
2905 UPDATE pn_var_periods_all
2906 SET end_date = p_term_date,
2907 proration_factor = p_proration_factor,
2908 last_update_date = p_last_update_date,
2909 last_updated_by = p_last_updated_by,
2910 last_update_login = p_last_updated_by
2911 WHERE var_rent_id = p_var_rent_id
2912 AND start_date <= p_term_date
2913 AND end_date >= p_term_date
2914 AND rownum < 2;
2915
2916 IF p_cumulative_vol = 'N' THEN
2917
2918 IF (p_reptg_freq_code = 1) THEN
2919 tot_grp_proration_days := 30;
2920 ELSIF (p_reptg_freq_code = 3) THEN
2921 tot_grp_proration_days := 90;
2922 ELSIF (p_reptg_freq_code = 6) THEN
2923 tot_grp_proration_days := 180;
2924 ELSE
2925 tot_grp_proration_days := 365;
2926 END IF;
2927
2928 grp_proration_days := ( p_term_date - p_grp_start_date) + 1;
2929
2930 p_proration_factor := ROUND((grp_proration_days/tot_grp_proration_days),2);
2931 IF p_proration_factor > 1 THEN
2932 p_proration_factor := 1;
2933 END IF;
2934
2935 END IF;
2936
2937 --call to update PN_VAR_GRP_DATES;
2938
2939 UPDATE pn_var_grp_dates_all
2940 SET grp_end_date = p_term_date,
2941 proration_factor = round(p_proration_factor,10),
2942 last_update_date = p_last_update_date,
2943 last_updated_by = p_last_updated_by,
2944 last_update_login = p_last_updated_by
2945 WHERE var_rent_id = p_var_rent_id
2946 AND grp_start_date <= p_term_date
2947 AND grp_end_date >= p_term_date
2948 AND rownum < 2;
2949
2950 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.UPDATE_VAR_RENT_PERIODS (-)');
2951
2952 END UPDATE_VAR_RENT_PERIODS;
2953
2954 /*===========================================================================+
2955 | PROCEDURE
2956 | DELETE_VAR_RENT_CONSTR
2957 |
2958 | DESCRIPTION
2959 | Delete variable rent constraints from the PN_VAR_CONSTRAINTS table for each period
2960 |
2961 | SCOPE - PUBLIC
2962 |
2963 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
2964 | PN_VAR_CONSTRAINTS_PKG.DELETE_ROW
2965 |
2966 | ARGUMENTS : IN:
2967 | p_var_rent_id
2968 | p_term_date
2969 |
2970 | OUT:
2971 |
2972 | RETURNS : None
2973 |
2974 | NOTES : Delete variable rent constraints from the PN_VAR_CONSTRAINTS table for each period
2975 |
2976 | MODIFICATION HISTORY
2977 |
2978 | 03-DEC-2001 Daniel Thota o Created
2979 | 27-DEC-2001 Daniel Thota o Included parameter p_term_date for contraction.
2980 +===========================================================================*/
2981
2982 PROCEDURE DELETE_VAR_RENT_CONSTR(p_var_rent_id IN NUMBER,
2983 p_term_date IN DATE ) IS
2984
2985 l_counter NUMBER := 0;
2986 l_date DATE := nvl(p_term_date,(to_date('01/01/1776','mm/dd/yyyy')));
2987
2988 CURSOR c1 IS
2989 SELECT constraint_id
2990 FROM PN_VAR_CONSTRAINTS_ALL
2991 WHERE period_id IN (SELECT period_id
2992 FROM PN_VAR_PERIODS_ALL
2993 WHERE var_rent_id = p_var_rent_id
2994 AND start_date > l_date
2995 AND end_date > l_date);
2996
2997 BEGIN
2998
2999 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.DELETE_VAR_RENT_CONSTR (+)');
3000
3001 FOR constr_rec IN c1 LOOP
3002
3003 PN_VAR_CONSTRAINTS_PKG.DELETE_ROW(constr_rec.constraint_id);
3004
3005 l_counter := l_counter + 1;
3006
3007 IF l_counter = 1000 THEN
3008 COMMIT;
3009 l_counter := 1;
3010 END IF;
3011
3012 END LOOP;
3013
3014 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.DELETE_VAR_RENT_CONSTR (-)');
3015
3016 END DELETE_VAR_RENT_CONSTR;
3017
3018 /*===========================================================================+
3019 | PROCEDURE
3020 | DELETE_VAR_RENT_LINES
3021 |
3022 | DESCRIPTION
3023 | Delete variable rent lines record in PN_VAR_LINES and associated
3024 | volume history records in the PN_VAR_VOL_HIST table for a
3025 | variable rent record
3026 |
3027 | SCOPE - PUBLIC
3028 |
3029 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
3030 | PN_VAR_LINES_PKG.DELETE_ROW
3031 |
3032 | ARGUMENTS : IN:
3033 | p_var_rent_id
3034 | p_term_date
3035 |
3036 | OUT:
3037 |
3038 | RETURNS : None
3039 |
3040 | NOTES : Delete variable rent lines record in PN_VAR_LINES and associated
3041 | volume history records in the PN_VAR_VOL_HIST table for a
3042 | variable rent record
3043 |
3044 | MODIFICATION HISTORY
3045 |
3046 | 15-OCT-2001 Daniel Thota o Created
3047 | 27-DEC-2001 Daniel Thota o Included parameter p_term_date for contraction.
3048 | 14-JUL-05 hareesha o Bug 4284035 - Replaced pn_var_lines with _ALL table.
3049 +===========================================================================*/
3050
3051 PROCEDURE DELETE_VAR_RENT_LINES(p_var_rent_id IN NUMBER,
3052 p_term_date IN DATE ) IS
3053
3054 l_counter NUMBER := 0;
3055 l_bkptshd_exist NUMBER := NULL;
3056 l_volhist_exist NUMBER := NULL;
3057 l_deduct_exist NUMBER := NULL;
3058 l_date DATE := NVL(p_term_date,(TO_DATE('01/01/1776','mm/dd/yyyy')));
3059
3060 CURSOR c1 is
3061 SELECT line_item_id
3062 FROM pn_var_lines
3063 WHERE period_id IN (SELECT period_id
3064 FROM pn_var_periods_ALL
3065 WHERE var_rent_id = p_var_rent_id
3066 AND start_date > l_date
3067 AND end_date > l_date);
3068
3069 BEGIN
3070
3071 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.DELETE_VAR_RENT_LINES (+)');
3072
3073 FOR lines_rec IN c1 LOOP
3074
3075 l_bkptshd_exist := PN_VAR_RENT_PKG.find_if_bkptshd_exist(lines_rec.line_item_id);
3076 -------------------------------------------------------------------------
3077 -- First delete breakpoints associated with each line associated with each
3078 -- period for this variable rent record
3079 -------------------------------------------------------------------------
3080 IF l_bkptshd_exist IS NOT NULL THEN
3081 PN_VAR_RENT_PKG.DELETE_VAR_BKPTS_HEAD(lines_rec.line_item_id);
3082 END IF;
3083
3084 l_volhist_exist := PN_VAR_RENT_PKG.find_if_volhist_exist(lines_rec.line_item_id);
3085 -------------------------------------------------------------------------
3086 -- First delete volume history associated with each line associated with each
3087 -- period for this variable rent record
3088 -------------------------------------------------------------------------
3089 IF l_volhist_exist IS NOT NULL THEN
3090 PN_VAR_RENT_PKG.DELETE_VAR_VOL_HIST(lines_rec.line_item_id);
3091 END IF;
3092
3093 l_deduct_exist := PN_VAR_RENT_PKG.find_if_deduct_exist(lines_rec.line_item_id);
3094 -------------------------------------------------------------------------
3095 -- First delete deductions associated with each line associated with each
3096 -- period for this variable rent record
3097 -------------------------------------------------------------------------
3098 IF l_deduct_exist IS NOT NULL THEN
3099 PN_VAR_RENT_PKG.DELETE_VAR_RENT_DEDUCT(lines_rec.line_item_id);
3100 END IF;
3101 -------------------------------------------------------------------------
3102 -- Delete lines associated with each period for this variable rent record
3103 -------------------------------------------------------------------------
3104 PN_VAR_LINES_PKG.DELETE_ROW(lines_rec.line_item_id);
3105
3106 l_counter := l_counter + 1;
3107
3108 IF l_counter = 1000 THEN
3109 COMMIT;
3110 l_counter := 1;
3111 END IF;
3112
3113 END LOOP;
3114
3115 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.DELETE_VAR_RENT_LINES (-)');
3116
3117 END DELETE_VAR_RENT_LINES;
3118
3119 /*===========================================================================+
3120 | PROCEDURE
3121 | DELETE_VAR_RENT_DEDUCT
3122 |
3123 | DESCRIPTION
3124 | Delete variable rent deductions from the PN_VAR_DEDUCTIONS table for each line
3125 |
3126 | SCOPE - PUBLIC
3127 |
3128 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
3129 | PN_VAR_DEDUCTIONS_PKG.DELETE_ROW
3130 |
3131 | ARGUMENTS : IN:
3132 | p_line_item_id
3133 |
3134 | OUT:
3135 |
3136 | RETURNS : None
3137 |
3138 | NOTES : Delete variable rent deductions from the PN_VAR_DEDUCTIONS table for each line
3139 |
3140 | MODIFICATION HISTORY
3141 |
3142 | 03-DEC-2001 Daniel Thota o Created
3143 +===========================================================================*/
3144
3145 PROCEDURE DELETE_VAR_RENT_DEDUCT(p_line_item_id IN NUMBER) IS
3146
3147 l_counter NUMBER := 0;
3148
3149 CURSOR c1 is
3150 SELECT deduction_id
3151 FROM PN_VAR_DEDUCTIONS_ALL
3152 WHERE line_item_id = p_line_item_id;
3153
3154 BEGIN
3155
3156 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.DELETE_VAR_RENT_DEDUCT (+)');
3157
3158 FOR deduct_rec IN c1 LOOP
3159
3160 PN_VAR_DEDUCTIONS_PKG.DELETE_ROW(deduct_rec.deduction_id);
3161
3162 l_counter := l_counter + 1;
3163
3164 IF l_counter = 1000 THEN
3165 COMMIT;
3166 l_counter := 1;
3167 END IF;
3168
3169 END LOOP;
3170
3171 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.DELETE_VAR_RENT_DEDUCT (-)');
3172
3173 END DELETE_VAR_RENT_DEDUCT;
3174
3175 /*===========================================================================+
3176 | PROCEDURE
3177 | DELETE_VAR_VOL_HIST
3178 |
3179 | DESCRIPTION
3180 | Delete variable rent lines
3181 | volume history records in the PN_VAR_VOL_HIST table
3182 |
3183 | SCOPE - PUBLIC
3184 |
3185 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
3186 | PN_VAR_LINES_PKG.DELETE_ROW
3187 |
3188 | ARGUMENTS : IN:
3189 | p_line_item_id
3190 |
3191 | OUT:
3192 |
3193 | RETURNS : None
3194 |
3195 | NOTES : Delete variable rent lines
3196 | volume history records in the PN_VAR_VOL_HIST table
3197 |
3198 | MODIFICATION HISTORY
3199 |
3200 | 30-NOV-2001 Daniel Thota o Created
3201 +===========================================================================*/
3202
3203 PROCEDURE DELETE_VAR_VOL_HIST(p_line_item_id IN NUMBER) IS
3204
3205 l_counter NUMBER := 0;
3206
3207 CURSOR c1 IS
3208 SELECT vol_hist_id
3209 FROM PN_VAR_VOL_HIST_ALL
3210 WHERE line_item_id = p_line_item_id;
3211
3212 BEGIN
3213
3214 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.DELETE_VAR_VOL_HIST (+)');
3215
3216 FOR vol_hist_rec IN c1 LOOP
3217
3218 PN_VAR_VOL_HIST_PKG.DELETE_ROW(vol_hist_rec.vol_hist_id);
3219
3220 l_counter := l_counter + 1;
3221
3222 IF l_counter = 1000 THEN
3223 COMMIT;
3224 l_counter := 1;
3225 END IF;
3226
3227 END LOOP;
3228
3229 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.DELETE_VAR_VOL_HIST (-)');
3230
3231 END DELETE_VAR_VOL_HIST;
3232
3233 /*===========================================================================+
3234 | PROCEDURE
3235 | DELETE_VAR_BKPTS_HEAD
3236 |
3237 | DESCRIPTION
3238 | Delete breakpoint details records in PN_VAR_BKPTS_DET for a
3239 | line item record.
3240 |
3241 | SCOPE - PUBLIC
3242 |
3243 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
3244 | PN_VAR_LINES_PKG.DELETE_ROW
3245 |
3246 | ARGUMENTS : IN:
3247 | p_line_item_id
3248 |
3249 | OUT:
3250 |
3251 | RETURNS : None
3252 |
3253 | NOTES : Delete breakpoint details records in PN_VAR_BKPTS_DET for a
3254 | line item record.
3255 |
3256 | MODIFICATION HISTORY
3257 |
3258 | 17-NOV-2001 Daniel Thota o Created
3259 | 20-JAN-06 Pikhar o Used cursor to delete Breakpoint Headers
3260 +===========================================================================*/
3261
3262 PROCEDURE DELETE_VAR_BKPTS_HEAD(p_line_item_id IN NUMBER) IS
3263
3264 l_bkpt_header_id NUMBER := 0;
3265 l_bkptsdet_exISt NUMBER := NULL;
3266
3267 CURSOR c2 IS
3268 SELECT bkpt_header_id
3269 FROM pn_var_bkpts_head_all
3270 WHERE line_item_id = p_line_item_id;
3271
3272 BEGIN
3273
3274 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.DELETE_VAR_BKPTS_HEAD (+)');
3275
3276 FOR head_rec IN c2 LOOP
3277
3278 l_bkptsdet_exist := PN_VAR_RENT_PKG.find_if_bkptsdet_exist(head_rec.bkpt_header_id);
3279 -------------------------------------------------------------------------
3280 -- First DELETE breakpoINt details ASsociated with each breakpoINt header
3281 -------------------------------------------------------------------------
3282 IF l_bkptsdet_exist IS NOT NULL THEN
3283 PN_VAR_RENT_PKG.DELETE_VAR_BKPTS_DET(head_rec.bkpt_header_id);
3284 END IF;
3285 -----------------------------------------------------
3286 -- DELETE breakpoINt header ASsociated with each lINe
3287 -----------------------------------------------------
3288 PN_VAR_BKPTS_HEAD_PKG.DELETE_ROW(head_rec.bkpt_header_id);
3289
3290 END LOOP;
3291
3292 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.DELETE_VAR_BKPTS_HEAD (-)');
3293
3294 END DELETE_VAR_BKPTS_HEAD;
3295
3296 /*===========================================================================+
3297 | PROCEDURE
3298 | DELETE_VAR_BKPTS_DET
3299 |
3300 | DESCRIPTION
3301 | Delete breakpoint details records in PN_VAR_BKPTS_DET for a
3302 | breakpoint header record.
3303 |
3304 | SCOPE - PUBLIC
3305 |
3306 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
3307 | PN_VAR_LINES_PKG.DELETE_ROW
3308 |
3309 | ARGUMENTS : IN:
3310 | p_bkpt_header_id
3311 |
3312 | OUT:
3313 |
3314 | RETURNS : None
3315 |
3316 | NOTES : Delete breakpoint details records in PN_VAR_BKPTS_DET for a
3317 | breakpoint header record.
3318 |
3319 | MODIFICATION HISTORY
3320 |
3321 | 17-NOV-2001 Daniel Thota o Created
3322 +===========================================================================*/
3323
3324 PROCEDURE DELETE_VAR_BKPTS_DET(p_bkpt_header_id IN NUMBER) IS
3325
3326 l_counter NUMBER := 0;
3327
3328 CURSOR c1 IS
3329 SELECT bkpt_detail_id
3330 FROM pn_var_bkpts_det_ALL
3331 WHERE bkpt_header_id = p_bkpt_header_id;
3332
3333 BEGIN
3334
3335 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.DELETE_VAR_BKPTS_DET (+)');
3336
3337 FOR det_rec IN c1 LOOP
3338
3339 PN_VAR_BKPTS_DET_PKG.DELETE_ROW(det_rec.bkpt_detail_id);
3340
3341 END LOOP;
3342
3343 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.DELETE_VAR_BKPTS_DET (-)');
3344
3345 END DELETE_VAR_BKPTS_DET;
3346
3347 /*===========================================================================+
3348 | FUNCTION
3349 | FIND_IF_PERIOD_EXISTS
3350 |
3351 | DESCRIPTION
3352 | Finds if periods exists for a variable rent record
3353 |
3354 | SCOPE - PUBLIC
3355 |
3356 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
3357 |
3358 | ARGUMENTS : IN:
3359 | p_var_rent_id
3360 |
3361 | OUT:
3362 |
3363 | RETURNS : None
3364 |
3365 | NOTES : Finds if periods exists for a variable rent record
3366 |
3367 | MODIFICATION HISTORY
3368 |
3369 | 05-SEP-2001 Daniel Thota o Created
3370 +===========================================================================*/
3371
3372 FUNCTION find_if_period_exists (p_var_rent_id NUMBER) RETURN NUMBER IS
3373
3374 l_period_exists NUMBER;
3375
3376 BEGIN
3377
3378 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.FIND_IF_PERIOD_EXISTS (+)');
3379
3380 SELECT 1
3381 INTO l_period_exists
3382 FROM dual
3383 WHERE EXISTS ( SELECT periods.period_id
3384 FROM pn_var_periods_ALL periods
3385 WHERE periods.var_rent_id = p_var_rent_id);
3386
3387 RETURN l_period_exists;
3388
3389 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.FIND_IF_PERIOD_EXISTS (-)');
3390
3391 EXCEPTION
3392
3393 WHEN OTHERS THEN
3394 RETURN NULL;
3395
3396 END find_if_period_exists;
3397
3398
3399 /*===========================================================================+
3400 | FUNCTION
3401 | FIND_IF_CALCULATION_EXISTS
3402 |
3403 | DESCRIPTION
3404 | Finds if calculation has been done for this variable rent.
3405 |
3406 | SCOPE - PUBLIC
3407 |
3408 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
3409 |
3410 | ARGUMENTS : IN:
3411 | p_var_rent_id
3412 |
3413 | OUT:
3414 |
3415 | RETURNS : None
3416 |
3417 | NOTES : Finds if calculation has been done for this variable rent.
3418 |
3419 | MODIFICATION HISTORY
3420 |
3421 | 26-02-2007 piagrawa o Created
3422 +===========================================================================*/
3423
3424 FUNCTION find_if_calculation_exists (p_var_rent_id NUMBER) RETURN NUMBER IS
3425
3426 l_calculation_exists NUMBER;
3427
3428 BEGIN
3429
3430 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.FIND_IF_CALCULATION_EXISTS (+)');
3431
3432 SELECT 1
3433 INTO l_calculation_exists
3434 FROM dual
3435 WHERE EXISTS ( SELECT inv.var_rent_inv_id
3436 FROM pn_var_rent_inv_all inv
3437 WHERE inv.var_rent_id = p_var_rent_id);
3438
3439 RETURN l_calculation_exists;
3440
3441 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.FIND_IF_CALCULATION_EXISTS (-)');
3442
3443 EXCEPTION
3444
3445 WHEN OTHERS THEN
3446 RETURN NULL;
3447
3448 END find_if_calculation_exists;
3449
3450 /*===========================================================================+
3451 | FUNCTION
3452 | FIND_IF_INVOICE_EXISTS
3453 |
3454 | DESCRIPTION
3455 | Finds if invoices exists for a variable rent record
3456 |
3457 | SCOPE - PUBLIC
3458 |
3459 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
3460 |
3461 | ARGUMENTS : IN:
3462 | p_var_rent_id
3463 |
3464 | OUT:
3465 |
3466 | RETURNS : None
3467 |
3468 | NOTES : Finds if invoices exists for a variable rent record
3469 |
3470 | MODIFICATION HISTORY
3471 |
3472 | 11-JAN-2007 Ram kumar o Created
3473 +===========================================================================*/
3474
3475 FUNCTION find_if_invoice_exists (p_var_rent_id NUMBER) RETURN NUMBER IS
3476
3477 l_invoice_exists NUMBER;
3478
3479 BEGIN
3480
3481 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.FIND_IF_INVOICE_EXISTS (+)');
3482
3483 SELECT 1
3484 INTO l_invoice_exists
3485 FROM dual
3486 WHERE EXISTS ( SELECT inv.var_rent_inv_id
3487 FROM pn_var_rent_inv_all inv
3488 WHERE inv.var_rent_id = p_var_rent_id);
3489
3490 RETURN l_invoice_exists;
3491
3492 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.FIND_IF_INVOICE_EXISTS (-)');
3493
3494 EXCEPTION
3495
3496 WHEN OTHERS THEN
3497 RETURN NULL;
3498
3499 END find_if_invoice_exists;
3500
3501 /*===========================================================================+
3502 | PROCEDURE
3503 | DELETE_VAR_RENT_INVOICES
3504 |
3505 | DESCRIPTION
3506 | Deletes variable rent Volumes, Deductions, Invoices and Terms created
3507 | for a variable rent record
3508 |
3509 | SCOPE - PUBLIC
3510 |
3511 | ARGUMENTS : IN:
3512 | p_var_rent_id
3513 | p_term_date
3514 |
3515 | OUT:
3516 |
3517 | RETURNS : None
3518 |
3519 | NOTES :
3520 |
3521 | MODIFICATION HISTORY
3522 |
3523 | 12-Jan-2007 Ram kumar o Created
3524 +===========================================================================*/
3525
3526 PROCEDURE DELETE_VAR_RENT_INVOICES(p_var_rent_id IN NUMBER,
3527 p_term_date IN DATE ) IS
3528
3529 l_lines_exist NUMBER := NULL;
3530 l_constr_exist NUMBER := NULL;
3531 l_date DATE;
3532 l_volhist_exist NUMBER;
3533 l_deduct_exist NUMBER;
3534 l_counter NUMBER;
3535
3536 CURSOR c1 is
3537 SELECT line_item_id
3538 FROM pn_var_lines
3539 WHERE period_id IN (SELECT period_id
3540 FROM pn_var_periods_ALL
3541 WHERE var_rent_id = p_var_rent_id
3542 AND start_date > l_date
3543 AND end_date > l_date);
3544
3545
3546 BEGIN
3547
3548 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.DELETE_VAR_RENT_INVOICES (+)');
3549
3550 l_date := NVL(p_term_date,(TO_DATE('01/01/1776','mm/dd/yyyy')));
3551
3552 l_lines_exist := PN_VAR_RENT_PKG.find_if_lines_exist(p_var_rent_id, NULL, l_date);
3553
3554 l_constr_exist:= PN_VAR_RENT_PKG.find_if_constr_exist(p_var_rent_id, l_date);
3555
3556 DELETE FROM pn_payment_items_all
3557 WHERE payment_term_id IN
3558 (SELECT payment_term_id
3559 FROM pn_payment_terms_all
3560 WHERE var_rent_inv_id IN
3561 (SELECT var_rent_inv_id
3562 FROM pn_var_rent_inv_all
3563 WHERE var_rent_id = p_var_rent_id
3564 )
3565 )
3566 AND export_to_ar_flag <>'Y' ;
3567
3568 DELETE FROM pn_payment_schedules_all
3569 WHERE payment_schedule_id IN
3570 (SELECT payment_schedule_id
3571 FROM pn_payment_items_all
3572 WHERE export_to_ar_flag <>'Y'
3573 AND payment_term_id IN
3574 (SELECT payment_term_id
3575 FROM pn_payment_terms
3576 WHERE VAR_RENT_INV_ID IN
3577 (SELECT var_rent_inv_id
3578 FROM pn_var_rent_inv_all
3579 WHERE var_rent_id = p_var_rent_id
3580 )
3581 )
3582 )
3583 AND payment_status_lookup_code <>'APPROVED';
3584
3585 DELETE FROM pn_var_rent_summ
3586 WHERE var_rent_id = p_var_rent_id;
3587
3588 IF SQL%NOTFOUND THEN
3589 NULL;
3590 END IF;
3591
3592 DELETE FROM pn_payment_terms
3593 WHERE var_rent_inv_id IN
3594 (SELECT var_rent_inv_id
3595 FROM pn_var_rent_inv_all
3596 WHERE var_rent_id = p_var_rent_id)
3597 AND NOT EXISTS
3598 (SELECT 1
3599 FROM pn_payment_items
3600 WHERE export_to_ar_flag ='Y'
3601 AND payment_term_id IN
3602 (SELECT payment_term_id
3603 FROM pn_payment_terms
3604 WHERE VAR_RENT_INV_ID IN
3605 (SELECT VAR_RENT_INV_ID
3606 FROM PN_VAR_RENT_INV_ALL
3607 WHERE VAR_RENT_ID = p_var_rent_id
3608 )
3609 )
3610 );
3611
3612 IF SQL%NOTFOUND THEN
3613 NULL;
3614 END IF;
3615
3616 DELETE FROM pn_var_rent_inv
3617 WHERE var_rent_id = p_var_rent_id;
3618
3619 IF SQL%NOTFOUND THEN
3620 NULL;
3621 END IF;
3622
3623 FOR lines_rec IN c1 LOOP
3624
3625 l_volhist_exist := PN_VAR_RENT_PKG.find_if_volhist_exist(lines_rec.line_item_id);
3626 -------------------------------------------------------------------------
3627 -- First delete volume history associated with each line associated with each
3628 -- period for this variable rent record
3629 -------------------------------------------------------------------------
3630 IF l_volhist_exist IS NOT NULL THEN
3631 PN_VAR_RENT_PKG.DELETE_VAR_VOL_HIST(lines_rec.line_item_id);
3632 END IF;
3633
3634 l_deduct_exist := PN_VAR_RENT_PKG.find_if_deduct_exist(lines_rec.line_item_id);
3635 -------------------------------------------------------------------------
3636 -- First delete deductions associated with each line associated with each
3637 -- period for this variable rent record
3638 -------------------------------------------------------------------------
3639 IF l_deduct_exist IS NOT NULL THEN
3640 PN_VAR_RENT_PKG.DELETE_VAR_RENT_DEDUCT(lines_rec.line_item_id);
3641 END IF;
3642
3643 END LOOP;
3644
3645 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.DELETE_VAR_RENT_INVOICES (-)');
3646
3647 END DELETE_VAR_RENT_INVOICES;
3648
3649 /*===========================================================================+
3650 | FUNCTION
3651 | FIND_IF_VRDATES_EXISTS
3652 |
3653 | DESCRIPTION
3654 | Finds if Variable Rent Dates exists for a variable rent record
3655 |
3656 | SCOPE - PUBLIC
3657 |
3658 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
3659 |
3660 | ARGUMENTS : IN:
3661 | p_var_rent_id
3662 |
3663 | OUT:
3664 |
3665 | RETURNS : None
3666 |
3667 | NOTES : Finds if Variable Rent Dates exists for a variable rent record
3668 |
3669 | MODIFICATION HISTORY
3670 |
3671 | 12-OCT-2001 Daniel Thota o Created
3672 +===========================================================================*/
3673
3674 FUNCTION find_if_vrdates_exists (p_var_rent_id NUMBER) RETURN NUMBER IS
3675
3676 l_vrdates_exists NUMBER;
3677
3678 BEGIN
3679
3680 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.FIND_IF_VRDATES_EXISTS (+)');
3681
3682 SELECT 1
3683 INTO l_vrdates_exists
3684 FROM dual
3685 WHERE EXISTS ( SELECT dates.var_rent_date_id
3686 FROM pn_var_rent_dates_ALL dates
3687 WHERE dates.var_rent_id = p_var_rent_id);
3688
3689 RETURN l_vrdates_exists;
3690
3691 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.FIND_IF_VRDATES_EXISTS (-)');
3692
3693 EXCEPTION
3694
3695 WHEN OTHERS THEN
3696 RETURN NULL;
3697
3698 END find_if_vrdates_exists;
3699
3700 /*===========================================================================+
3701 | FUNCTION
3702 | FIND_IF_LINES_EXIST
3703 |
3704 | DESCRIPTION
3705 | Finds if Variable Rent Lines exist for a variable rent record
3706 |
3707 | SCOPE - PUBLIC
3708 |
3709 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
3710 |
3711 | ARGUMENTS : IN:
3712 | p_var_rent_id
3713 | p_period_id
3714 | p_term_date
3715 |
3716 | OUT:
3717 |
3718 | RETURNS : None
3719 |
3720 | NOTES : Finds if Variable Rent Lines exist for a variable rent record
3721 |
3722 | MODIFICATION HISTORY
3723 |
3724 | 15-OCT-2001 Daniel Thota o Created
3725 | 27-DEC-2001 Daniel Thota o Included parameter p_term_date for contraction.
3726 +===========================================================================*/
3727
3728 FUNCTION find_if_lines_exist (p_var_rent_id NUMBER,
3729 p_period_id NUMBER,
3730 p_term_date DATE) RETURN NUMBER IS
3731
3732 l_lines_exist NUMBER;
3733 l_date DATE;
3734
3735 BEGIN
3736
3737 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.FIND_IF_LINES_EXIST (+)');
3738
3739 l_date := nvl(p_term_date,(to_date('01/01/1776','mm/dd/yyyy')));
3740
3741 SELECT 1
3742 INTO l_lines_exist
3743 FROM dual
3744 WHERE EXISTS ( SELECT line_item_id
3745 FROM pn_var_lines_ALL
3746 WHERE period_id IN (SELECT period_id
3747 FROM pn_var_periods_ALL
3748 WHERE var_rent_id = p_var_rent_id
3749 AND period_id = NVL(p_period_id,period_id)
3750 AND start_date > l_date
3751 AND end_date > l_date)
3752 );
3753
3754 RETURN l_lines_exist;
3755
3756 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.FIND_IF_LINES_EXIST (-)');
3757
3758 EXCEPTION
3759
3760 WHEN OTHERS THEN
3761 RETURN NULL;
3762
3763 END find_if_lines_exist;
3764
3765 /*===========================================================================+
3766 | FUNCTION
3767 | FIND_IF_VOLHIST_EXIST
3768 |
3769 | DESCRIPTION
3770 | Finds if Variable Rent Lines volume history exists for a variable rent record
3771 |
3772 | SCOPE - PUBLIC
3773 |
3774 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
3775 |
3776 | ARGUMENTS : IN:
3777 | p_line_item_id
3778 |
3779 | OUT:
3780 |
3781 | RETURNS : None
3782 |
3783 | NOTES : Finds if Variable Rent Lines volume history exists for a variable rent record
3784 |
3785 | MODIFICATION HISTORY
3786 |
3787 | 30-NOV-2001 Daniel Thota o Created
3788 +===========================================================================*/
3789
3790 FUNCTION find_if_volhist_exist (p_line_item_id NUMBER) RETURN NUMBER IS
3791
3792 l_volhist_exist NUMBER;
3793
3794 BEGIN
3795
3796 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.FIND_IF_VOLHIST_EXIST (+)');
3797
3798 SELECT 1
3799 INTO l_volhist_exist
3800 FROM dual
3801 WHERE EXISTS ( SELECT vol_hist_id
3802 FROM pn_var_vol_hist_ALL
3803 WHERE line_item_id = p_line_item_id
3804 );
3805
3806 RETURN l_volhist_exist;
3807
3808 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.FIND_IF_VOLHIST_EXIST (-)');
3809
3810 EXCEPTION
3811
3812 WHEN OTHERS THEN
3813 RETURN NULL;
3814
3815 END find_if_volhist_exist;
3816
3817 /*===========================================================================+
3818 | FUNCTION
3819 | FIND_IF_VOLHIST_APPROVED_EXIST
3820 |
3821 | DESCRIPTION
3822 | Finds if Variable Rent Lines volume history exists for a variable rent record
3823 | in approved status
3824 |
3825 | SCOPE - PUBLIC
3826 |
3827 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
3828 |
3829 | ARGUMENTS : IN:
3830 | p_line_item_id
3831 |
3832 | OUT:
3833 |
3834 | RETURNS : None
3835 |
3836 | NOTES : Finds if Variable Rent Lines volume history exists for a variable rent record
3837 | in approved status
3838 |
3839 | MODIFICATION HISTORY
3840 |
3841 | 15-JUN-2004 Chris Thangaiyan o Created
3842 +===========================================================================*/
3843
3844 FUNCTION find_if_volhist_approved_exist (p_line_item_id NUMBER
3845 ,p_grp_date_id NUMBER)
3846 RETURN VARCHAR2 IS
3847
3848 l_volhist_approved_exist VARCHAR2(1);
3849
3850 BEGIN
3851
3852 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.FIND_IF_VOLHIST_APPROVED_EXIST (+)');
3853
3854 SELECT 'Y'
3855 INTO l_volhist_approved_exist
3856 FROM dual
3857 WHERE EXISTS ( SELECT vol_hist_id
3858 FROM pn_var_vol_hist_all
3859 WHERE line_item_id = p_line_item_id
3860 AND grp_date_id = p_grp_date_id
3861 AND vol_hist_status_code = 'APPROVED'
3862 );
3863
3864 RETURN l_volhist_approved_exist;
3865
3866 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.FIND_IF_VOLHIST_APPROVED_EXIST (-)');
3867
3868 EXCEPTION
3869
3870 WHEN OTHERS THEN
3871 RETURN 'N';
3872
3873 END find_if_volhist_approved_exist;
3874
3875 /*===========================================================================+
3876 | FUNCTION
3877 | FIND_IF_VOLHIST_BKPTS_EXIST
3878 |
3879 | DESCRIPTION
3880 | Finds if Variable Rent Lines volume history, Breakpoint Header and
3881 | Breakpoints Details exists for a variable rent record.
3882 |
3883 | SCOPE - PUBLIC
3884 |
3885 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
3886 |
3887 | ARGUMENTS : IN:
3888 | p_id ( maybe a line_item_id OR period_id OR var_rent_id )
3889 | p_id_type ( valid values are 'LINE_ITEM_ID' or 'PERIOD_ID' or 'VAR_RENT_ID' )
3890 |
3891 | OUT:
3892 |
3893 | RETURNS : NUMBER
3894 |
3895 | NOTES : Finds if Variable Rent Lines volume history, Breakpoint Header and
3896 | Breakpoints Details exists for a variable rent record.
3897 |
3898 | IMP NOTE : 1. p_id may be line_item_id OR period_id OR var_rent_id
3899 | 2. p_id_type can take on values
3900 | a. 'LINE_ITEM_ID' or
3901 | b. 'PERIOD_ID' or
3902 | c. 'VAR_RENT_ID'
3903 |
3904 | MODIFICATION HISTORY
3905 |
3906 | 26-JUN-2002 Kiran Hegde o Created. Fix for bug#2173867.
3907 +===========================================================================*/
3908
3909 FUNCTION find_if_volhist_bkpts_exist ( p_id NUMBER,
3910 p_id_type VARCHAR2 )
3911 RETURN NUMBER IS
3912
3913 CURSOR c_bkptshd_line_item ( p_id IN NUMBER ) IS
3914 SELECT bkpt_header_id, line_item_id
3915 FROM pn_var_bkpts_head_ALL
3916 WHERE line_item_id = p_id;
3917
3918 CURSOR c_bkptshd_period ( p_id IN NUMBER ) IS
3919 SELECT bkpt_header_id, line_item_id
3920 FROM pn_var_bkpts_head_ALL
3921 WHERE period_id = p_id;
3922
3923 CURSOR c_bkptshd_var_rent ( p_id IN NUMBER ) IS
3924 SELECT bkpt_header_id, line_item_id
3925 FROM pn_var_bkpts_head_ALL
3926 WHERE period_id IN ( SELECT period_id
3927 FROM pn_var_periods_ALL
3928 WHERE var_rent_id = p_id );
3929
3930 l_volhist_bkpts_exist NUMBER := NULL;
3931
3932 BEGIN
3933
3934 IF p_id_type = 'LINE_ITEM_ID' THEN
3935
3936 FOR i IN c_bkptshd_line_item( p_id ) LOOP
3937 IF PN_VAR_RENT_PKG.find_if_volhist_exist( i.line_item_id ) IS NOT NULL THEN
3938 l_volhist_bkpts_exist := PN_VAR_RENT_PKG.find_if_bkptsdet_exist( i.bkpt_header_id );
3939 IF l_volhist_bkpts_exist IS NOT NULL THEN
3940 RETURN l_volhist_bkpts_exist;
3941 END IF;
3942 END IF;
3943 END LOOP;
3944
3945 ELSIF p_id_type = 'PERIOD_ID' THEN
3946
3947 FOR i in c_bkptshd_period ( p_id ) LOOP
3948 IF PN_VAR_RENT_PKG.find_if_volhist_exist( i.line_item_id ) IS NOT NULL THEN
3949 l_volhist_bkpts_exist := PN_VAR_RENT_PKG.find_if_bkptsdet_exist( i.bkpt_header_id );
3950 IF l_volhist_bkpts_exist IS NOT NULL THEN
3951 RETURN l_volhist_bkpts_exist;
3952 END IF;
3953 END IF;
3954 END LOOP;
3955
3956 ELSIF p_id_type = 'VAR_RENT_ID' THEN
3957
3958 FOR i IN c_bkptshd_var_rent ( p_id ) LOOP
3959 IF PN_VAR_RENT_PKG.find_if_volhist_exist( i.line_item_id ) IS NOT NULL THEN
3960 l_volhist_bkpts_exist := PN_VAR_RENT_PKG.find_if_bkptsdet_exist( i.bkpt_header_id );
3961 IF l_volhist_bkpts_exist IS NOT NULL THEN
3962 RETURN l_volhist_bkpts_exist;
3963 END IF;
3964 END IF;
3965 END LOOP;
3966
3967 END IF;
3968
3969 RETURN l_volhist_bkpts_exist;
3970
3971 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.FIND_IF_BKPTS_EXIST (+)');
3972
3973 END find_if_volhist_bkpts_exist;
3974
3975 /*===========================================================================+
3976 | FUNCTION
3977 | FIND_IF_CONSTR_EXIST
3978 |
3979 | DESCRIPTION
3980 | Finds if Variable Rent Constraints exist for a variable rent period record
3981 |
3982 | SCOPE - PUBLIC
3983 |
3984 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
3985 |
3986 | ARGUMENTS : IN:
3987 | p_var_rent_id
3988 | p_term_date
3989 |
3990 | OUT:
3991 |
3992 | RETURNS : None
3993 |
3994 | NOTES : Finds if Variable Rent Constraints exist for a variable rent period record
3995 |
3996 | MODIFICATION HISTORY
3997 |
3998 | 03-DEC-2001 Daniel Thota o Created
3999 | 27-DEC-2001 Daniel Thota o Included parameter p_term_date for contraction.
4000 +===========================================================================*/
4001
4002 FUNCTION FIND_IF_CONSTR_EXIST (p_var_rent_id NUMBER,
4003 p_term_date DATE )
4004 RETURN NUMBER IS
4005
4006 l_constr_exist NUMBER;
4007 l_date DATE;
4008
4009 BEGIN
4010
4011 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.FIND_IF_CONSTR_EXIST (+)');
4012
4013 l_date := NVL(p_term_date,(TO_DATE('01/01/1776','mm/dd/yyyy')));
4014
4015 SELECT 1
4016 INTO l_constr_exist
4017 FROM dual
4018 WHERE EXISTS ( SELECT constraint_id
4019 FROM pn_var_constraints_ALL
4020 WHERE period_id IN (SELECT period_id
4021 FROM PN_VAR_PERIODS_ALL
4022 WHERE var_rent_id = p_var_rent_id
4023 AND start_date > l_date
4024 AND end_date > l_date)
4025 );
4026
4027 RETURN l_constr_exist;
4028
4029 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.FIND_IF_CONSTR_EXIST (-)');
4030
4031 EXCEPTION
4032
4033 WHEN OTHERS THEN
4034 RETURN NULL;
4035
4036 END FIND_IF_CONSTR_EXIST;
4037
4038 /*===========================================================================+
4039 | FUNCTION
4040 | FIND_IF_ABAT_DEF_EXIST
4041 |
4042 | DESCRIPTION
4043 | Finds if Fixed abatements and rolling allowances exist for a variable rent
4044 |
4045 | SCOPE - PUBLIC
4046 |
4047 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
4048 |
4049 | ARGUMENTS : IN:
4050 | p_var_rent_id
4051 |
4052 |
4053 | OUT:
4054 |
4055 | RETURNS : None
4056 |
4057 | NOTES : Finds if Fixed abatements and rolling allowances exist for a variable rent
4058 | craeted at the time of setup
4059 | MODIFICATION HISTORY
4060 |
4061 | 15-MAY-2007 Lokesh o Created for Bug # 6053747
4062 |
4063 +===========================================================================*/
4064
4065 FUNCTION FIND_IF_ABAT_DEF_EXIST (p_var_rent_id NUMBER)
4066 RETURN NUMBER IS
4067
4068 l_abat_exist NUMBER;
4069
4070 BEGIN
4071
4072 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.FIND_IF_ABAT_DEF_EXIST (+)');
4073
4074 SELECT 1
4075 INTO l_abat_exist
4076 FROM dual
4077 WHERE EXISTS ( SELECT NULL
4078 FROM pn_var_abat_defaults_all
4079 WHERE var_rent_id = p_var_rent_id
4080 );
4081
4082 RETURN l_abat_exist;
4083
4084 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.FIND_IF_ABAT_DEF_EXIST (-)');
4085
4086 EXCEPTION
4087
4088 WHEN OTHERS THEN
4089 RETURN NULL;
4090
4091 END FIND_IF_ABAT_DEF_EXIST;
4092
4093 /*===========================================================================+
4094 | FUNCTION
4095 | FIND_IF_CONSTR_DEF_EXIST
4096 |
4097 | DESCRIPTION
4098 | Finds if Variable Rent Constraints exist for a variable rent
4099 |
4100 | SCOPE - PUBLIC
4101 |
4102 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
4103 |
4104 | ARGUMENTS : IN:
4105 | p_var_rent_id
4106 |
4107 |
4108 | OUT:
4109 |
4110 | RETURNS : None
4111 |
4112 | NOTES : Finds if Variable Rent Constraints exist for a variable rent created
4113 | at the time of setup
4114 |
4115 | MODIFICATION HISTORY
4116 |
4117 | 15-MAY-2007 Lokesh o Created Bug # 6053747
4118 |
4119 +===========================================================================*/
4120
4121 FUNCTION FIND_IF_CONSTR_DEF_EXIST (p_var_rent_id NUMBER)
4122 RETURN NUMBER IS
4123
4124 l_constr_exist NUMBER;
4125
4126 BEGIN
4127
4128 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.FIND_IF_CONSTR_DEF_EXIST (+)');
4129
4130 SELECT 1
4131 INTO l_constr_exist
4132 FROM dual
4133 WHERE EXISTS ( SELECT NULL
4134 FROM pn_var_constr_defaults_all
4135 WHERE var_rent_id = p_var_rent_id
4136 );
4137
4138 RETURN l_constr_exist;
4139
4140 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.FIND_IF_CONSTR_DEF_EXIST (-)');
4141
4142 EXCEPTION
4143
4144 WHEN OTHERS THEN
4145 RETURN NULL;
4146
4147 END FIND_IF_CONSTR_DEF_EXIST;
4148
4149 /*===========================================================================+
4150 | FUNCTION
4151 | FIND_IF_DEDUCT_EXIST
4152 |
4153 | DESCRIPTION
4154 | Finds if Variable Rent Deductions exist for a variable rent line record
4155 |
4156 | SCOPE - PUBLIC
4157 |
4158 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
4159 |
4160 | ARGUMENTS : IN:
4161 | p_line_item_id
4162 |
4163 | OUT:
4164 |
4165 | RETURNS : None
4166 |
4167 | NOTES : Finds if Variable Rent Deductions exist for a variable rent line record
4168 |
4169 | MODIFICATION HISTORY
4170 |
4171 | 03-DEC-2001 Daniel Thota o Created
4172 +===========================================================================*/
4173
4174 FUNCTION find_if_deduct_exist (p_line_item_id NUMBER) RETURN NUMBER IS
4175
4176 l_deduct_exist NUMBER;
4177
4178 BEGIN
4179
4180 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.FIND_IF_DEDUCT_EXIST (+)');
4181
4182 SELECT 1
4183 INTO l_deduct_exist
4184 FROM dual
4185 WHERE EXISTS ( SELECT deduction_id
4186 FROM pn_var_deductions_ALL
4187 WHERE line_item_id = p_line_item_id
4188 );
4189
4190 RETURN l_deduct_exist;
4191
4192 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.FIND_IF_DEDUCT_EXIST (-)');
4193
4194 EXCEPTION
4195
4196 WHEN OTHERS THEN
4197 RETURN NULL;
4198
4199 END find_if_deduct_exist;
4200
4201 /*===========================================================================+
4202 | FUNCTION
4203 | LOCK_ROW_EXCEPTION
4204 |
4205 | DESCRIPTION
4206 | Gives the statndard message for the offending column in a LOCK_ROW raised
4207 | exception
4208 |
4209 | SCOPE - PUBLIC
4210 |
4211 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
4212 |
4213 | ARGUMENTS : IN:
4214 | p_column_name, p_new_value
4215 |
4216 | OUT:
4217 |
4218 | RETURNS : None
4219 |
4220 | NOTES : Gives the statndard message for the offending column in a
4221 | LOCK_ROW raised exception
4222 |
4223 | MODIFICATION HISTORY
4224 |
4225 | 15-OCT-2001 Daniel Thota o Created
4226 +===========================================================================*/
4227
4228 PROCEDURE LOCK_ROW_EXCEPTION (p_column_name IN VARCHAR2,
4229 p_new_value IN VARCHAR2)
4230 IS
4231 BEGIN
4232 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.LOCK_ROW_EXCEPTION (+)');
4233
4234 fnd_message.set_name ('PN','PN_RECORD_CHANGED');
4235 fnd_message.set_token ('COLUMN_NAME',p_column_name);
4236 fnd_message.set_token ('NEW_VALUE',p_new_value);
4237 app_exception.raise_exception;
4238
4239 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.LOCK_ROW_EXCEPTION (-)');
4240 END lock_row_exception;
4241
4242 /*===========================================================================+
4243 | FUNCTION
4244 | First_Day
4245 |
4246 | DESCRIPTION
4247 | Gives the first day of a month given any date
4248 |
4249 | SCOPE - PUBLIC
4250 |
4251 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
4252 |
4253 | ARGUMENTS : IN:
4254 | p_Date
4255 |
4256 | OUT:
4257 |
4258 | RETURNS : None
4259 |
4260 | NOTES : Gives the first day of a month given any date
4261 |
4262 | MODIFICATION HISTORY
4263 |
4264 | 22-OCT-2001 Daniel Thota o Created
4265 +===========================================================================*/
4266
4267 FUNCTION First_Day ( p_Date DATE ) RETURN DATE IS
4268 BEGIN
4269 RETURN ADD_MONTHS(LAST_DAY(p_Date) + 1, -1);
4270 END First_Day;
4271
4272 /*===========================================================================+
4273 | FUNCTION
4274 | FIND_REPORTING_PERIODS
4275 |
4276 | DESCRIPTION
4277 | Finds the number of reporting periods in a period given a period_id
4278 |
4279 | SCOPE - PUBLIC
4280 |
4281 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
4282 |
4283 | ARGUMENTS : IN:
4284 | p_period_id
4285 |
4286 | OUT:
4287 |
4288 | RETURNS : None
4289 |
4290 | NOTES : Finds the number of reporting periods in a period given a period_id
4291 |
4292 | MODIFICATION HISTORY
4293 |
4294 | 26-OCT-2001 Daniel Thota o Created
4295 | 14-JUL-05 hareesha o Bug 4284035 - Replaced pn_var_grp_dates with _ALL table.
4296 +===========================================================================*/
4297
4298 FUNCTION find_reporting_periods (p_period_id NUMBER) RETURN NUMBER IS
4299
4300 l_reporting_periods NUMBER;
4301
4302 BEGIN
4303
4304 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.FIND_REPORTING_PERIODS (+)');
4305
4306 SELECT count(GRP_START_DATE)
4307 INTO l_reporting_periods
4308 FROM pn_var_grp_dates_all
4309 WHERE period_id = p_period_id;
4310
4311 RETURN l_reporting_periods;
4312
4313 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.FIND_REPORTING_PERIODS (-)');
4314
4315 EXCEPTION
4316
4317 WHEN OTHERS THEN
4318 RETURN NULL;
4319
4320 END find_reporting_periods;
4321
4322 /*==============================================================================+
4323 | FUNCTION
4324 | FIND_REPORTING_PERIODS
4325 |
4326 | DESCRIPTION
4327 | Finds the number of reporting periods in a period given a p_freq_code
4328 |
4329 | SCOPE - PUBLIC
4330 |
4331 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
4332 |
4333 | ARGUMENTS : IN: p_freq_code
4334 | OUT: l_reporting_periods
4335 |
4336 | RETURNS : None
4337 |
4338 | NOTES : Finds the number of reporting periods in a period given a
4339 | p_freq_code
4340 |
4341 | MODIFICATION HISTORY
4342 |
4343 | 12-APR-06 Pikhar o Created
4344 +==============================================================================*/
4345
4346 FUNCTION find_reporting_periods (p_freq_code VARCHAR2) RETURN NUMBER IS
4347
4348 l_reporting_periods NUMBER;
4349
4350 BEGIN
4351
4352 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.FIND_REPORTING_PERIODS (+)');
4353
4354 IF p_freq_code = 'MON' THEN
4355
4356 RETURN 12;
4357
4358 ELSIF p_freq_code = 'QTR' THEN
4359
4360 RETURN 4;
4361
4362 ELSIF p_freq_code = 'SA' THEN
4363
4364 RETURN 2;
4365
4366 ELSIF p_freq_code = 'YR' THEN
4367
4368 RETURN 1;
4369
4370 END IF;
4371
4372 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.FIND_REPORTING_PERIODS (-)');
4373
4374 RETURN l_reporting_periods;
4375
4376 EXCEPTION
4377
4378 WHEN OTHERS THEN
4379 RETURN NULL;
4380
4381 END find_reporting_periods;
4382
4383 /*===========================================================================+
4384 | FUNCTION
4385 | CALCULATE_BASE_RENT
4386 |
4387 | DESCRIPTION
4388 | Calculates the base rent for a period given a var_rent_id and period_id
4389 |
4390 | SCOPE - PUBLIC
4391 |
4392 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
4393 |
4394 | ARGUMENTS : IN:
4395 | p_var_rent_id
4396 | p_period_id
4397 | p_base_rent_type
4398 |
4399 | OUT:
4400 |
4401 | RETURNS : None
4402 |
4403 | NOTES : Calculates the base rent for a period given a var_rent_id,
4404 | period_id and base_rent_type
4405 |
4406 | MODIFICATION HISTORY
4407 |
4408 | 15-NOV-01 Daniel Thota o Created
4409 | 17-JAN-02 Daniel Thota o Added p_base_rent_type
4410 | 26-DEC-02 Daniel Thota o Removed the foll. predicate to fix bug # 2696773
4411 | term.start_date>= FIRST_DAY(per.start_date)
4412 | 14-JUN-05 hareesha o Bug 4284035 - Replaced pn_payment_schedules with _ALL table.
4413 +===========================================================================*/
4414
4415 FUNCTION CALCULATE_BASE_RENT (p_var_rent_id NUMBER,
4416 p_period_id NUMBER,
4417 p_base_rent_type VARCHAR2) RETURN NUMBER IS
4418
4419 l_base_rent NUMBER;
4420
4421 BEGIN
4422
4423 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.CALCULATE_BASE_RENT (+)');
4424
4425 IF (p_base_rent_type = 'ROLLING') THEN
4426
4427 SELECT SUM(item.ACTUAL_AMOUNT)
4428 INTO l_base_rent
4429 FROM pn_payment_items_ALL item,
4430 pn_payment_terms_ALL term,
4431 pn_var_periods_ALL per,
4432 pn_var_rents_ALL var,
4433 pn_payment_schedules_all sched
4434 WHERE item.PAYMENT_TERM_ID = term.PAYMENT_TERM_ID
4435 AND sched.PAYMENT_SCHEDULE_ID = item.PAYMENT_SCHEDULE_ID
4436 AND term.lease_id = var.lease_id
4437 AND var.var_rent_id = p_var_rent_id
4438 AND per.period_id = p_period_id
4439 AND per.var_rent_id = p_var_rent_id
4440 AND sched.SCHEDULE_DATE >= FIRST_DAY(per.start_date)
4441 AND sched.SCHEDULE_DATE <= per.end_date
4442 AND term.PAYMENT_PURPOSE_CODE = 'RENT'
4443 AND term.PAYMENT_TERM_TYPE_CODE = 'BASER'
4444 AND term.start_date <= per.end_date
4445 AND term.end_date >= FIRST_DAY(per.start_date)
4446 AND item.PAYMENT_ITEM_TYPE_LOOKUP_CODE = 'CASH'
4447 AND term.currency_code = var.currency_code;
4448
4449 ELSIF (p_base_rent_type = 'FIXED') THEN
4450
4451 SELECT SUM(item.ACTUAL_AMOUNT)
4452 INTO l_base_rent
4453 FROM pn_payment_items_ALL item,
4454 pn_payment_terms_ALL term,
4455 pn_var_periods_ALL per,
4456 pn_var_rents_ALL var,
4457 pn_payment_schedules_all sched
4458 WHERE item.PAYMENT_TERM_ID = term.PAYMENT_TERM_ID
4459 AND sched.PAYMENT_SCHEDULE_ID = item.PAYMENT_SCHEDULE_ID
4460 AND term.lease_id = var.lease_id
4461 AND var.var_rent_id = p_var_rent_id
4462 AND per.period_num = 1
4463 AND per.var_rent_id = p_var_rent_id
4464 AND sched.SCHEDULE_DATE >= FIRST_DAY(per.start_date)
4465 AND sched.SCHEDULE_DATE <= per.end_date
4466 AND term.PAYMENT_PURPOSE_CODE = 'RENT'
4467 AND term.PAYMENT_TERM_TYPE_CODE = 'BASER'
4468 AND term.start_date <= per.end_date
4469 AND term.end_date >= FIRST_DAY(per.start_date)
4470 AND item.PAYMENT_ITEM_TYPE_LOOKUP_CODE = 'CASH'
4471 AND term.currency_code = var.currency_code;
4472
4473 END IF;
4474
4475 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.CALCULATE_BASE_RENT (-)');
4476
4477 RETURN l_base_rent;
4478
4479 EXCEPTION
4480
4481 WHEN OTHERS THEN
4482 RETURN NULL;
4483
4484 END CALCULATE_BASE_RENT;
4485
4486 /*===========================================================================+
4487 | FUNCTION
4488 | GET_GRP_DATE_INFO
4489 |
4490 | DESCRIPTION
4491 | Gets group date related info based on var_rent_id , period_id and start
4492 | and end dates given as input
4493 |
4494 | SCOPE - PUBLIC
4495 |
4496 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
4497 |
4498 | ARGUMENTS : IN:
4499 | p_var_rent_id
4500 | p_period_id
4501 | p_start_date
4502 | p_end_date
4503 |
4504 | OUT:
4505 |
4506 | RETURNS : None
4507 |
4508 | NOTES : Gets group date related info based on var_rent_id , period_id and star
4509 | and end dates given as input
4510 |
4511 | MODIFICATION HISTORY
4512 |
4513 | 16-NOV-01 Daniel Thota o Created
4514 | 21-NOV-03 Daniel Thota o Added forecasted_exp_code to SELECT -- Fix for bug # 2435455
4515 | 14-JUN-05 hareesha o Bug 4284035 - Replaced pn_var_grp_dates with _ALL table.
4516 +===========================================================================*/
4517
4518 FUNCTION get_grp_date_info (p_var_rent_id IN NUMBER,
4519 p_period_id IN NUMBER,
4520 p_start_date IN DATE,
4521 p_end_date IN DATE) RETURN GRP_DATE_INFO_REC
4522 IS
4523
4524 l_grp_date_info GRP_DATE_INFO_REC ;
4525
4526 BEGIN
4527
4528 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.GET_GRP_DATE_INFO (+)');
4529
4530 SELECT grp_date_id,
4531 grp_start_date,
4532 grp_end_date,
4533 group_date,
4534 reptg_due_date,
4535 inv_start_date,
4536 inv_end_date,
4537 invoice_date,
4538 inv_schedule_date,
4539 forecasted_exp_code
4540 INTO l_grp_date_info
4541 FROM pn_var_grp_dates_all
4542 WHERE var_rent_id = p_var_rent_id
4543 AND period_id = p_period_id
4544 AND grp_start_date <= p_start_date
4545 AND grp_start_date <= p_end_date
4546 AND grp_end_date >= p_start_date
4547 AND grp_end_date >= p_end_date
4548 AND rownum = 1;
4549
4550 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.GET_GRP_DATE_INFO (-)');
4551
4552 RETURN l_grp_date_info;
4553
4554 EXCEPTION
4555
4556 WHEN NO_DATA_FOUND THEN
4557 fnd_message.set_name ('PN','PN_VAR_CHECK_DATES');
4558 APP_EXCEPTION.Raise_Exception;
4559
4560 WHEN OTHERS THEN
4561 RETURN NULL;
4562
4563 END get_grp_date_info;
4564
4565 /*===========================================================================+
4566 | FUNCTION
4567 | GET_PRORATION_FACTOR
4568 |
4569 | DESCRIPTION
4570 | Gets proration factor information
4571 |
4572 | SCOPE - PUBLIC
4573 |
4574 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
4575 |
4576 | ARGUMENTS : IN:
4577 | p_var_rent_id
4578 |
4579 | OUT:
4580 |
4581 | RETURNS : None
4582 |
4583 | NOTES : Gets proration factor information
4584 |
4585 | MODIFICATION HISTORY
4586 |
4587 | 27-DEC-01 Daniel Thota o Created
4588 | 14-JUL-05 hareesha o Bug 4284035 - Replaced pn_var_grp_dates with _ALL table.
4589 +===========================================================================*/
4590
4591 FUNCTION get_proration_factor(p_var_rent_id IN NUMBER)
4592 RETURN PRORATION_FACTOR_REC IS
4593
4594 l_proration_factor PRORATION_FACTOR_REC ;
4595
4596 BEGIN
4597
4598 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.GET_PRORATION_FACTOR (+)');
4599
4600 SELECT
4601 (p1.end_date-p1.start_date)+1 first_period_pro_days,
4602 p1.proration_factor first_period_gl_days,
4603 (p2.end_date-p2.start_date)+1 last_period_pro_days,
4604 p2.proration_factor last_period_gl_days,
4605 (g1.grp_end_date-g1.grp_start_date)+1 first_group_pro_days,
4606 g1.proration_factor first_group_gl_days,
4607 (g2.grp_end_date-g2.grp_start_date)+1 last_group_pro_days,
4608 g2.proration_factor last_group_gl_days
4609 INTO l_proration_factor
4610 FROM pn_var_periods_ALL p1, pn_var_periods_ALL p2,
4611 pn_var_grp_dates_ALL g1, pn_var_grp_dates_ALL g2
4612 WHERE p1.var_rent_id = p2.var_rent_id
4613 AND p1.var_rent_id = p_var_rent_id
4614 AND g1.var_rent_id = g2.var_rent_id
4615 AND g1.var_rent_id = p_var_rent_id
4616 AND p1.period_id = (SELECT min(period_id)
4617 FROM pn_var_periods_ALL
4618 WHERE var_rent_id = p_var_rent_id)
4619 AND p2.period_id = (SELECT max(period_id)
4620 FROM pn_var_periods_ALL
4621 WHERE var_rent_id = p_var_rent_id)
4622 AND g1.grp_date_id = (SELECT min(grp_date_id)
4623 FROM pn_var_grp_dates
4624 WHERE var_rent_id = p_var_rent_id)
4625 AND g2.grp_date_id = (SELECT max(grp_date_id)
4626 FROM pn_var_grp_dates
4627 WHERE var_rent_id = p_var_rent_id);
4628
4629 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.GET_PRORATION_FACTOR (-)');
4630
4631 RETURN l_proration_factor;
4632
4633 EXCEPTION
4634
4635 WHEN NO_DATA_FOUND THEN
4636 RETURN NULL;
4637 WHEN OTHERS THEN
4638 RETURN NULL;
4639
4640 END get_proration_factor;
4641
4642 /*===========================================================================+
4643 | FUNCTION
4644 | FIND_IF_BKPTSHD_EXIST
4645 |
4646 | DESCRIPTION
4647 | Finds if Breakpoint header exists for a line item
4648 |
4649 | SCOPE - PUBLIC
4650 |
4651 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
4652 |
4653 | ARGUMENTS : IN:
4654 | p_line_item_id
4655 |
4656 | OUT:
4657 |
4658 | RETURNS : None
4659 |
4660 | NOTES : Finds if Breakpoint header exists for a line item
4661 |
4662 | MODIFICATION HISTORY
4663 |
4664 | 17-NOV-2001 Daniel Thota o Created
4665 +===========================================================================*/
4666
4667 FUNCTION find_if_bkptshd_exist (p_line_item_id NUMBER) RETURN NUMBER IS
4668
4669 l_bkptshd_exists NUMBER;
4670
4671 BEGIN
4672
4673 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.FIND_IF_BKPTSHD_EXIST (+)');
4674
4675 SELECT 1
4676 INTO l_bkptshd_exists
4677 FROM dual
4678 WHERE EXISTS ( SELECT head.bkpt_header_id
4679 FROM pn_var_bkpts_head_ALL head
4680 WHERE head.line_item_id = p_line_item_id);
4681
4682 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.FIND_IF_BKPTSHD_EXIST (-)');
4683
4684 RETURN l_bkptshd_exists;
4685
4686 EXCEPTION
4687
4688 WHEN OTHERS THEN
4689 RETURN NULL;
4690
4691 END find_if_bkptshd_exist;
4692
4693 /*===========================================================================+
4694 | FUNCTION
4695 | FIND_IF_BKPTSDET_EXIST
4696 |
4697 | DESCRIPTION
4698 | Finds if Breakpoint Details exist for a breakpoint header
4699 |
4700 | SCOPE - PUBLIC
4701 |
4702 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
4703 |
4704 | ARGUMENTS : IN:
4705 | p_bkpt_header_id
4706 |
4707 | OUT:
4708 |
4709 | RETURNS : None
4710 |
4711 | NOTES : Finds if Breakpoint Details exist for a breakpoint header
4712 |
4713 | MODIFICATION HISTORY
4714 |
4715 | 17-NOV-2001 Daniel Thota o Created
4716 +===========================================================================*/
4717
4718 FUNCTION find_if_bkptsdet_exist (p_bkpt_header_id NUMBER) RETURN NUMBER IS
4719
4720 l_bkptsdet_exist NUMBER;
4721
4722 BEGIN
4723
4724 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.FIND_IF_BKPTSDET_EXIST (+)');
4725
4726 SELECT 1
4727 INTO l_bkptsdet_exist
4728 FROM dual
4729 WHERE EXISTS ( SELECT det.bkpt_detail_id
4730 FROM pn_var_bkpts_det_ALL det
4731 WHERE det.bkpt_header_id = p_bkpt_header_id);
4732
4733 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.FIND_IF_BKPTSDET_EXIST (-)');
4734
4735 RETURN l_bkptsdet_exist;
4736
4737 EXCEPTION
4738
4739 WHEN OTHERS THEN
4740 RETURN NULL;
4741
4742 END find_if_bkptsdet_exist;
4743
4744 /*===========================================================================+
4745 | FUNCTION
4746 | FIND_IF_EXPORTED
4747 |
4748 | DESCRIPTION
4749 | Find if the given record has been exported.
4750 |
4751 | SCOPE - PUBLIC
4752 |
4753 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
4754 |
4755 | ARGUMENTS : IN:
4756 | p_id
4757 | p_block
4758 | p_start_dt
4759 | p_end_dt
4760 |
4761 | OUT:
4762 |
4763 | RETURNS : l_exported
4764 |
4765 | NOTES : Find if the given record has been exported.
4766 |
4767 | MODIFICATION HISTORY
4768 |
4769 | 17-NOV-01 Daniel Thota o Created
4770 | 16-Jan-03 Daniel Thota o Added code to check if exported from
4771 | pn_var_rent_inv_all table.
4772 | Fix for bug # 2722191
4773 | 30-NOV-04 abanerje o corrected the SELECT statement when
4774 | called FROM with p_block AS PERIODS_INV_BLK
4775 | Added brackets so that the join condition
4776 | IS evaluated correctly.
4777 | Bug 4026980
4778 | 14-JUL-05 hareesha o Bug 4284035 - Replaced pn_var_grp_dates with _ALL table.
4779 | 12-Mar-07 Shabda o Bug 5911819 - Volume records are considered exported
4780 | when actual or variance exp_code = y (Not forecasted exp_code)
4781 +===========================================================================*/
4782
4783 FUNCTION find_if_exported (p_id IN NUMBER,
4784 p_block IN VARCHAR2,
4785 p_start_dt IN DATE DEFAULT NULL,
4786 p_end_dt IN DATE DEFAULT NULL) RETURN NUMBER IS
4787
4788 l_exported NUMBER;
4789
4790 BEGIN
4791
4792 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.FIND_IF_EXPORTED (+)');
4793
4794 IF p_block IN('SUMMARY_FDR_BLK','VARENT_DATES_BLK') THEN
4795
4796 SELECT 1
4797 INTO l_exported
4798 FROM dual
4799 WHERE EXISTS ( SELECT grp_date_id
4800 FROM pn_var_grp_dates_all
4801 WHERE var_rent_id = p_id
4802 AND (actual_exp_code = 'Y' OR
4803 forecasted_exp_code = 'Y')
4804 );
4805
4806 ELSIF p_block IN('CONSTRAINTS_BLK') THEN
4807
4808 SELECT 1
4809 INTO l_exported
4810 FROM dual
4811 WHERE EXISTS ( SELECT grp_date_id
4812 FROM pn_var_grp_dates_all
4813 WHERE period_id = p_id
4814 AND (actual_exp_code = 'Y' OR
4815 forecasted_exp_code = 'Y')
4816 );
4817
4818 ELSIF p_block IN('LINE_ITEMS_BLK','BKPTS_HEADER_BLK','BKPTS_DETAIL_BLK','DEDUCTIONS_BLK') THEN
4819
4820 SELECT 1
4821 INTO l_exported
4822 FROM dual
4823 WHERE EXISTS ( SELECT grp_date_id
4824 FROM pn_var_grp_dates_all
4825 WHERE period_id IN (SELECT period_id
4826 FROM pn_var_lines_ALL
4827 WHERE line_item_id = p_id)
4828 AND (actual_exp_code = 'Y' OR
4829 forecasted_exp_code = 'Y')
4830 );
4831
4832 ELSIF p_block IN('LINE_DEFAULTS_BLK','BKHD_DEFAULTS_BLK','BKDT_DEFAULTS_BLK') THEN
4833 IF p_start_dt IS NULL OR p_end_dt IS NULL THEN
4834 SELECT 1
4835 INTO l_exported
4836 FROM dual
4837 WHERE EXISTS ( SELECT grp_date_id
4838 FROM pn_var_grp_dates_all
4839 WHERE period_id IN (SELECT period_id
4840 FROM pn_var_lines_ALL
4841 WHERE line_default_id = p_id)
4842 AND (actual_exp_code = 'Y' OR
4843 forecasted_exp_code = 'Y')
4844 );
4845
4846 ELSE
4847 SELECT 1
4848 INTO l_exported
4849 FROM dual
4850 WHERE EXISTS ( SELECT grp_date_id
4851 FROM pn_var_grp_dates_all a,
4852 pn_var_periods_all b,
4853 pn_var_lines_all c
4854 WHERE a.period_id = b.period_id
4855 AND b.period_id = c.period_id
4856 AND c.line_default_id = p_id
4857 AND (a.actual_exp_code = 'Y' OR
4858 a.forecasted_exp_code = 'Y')
4859 AND ((b.start_date BETWEEN p_start_dt AND p_end_dt)
4860 OR (b.end_date BETWEEN p_start_dt AND p_end_dt)
4861 OR (p_start_dt BETWEEN b.start_date AND b.end_date)
4862 OR (p_end_dt BETWEEN b.start_date AND b.end_date))
4863 );
4864 END IF;
4865
4866 ELSIF p_block IN('VOL_HIST_BLK') THEN
4867
4868 SELECT 1
4869 INTO l_exported
4870 FROM dual
4871 WHERE EXISTS ( SELECT vol_hist_id
4872 FROM pn_var_vol_hist_ALL
4873 WHERE vol_hist_id = p_id
4874 AND (actual_exp_code = 'Y' OR
4875 variance_exp_code = 'Y')
4876 );
4877
4878 ELSIF p_block IN('PERIODS_INV_BLK') THEN -- Fix for bug # 2722191
4879
4880 SELECT 1
4881 INTO l_exported
4882 FROM dual
4883 WHERE EXISTS ( SELECT VAR_RENT_INV_ID
4884 FROM pn_var_rent_inv_all
4885 WHERE var_rent_inv_id = p_id
4886 AND (actual_exp_code = 'Y' OR
4887 variance_exp_code = 'Y')
4888 );
4889
4890
4891 END IF;
4892
4893 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.FIND_IF_EXPORTED (-)');
4894
4895 RETURN l_exported;
4896
4897 EXCEPTION
4898
4899 WHEN OTHERS THEN
4900 RETURN NULL;
4901
4902 END find_if_exported;
4903
4904
4905 /*===========================================================================+
4906 | FUNCTION
4907 | FIND_IF_OR_VOL_EXPORTED
4908 |
4909 | DESCRIPTION
4910 | Find if the given forecasted volume record has been exported.
4911 |
4912 | SCOPE - PUBLIC
4913 |
4914 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
4915 |
4916 | ARGUMENTS : IN:
4917 | p_id
4918 |
4919 | OUT:
4920 |
4921 | RETURNS : l_exported
4922 |
4923 | NOTES : Find if the given record has been exported.
4924 |
4925 | MODIFICATION HISTORY
4926 |
4927 | 12-Mar-2007 Shabda o Created
4928 +===========================================================================*/
4929
4930 FUNCTION find_if_for_vol_exported (p_id IN NUMBER) RETURN NUMBER IS
4931
4932 l_exported NUMBER;
4933
4934 BEGIN
4935 NULL;
4936 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.FIND_IF_EXPORTED (+)');
4937 SELECT 1
4938 INTO l_exported
4939 FROM dual
4940 WHERE EXISTS ( SELECT vol_hist_id
4941 FROM pn_var_vol_hist_ALL
4942 WHERE vol_hist_id = p_id
4943 AND forecasted_exp_code = 'Y'
4944 );
4945
4946 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.FIND_IF_EXPORTED (-)');
4947
4948 RETURN l_exported;
4949
4950 EXCEPTION
4951 WHEN OTHERS THEN
4952 RETURN NULL;
4953
4954 END find_if_for_vol_exported;
4955
4956
4957 /*===========================================================================+
4958 | FUNCTION
4959 | FIND_STATUS
4960 |
4961 | DESCRIPTION
4962 | Finds if a period/line record is in 'OPEN','COMPLETE' or 'RECONCILED' status
4963 |
4964 | SCOPE - PUBLIC
4965 |
4966 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
4967 |
4968 | ARGUMENTS : IN:
4969 | p_period_id
4970 | p_invoice_on
4971 |
4972 | OUT:
4973 |
4974 | RETURNS : None
4975 |
4976 | NOTES : Finds if a period/line record is in 'OPEN','COMPLETE' or 'RECONCILED' status
4977 |
4978 | MODIFICATION HISTORY
4979 |
4980 | 23-JAN-02 Daniel Thota o Created
4981 | 21-Jun-02 Ashish Kumar Fix BUG#2096829 and BUG#2096810 Change the Where clause of the
4982 | Completed and Reconciled Select stmts
4983 | 11-Jul-02 Ashish Kumar Fix for BUG#2452276 In the Reconcile query change the
4984 | Forcasted_exp_code to Variance_exp_code
4985 | 14-JUL-05 hareesha o Bug 4284035 - Replaced pn_var_grp_dates with _ALL table.
4986 +===========================================================================*/
4987
4988 FUNCTION find_status (p_period_id NUMBER) RETURN VARCHAR2 IS
4989
4990 l_status VARCHAR2(30);
4991
4992 BEGIN
4993
4994 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.FIND_STATUS (+)');
4995
4996 SELECT 'COMPLETE'
4997 INTO l_status
4998 FROM dual
4999 WHERE NOT EXISTS
5000 (SELECT grp_date_id
5001 FROM pn_var_grp_dates_all
5002 WHERE period_id = p_period_id
5003 AND ((actual_exp_code = 'N' AND FORECASTED_exp_code ='N' AND variance_exp_code = 'N') OR
5004 (actual_exp_code = 'N' AND FORECASTED_exp_code ='Y' AND variance_exp_code = 'Y')
5005 )
5006 )
5007 AND NOT EXISTS
5008 (SELECT vol_hist_id
5009 FROM pn_var_vol_hist_ALL
5010 WHERE period_id = p_period_id
5011 AND ((actual_exp_code = 'N' AND FORECASTED_exp_code ='N' AND variance_exp_code = 'N') OR
5012 (actual_exp_code = 'N' AND FORECASTED_exp_code ='Y' AND variance_exp_code = 'Y')
5013 )
5014 );
5015
5016 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.FIND_STATUS (-)');
5017
5018 RETURN l_status;
5019
5020 EXCEPTION
5021
5022 WHEN NO_DATA_FOUND THEN
5023 BEGIN
5024
5025 SELECT 'RECONCILED'
5026 INTO l_status
5027 FROM dual
5028 WHERE NOT EXISTS(SELECT grp_date_id
5029 FROM pn_var_grp_dates_all
5030 WHERE period_id = p_period_id
5031 AND variance_exp_code = 'N')
5032 AND NOT EXISTS(SELECT vol_hist_id
5033 FROM pn_var_vol_hist_all
5034 WHERE period_id = p_period_id
5035 AND VARIANCE_EXP_CODE ='N' );
5036
5037 RETURN l_status;
5038
5039 EXCEPTION
5040 WHEN OTHERS THEN
5041 l_status := 'OPEN';
5042 RETURN l_status;
5043
5044 END;
5045
5046 END find_status;
5047
5048 /*===========================================================================+
5049 | FUNCTION
5050 | FIND_IF_ADJUST_HIST_EXISTS
5051 |
5052 | DESCRIPTION
5053 | Finds if a period has an adjustment history.
5054 |
5055 | SCOPE - PUBLIC
5056 |
5057 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
5058 |
5059 | ARGUMENTS : IN:
5060 | p_period_id
5061 |
5062 | OUT:
5063 |
5064 | RETURNS : None
5065 |
5066 | NOTES : Finds if a period has an adjustment history.
5067 |
5068 | MODIFICATION HISTORY
5069 |
5070 | 22-FEB-2002 Daniel Thota o Created
5071 +===========================================================================*/
5072
5073 FUNCTION find_if_adjust_hist_exists (p_period_id NUMBER) RETURN NUMBER IS
5074
5075 l_adjust_hist_exists NUMBER := NULL;
5076
5077 BEGIN
5078
5079 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.FIND_IF_ADJUST_HIST_EXISTS (+)');
5080
5081 SELECT 1
5082 INTO l_adjust_hist_exists
5083 FROM dual
5084 WHERE EXISTS(SELECT 1
5085 FROM pn_var_rent_inv_ALL inv1
5086 WHERE inv1.period_id = p_period_id
5087 AND (NVL(inv1.adjust_num,0) <> 0 OR
5088 NVL(inv1.true_up_amt,0) <> 0 ));
5089
5090 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.FIND_IF_ADJUST_HIST_EXISTS (-)');
5091
5092 RETURN l_adjust_hist_exists;
5093
5094 EXCEPTION
5095
5096 WHEN OTHERS THEN
5097 RETURN NULL;
5098
5099 END find_if_adjust_hist_exists;
5100
5101 -------------------------------------------------------------------------------
5102 -- FUNCTION : APPROVED_TERM_EXIST
5103 -- PARAMETERS : Variable_rent_id AND Period_id
5104 -- HISTORY :
5105 -- xx-xxx-xx ashish o To find any approved term exist for the var rent
5106 -- 05-JUL-04 anand o Added another condition in the query
5107 -- o Coverted the INlINe query to CURSOR
5108 -- ******** NOTE ********
5109 -- Below IS the modIFied logic OF this function
5110 -- IF (approved term exists) OR
5111 -- (actual INvoiced amount IS 0
5112 -- AND transferred IS checked FOR a INvoice OF thIS perticular period)
5113 -- THEN
5114 -- RETURN Y
5115 -- ELSE
5116 -- RETURN N
5117 -- END IF;
5118 -- ******** NOTE ********
5119 -------------------------------------------------------------------------------
5120
5121 FUNCTION approved_term_exist (p_var_rent_id IN NUMBER,
5122 p_period_id IN NUMBER ) RETURN VARCHAR2 IS
5123
5124 CURSOR chk_term_cur IS
5125 SELECT 'Y' term_exists
5126 FROM DUAL
5127 WHERE EXISTS (SELECT NULL
5128 FROM pn_var_rent_inv_all INv,
5129 pn_payment_terms_all pt
5130 WHERE inv.var_rent_id = p_var_rent_id
5131 AND inv.period_id = NVL(p_period_id,inv.period_id)
5132 AND inv.var_rent_inv_id = pt.var_rent_inv_id
5133 AND pt.status ='APPROVED'
5134 AND pt.var_rent_type IN ('ACTUAL','VARIANCE'))
5135 OR EXISTS (SELECT NULL
5136 FROM pn_var_rent_inv_all pvri
5137 WHERE pvri.period_id = NVL(p_period_id,pvri.period_id)
5138 AND pvri.actual_invoiced_amount = 0
5139 AND actual_exp_code = 'Y'
5140 );
5141
5142 l_term_exISts VARCHAR2(1) := 'N';
5143
5144 BEGIN
5145
5146 pnp_debug_pkg.debug( 'pn_var_rent_pkg.approved_term_exist (+): ');
5147
5148 FOR chk_term_cur_rec IN chk_term_cur LOOP
5149 l_term_exists := chk_term_cur_rec.term_exists;
5150 END LOOP;
5151
5152 pnp_debug_pkg.debug( 'pn_var_rent_pkg.approved_term_exist (-): ');
5153
5154 RETURN l_term_exists;
5155
5156 END approved_term_exist;
5157
5158 ------------------------------------------------------------------------
5159 -- PROCEDURE : DELETE_INV_SUMM
5160 -- PARAMETERS : Variable_rent_id
5161 -- 24-Jul-2002 Ashish Kumar o Fix BUG#2452909 created
5162 -- FIX for BUG#2452909 created To delete all the Natural breakpoint
5163 -- detials , summary, invoice , abatements and payment terms
5164 -- 14-JUL-05 hareesha o Bug 4284035 - Replaced pn_var_bkpts_head with _ALL table.
5165 ---------------------------------------------------------------------
5166
5167 PROCEDURE delete_inv_summ (p_var_rent_id IN NUMBER) IS
5168
5169 CURSOR C_EXIST IS
5170 SELECT bp.bkpt_header_id
5171 FROM pn_var_periods_all pd, pn_var_lines_all ln, pn_var_bkpts_head_all bp
5172 WHERE pd.var_rent_id = p_var_rent_id
5173 AND pd.period_id = ln.period_id
5174 AND ln.lINe_item_id = bp.lINe_item_id
5175 AND bp.break_type = 'NATURAL';
5176
5177 l_bkpt_header_id NUMBER := 0;
5178 l_bkptsdet_exISt NUMBER := NULL;
5179
5180 BEGIN
5181
5182 pnp_debug_pkg.debug( 'pn_var_rent_pkg.delet_INv_summ(+): ');
5183
5184 OPEN c_exist;
5185 LOOP
5186
5187 FETCH c_exist INTO l_bkpt_header_id;
5188 EXIT when c_exist%NOTFOUND;
5189
5190 l_bkptsdet_exist := PN_VAR_RENT_PKG.find_if_bkptsdet_exist(l_bkpt_header_id);
5191
5192 -------------------------------------------------------------------------
5193 -- first delete breakpoint details associated with each breakpoint header
5194 -------------------------------------------------------------------------
5195 IF l_bkptsdet_exist IS NOT NULL THEN
5196 pn_var_rent_pkg.delete_var_bkpts_det(l_bkpt_header_id);
5197 END IF;
5198
5199 -----------------------------------------------------
5200 -- delete breakpoint header associated with each line
5201 -----------------------------------------------------
5202 pn_var_bkpts_head_pkg.delete_row(l_bkpt_header_id);
5203
5204 END LOOP;
5205
5206 DELETE FROM pn_var_rent_summ_all
5207 WHERE var_rent_id = p_var_rent_id;
5208
5209 IF SQL%NOTFOUND THEN
5210 NULL;
5211 END IF;
5212
5213 DELETE FROM pn_payment_terms_all
5214 WHERE var_rent_inv_id IN
5215 (SELECT var_rent_inv_id
5216 FROM pn_var_rent_inv_all
5217 WHERE var_rent_id = p_var_rent_id);
5218
5219 IF SQL%NOTFOUND THEN
5220 NULL;
5221 END IF;
5222
5223 DELETE FROM pn_var_rent_inv_all
5224 WHERE var_rent_id = p_var_rent_id;
5225
5226 IF SQL%NOTFOUND THEN
5227 NULL;
5228 END IF;
5229
5230 DELETE FROM pn_var_abatements_all
5231 WHERE var_rent_inv_id IN
5232 (SELECT var_rent_inv_id
5233 FROM pn_var_rent_inv_all
5234 WHERE var_rent_id = p_var_rent_id);
5235
5236 IF SQL%NOTFOUND THEN
5237 NULL;
5238 END IF;
5239
5240 pnp_debug_pkg.debug( 'pn_var_rent_pkg.delet_INv_summ(-): ');
5241
5242 END delete_inv_summ;
5243
5244 /*===========================================================================+
5245 | FUNCTION
5246 | FIND_VOL_READY_FOR_ADJUST
5247 |
5248 | DESCRIPTION
5249 | To find records in the volume history table
5250 | which are entered as an adjustment
5251 |
5252 | SCOPE - PUBLIC
5253 |
5254 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
5255 |
5256 | ARGUMENTS : IN:
5257 | p_period_id,p_invoice_on
5258 |
5259 | OUT:
5260 |
5261 | RETURNS : None
5262 |
5263 | NOTES : To find records in the volume history table
5264 | which are entered as an adjustment
5265 |
5266 | MODIFICATION HISTORY
5267 |
5268 | 16-Jan-2002 Daniel Thota o Created Fix for bug # 2487686
5269 +===========================================================================*/
5270
5271 FUNCTION find_vol_ready_for_adjust (p_period_id NUMBER,
5272 p_invoice_on VARCHAR2) RETURN NUMBER IS
5273
5274 l_vol_ready_for_adjust NUMBER := NULL;
5275
5276 BEGIN
5277
5278 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.FIND_VOL_READY_FOR_ADJUST (+)');
5279
5280 IF p_invoice_on = 'ACTUAL' THEN
5281
5282 SELECT 1
5283 INTO l_vol_ready_for_adjust
5284 FROM dual
5285 WHERE EXISTS(SELECT vh.grp_date_id
5286 FROM pn_var_vol_hist_all vh
5287 WHERE actual_exp_code = 'N'
5288 AND period_id = p_period_id
5289 AND EXISTS (SELECT grp.grp_date_id
5290 FROM pn_var_grp_dates_all grp
5291 WHERE actual_exp_code = 'Y'
5292 AND grp.grp_date_id = vh.grp_date_id));
5293
5294 ELSIF p_invoice_on = 'FORECASTED' THEN
5295
5296 SELECT 1
5297 INTO l_vol_ready_for_adjust
5298 FROM dual
5299 WHERE EXISTS(SELECT vh.grp_date_id
5300 FROM pn_var_vol_hist_all vh
5301 WHERE forecasted_exp_code = 'N'
5302 AND period_id = p_period_id
5303 AND EXISTS (SELECT grp.grp_date_id
5304 FROM pn_var_grp_dates_all grp
5305 WHERE forecasted_exp_code = 'Y'
5306 AND grp.grp_date_id = vh.grp_date_id));
5307
5308 END IF;
5309
5310 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.FIND_VOL_READY_FOR_ADJUST (-)');
5311
5312 RETURN l_vol_ready_for_adjust;
5313
5314 EXCEPTION
5315
5316 WHEN OTHERS THEN
5317 RETURN NULL;
5318
5319 END find_vol_ready_for_adjust;
5320
5321 -------------------------------------------------------------------------------
5322 -- NAME : UPDATE_LOCATION_FOR_VR_TERMS()
5323 -- PURPOSE : UPDATEs the location ID FOR the terms ASsocaited with VR
5324 -- DESCRIPTION : UPDATEs the location ID FOR the terms ASsocaited with VR
5325 -- whenever the location ASsociated with VR agreement IS
5326 -- UPDATEd.
5327 -- SCOPE : PUBLIC
5328 -- ARGUMENTS : p_var_rent_id : variable rent ID.
5329 -- p_location_id : new location ID that terms to be UPDATEd with.
5330 -- p_return_status : return status OF the procedure
5331 -- RETURNS : None
5332 -- HISTORY :
5333 -- 03-JUN-04 ATUPPAD o Created.
5334 -- FOR 'Edit location at VR Agreement' enhancement.
5335 -------------------------------------------------------------------------------
5336 PROCEDURE UPDATE_LOCATION_FOR_VR_TERMS(
5337 p_var_rent_id IN NUMBER,
5338 p_location_id IN NUMBER,
5339 p_return_status OUT NOCOPY VARCHAR2)
5340 IS
5341
5342 CURSOR C_UPD_TERMS IS
5343 SELECT ppi.payment_term_id
5344 FROM PN_PAYMENT_ITEMS_ALL ppi,
5345 PN_PAYMENT_TERMS_ALL ppt,
5346 PN_VAR_RENT_INV_ALL pvri,
5347 PN_LEASES_ALL pl
5348 WHERE DECODE(pl.lease_class_code, 'DIRECT', NVL(ppi.transferred_to_ap_flag,'N'),
5349 'THIRD_PARTY', NVL(ppi.transferred_to_ar_flag,'N'),
5350 'SUB_LEASE', NVL(ppi.transferred_to_ar_flag,'N')) = 'N'
5351 AND ppi.payment_term_id = ppt.payment_term_id
5352 AND ppt.STATUS = 'APPROVED'
5353 AND ppt.lease_id = pl.lease_id
5354 AND ppt.var_rent_inv_id = pvri.var_rent_inv_id
5355 AND pvri.var_rent_id = p_var_rent_id
5356 UNION ALL
5357 SELECT ppt.payment_term_id
5358 FROM PN_PAYMENT_TERMS_ALL ppt,
5359 PN_VAR_RENT_INV_ALL pvri
5360 WHERE ppt.STATUS = 'DRAFT'
5361 AND ppt.var_rent_inv_id = pvri.var_rent_inv_id
5362 AND pvri.var_rent_id = p_var_rent_id;
5363
5364 TYPE number_tbl_type IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
5365 l_payment_term_id number_tbl_type;
5366
5367 BEGIN
5368 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.UPDATE_LOCATION_FOR_VR_TERMS (+)');
5369
5370 OPEN C_UPD_TERMS;
5371 LOOP
5372 FETCH C_UPD_TERMS
5373 BULK COLLECT INTO l_payment_term_id
5374 LIMIT 1000;
5375
5376 FORALL i IN 1..l_payment_term_id.COUNT
5377 UPDATE PN_PAYMENT_TERMS_ALL
5378 SET location_id = p_location_id
5379 WHERE payment_term_id = l_payment_term_id(i);
5380 EXIT WHEN C_UPD_TERMS%NOTFOUND;
5381
5382 END LOOP;
5383
5384 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.UPDATE_LOCATION_FOR_VR_TERMS (-)');
5385
5386 -- initialize api return status to success
5387 p_return_status := FND_API.G_RET_STS_SUCCESS;
5388
5389 EXCEPTION
5390
5391 WHEN FND_API.G_EXC_ERROR THEN
5392 p_return_status := FND_API.G_RET_STS_ERROR;
5393
5394 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
5395 p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5396
5397 WHEN OTHERS THEN
5398 p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5399
5400 END UPDATE_LOCATION_FOR_VR_TERMS;
5401
5402 -------------------------------------------------------------------------------
5403 -- NAME : DATES_VALIDATION()
5404 -- PURPOSE : Vaidate Breakpoint Headers and details start and End dates
5405 -- DESCRIPTION : It checks if the Bkpt
5406 -- headers and details dates have no overlaps or gaps.
5407 -- SCOPE : PUBLIC
5408 --
5409 -- ARGUMENTS : p_var_rent_id : variable rent ID (mandatory)
5410 -- p_period_id : Id of a particular period (optional)
5411 -- p_line_item_id: ID of a particular line item (optional)
5412 -- p_called_from : CAlled from SETUP or MAIN (mandatory)
5413 -- p_check for : Checking for GAPS or OVERLAPS (mandatory)
5414
5415 -- RETURNS : l_return_status
5416 -- HISTORY :
5417 --
5418 -- 12-APR-06 Pikhar o Created.
5419 --
5420 -------------------------------------------------------------------------------
5421 FUNCTION dates_validation (p_var_rent_id IN NUMBER
5422 ,p_period_id IN NUMBER
5423 ,p_line_item_id IN NUMBER
5424 ,p_check_for IN VARCHAR2
5425 ,p_called_from IN VARCHAR2) RETURN VARCHAR2
5426 IS
5427
5428 /* cursors for main window - bkpt hrd, details, volumes */
5429 CURSOR periods_vr_c(p_vr_id IN NUMBER) IS
5430 SELECT period_id
5431 ,start_date
5432 ,end_date
5433 FROM pn_var_periods_all
5434 WHERE var_rent_id = p_vr_id
5435 ORDER BY start_date;
5436
5437 CURSOR periods_c(p_prd_id IN NUMBER) IS
5438 SELECT period_id
5439 ,start_date
5440 ,end_date
5441 FROM pn_var_periods_all
5442 WHERE period_id = p_prd_id;
5443
5444 CURSOR line_items_c(p_prd_id IN NUMBER) IS
5445 SELECT line_item_id
5446 FROM pn_var_lines_all
5447 WHERE period_id = p_prd_id
5448 ORDER BY line_item_id;
5449
5450 CURSOR bkpt_headers_c(p_line_id IN NUMBER) IS
5451 SELECT bkhd_start_date
5452 ,bkhd_end_date
5453 ,bkpt_header_id
5454 ,breakpoint_type
5455 FROM pn_var_bkpts_head_all
5456 WHERE line_item_id = p_line_id
5457 ORDER BY bkhd_start_date;
5458
5459 CURSOR bkpt_details_c(p_bkhd_id IN NUMBER) IS
5460 SELECT bkpt_start_date
5461 ,bkpt_end_date
5462 ,COUNT(bkpt_detail_id) AS bkpt_count
5463 FROM pn_var_bkpts_det_all
5464 WHERE bkpt_header_id = p_bkhd_id
5465 GROUP BY bkpt_start_date, bkpt_end_date
5466 ORDER BY bkpt_start_date;
5467
5468 CURSOR bkpt_vol_c( p_bkhd_id IN NUMBER
5469 ,p_st_dt IN DATE
5470 ,p_end_dt IN DATE) IS
5471 SELECT period_bkpt_vol_start
5472 ,period_bkpt_vol_end
5473 FROM pn_var_bkpts_det_all
5474 WHERE bkpt_header_id = p_bkhd_id
5475 AND bkpt_start_date = p_st_dt
5476 AND bkpt_end_date = p_end_dt
5477 ORDER BY period_bkpt_vol_start;
5478
5479 CURSOR null_vols(p_bkhd_id IN NUMBER, p_start_date IN DATE) IS
5480 SELECT count(*)
5481 FROM pn_var_bkpts_det_all
5482 WHERE bkpt_header_id = p_bkhd_id
5483 AND bkpt_start_date = p_start_date
5484 AND period_bkpt_vol_end IS NULL;
5485
5486
5487 /* cursors for defaults - bkpt hrd, details, volumes */
5488 CURSOR var_rent_c(p_vr_id IN NUMBER) IS
5489 SELECT var_rent_id
5490 ,commencement_date
5491 ,termination_date
5492 FROM pn_var_rents_all
5493 WHERE var_rent_id = p_vr_id;
5494
5495 CURSOR line_defs_c(p_vr_id IN NUMBER) IS
5496 SELECT line_default_id
5497 FROM pn_var_line_defaults_all
5498 WHERE var_rent_id = p_vr_id
5499 ORDER BY line_default_id;
5500
5501 CURSOR bkpt_hdr_defs_c(p_line_def_id IN NUMBER) IS
5502 SELECT bkhd_start_date
5503 ,bkhd_end_date
5504 ,bkhd_default_id
5505 FROM pn_var_bkhd_defaults_all
5506 WHERE line_default_id = p_line_def_id
5507 ORDER BY bkhd_start_date;
5508
5509 CURSOR bkpt_dtl_defs_c(p_bkhd_def_id IN NUMBER) IS
5510 SELECT bkdt_start_date
5511 ,bkdt_end_date
5512 ,COUNT(bkdt_default_id) AS bkpt_count
5513 FROM pn_var_bkdt_defaults_all
5514 WHERE bkhd_default_id = p_bkhd_def_id
5515 GROUP BY bkdt_start_date, bkdt_end_date
5516 ORDER BY bkdt_start_date;
5517
5518 CURSOR bkpt_vol_defs_c( p_bkhd_def_id IN NUMBER
5519 ,p_st_dt IN DATE
5520 ,p_end_dt IN DATE) IS
5521 SELECT period_bkpt_vol_start
5522 ,period_bkpt_vol_end
5523 FROM pn_var_bkdt_defaults_all
5524 WHERE bkhd_default_id = p_bkhd_def_id
5525 AND bkdt_start_date = p_st_dt
5526 AND bkdt_end_date = p_end_dt
5527 ORDER BY period_bkpt_vol_start;
5528
5529 CURSOR null_def_vols(p_bkhd_def_id IN NUMBER, p_start_date IN DATE) IS
5530 SELECT count(*)
5531 FROM pn_var_bkdt_defaults_all
5532 WHERE bkhd_default_id = p_bkhd_def_id
5533 AND bkdt_start_date = p_start_date
5534 AND period_bkpt_vol_end IS NULL;
5535
5536 /* exceptions */
5537 BAD_CALLED_FROM_EXCEPTION EXCEPTION;
5538 GAP_FOUND_EXCEPTION EXCEPTION;
5539 VOL_GAP_FOUND_EXCEPTION EXCEPTION;
5540 OVERLAP_FOUND_EXCEPTION EXCEPTION;
5541 DT_OUT_OF_PRD_RANGE_EXCEPTION EXCEPTION;
5542 DT_OUT_OF_BKHD_RANGE_EXCEPTION EXCEPTION;
5543
5544 /* data structures */
5545 TYPE NUM_TBL IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
5546 TYPE DATE_TBL IS TABLE OF DATE INDEX BY BINARY_INTEGER;
5547
5548 /* period details */
5549 l_period_t NUM_TBL;
5550 l_period_st_dt_t DATE_TBL;
5551 l_period_end_dt_t DATE_TBL;
5552
5553 /* line details */
5554 l_line_t NUM_TBL;
5555
5556 /* other variables */
5557 l_vr_comm_dt DATE;
5558 l_vr_term_dt DATE;
5559 l_period_st_dt DATE;
5560 l_period_end_dt DATE;
5561 l_prev_bkhd_start DATE;
5562 l_prev_bkhd_end DATE;
5563 l_hd_min_st_dt DATE;
5564 l_dt_min_st_dt DATE;
5565 l_prev_bkdt_start DATE;
5566 l_prev_bkdt_end DATE;
5567 l_prev_vol_start NUMBER;
5568 l_prev_vol_end NUMBER;
5569 l_bktd_num NUMBER;
5570 l_volumes NUMBER;
5571
5572 l_bkhd_counter NUMBER;
5573 l_bkdt_counter NUMBER;
5574 l_vol_counter NUMBER;
5575
5576 l_return_status VARCHAR2(50) := 'N';
5577
5578 BEGIN
5579
5580 IF p_called_from = 'SETUP' THEN
5581
5582
5583 IF p_var_rent_id IS NOT NULL THEN
5584 FOR vr_rec IN var_rent_c(p_vr_id => p_var_rent_id) LOOP
5585 l_vr_comm_dt := vr_rec.commencement_date;
5586 l_vr_term_dt := vr_rec.termination_date;
5587 END LOOP;
5588
5589 ELSE
5590 RAISE BAD_CALLED_FROM_EXCEPTION;
5591
5592 END IF;
5593
5594 l_line_t.DELETE;
5595
5596 OPEN line_defs_c(p_vr_id => p_var_rent_id);
5597 FETCH line_defs_c BULK COLLECT INTO l_line_t;
5598 CLOSE line_defs_c;
5599
5600 FOR line_rec IN l_line_t.FIRST..l_line_t.LAST LOOP
5601
5602 l_bkhd_counter := 1;
5603
5604 FOR bkhd_rec IN bkpt_hdr_defs_c(p_line_def_id => l_line_t(line_rec)) LOOP
5605
5606 IF l_bkhd_counter = 1 THEN
5607
5608 IF bkhd_rec.bkhd_start_date < l_vr_comm_dt THEN
5609 RAISE DT_OUT_OF_PRD_RANGE_EXCEPTION;
5610 END IF;
5611
5612 ELSE
5613
5614 IF bkhd_rec.bkhd_start_date
5615 > l_prev_bkhd_end + 1
5616 THEN
5617 IF p_check_for = 'GAPS' THEN
5618 /*RAISE GAP_FOUND_EXCEPTION;*/
5619 l_return_status := 'GAP_FOUND_EXCEPTION';
5620 END IF;
5621
5622 ELSIF bkhd_rec.bkhd_start_date
5623 < l_prev_bkhd_end + 1 THEN
5624 RAISE OVERLAP_FOUND_EXCEPTION;
5625
5626 END IF;
5627
5628 END IF;
5629
5630 l_prev_bkhd_start := bkhd_rec.bkhd_start_date;
5631 l_prev_bkhd_end := bkhd_rec.bkhd_end_date;
5632 l_bkhd_counter := l_bkhd_counter + 1;
5633
5634 l_bkdt_counter := 1;
5635
5636 SELECT count(*)
5637 INTO l_bktd_num
5638 FROM pn_var_bkdt_defaults_all
5639 WHERE bkhd_default_id = bkhd_rec.bkhd_default_id;
5640
5641 IF l_bktd_num = 0 THEN
5642 l_return_status := 'GAP_FOUND_EXCEPTION';
5643 ELSE
5644
5645 FOR bkdt_rec IN bkpt_dtl_defs_c(p_bkhd_def_id => bkhd_rec.bkhd_default_id) LOOP
5646
5647 IF l_bkdt_counter = 1 THEN
5648
5649 IF bkdt_rec.bkdt_start_date < bkhd_rec.bkhd_start_date THEN
5650 RAISE DT_OUT_OF_BKHD_RANGE_EXCEPTION;
5651
5652 ELSIF bkdt_rec.bkdt_start_date > bkhd_rec.bkhd_start_date THEN
5653 IF p_check_for = 'GAPS' THEN
5654 /*RAISE GAP_FOUND_EXCEPTION;*/
5655 l_return_status := 'GAP_FOUND_EXCEPTION';
5656 END IF;
5657
5658 END IF;
5659
5660 ELSE
5661
5662 IF bkdt_rec.bkdt_start_date
5663 > l_prev_bkdt_end + 1
5664 THEN
5665 IF p_check_for = 'GAPS' THEN
5666 /*RAISE GAP_FOUND_EXCEPTION;*/
5667 l_return_status := 'GAP_FOUND_EXCEPTION';
5668 END IF;
5669
5670 ELSIF bkdt_rec.bkdt_start_date
5671 < l_prev_bkdt_end + 1 THEN
5672 RAISE OVERLAP_FOUND_EXCEPTION;
5673
5674 END IF;
5675
5676 END IF;
5677
5678 l_prev_bkdt_start := bkdt_rec.bkdt_start_date;
5679 l_prev_bkdt_end := bkdt_rec.bkdt_end_date;
5680 l_bkdt_counter := l_bkdt_counter + 1;
5681
5682 /*Checking for volumes overlap */
5683
5684 IF bkdt_rec.bkpt_count > 1 THEN
5685
5686 l_vol_counter := 1;
5687
5688 FOR vol_rec IN bkpt_vol_defs_c(p_bkhd_def_id => bkhd_rec.bkhd_default_id
5689 ,p_st_dt => bkdt_rec.bkdt_start_date
5690 ,p_end_dt => bkdt_rec.bkdt_end_date) LOOP
5691
5692 IF l_vol_counter = 1 THEN
5693 NULL;
5694
5695 ELSE
5696 IF vol_rec.period_bkpt_vol_start
5697 > l_prev_vol_end
5698 THEN
5699 IF p_check_for = 'GAPS' THEN
5700 /*RAISE GAP_FOUND_EXCEPTION;*/
5701 l_return_status := 'VOL_GAP_FOUND_EXCEPTION';
5702 END IF;
5703
5704 ELSIF vol_rec.period_bkpt_vol_start
5705 < l_prev_vol_end THEN
5706 RAISE OVERLAP_FOUND_EXCEPTION;
5707 END IF;
5708
5709 END IF;
5710
5711 l_prev_vol_start := vol_rec.period_bkpt_vol_start;
5712 l_prev_vol_end := vol_rec.period_bkpt_vol_end;
5713 l_vol_counter := l_vol_counter + 1;
5714
5715 END LOOP; /* loop for volumes */
5716
5717 l_volumes := NULL;
5718 OPEN null_def_vols(p_bkhd_def_id => bkhd_rec.bkhd_default_id
5719 ,p_start_date => bkdt_rec.bkdt_start_date);
5720 FETCH null_def_vols INTO l_volumes;
5721 CLOSE null_def_vols;
5722
5723 IF l_volumes >1 THEN
5724 RAISE OVERLAP_FOUND_EXCEPTION;
5725 END IF;
5726
5727 END IF;
5728
5729 END LOOP; /* loop for bkdt */
5730
5731 IF l_prev_bkdt_end > bkhd_rec.bkhd_end_date THEN
5732 RAISE DT_OUT_OF_BKHD_RANGE_EXCEPTION;
5733
5734 ELSIF l_prev_bkdt_end < bkhd_rec.bkhd_end_date THEN
5735 IF p_check_for = 'GAPS' THEN
5736 /*RAISE GAP_FOUND_EXCEPTION;*/
5737 l_return_status := 'GAP_FOUND_EXCEPTION';
5738 END IF;
5739 ELSE
5740 SELECT min(bkdt_start_date)
5741 INTO l_dt_min_st_dt
5742 FROM pn_var_bkdt_defaults_all
5743 WHERE bkhd_default_id = bkhd_rec.bkhd_default_id;
5744
5745 IF l_dt_min_st_dt > bkhd_rec.bkhd_start_date THEN
5746 IF p_check_for = 'GAPS' THEN
5747 /*RAISE GAP_FOUND_EXCEPTION;*/
5748 l_return_status := 'GAP_FOUND_EXCEPTION';
5749 END IF;
5750 END IF;
5751
5752 END IF;
5753
5754 END IF;
5755
5756 END LOOP; /* loop for bkhd */
5757
5758 IF l_prev_bkhd_end > l_vr_term_dt THEN
5759 RAISE DT_OUT_OF_PRD_RANGE_EXCEPTION;
5760
5761 ELSIF l_prev_bkhd_end < l_vr_term_dt THEN
5762 IF p_check_for = 'GAPS' THEN
5763 /*RAISE GAP_FOUND_EXCEPTION;*/
5764 l_return_status := 'GAP_FOUND_EXCEPTION';
5765 END IF;
5766 ELSE
5767 SELECT min(bkhd_start_date)
5768 INTO l_hd_min_st_dt
5769 FROM pn_var_bkhd_defaults_all
5770 WHERE line_default_id = l_line_t(line_rec);
5771
5772 IF l_hd_min_st_dt > l_vr_comm_dt THEN
5773 IF p_check_for = 'GAPS' THEN
5774 /*RAISE GAP_FOUND_EXCEPTION;*/
5775 l_return_status := 'GAP_FOUND_EXCEPTION';
5776 END IF;
5777 END IF;
5778 END IF;
5779
5780 END LOOP; /* loop for lines */
5781
5782 ELSIF p_called_from = 'MAIN' THEN
5783
5784 l_period_t.DELETE;
5785 l_period_st_dt_t.DELETE;
5786 l_period_end_dt_t.DELETE;
5787
5788 /* fetch period details */
5789 IF p_period_id IS NULL THEN
5790
5791 IF p_var_rent_id IS NOT NULL THEN
5792 OPEN periods_vr_c(p_vr_id => p_var_rent_id);
5793 FETCH periods_vr_c BULK COLLECT INTO
5794 l_period_t
5795 ,l_period_st_dt_t
5796 ,l_period_end_dt_t;
5797 CLOSE periods_vr_c;
5798
5799 ELSE
5800 RAISE BAD_CALLED_FROM_EXCEPTION;
5801
5802 END IF;
5803
5804 ELSE
5805 OPEN periods_c(p_prd_id => p_period_id);
5806 FETCH periods_c BULK COLLECT INTO
5807 l_period_t
5808 ,l_period_st_dt_t
5809 ,l_period_end_dt_t;
5810 CLOSE periods_c;
5811
5812 END IF;
5813
5814 IF l_period_t.FIRST IS NOT NULL THEN
5815 FOR prd_rec IN l_period_t.FIRST..l_period_t.LAST LOOP
5816
5817 l_line_t.DELETE;
5818
5819 IF p_line_item_id IS NULL THEN
5820 OPEN line_items_c(p_prd_id => l_period_t(prd_rec));
5821 FETCH line_items_c BULK COLLECT INTO l_line_t;
5822 CLOSE line_items_c;
5823
5824 l_period_st_dt := l_period_st_dt_t(prd_rec);
5825 l_period_end_dt := l_period_end_dt_t(prd_rec);
5826
5827 ELSE
5828 l_line_t(1) := p_line_item_id;
5829
5830 SELECT start_date , end_date
5831 INTO l_period_st_dt, l_period_end_dt
5832 FROM pn_var_periods_all
5833 WHERE period_id =(SELECT period_id
5834 FROM pn_var_lines_all
5835 WHERE line_item_id = p_line_item_id);
5836 END IF;
5837
5838 IF l_line_t.FIRST IS NOT NULL THEN
5839 FOR line_rec IN l_line_t.FIRST..l_line_t.LAST LOOP
5840
5841 l_bkhd_counter := 1;
5842
5843 FOR bkhd_rec IN bkpt_headers_c(p_line_id => l_line_t(line_rec)) LOOP
5844
5845 IF l_bkhd_counter = 1 THEN
5846
5847 IF bkhd_rec.bkhd_start_date < l_period_st_dt THEN
5848 RAISE DT_OUT_OF_PRD_RANGE_EXCEPTION;
5849
5850 ELSIF bkhd_rec.bkhd_start_date > l_period_st_dt THEN
5851 IF p_check_for = 'GAPS' THEN
5852 /*RAISE GAP_FOUND_EXCEPTION;*/
5853 l_return_status := 'GAP_FOUND_EXCEPTION';
5854 END IF;
5855
5856 END IF;
5857
5858 ELSE
5859
5860 IF bkhd_rec.bkhd_start_date
5861 > l_prev_bkhd_end + 1
5862 THEN
5863 IF p_check_for = 'GAPS' THEN
5864 /*RAISE GAP_FOUND_EXCEPTION;*/
5865 l_return_status := 'GAP_FOUND_EXCEPTION';
5866 END IF;
5867
5868 ELSIF bkhd_rec.bkhd_start_date
5869 < l_prev_bkhd_end + 1 THEN
5870 RAISE OVERLAP_FOUND_EXCEPTION;
5871
5872 END IF;
5873
5874 END IF;
5875
5876 l_prev_bkhd_start := bkhd_rec.bkhd_start_date;
5877 l_prev_bkhd_end := bkhd_rec.bkhd_end_date;
5878 l_bkhd_counter := l_bkhd_counter + 1;
5879
5880
5881 l_bkdt_counter := 1;
5882
5883 FOR bkdt_rec IN bkpt_details_c(p_bkhd_id => bkhd_rec.bkpt_header_id) LOOP
5884
5885 IF l_bkdt_counter = 1 THEN
5886
5887 IF bkdt_rec.bkpt_start_date < bkhd_rec.bkhd_start_date THEN
5888 RAISE DT_OUT_OF_BKHD_RANGE_EXCEPTION;
5889
5890 ELSIF bkdt_rec.bkpt_start_date > bkhd_rec.bkhd_start_date THEN
5891 IF p_check_for = 'GAPS' THEN
5892 /*RAISE GAP_FOUND_EXCEPTION;*/
5893 l_return_status := 'GAP_FOUND_EXCEPTION';
5894 END IF;
5895
5896 END IF;
5897
5898 ELSE
5899
5900 IF bkdt_rec.bkpt_start_date
5901 > l_prev_bkdt_end + 1
5902 THEN
5903 IF p_check_for = 'GAPS' THEN
5904 /*RAISE GAP_FOUND_EXCEPTION;*/
5905 l_return_status := 'GAP_FOUND_EXCEPTION';
5906 END IF;
5907
5908 ELSIF bkdt_rec.bkpt_start_date
5909 < l_prev_bkdt_end + 1 THEN
5910 RAISE OVERLAP_FOUND_EXCEPTION;
5911
5912 END IF;
5913
5914 END IF;
5915
5916 l_prev_bkdt_start := bkdt_rec.bkpt_start_date;
5917 l_prev_bkdt_end := bkdt_rec.bkpt_end_date;
5918 l_bkdt_counter := l_bkdt_counter + 1;
5919
5920 /*Checking for volumes overlap */
5921
5922 IF bkdt_rec.bkpt_count > 1 THEN
5923
5924 l_vol_counter := 1;
5925
5926 FOR vol_rec IN bkpt_vol_c(p_bkhd_id => bkhd_rec.bkpt_header_id
5927 ,p_st_dt => bkdt_rec.bkpt_start_date
5928 ,p_end_dt => bkdt_rec.bkpt_end_date) LOOP
5929
5930 IF l_vol_counter = 1 THEN
5931 NULL;
5932
5933 ELSE
5934
5935 IF vol_rec.period_bkpt_vol_start
5936 > l_prev_vol_end
5937 THEN
5938 IF p_check_for = 'GAPS' THEN
5939 /*RAISE VOL_GAP_FOUND_EXCEPTION;*/
5940 l_return_status := 'VOL_GAP_FOUND_EXCEPTION';
5941 END IF;
5942
5943 ELSIF vol_rec.period_bkpt_vol_start
5944 < l_prev_vol_end THEN
5945 RAISE OVERLAP_FOUND_EXCEPTION;
5946 END IF;
5947
5948 END IF;
5949
5950 l_prev_vol_start := vol_rec.period_bkpt_vol_start;
5951 l_prev_vol_end := vol_rec.period_bkpt_vol_end;
5952 l_vol_counter := l_vol_counter + 1;
5953
5954 END LOOP; /* loop for volumes */
5955
5956 l_volumes := NULL;
5957 OPEN null_vols(p_bkhd_id => bkhd_rec.bkpt_header_id
5958 ,p_start_date => bkdt_rec.bkpt_start_date);
5959 FETCH null_vols INTO l_volumes;
5960 CLOSE null_vols;
5961
5962 IF l_volumes >1 THEN
5963 RAISE OVERLAP_FOUND_EXCEPTION;
5964 END IF;
5965
5966 END IF;
5967
5968 END LOOP; /* loop for bkdt */
5969
5970 IF l_prev_bkdt_end > bkhd_rec.bkhd_end_date THEN
5971 RAISE DT_OUT_OF_BKHD_RANGE_EXCEPTION;
5972
5973 ELSIF l_prev_bkdt_end < bkhd_rec.bkhd_end_date THEN
5974 IF p_check_for = 'GAPS' THEN
5975 /*RAISE GAP_FOUND_EXCEPTION;*/
5976 l_return_status := 'GAP_FOUND_EXCEPTION';
5977 END IF;
5978
5979 END IF;
5980
5981 END LOOP; /* loop for bkhd */
5982
5983 IF l_prev_bkhd_end > l_period_end_dt THEN
5984 RAISE DT_OUT_OF_PRD_RANGE_EXCEPTION;
5985
5986 ELSIF l_prev_bkhd_end < l_period_end_dt THEN
5987 IF p_check_for = 'GAPS' THEN
5988 /*RAISE GAP_FOUND_EXCEPTION;*/
5989 l_return_status := 'GAP_FOUND_EXCEPTION';
5990 END IF;
5991
5992 END IF;
5993
5994 END LOOP; /* loop for lines */
5995 END IF;
5996
5997 END LOOP; /* loop for periods */
5998 END IF;
5999
6000 ELSE
6001 /* raise bad exception error */
6002 RAISE BAD_CALLED_FROM_EXCEPTION;
6003
6004 END IF;
6005 RETURN l_return_status;
6006
6007 EXCEPTION
6008 WHEN BAD_CALLED_FROM_EXCEPTION THEN
6009 NULL;
6010 RETURN 'BAD_CALLED_FROM_EXCEPTION';
6011 /* write error log here */
6012 WHEN GAP_FOUND_EXCEPTION THEN
6013 l_return_status := 'GAP_FOUND_EXCEPTION';
6014 /* write error log here */
6015 WHEN VOL_GAP_FOUND_EXCEPTION THEN
6016 l_return_status := 'VOL_GAP_FOUND_EXCEPTION';
6017 /* write error log here */
6018 WHEN OVERLAP_FOUND_EXCEPTION THEN
6019 l_return_status := 'OVERLAP_FOUND_EXCEPTION';
6020 RETURN l_return_status;
6021 /* write error log here */
6022 WHEN DT_OUT_OF_PRD_RANGE_EXCEPTION THEN
6023 NULL;
6024 RETURN 'DT_OUT_OF_BKHD_RANGE_EXCEPTION';
6025 /* write error log here */
6026 WHEN DT_OUT_OF_BKHD_RANGE_EXCEPTION THEN
6027 NULL;
6028 RETURN 'DT_OUT_OF_BKHD_RANGE_EXCEPTION';
6029 /* write error log here */
6030 WHEN OTHERS THEN NULL;
6031
6032 RETURN l_return_status;
6033
6034 END dates_validation;
6035
6036 -------------------------------------------------------------------------------
6037 -- NAME : CONSTR_DATES_VALIDATION()
6038 -- PURPOSE : Vaidate overlap in constraints start and End dates
6039 -- DESCRIPTION :
6040 -- SCOPE : PUBLIC
6041 --
6042 -- ARGUMENTS : p_var_rent_id : variable rent ID (mandatory)
6043 -- p_called_from : SETUP or MAIN
6044 --
6045
6046 -- RETURNS : l_return_status
6047 -- HISTORY :
6048 --
6049 -- 12-APR-06 Pikhar o Created.
6050 -- 14-MAR-07 Pikhar o Changes for Bug 5930407
6051 -------------------------------------------------------------------------------
6052 FUNCTION CONSTR_DATES_VALIDATION (p_var_rent_id IN NUMBER
6053 ,p_called_from IN VARCHAR2) RETURN VARCHAR2
6054 IS
6055
6056 TYPE constr_def_type IS TABLE OF pn_var_constr_defaults_all%ROWTYPE INDEX BY BINARY_INTEGER;
6057 TYPE constr_type IS TABLE OF pn_var_constraints_all%ROWTYPE INDEX BY BINARY_INTEGER;
6058 constr_def_tab constr_def_type;
6059 constr_tab constr_type;
6060 l_C1_start_date DATE;
6061 l_C1_end_date DATE;
6062 l_C1_type_code VARCHAR2(30);
6063 l_C2_start_date DATE;
6064 l_C2_end_date DATE;
6065 l_C2_type_code VARCHAR2(30);
6066 l_C1_amount NUMBER;
6067 l_C2_amount NUMBER;
6068 i NUMBER;
6069 l_var_rent_id NUMBER;
6070 l_vr_comm_dt DATE;
6071 l_vr_term_dt DATE;
6072 l_return_status VARCHAR2(50) := 'N';
6073
6074 /* data structures */
6075 TYPE NUM_TBL IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
6076 TYPE DATE_TBL IS TABLE OF DATE INDEX BY BINARY_INTEGER;
6077
6078 /* period details */
6079 l_period_t NUM_TBL;
6080 l_period_st_dt_t DATE_TBL;
6081 l_period_end_dt_t DATE_TBL;
6082
6083 CURSOR var_rent_c(p_vr_id IN NUMBER) IS
6084 SELECT var_rent_id
6085 ,commencement_date
6086 ,termination_date
6087 FROM pn_var_rents_all
6088 WHERE var_rent_id = p_vr_id;
6089
6090 /* cursor for defaults - SETUP */
6091 CURSOR constr_def_c IS
6092 SELECT constr_default_id
6093 ,constr_start_date
6094 ,constr_end_date
6095 ,type_code
6096 ,amount
6097 FROM pn_var_constr_defaults_all
6098 WHERE var_rent_id = p_var_rent_id
6099 ORDER BY constr_start_date;
6100
6101
6102 /* cursors for main flow */
6103 CURSOR periods_vr_c(p_vr_id IN NUMBER) IS
6104 SELECT period_id
6105 ,start_date
6106 ,end_date
6107 FROM pn_var_periods_all
6108 WHERE var_rent_id = p_vr_id
6109 ORDER BY start_date;
6110
6111 CURSOR periods_c(p_prd_id IN NUMBER) IS
6112 SELECT period_id
6113 ,start_date
6114 ,end_date
6115 FROM pn_var_periods_all
6116 WHERE period_id = p_prd_id;
6117
6118 CURSOR constr_c(p_period_id IN NUMBER) IS
6119 SELECT constraint_id
6120 ,constr_start_date
6121 ,constr_end_date
6122 ,type_code
6123 FROM pn_var_constraints_all
6124 WHERE period_id = p_period_id
6125 ORDER BY constr_start_date;
6126
6127
6128 OVERLAP_FOUND_EXCEPTION EXCEPTION;
6129 DT_OUT_OF_RANGE_EXCEPTION EXCEPTION;
6130 BAD_CALLED_FROM_EXCEPTION EXCEPTION;
6131 MAX_LESS_THAN_MIN EXCEPTION;
6132
6133
6134 BEGIN
6135
6136 IF p_var_rent_id IS NOT NULL THEN
6137 FOR vr_rec IN var_rent_c(p_vr_id => p_var_rent_id) LOOP
6138 l_vr_comm_dt := vr_rec.commencement_date;
6139 l_vr_term_dt := vr_rec.termination_date;
6140 END LOOP;
6141 ELSE
6142 RAISE BAD_CALLED_FROM_EXCEPTION;
6143 END IF;
6144
6145 IF p_called_from = 'SETUP' THEN
6146
6147 i := 1; /*This is used to feed data in PL/SQL table */
6148
6149 FOR constr_cursor IN constr_def_c LOOP
6150 constr_def_tab(i).constr_start_date := constr_cursor.constr_start_date;
6151 constr_def_tab(i).constr_end_date := constr_cursor.constr_end_date;
6152 constr_def_tab(i).type_code := constr_cursor.type_code;
6153 constr_def_tab(i).constr_default_id := constr_cursor.constr_default_id;
6154 constr_def_tab(i).amount := constr_cursor.amount;
6155 i := i+1;
6156 END LOOP;
6157
6158 IF constr_def_tab.FIRST IS NOT NULL THEN
6159 FOR i IN constr_def_tab.FIRST..constr_def_tab.LAST
6160 LOOP
6161
6162 l_C1_start_date := constr_def_tab(i).constr_start_date;
6163 l_C1_end_date := constr_def_tab(i).constr_end_date;
6164 l_C1_type_code := constr_def_tab(i).type_code;
6165 l_C1_amount := constr_def_tab(i).amount;
6166
6167
6168 FOR j IN i..constr_def_tab.LAST
6169 LOOP
6170 l_C2_start_date := constr_def_tab(j).constr_start_date;
6171 l_C2_end_date := constr_def_tab(j).constr_end_date;
6172 l_C2_type_code := constr_def_tab(j).type_code;
6173 l_C2_amount := constr_def_tab(j).amount;
6174
6175 /* Constraints of same type_code should not overlap for overlaping dates*/
6176 IF constr_def_tab(i).constr_default_id <> constr_def_tab(j).constr_default_id THEN
6177 IF l_C1_start_date BETWEEN l_C2_start_date AND l_C2_end_date OR
6178 l_C2_start_date BETWEEN l_C1_start_date AND l_C1_end_date THEN
6179 IF l_C1_type_code = l_C2_type_code THEN
6180 RETURN 'OVERLAP_FOUND_EXCEPTION';
6181 END IF;
6182 /* Max constraint should not be less than Min Constraint */
6183 IF (l_C1_type_code = 'MAX' AND l_C2_type_code = 'MIN' AND (l_C1_amount < l_C2_amount)) OR
6184 (l_C2_type_code = 'MAX' AND l_C1_type_code = 'MIN' AND (l_C2_amount < l_C1_amount)) THEN
6185 RETURN 'MAX_LESS_THAN_MIN';
6186 END IF;
6187 END IF;
6188 END IF;
6189
6190 END LOOP;
6191 END LOOP;
6192 END IF;
6193
6194 RETURN l_return_status;
6195
6196 ELSIF p_called_from = 'MAIN' THEN
6197
6198 l_period_t.DELETE;
6199 l_period_st_dt_t.DELETE;
6200 l_period_end_dt_t.DELETE;
6201
6202 OPEN periods_vr_c(p_vr_id => p_var_rent_id);
6203 FETCH periods_vr_c BULK COLLECT INTO
6204 l_period_t
6205 ,l_period_st_dt_t
6206 ,l_period_end_dt_t;
6207 CLOSE periods_vr_c;
6208
6209 IF l_period_t.FIRST IS NOT NULL THEN
6210 FOR prd_rec IN l_period_t.FIRST..l_period_t.LAST LOOP
6211
6212 i := 1; /*This is used to feed data in PL/SQL table */
6213
6214 FOR constr_cursor IN constr_c(p_period_id => l_period_t(prd_rec)) LOOP
6215 constr_tab(i).constr_start_date := constr_cursor.constr_start_date;
6216 constr_tab(i).constr_end_date := constr_cursor.constr_end_date;
6217 constr_tab(i).type_code := constr_cursor.type_code;
6218 constr_tab(i).constraint_id := constr_cursor.constraint_id;
6219 i := i+1;
6220 END LOOP;
6221
6222 FOR i IN constr_tab.FIRST..constr_tab.LAST
6223 LOOP
6224
6225 l_C1_start_date := constr_tab(i).constr_start_date;
6226 l_C1_end_date := constr_tab(i).constr_end_date;
6227 l_C1_type_code := constr_tab(i).type_code;
6228
6229
6230 FOR j IN i..constr_tab.LAST
6231 LOOP
6232 l_C2_start_date := constr_tab(j).constr_start_date;
6233 l_C2_end_date := constr_tab(j).constr_end_date;
6234 l_C2_type_code := constr_tab(j).type_code;
6235
6236 /* Constraints of same type_code should not overlap for overlaping dates*/
6237 IF constr_tab(i).constraint_id <> constr_tab(j).constraint_id THEN
6238 IF l_C1_start_date BETWEEN l_C2_start_date AND l_C2_end_date OR
6239 l_C2_start_date BETWEEN l_C1_start_date AND l_C1_end_date THEN
6240 IF l_C1_type_code = l_C2_type_code THEN
6241 RETURN 'OVERLAP_FOUND_EXCEPTION';
6242 END IF;
6243 END IF;
6244 END IF;
6245
6246 END LOOP;
6247
6248 END LOOP;
6249
6250 END LOOP; /*periods*/
6251
6252 END IF;
6253 RETURN l_return_status;
6254
6255 END IF; /*validation for SETUP and MAIN complete*/
6256
6257 RETURN l_return_status;
6258
6259 EXCEPTION
6260 WHEN BAD_CALLED_FROM_EXCEPTION THEN
6261 RETURN 'BAD_CALLED_FROM_EXCEPTION';
6262 WHEN OVERLAP_FOUND_EXCEPTION THEN
6263 RETURN 'OVERLAP_FOUND_EXCEPTION';
6264 WHEN DT_OUT_OF_RANGE_EXCEPTION THEN
6265 RETURN 'DT_OUT_OF_RANGE_EXCEPTION';
6266 WHEN MAX_LESS_THAN_MIN THEN
6267 RETURN 'MAX_LESS_THAN_MIN';
6268 WHEN OTHERS THEN NULL;
6269
6270 END CONSTR_DATES_VALIDATION;
6271
6272 /*===========================================================================+
6273 | PROCEDURE
6274 | extend_periods
6275 |
6276 | DESCRIPTION
6277 | This procedure will be calles when the termination date of the VR
6278 | agreement is extended or if the start date is changed to an earlier
6279 | start date due to either change in the lease agreement or the VR
6280 | agreement
6281 |
6282 | SCOPE - PUBLIC
6283 |
6284 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
6285 | CALLS : extend_group_dates
6286 |
6287 | ARGUMENTS : IN:
6288 |
6289 | p_var_rent_id - Variable rent id ( PK),
6290 | p_extension_end_date - new term date , NULL if no change
6291 | p_start_date - old start date, NULL if no change
6292 | p_end_date - old end date, NULL if no change
6293 | p_cumulative_vol - Cumulative Y/N,
6294 | ARGUMENTS : OUT:
6295 | x_return_status
6296 | x_return_message
6297 |
6298 | MODIFICATION HISTORY
6299 |
6300 | 08-DEC-2002 graghuna o Created
6301 +===========================================================================*/
6302 PROCEDURE extend_periods ( p_var_rent_id IN NUMBER,
6303 p_extension_end_date IN DATE,
6304 p_start_date IN DATE,
6305 p_end_date IN DATE,
6306 x_return_status OUT NOCOPY VARCHAR2,
6307 x_return_message OUT NOCOPY VARCHAR2)
6308 IS
6309
6310 Cursor var_periods_cur IS
6311 SELECT *
6312 FROM pn_var_periods_all
6313 WHERE var_rent_id = p_var_rent_id
6314 -- AND (start_date = NVL(p_start_date,start_date) OR
6315 -- end_date = NVL(p_end_date ,end_date) )
6316 Order by start_date ;
6317
6318 CURSOR var_rent_dates_cur IS
6319 SELECT *
6320 FROM pn_var_rent_dates_all
6321 WHERE var_rent_id = p_var_rent_id ;
6322
6323 l_row_found BOOLEAN := FALSE;
6324 l_index NUMBER := 0;
6325 l_number_of_new_periods NUMBER := 0;
6326
6327 v_cal_periods_tbl cal_periods_tbl;
6328 v_new_periods_tbl new_periods_tbl;
6329 l_is_partial_period BOOLEAN := FALSE;
6330 l_partial_period VARCHAR2(1) := 'N';
6331
6332 BEGIN
6333
6334 -- First determine if the extension end date lies
6335 -- in the same period year or another period needs
6336 -- to be created
6337
6338 FOR var_rent_dates_rec in var_rent_dates_cur
6339 LOOP
6340 pnp_debug_pkg.debug('inside var_rent_dates_rec loop');
6341 generate_cal_periods_tbl(p_var_rent_dates_rec => var_rent_dates_rec ,
6342 p_start_date => p_start_date,
6343 p_end_date => p_end_date,
6344 p_extension_end_date => p_extension_end_date,
6345 x_cal_periods_tbl => v_cal_periods_tbl);
6346 FOR i in v_cal_periods_tbl.FIRST .. v_cal_periods_tbl.LAST
6347 LOOP
6348 l_row_found := FALSE;
6349 FOR var_periods_rec in var_periods_cur
6350 LOOP
6351 IF (v_cal_periods_tbl(i).start_date = var_periods_rec.start_date AND
6352 v_cal_periods_tbl(i).end_date = var_periods_rec.end_date ) THEN
6353 --put_log('found exact row....');
6354 l_row_found := TRUE;
6355 exit;
6356 ELSIF (v_cal_periods_tbl(i).start_date = var_periods_rec.start_date AND
6357 v_cal_periods_tbl(i).end_date > var_periods_rec.end_date ) THEN
6358 --put_log('found row to update....');
6359 l_row_found := TRUE;
6360 l_index := l_index + 1;
6361 v_new_periods_tbl(l_index).period_id := var_periods_rec.period_id;
6362 v_new_periods_tbl(l_index).var_rent_id := p_var_rent_id;
6363 v_new_periods_tbl(l_index).start_date := v_cal_periods_Tbl(i).start_date; --Srini
6364 v_new_periods_tbl(l_index).end_date := v_cal_periods_Tbl(i).end_date;
6365 v_new_periods_tbl(l_index).flag := 'U' ;
6366 exit;
6367 END IF; -- end if of if VR Preiod lies within the GL period.
6368 END LOOP; -- end loop for var_periods_rec in var_periods_cur LOOP
6369
6370 IF NOT(l_row_found) THEN
6371 l_index := l_index + 1;
6372 l_number_of_new_periods := l_number_of_new_periods + 1;
6373 v_new_periods_tbl(l_index).flag := 'A' ;
6374 v_new_periods_tbl(l_index).var_rent_id := p_var_rent_id;
6375 v_new_periods_tbl(l_index).start_date := v_cal_periods_tbl(i).start_date;
6376 IF p_extension_end_date > v_cal_periods_tbl(i).end_date THEN
6377 v_new_periods_tbl(l_index).end_date := v_cal_periods_tbl(i).end_date ;
6378 ELSE
6379 v_new_periods_tbl(l_index).end_date := p_extension_end_date;
6380 END IF;
6381 END IF;
6382 END LOOP; -- end loop of v_cal_periods_tbl.FIRST .. v_cal_periods_tbl.LAST
6383
6384 -- Process the update and then new inserts, if any
6385 FOR i in v_new_periods_tbl.FIRST .. v_new_periods_tbl.LAST
6386 LOOP
6387 IF v_new_periods_tbl(i).flag = 'U' THEN
6388 IF v_new_periods_tbl(i).end_date is NOT NULL THEN
6389 /*DELETE pn_var_transactions_all
6390 WHERE period_id = v_new_periods_tbl(i).period_id ;*/
6391
6392 --Srini Start 30-JUL-2004
6393 --Determine the new period is partial or full year
6394 l_is_partial_period := FALSE;
6395 /*
6396 l_is_partial_period := pn_var_trueup_ytd.is_partial_period (
6397 p_period_start_date => v_new_periods_tbl(i).start_date,
6398 p_period_end_date => v_new_periods_tbl(i).end_date,
6399 p_gl_calendar => var_rent_dates_rec.use_gl_calendar,
6400 p_period_set_name => var_rent_dates_rec.gl_period_set_name ,
6401 p_period_type => var_rent_dates_rec.period_type,
6402 p_cal_start_date => var_rent_dates_rec.year_start_date);
6403 */
6404 IF l_is_partial_period THEN
6405 l_partial_period := 'Y';
6406 ELSE
6407 l_partial_period := 'N';
6408 END IF;
6409 /*pnp_debug_pkg.debug(' v_new_periods_tbl(i).start_date:'||v_new_periods_tbl(i).start_date);
6410 pnp_debug_pkg.debug(' v_new_periods_tbl(i).end_date:'||v_new_periods_tbl(i).end_date);
6411 pnp_debug_pkg.debug(' l_partial_period:'||l_partial_period);*/
6412 --Srini End 30-JUL-2004
6413
6414 UPDATE pn_var_periods_all
6415 SET end_date = v_new_periods_tbl(i).end_date,
6416 partial_period = l_partial_period, --Srini
6417 last_update_date = sysdate,
6418 last_updated_by = FND_GLOBAL.USER_ID,
6419 last_update_login = FND_GLOBAL.LOGIN_ID
6420 WHERE period_id = v_new_periods_tbl(i).period_id;
6421 put_log('updated period id '|| v_new_periods_tbl(i).period_id || ' with date = ' || v_new_periods_tbl(i).end_date);
6422 END IF;
6423
6424 extend_group_dates(p_pn_var_rent_dates_rec => var_rent_dates_rec,
6425 p_period_id => v_new_periods_tbl(i).period_id,
6426 x_return_status => x_return_status,
6427 x_return_message => x_return_message);
6428 END IF;
6429 END LOOP; -- end loop for v_new_periods_tbl.FIRST .. v_new_periods_tbl.LAST
6430
6431 FOR i in v_new_periods_tbl.FIRST .. v_new_periods_tbl.LAST
6432 LOOP
6433 IF v_new_periods_tbl(i).flag = 'A' THEN
6434 pn_var_rent_pkg.create_var_rent_periods_nocal(p_var_rent_id => p_var_rent_id ,
6435 p_cumulative_vol => 'Y' ,
6436 p_yr_start_date => var_rent_dates_rec.year_start_date);
6437 END IF;
6438 END LOOP; -- end loop for v_new_periods_tbl.FIRST .. v_new_periods_tbl.LAST
6439
6440 END LOOP; --- end loop for var_rent_dates_rec will always have one row.
6441
6442 EXCEPTION
6443 WHEN OTHERS THEN
6444 fnd_message.set_name('PN','PN_OTHERS_EXCEPTION');
6445 fnd_message.set_token('ERR_MSG',sqlerrm);
6446 x_return_status := FND_API.G_RET_STS_ERROR;
6447 pnp_debug_pkg.put_log_msg (fnd_message.get);
6448 --PNP_DEBUG_PKG.disable_file_debug;
6449
6450 END extend_periods ;
6451
6452 /*===========================================================================+
6453 | PROCEDURE
6454 | extend_group_dates
6455 |
6456 | DESCRIPTION
6457 | This procedure will be calles when the termination date of the VR
6458 | agreement is extended or if the start date is changed to an earlier
6459 | start date due to either change in the lease agreement or the VR
6460 | agreement
6461 |
6462 | SCOPE - PUBLIC
6463 |
6464 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
6465 | CALLS : extend_group_dates
6466 |
6467 | ARGUMENTS : IN:
6468 |
6469 | p_pn_var_rent_dates_Rec -
6470 | p_period_id -
6471 | ARGUMENTS : OUT:
6472 | x_return_status
6473 | x_return_message
6474 |
6475 | MODIFICATION HISTORY
6476 |
6477 | 29-MAR-2003 Srini Vijayareddy o Created
6478 |
6479 | 31-MAY-2005 Ajay Solanki
6480 | B88A - TEST - 37161: When using an Annual Reporting method, the breakpoints for the
6481 | last partial period are not being prorated. We prorate for the first partial period,
6482 | but use a annual breakpoint in the last period.
6483 |
6484 +===========================================================================*/
6485 PROCEDURE extend_group_dates (p_pn_var_rent_dates_rec IN PN_VAR_RENT_DATES_ALL%ROWTYPE,
6486 p_period_id IN NUMBER,
6487 x_return_status OUT NOCOPY VARCHAR2,
6488 x_return_message OUT NOCOPY VARCHAR2)
6489 IS
6490 CURSOR group_date_mon(p_vr_comm_date DATE, p_vr_term_date DATE) IS
6491 SELECT min(start_date) start_date, max(end_date) end_date
6492 FROM gl_periods
6493 WHERE period_set_name = p_pn_var_rent_dates_rec.gl_period_set_name
6494 AND start_date <= p_vr_term_date
6495 AND end_date >= p_vr_comm_date
6496 AND period_type = p_pn_var_rent_dates_rec.period_type
6497 AND adjustment_period_flag = 'N'
6498 GROUP BY period_year, quarter_num, period_num
6499 ORDER BY start_date,end_date;
6500
6501 CURSOR group_date_qtr(p_vr_comm_date DATE, p_vr_term_date DATE)IS
6502 SELECT min(start_date) start_date, max(end_date) end_date
6503 FROM gl_periods
6504 WHERE period_set_name = p_pn_var_rent_dates_rec.gl_period_set_name
6505 AND start_date <= p_vr_term_date
6506 AND end_date >= p_vr_comm_date
6507 AND quarter_num IN(1,2,3,4)
6508 AND period_type = p_pn_var_rent_dates_rec.period_type
6509 GROUP BY period_year, quarter_num
6510 ORDER BY start_date;
6511
6512 CURSOR group_date_sa (p_vr_comm_date DATE, p_vr_term_date DATE) IS
6513 SELECT min(g1.start_date) start_date
6514 ,max(g2.end_date) end_date
6515 FROM gl_periods g1, gl_periods g2
6516 WHERE g1.period_set_name(+) = p_pn_var_rent_dates_rec.gl_period_set_name
6517 AND g2.period_set_name = p_pn_var_rent_dates_rec.gl_period_set_name
6518 AND g1.start_date(+) <= p_vr_term_date
6519 AND g2.end_date >= p_vr_comm_date
6520 AND g1.quarter_num(+) = 1
6521 AND g2.quarter_num = 2
6522 AND g1.period_year(+) = g2.period_year
6523 AND g1.start_date IS NOT NULL
6524 AND g2.end_date IS NOT NULL
6525 AND g1.period_type = p_pn_var_rent_dates_rec.period_type
6526 AND g2.period_type = p_pn_var_rent_dates_rec.period_type
6527 GROUP BY g2.period_year
6528 UNION
6529 SELECT min(g1.start_date) start_date
6530 ,max(g2.end_date) end_date
6531 FROM gl_periods g1, gl_periods g2
6532 WHERE g1.period_set_name(+) = p_pn_var_rent_dates_rec.gl_period_set_name
6533 AND g2.period_set_name = p_pn_var_rent_dates_rec.gl_period_set_name
6534 AND g1.start_date(+) <= p_vr_term_date
6535 AND g2.end_date >= p_vr_comm_date
6536 AND g1.quarter_num(+) = 3
6537 AND g2.quarter_num = 4
6538 AND g1.period_year (+)= g2.period_year
6539 AND g1.start_date IS NOT NULL
6540 AND g2.end_date IS NOT NULL
6541 AND g1.period_type = p_pn_var_rent_dates_rec.period_type
6542 AND g2.period_type = p_pn_var_rent_dates_rec.period_type
6543 GROUP BY g2.period_year
6544 order by 1;
6545
6546 CURSOR group_date_ann (p_vr_comm_date DATE, p_vr_term_date DATE) IS
6547 SELECT min(start_date) start_date,max(end_date) end_date
6548 FROM gl_periods
6549 WHERE period_set_name = p_pn_var_rent_dates_rec.gl_period_set_name
6550 AND start_date <= p_vr_term_date
6551 AND end_date >= p_vr_comm_date
6552 AND period_type = p_pn_var_rent_dates_rec.period_type
6553 GROUP BY period_year
6554 ORDER BY start_date;
6555
6556 CURSOR periods_cur
6557 IS
6558 SELECT start_date, end_date ,proration_factor
6559 FROM pn_var_periods_all
6560 WHERE period_id = p_period_id;
6561
6562 CURSOR pn_var_grp_dates_cur
6563 IS
6564 SELECT *
6565 FROM pn_var_grp_dates_all
6566 WHERE period_id = p_period_id
6567 ORDER BY grp_start_date;
6568
6569 v_inv_dates_tbl group_dates_tbl;
6570
6571 l_period_start_date DATE;
6572 l_period_end_date DATE;
6573 l_proration_factor NUMBER := 0;
6574 l_grpdateid NUMBER;
6575 l_period_proration_factor NUMBER := 0;
6576 l_new_st_date DATE;
6577 l_new_end_date DATE;
6578 l_rptg_date DATE;
6579 l_inv_schedule_date DATE;
6580 l_invoice_due_date DATE;
6581 l_inv_st_date DATE;
6582 l_year_st_date DATE ;
6583 l_year_end_date DATE ;
6584 l_grp_st_date DATE ;
6585 l_grp_end_date DATE ;
6586 l_rowid VARCHAR2(18);
6587 l_vr_comm_dt DATE;
6588 l_vr_term_dt DATE;
6589 l_inv_counter NUMBER;
6590 l_invg_freq_code NUMBER;
6591 l_reptg_freq_code NUMBER;
6592 l_grp_counter NUMBER := 0;
6593 l_inv_end_date DATE := to_date('01/01/0001','mm/dd/yyyy');
6594 l_invoice_date DATE;
6595 l_grp_inv_counter NUMBER := 0;
6596
6597 TYPE grp_date_rec is RECORD (l_grp_start_date DATE,
6598 l_grp_end_date DATE,
6599 l_group_date DATE,
6600 l_reptg_due_date DATE,
6601 l_inv_start_date DATE,
6602 l_inv_end_date DATE,
6603 l_invoice_date DATE,
6604 l_inv_schedule_date DATE,
6605 l_proration_factor NUMBER,
6606 l_rec_found VARCHAR2(1));
6607
6608 TYPE grp_date_table_type IS TABLE OF grp_date_rec INDEX BY BINARY_INTEGER;
6609 vr_grp_dates grp_date_table_type;
6610
6611 BEGIN
6612 SELECT commencement_date, termination_date
6613 INTO l_vr_comm_dt, l_vr_term_dt
6614 FROM pn_var_rents_all
6615 WHERE var_rent_id = p_pn_var_rent_dates_rec.var_rent_id;
6616
6617 SELECT year_start_date
6618 INTO l_year_st_date
6619 FROM pn_var_rent_dates_all
6620 WHERE var_rent_id = p_pn_var_rent_dates_rec.var_rent_id;
6621
6622 IF p_pn_var_rent_dates_rec.invg_freq_code = 'MON' THEN
6623 l_invg_freq_code := 1;
6624 ELSIF p_pn_var_rent_dates_rec.invg_freq_code = 'QTR' THEN
6625 l_invg_freq_code := 3;
6626 ELSIF p_pn_var_rent_dates_rec.invg_freq_code = 'SA' THEN
6627 l_invg_freq_code := 6;
6628 ELSIF p_pn_var_rent_dates_rec.invg_freq_code = 'YR' THEN
6629 l_invg_freq_code := 12;
6630 END IF;
6631
6632 IF p_pn_var_rent_dates_rec.reptg_freq_code = 'MON' THEN
6633 l_reptg_freq_code := 1;
6634 ELSIF p_pn_var_rent_dates_rec.reptg_freq_code = 'QTR' THEN
6635 l_reptg_freq_code := 3;
6636 ELSIF p_pn_var_rent_dates_rec.reptg_freq_code = 'SA' THEN
6637 l_reptg_freq_code := 6;
6638 ELSIF p_pn_var_rent_dates_rec.reptg_freq_code = 'YR' THEN
6639 l_reptg_freq_code := 12;
6640 END IF;
6641
6642 FOR periods_rec in periods_cur
6643 LOOP
6644 l_period_start_date := periods_rec.start_date;
6645 l_period_end_date := periods_rec.end_date;
6646
6647 put_log('l_period start date = ' || l_period_start_date);
6648 put_log('l_period end_date' || l_period_end_date);
6649
6650 -- determine reporting preiods
6651 IF NVL(p_pn_var_rent_dates_rec.use_gl_calendar,'N') = 'Y' THEN
6652 l_grp_counter := 0;
6653 IF p_pn_var_rent_dates_rec.reptg_freq_code = 'MON' THEN
6654 FOR group_date_rec in group_date_mon(l_period_start_date,
6655 l_period_end_date)
6656 LOOP
6657 l_grp_counter := l_grp_counter + 1;
6658 vr_grp_dates(l_grp_counter).l_grp_start_date := group_date_rec.start_date;
6659 vr_grp_dates(l_grp_counter).l_grp_end_date := group_date_rec.end_date;
6660 END LOOP;
6661 ELSIF p_pn_var_rent_dates_rec.reptg_freq_code = 'QTR' THEN
6662 put_log('reporting = quarter');
6663 FOR group_date_rec in group_date_qtr(l_period_start_date,
6664 l_period_end_date)
6665 LOOP
6666 l_grp_counter := l_grp_counter + 1;
6667 vr_grp_dates(l_grp_counter).l_grp_start_date := group_date_rec.start_date;
6668 vr_grp_dates(l_grp_counter).l_grp_end_date := group_date_rec.end_date;
6669 END LOOP;
6670 ELSIF p_pn_var_rent_dates_rec.reptg_freq_code = 'SA' THEN
6671 FOR group_date_rec in group_date_sa(l_period_start_date,
6672 l_period_end_date)
6673 LOOP
6674 l_grp_counter := l_grp_counter + 1;
6675 vr_grp_dates(l_grp_counter).l_grp_start_date := group_date_rec.start_date;
6676 vr_grp_dates(l_grp_counter).l_grp_end_date := group_date_rec.end_date;
6677 END LOOP;
6678 ELSIF p_pn_var_rent_dates_rec.reptg_freq_code = 'YR' THEN
6679 FOR group_date_rec in group_date_ann(l_period_start_date,
6680 l_period_end_date)
6681 LOOP
6682 l_grp_counter := l_grp_counter + 1;
6683 vr_grp_dates(l_grp_counter).l_grp_start_date := group_date_rec.start_date;
6684 vr_grp_dates(l_grp_counter).l_grp_end_date := group_date_rec.end_date;
6685 END LOOP;
6686 END IF;
6687
6688 -- determine invoice periods
6689 l_inv_counter := 0;
6690 IF p_pn_var_rent_dates_rec.invg_freq_code = 'MON' THEN
6691 l_inv_end_date := ADD_MONTHS(l_inv_st_date,1);
6692 v_inv_dates_tbl(l_inv_counter).start_date := l_inv_st_date;
6693 v_inv_dates_tbl(l_inv_counter).end_date := l_inv_end_date;
6694 l_inv_st_date := l_inv_end_date + 1;
6695 FOR group_date_rec in group_date_mon(l_period_start_date,
6696 l_period_end_date)
6697 LOOP
6698 l_inv_counter := l_inv_counter + 1;
6699 v_inv_dates_tbl(l_inv_counter).start_date := group_date_rec.start_date;
6700 v_inv_dates_tbl(l_inv_counter).end_date := group_date_rec.end_date;
6701 END LOOP;
6702 ELSIF p_pn_var_rent_dates_rec.invg_freq_code = 'QTR' THEN
6703 FOR group_date_rec in group_date_qtr(l_period_start_date,
6704 l_period_end_date)
6705 LOOP
6706 l_inv_counter := l_inv_counter + 1;
6707 v_inv_dates_tbl(l_inv_counter).start_date := group_date_rec.start_date;
6708 v_inv_dates_tbl(l_inv_counter).end_date := group_date_rec.end_date;
6709 END LOOP;
6710 ELSIF p_pn_var_rent_dates_rec.invg_freq_code = 'SA' THEN
6711 FOR group_date_rec in group_date_sa(l_period_start_date,
6712 l_period_end_date)
6713 LOOP
6714 l_inv_counter := l_inv_counter + 1;
6715 v_inv_dates_tbl(l_inv_counter).start_date := group_date_rec.start_date;
6716 v_inv_dates_tbl(l_inv_counter).end_date := group_date_rec.end_date;
6717 END LOOP;
6718 ELSIF p_pn_var_rent_dates_rec.invg_freq_code = 'YR' THEN
6719 FOR group_date_rec in group_date_ann(l_period_start_date,
6720 l_period_end_date)
6721 LOOP
6722 l_inv_counter := l_inv_counter + 1;
6723 v_inv_dates_tbl(l_inv_counter).start_date := group_date_rec.start_date;
6724 v_inv_dates_tbl(l_inv_counter).end_date := group_date_rec.end_date;
6725 END LOOP;
6726 END IF;
6727 ELSE
6728 -- use_gl_calendar = N
6729 -- determine reporting periods
6730 l_grp_counter := 0;
6731 l_grp_st_date := l_year_st_date;
6732 l_grp_end_date := ADD_MONTHS(l_grp_st_date,l_reptg_freq_code)-1;
6733
6734 WHILE l_grp_end_date < l_vr_comm_dt LOOP
6735 l_grp_st_date := l_grp_end_date + 1;
6736 l_grp_end_date := ADD_MONTHS(l_grp_st_date,l_reptg_freq_code)-1;
6737 END LOOP;
6738
6739 vr_grp_dates(l_grp_counter).l_grp_start_date := l_vr_comm_dt;
6740 vr_grp_dates(l_grp_counter).l_grp_end_date := l_grp_end_date;
6741 vr_grp_dates(l_grp_counter).l_group_date := l_grp_st_date;
6742 vr_grp_dates(l_grp_counter).l_reptg_due_date :=
6743 NVL( ((ADD_MONTHS(FIRST_DAY(vr_grp_dates(l_grp_counter).l_grp_end_date),1)-1)
6744 + p_pn_var_rent_dates_rec.reptg_day_of_month), (vr_grp_dates(l_grp_counter).l_grp_end_date
6745 + nvl(p_pn_var_rent_dates_rec.reptg_days_after,0)) );
6746 --vr_grp_dates(l_grp_counter).l_proration_factor :=
6747 -- (l_vr_comm_dt - l_grp_end_date)+1/(l_grp_st_date - LAST_DAY(l_grp_end_date))+1; --20MAY2004
6748
6749 WHILE vr_grp_dates(l_grp_counter).l_grp_end_date < l_vr_term_dt LOOP
6750 l_grp_counter := l_grp_counter + 1;
6751 vr_grp_dates(l_grp_counter).l_grp_start_date := vr_grp_dates(l_grp_counter-1).l_grp_end_date + 1;
6752 vr_grp_dates(l_grp_counter).l_grp_end_date := ADD_MONTHS(VR_grp_dates(l_grp_counter).l_grp_start_date,
6753 l_reptg_freq_code) - 1;
6754 vr_grp_dates(l_grp_counter).l_group_date := vr_grp_dates(l_grp_counter).l_grp_start_date;
6755 vr_grp_dates(l_grp_counter).l_reptg_due_date :=
6756 NVL( ((ADD_MONTHS(FIRST_DAY(vr_grp_dates(l_grp_counter).l_grp_end_date),1)-1) + p_pn_var_rent_dates_rec.reptg_day_of_month),
6757 (vr_grp_dates(l_grp_counter).l_grp_end_date + nvl(p_pn_var_rent_dates_rec.reptg_days_after,0)) );
6758 --vr_grp_dates(l_grp_counter).l_proration_factor := 1; --20MAY2004
6759 END LOOP;
6760 vr_grp_dates(l_grp_counter).l_grp_end_date := l_vr_term_dt;
6761
6762 -- determine invoice periods
6763 l_inv_counter := 0;
6764 l_inv_st_date := l_year_st_date;
6765 l_inv_end_date := l_year_st_date;
6766
6767 WHILE l_inv_end_date < l_vr_term_dt
6768 LOOP
6769 IF l_inv_counter = 0 THEN
6770 l_inv_st_date := l_year_st_date;
6771 l_inv_end_date := ADD_MONTHS(l_inv_st_date,l_invg_freq_code)-1;
6772
6773 WHILE l_inv_end_date < l_vr_comm_dt
6774 LOOP
6775 l_inv_st_date := l_inv_end_date + 1;
6776 l_inv_end_date := ADD_MONTHS(l_inv_st_date,l_invg_freq_code)-1;
6777 END LOOP;
6778
6779 l_invoice_date := l_inv_st_date;
6780 l_inv_st_date := l_vr_comm_dt;
6781 ELSE
6782 l_inv_st_date := l_inv_end_date + 1;
6783 l_inv_end_date := ADD_MONTHS(l_inv_st_date,l_invg_freq_code)-1;
6784 l_invoice_date := l_inv_st_date;
6785 END IF;
6786
6787 l_inv_schedule_date := NVL(((ADD_MONTHS(FIRST_DAY(l_inv_end_date),1)-1)
6788 + p_pn_var_rent_dates_rec.invg_day_of_month), (l_inv_end_date
6789 + NVL(p_pn_var_rent_dates_rec.invg_days_after,0)));
6790
6791 IF l_inv_end_date > l_vr_term_dt THEN
6792 l_inv_end_date := l_vr_term_dt;
6793 END IF;
6794
6795 IF TO_NUMBER(TO_CHAR(l_inv_schedule_date,'dd')) in (29,30,31) THEN
6796 l_inv_schedule_date:= (FIRST_DAY(l_inv_schedule_date)+27);
6797 END IF;
6798
6799 FOR i IN l_grp_inv_counter..VR_grp_dates.COUNT-1 LOOP
6800 EXIT WHEN VR_grp_dates(i).l_grp_start_date > l_inv_end_date;
6801 VR_grp_dates(i).l_inv_start_date := l_inv_st_date;
6802 VR_grp_dates(i).l_inv_end_date := l_inv_end_date;
6803 VR_grp_dates(i).l_invoice_date := l_invoice_date;
6804 VR_grp_dates(i).l_inv_schedule_date := l_inv_schedule_date;
6805 l_grp_inv_counter := l_grp_inv_counter + 1;
6806 END LOOP;
6807 l_inv_counter := l_inv_counter + 1;
6808 END LOOP;
6809 END IF; -- end if of gl_calendar = Y
6810
6811 FOR pn_var_grp_dates_rec IN pn_var_grp_dates_cur
6812 LOOP
6813 FOR i IN vr_grp_dates.FIRST .. vr_grp_dates.LAST
6814 LOOP
6815 IF (vr_grp_dates(i).l_grp_start_date = pn_var_grp_dates_rec.grp_start_date AND
6816 vr_grp_dates(i).l_grp_end_date = pn_var_grp_dates_rec.grp_end_date )
6817 THEN
6818 --put_log('Same groups found');
6819 vr_grp_dates(i).l_rec_found := 'X';
6820 END IF;
6821
6822 IF vr_grp_dates(i).l_grp_end_date <> pn_var_grp_dates_rec.grp_end_date AND
6823 vr_grp_dates(i).l_grp_start_date = pn_var_grp_dates_rec.grp_start_date THEN
6824 --put_log('Updating end dates');
6825 vr_grp_dates(i).l_rec_found := 'X';
6826 l_new_st_date := nvl(l_new_st_date,pn_var_grp_dates_rec.grp_start_date);
6827 l_new_end_date := vr_grp_dates(i).l_grp_end_date;
6828
6829 IF p_pn_var_rent_dates_rec.reptg_day_of_month IS NOT NULL THEN
6830 l_rptg_date :=(ADD_MONTHS(FIRST_DAY(vr_grp_dates(i).l_grp_end_date),1)-1)+
6831 p_pn_var_rent_dates_rec.reptg_day_of_month;
6832 ELSE
6833 l_rptg_date := vr_grp_dates(i).l_grp_end_date +
6834 NVL(p_pn_var_rent_dates_rec.reptg_days_after,0);
6835 END IF;
6836
6837 --Code commented Ajay Solanki, 31-MAY-2005 according to mail from Jagan on Mon, 30 May 2005 12:46:54 -0700
6838
6839 -- vr_grp_dates(i).l_proration_factor := ((vr_grp_dates(i).l_grp_end_date -
6840 -- vr_grp_dates(i).l_grp_start_date) +1 )/
6841 -- ((last_day(vr_grp_dates(i).l_grp_end_date) -
6842 -- vr_grp_dates(i).l_group_date)+1); --Chris.T. 20MAY2004
6843
6844 --End Code commented Ajay Solanki, 31-MAY-2005 according to mail from Jagan on Mon, 30 May 2005 12:46:54 -0700
6845
6846
6847 --New Code Ajay Solanki, 31-MAY-2005 according to mail from Jagan on Mon, 30 May 2005 12:46:54 -0700
6848
6849 vr_grp_dates(i).l_proration_factor := ((vr_grp_dates(i).l_grp_end_date -
6850 vr_grp_dates(i).l_grp_start_date) +1 )/
6851 ((LAST_DAY(ADD_MONTHS(LAST_DAY(vr_grp_dates(i).l_group_date),l_reptg_freq_code-1)) -
6852 vr_grp_dates(i).l_group_date)+1);
6853
6854 --End New Code Ajay Solanki, 31-MAY-2005 according to mail from Jagan on Mon, 30 May 2005 12:46:54 -0700
6855
6856 --Srini
6857 IF vr_grp_dates(i).l_proration_factor = 0 THEN
6858 put_log(' GRP Start Date While Updating Group Dates:'||vr_grp_dates(i).l_grp_start_date);
6859 put_log(' GRP End Date While Updating Group Dates:'||vr_grp_dates(i).l_grp_end_date);
6860 put_log(' Group Date While Updating Group Dates:'||vr_grp_dates(i).l_group_date);
6861 --vr_grp_dates(i).l_proration_factor := 1;
6862 END IF;
6863
6864 UPDATE pn_var_grp_dates_all
6865 SET grp_end_date = vr_grp_dates(i).l_grp_end_date ,
6866 proration_factor = round(vr_grp_dates(i).l_proration_factor,10), --Chris.T. 20MAY2004
6867 last_update_date = sysdate,
6868 last_updated_by = FND_GLOBAL.USER_ID,
6869 last_update_login = FND_GLOBAL.LOGIN_ID
6870 WHERE grp_date_id = pn_var_grp_dates_rec.grp_date_id;
6871
6872 /*UPDATE pn_var_transactions_all
6873 SET bkpt_end_date = vr_grp_dates(i).l_grp_end_date,
6874 last_update_date = SYSDATE,
6875 last_updated_by = FND_GLOBAL.USER_ID,
6876 last_update_login = FND_GLOBAL.LOGIN_ID
6877 WHERE grp_date_id = pn_var_grp_dates_rec.grp_date_id;*/
6878
6879 END IF; -- end if of end date not being equal
6880 END LOOP; -- end loop for groups table.
6881 END LOOP; -- end loop for pn_var_grp_dates_rec
6882
6883 FOR i in vr_grp_dates.FIRST .. vr_grp_dates.LAST
6884 LOOP
6885 IF vr_grp_dates(i).l_rec_found is NULL THEN
6886 IF NVL(p_pn_var_rent_dates_rec.use_gl_calendar,'N') = 'N' THEN
6887 l_inv_st_date := vr_grp_dates(i).l_inv_start_date;
6888 l_inv_end_date := vr_grp_dates(i).l_inv_end_date;
6889 l_invoice_due_date := vr_grp_dates(i).l_invoice_date;
6890 l_inv_schedule_date := vr_grp_dates(i).l_inv_schedule_date;
6891 l_rptg_date := vr_grp_dates(i).l_reptg_due_date;
6892 ELSE
6893 l_inv_st_date := NULL;
6894 l_inv_end_date := NULL;
6895 l_invoice_due_date := NULL;
6896 l_inv_schedule_date := NULL;
6897 l_rptg_date := vr_grp_dates(i).l_grp_start_date;
6898 END IF;
6899
6900 vr_grp_dates(i).l_proration_Factor:= ((vr_grp_dates(i).l_grp_end_date -
6901 vr_grp_dates(i).l_grp_start_date) +1 )/
6902 ((last_day(vr_grp_dates(i).l_grp_end_date) -
6903 vr_grp_dates(i).l_group_date)+1); --Chris.T. 20MAY2004
6904 --Srini
6905 IF vr_grp_dates(i).l_proration_factor = 0 THEN
6906 put_log(' GRP Start Date While Creating New Group Dates:'||vr_grp_dates(i).l_grp_start_date);
6907 put_log(' GRP End Date While Creating New Group Dates:'||vr_grp_dates(i).l_grp_end_date);
6908 put_log(' Group Date While Creating New Group Dates:'||vr_grp_dates(i).l_group_date);
6909 --vr_grp_dates(i).l_proration_factor := 1;
6910 END IF;
6911
6912 IF vr_grp_dates(i).l_grp_start_date >= l_period_start_date AND
6913 vr_grp_dates(i).l_grp_end_date <= l_period_end_date THEN
6914 --put_log('-----------------------------------------');
6915 put_log(' Creating new group ');
6916 PN_VAR_RENT_PKG.INSERT_GRP_DATE_ROW(
6917 x_rowid => l_rowId,
6918 x_grp_date_id => l_grpDateId,
6919 x_var_rent_id => p_pn_var_rent_dates_rec.var_rent_id,
6920 x_period_id => p_period_id,
6921 x_grp_start_date => vr_grp_dates(i).l_grp_start_date,
6922 x_grp_end_date => vr_grp_dates(i).l_grp_end_date,
6923 x_group_date => vr_grp_dates(i).l_group_date,
6924 x_reptg_due_date => l_rptg_date,
6925 x_inv_start_date => l_inv_st_date,
6926 x_inv_end_date => l_inv_end_date,
6927 x_invoice_date => l_invoice_due_date,
6928 x_inv_schedule_date => l_inv_schedule_date,
6929 x_proration_factor => vr_grp_dates(i).l_proration_factor, --20MAY2004
6930 x_actual_exp_code => 'N',
6931 x_forecasted_exp_code => 'N',
6932 x_variance_exp_code => 'N',
6933 x_creation_date => SYSDATE,
6934 x_created_by => NVL(FND_PROFILE.VALUE('USER_ID'),1),
6935 x_last_update_date => SYSDATE,
6936 x_last_updated_by => NVL(FND_PROFILE.VALUE('USER_ID'),1),
6937 x_last_update_login => NVL(FND_PROFILE.VALUE('USER_ID'),1));
6938
6939 l_rowId := NULL;
6940 l_grpDateId := NULL;
6941 END IF;
6942 END IF;
6943
6944 END LOOP ;
6945
6946 END LOOP;
6947
6948 IF NVL(p_pn_var_rent_dates_rec.use_gl_calendar,'N') = 'Y' THEN
6949 pn_var_rent_pkg.create_var_rent_periods(
6950 p_var_rent_id => p_pn_var_rent_dates_rec.var_rent_id,
6951 p_cumulative_vol => 'Y',
6952 p_comm_date => l_vr_comm_dt,
6953 p_term_date => l_vr_term_dt,
6954 p_create_flag => 'N');
6955 END IF;
6956
6957 EXCEPTION
6958 WHEN OTHERS THEN
6959 pnp_debug_pkg.debug('error ' || sqlerrm);
6960 fnd_message.set_name('PN','PN_OTHERS_EXCEPTION');
6961 fnd_message.set_token('ERR_MSG',sqlerrm);
6962 x_return_status := FND_API.G_RET_STS_ERROR;
6963 pnp_debug_pkg.debug (fnd_message.get);
6964 pnp_debug_pkg.put_log_msg (fnd_message.get);
6965 --PNP_DEBUG_PKG.disable_file_debug;
6966 END extend_group_dates;
6967
6968 /*===========================================================================+
6969 | PROCEDURE
6970 | create_new_bkpts
6971 |
6972 | DESCRIPTION
6973 | This procedure will be called when the termination date of the VR
6974 | agreement is extended and user selects to create new breakpoints rather than extending
6975 |
6976 | SCOPE - PUBLIC
6977 |
6978 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
6979 | CALLS : None
6980 |
6981 | ARGUMENTS : IN:
6982 |
6983 | p_var_rent_id - var_rent_id of the VR which got extended.( PK),
6984 | p_extension_end_date - new term date , NULL if no change
6985 | p_old_end_date - old end date, NULL if no change
6986 | ARGUMENTS : OUT:
6987 | x_return_status
6988 | x_return_message
6989 |
6990 | MODIFICATION HISTORY
6991 |
6992 | 29-MAR-2004 Srini Vijayareddy o Created
6993 +===========================================================================*/
6994 PROCEDURE create_new_bkpts(p_var_rent_id IN NUMBER,
6995 p_extension_end_date IN DATE,
6996 p_old_end_date IN DATE,
6997 x_return_status OUT NOCOPY VARCHAR2,
6998 x_return_message OUT NOCOPY VARCHAR2)
6999 IS
7000 CURSOR main_vr_cur
7001 IS
7002 SELECT var_rent_id,
7003 commencement_date start_date,
7004 termination_date end_date,
7005 cumulative_vol
7006 FROM pn_var_rents_all
7007 WHERE var_rent_id = p_var_rent_id;
7008
7009 errbuf VARCHAR2(5000);
7010 retcode VARCHAR2(5000);
7011 l_default VARCHAR2(1);
7012
7013 BEGIN
7014 put_log ('PN_VAR_RENT_PKG.create_new_bkpts (+)');
7015 FOR main_vr_rec in main_vr_cur
7016 LOOP
7017 UPDATE pn_var_rents_all
7018 SET termination_date = p_extension_end_date
7019 WHERE var_rent_id = main_vr_rec.var_rent_id;
7020
7021 put_log ('Starting Extension of Periods and group Dates');
7022 extend_periods(p_var_rent_id => main_vr_rec.var_rent_id,
7023 p_extension_end_date => p_extension_end_date,
7024 p_start_date => main_vr_rec.start_date,
7025 p_end_date => main_vr_rec.end_date,
7026 x_return_status => x_return_status,
7027 x_return_message => x_return_message);
7028 put_log ('Completing Extension of Periods and group Dates');
7029
7030 l_default := 'N';
7031 BEGIN
7032 SELECT 'Y'
7033 INTO l_default
7034 FROM DUAL
7035 WHERE EXISTS (SELECT var_rent_id
7036 FROM pn_var_bkhd_defaults_all
7037 WHERE var_rent_id = main_vr_rec.var_rent_id);
7038 EXCEPTION
7039 WHEN OTHERS THEN
7040 l_default := 'N';
7041 END;
7042
7043 put_log ('Defaults Exists:'||l_default);
7044 IF l_default = 'Y' THEN
7045 UPDATE pn_var_line_defaults_all
7046 SET line_end_date = p_extension_end_date,
7047 processed_flag = 0
7048 WHERE var_rent_id = main_vr_rec.var_rent_id
7049 AND line_end_date = p_old_end_date;
7050 COMMIT;
7051 END IF;
7052 END LOOP;
7053 put_log ('PN_VAR_RENT_PKG.create_new_bkpts (-)');
7054 EXCEPTION
7055 WHEN OTHERS THEN
7056 pnp_debug_pkg.debug('error ' || sqlerrm);
7057 fnd_message.set_name('PN','PN_OTHERS_EXCEPTION');
7058 fnd_message.set_token('ERR_MSG',sqlerrm);
7059 x_return_status := FND_API.G_RET_STS_ERROR;
7060 pnp_debug_pkg.debug (fnd_message.get);
7061 pnp_debug_pkg.put_log_msg (fnd_message.get);
7062 END create_new_bkpts;
7063
7064
7065 FUNCTION GET_PRORATION_RULE(p_var_rent_id IN NUMBER DEFAULT NULL,
7066 p_period_id IN NUMBER DEFAULT NULL)
7067 RETURN VARCHAR2
7068 IS
7069 CURSOR var_rent_cur IS
7070 SELECT a.proration_rule
7071 FROM pn_var_rents_all a,
7072 pn_var_periods_all b
7073 WHERE a.var_rent_id = NVL(p_var_rent_id,a.var_rent_id)
7074 AND a.var_rent_id = b.var_rent_id
7075 AND b.period_id = NVL(p_period_id,b.period_id);
7076
7077 l_proration_rule VARCHAR2(50) := NULL;
7078 BEGIN
7079
7080 IF p_var_rent_id IS NOT NULL THEN
7081 BEGIN
7082 SELECT proration_rule
7083 INTO l_proration_rule
7084 FROM pn_var_rents_all
7085 WHERE var_rent_id = p_var_rent_id;
7086 EXCEPTION
7087 WHEN OTHERS THEN
7088 l_proration_rule := NULL;
7089 END;
7090
7091 ELSE
7092 BEGIN
7093 SELECT proration_rule
7094 INTO l_proration_rule
7095 FROM pn_var_rents_all a,
7096 pn_var_periods_all b
7097 WHERE a.var_rent_id = b.var_rent_id
7098 AND b.period_id = NVL(p_period_id,b.period_id);
7099 EXCEPTION
7100 WHEN OTHERS THEN
7101 l_proration_rule := NULL;
7102 END;
7103
7104 END IF;
7105
7106
7107 FOR var_rent_rec in var_rent_cur LOOP
7108 l_proration_rule := var_rent_rec.proration_rule;
7109 EXIT;
7110 END LOOP;
7111 RETURN l_proration_rule;
7112 END;
7113
7114 PROCEDURE generate_cal_periods_tbl(p_var_rent_dates_rec IN PN_VAR_RENT_DATES_ALL%ROWTYPE,
7115 p_start_date IN DATE,
7116 p_end_date IN DATE,
7117 p_extension_end_date IN DATE,
7118 x_cal_periods_tbl OUT NOCOPY cal_periods_tbl)
7119 IS
7120 CURSOR cal_periods_cur(p_period_set_name VARCHAR2,
7121 p_period_type VARCHAR2,
7122 p_start_date DATE,
7123 p_end_date DATE) IS
7124 SELECT MIN(start_date) start_date,
7125 MAX(end_date) end_date ,
7126 period_year
7127 FROM gl_periods
7128 WHERE period_set_name = p_period_set_name
7129 AND period_type = p_period_type
7130 AND period_year >= TO_NUMBER(TO_CHAR(TO_DATE(p_end_date,'DD/MM/RRRR'),'RRRR'))
7131 AND period_year <= TO_NUMBER(TO_CHAR(TO_DATE(p_extension_end_date,'DD/MM/RRRR'),'RRRR'))
7132 GROUP BY period_year;
7133
7134 l_index NUMBER :=0;
7135 l_start_date DATE ;
7136 l_end_date DATE ;
7137 BEGIN
7138 pnp_debug_pkg.debug('generate_cal periodd(+)');
7139 pnp_debug_pkg.debug('use gl calendar' || p_var_rent_dates_rec.use_gl_calendar);
7140 IF NVL(p_var_rent_dates_rec.use_gl_calendar,'N') = 'Y' THEN
7141 FOR cal_periods_rec in cal_periods_cur(
7142 p_var_rent_dates_rec.gl_period_set_name,
7143 p_var_rent_dates_rec.period_type,
7144 p_start_date,
7145 nvl(p_extension_end_date,p_end_date))
7146 LOOP
7147 l_index := l_index + 1;
7148 x_cal_periods_tbl(l_index).period_year := cal_periods_rec.period_year;
7149 x_cal_periods_tbl(l_index).start_date := cal_periods_rec.start_date;
7150 x_cal_periods_tbl(l_index).end_date := cal_periods_rec.end_date ;
7151 END LOOP;
7152 ELSE
7153 l_start_date := p_start_date;
7154 pnp_debug_pkg.debug ('l_end_date' || l_end_date);
7155 pnp_debug_pkg.debug ('l_start_date' || l_start_date);
7156 l_end_date := ADD_MONTHS(p_var_rent_dates_rec.year_start_date , 12) - 1;
7157 WHILE l_start_date < nvl(p_extension_end_date,p_end_date)
7158 LOOP
7159 l_index := l_index + 1;
7160 x_cal_periods_tbl(l_index).start_date := l_start_date;
7161 IF p_extension_end_date <= l_end_date THEN
7162 x_cal_periods_tbl(l_index).end_date := p_extension_end_date;
7163 ELSE
7164 x_cal_periods_tbl(l_index).end_date := l_end_date;
7165 END IF;
7166 l_start_date := l_end_date + 1;
7167 l_end_date := ADD_MONTHS(l_start_date , 12) - 1;
7168 pnp_debug_pkg.debug ('loop l_end_date' || l_end_date);
7169 END LOOP;
7170 END IF;
7171 -- end if of use_gl_calendar
7172 END generate_cal_periods_tbl;
7173
7174 PROCEDURE generate_group_inv_tbl ( p_pn_var_rent_dates_rec IN pn_var_rent_dates_all%rowtype,
7175 p_period_start_date IN DATE,
7176 p_period_end_date IN DATE,
7177 x_group_dates_tbl OUT NOCOPY group_dates_tbl,
7178 x_inv_dates_tbl OUT NOCOPY group_dates_tbl)
7179
7180 IS
7181 l_index NUMBER := 0;
7182 l_grpDateId NUMBER := NULL;
7183 l_rptg_date DATE ;
7184 l_year_st_date DATE ;
7185 l_year_end_date DATE ;
7186 l_grp_st_date DATE ;
7187 l_grp_end_date DATE ;
7188 l_inv_st_date DATE ;
7189 l_inv_end_date DATE ;
7190
7191 CURSOR group_date_mon(p_vr_comm_date DATE, p_vr_term_date DATE) IS
7192 SELECT min(start_date) start_date, max(end_date) end_date
7193 FROM gl_periods
7194 WHERE period_set_name = p_pn_var_rent_dates_rec.gl_period_set_name
7195 AND start_date <= p_vr_term_date
7196 AND end_date >= p_vr_comm_date
7197 AND period_type = p_pn_var_rent_dates_rec.period_type
7198 AND adjustment_period_flag = 'N'
7199 GROUP BY period_year, quarter_num, period_num
7200 ORDER BY start_date,end_date;
7201
7202 CURSOR group_date_qtr(p_vr_comm_date DATE, p_vr_term_date DATE)IS
7203 SELECT min(start_date) start_date, max(end_date) end_date
7204 FROM gl_periods
7205 WHERE period_set_name = p_pn_var_rent_dates_rec.gl_period_set_name
7206 AND start_date <= p_vr_term_date
7207 AND end_date >= p_vr_comm_date
7208 AND quarter_num IN(1,2,3,4)
7209 AND period_type = p_pn_var_rent_dates_rec.period_type
7210 GROUP BY period_year, quarter_num
7211 ORDER BY start_date;
7212
7213 CURSOR group_date_sa (p_vr_comm_date DATE, p_vr_term_date DATE) IS
7214 SELECT min(g1.start_date) start_date
7215 ,max(g2.end_date) end_date
7216 FROM gl_periods g1, gl_periods g2
7217 WHERE g1.period_set_name(+) = p_pn_var_rent_dates_rec.gl_period_set_name
7218 AND g2.period_set_name = p_pn_var_rent_dates_rec.gl_period_set_name
7219 AND g1.start_date(+) <= p_vr_term_date
7220 AND g2.end_date >= p_vr_comm_date
7221 AND g1.quarter_num(+) = 1
7222 AND g2.quarter_num = 2
7223 AND g1.period_year(+) = g2.period_year
7224 AND g1.start_date IS NOT NULL
7225 AND g2.end_date IS NOT NULL
7226 AND g1.period_type = p_pn_var_rent_dates_rec.period_type
7227 AND g2.period_type = p_pn_var_rent_dates_rec.period_type
7228 GROUP BY g2.period_year
7229 UNION
7230 SELECT min(g1.start_date) start_date
7231 ,max(g2.end_date) end_date
7232 FROM gl_periods g1, gl_periods g2
7233 WHERE g1.period_set_name(+) = p_pn_var_rent_dates_rec.gl_period_set_name
7234 AND g2.period_set_name = p_pn_var_rent_dates_rec.gl_period_set_name
7235 AND g1.start_date(+) <= p_vr_term_date
7236 AND g2.end_date >= p_vr_comm_date
7237 AND g1.quarter_num(+) = 3
7238 AND g2.quarter_num = 4
7239 AND g1.period_year (+)= g2.period_year
7240 AND g1.start_date IS NOT NULL
7241 AND g2.end_date IS NOT NULL
7242 AND g1.period_type = p_pn_var_rent_dates_rec.period_type
7243 AND g2.period_type = p_pn_var_rent_dates_rec.period_type
7244 GROUP BY g2.period_year
7245 order by 1;
7246
7247 CURSOR group_date_ann (p_vr_comm_date DATE, p_vr_term_date DATE) IS
7248 SELECT min(start_date) start_date,max(end_date) end_date
7249 FROM gl_periods
7250 WHERE period_set_name = p_pn_var_rent_dates_rec.gl_period_set_name
7251 AND start_date <= p_vr_term_date
7252 AND end_date >= p_vr_comm_date
7253 AND period_type = p_pn_var_rent_dates_rec.period_type
7254 GROUP BY period_year
7255 ORDER BY start_date;
7256
7257
7258 BEGIN
7259
7260 l_index := 0;
7261 IF NVL(p_pn_var_rent_dates_rec.use_gl_calendar,'N') = 'Y' THEN
7262 IF p_pn_var_rent_dates_rec.reptg_freq_code = 'MON' THEN
7263 FOR group_date_rec in group_date_mon(p_period_start_date,
7264 p_period_end_date)
7265 LOOP
7266 l_index := l_index + 1;
7267 x_group_dates_tbl(l_index).start_date := group_date_rec.start_date;
7268 x_group_dates_tbl(l_index).end_date := group_date_rec.end_date;
7269 END LOOP;
7270 ELSIF p_pn_var_rent_dates_rec.reptg_freq_code = 'QTR' THEN
7271 pnp_debug_pkg.debug('reporting = quarter');
7272 FOR group_date_rec in group_date_qtr(p_period_start_date,
7273 p_period_end_date)
7274 LOOP
7275 l_index := l_index + 1;
7276 x_group_dates_tbl(l_index).start_date := group_date_rec.start_date;
7277 x_group_dates_tbl(l_index).end_date := group_date_rec.end_date;
7278 END LOOP;
7279 ELSIF p_pn_var_rent_dates_rec.reptg_freq_code = 'SA' THEN
7280 FOR group_date_rec in group_date_sa(p_period_start_date,
7281 p_period_end_date)
7282 LOOP
7283 l_index := l_index + 1;
7284 x_group_dates_tbl(l_index).start_date := group_date_rec.start_date;
7285 x_group_dates_tbl(l_index).end_date := group_date_rec.end_date;
7286 END LOOP;
7287 ELSIF p_pn_var_rent_dates_rec.reptg_freq_code = 'YR' THEN
7288 FOR group_date_rec in group_date_ann(p_period_start_date,
7289 p_period_end_date)
7290 LOOP
7291 l_index := l_index + 1;
7292 x_group_dates_tbl(l_index).start_date := group_date_rec.start_date;
7293 x_group_dates_tbl(l_index).end_date := group_date_rec.end_date;
7294 END LOOP;
7295 END IF;
7296
7297 -- determine invoice periods
7298 l_index := 0;
7299 IF p_pn_var_rent_dates_rec.invg_freq_code = 'MON' THEN
7300 FOR group_date_rec in group_date_mon(p_period_start_date,
7301 p_period_end_date)
7302 LOOP
7303 l_index := l_index + 1;
7304 x_inv_dates_tbl(l_index).start_date := group_date_rec.start_date;
7305 x_inv_dates_tbl(l_index).end_date := group_date_rec.end_date;
7306 END LOOP;
7307 ELSIF p_pn_var_rent_dates_rec.invg_freq_code = 'QTR' THEN
7308 FOR group_date_rec in group_date_qtr(p_period_start_date,
7309 p_period_end_date)
7310 LOOP
7311 l_index := l_index + 1;
7312 x_inv_dates_tbl(l_index).start_date := group_date_rec.start_date;
7313 x_inv_dates_tbl(l_index).end_date := group_date_rec.end_date;
7314 END LOOP;
7315 ELSIF p_pn_var_rent_dates_rec.invg_freq_code = 'SA' THEN
7316 FOR group_date_rec in group_date_sa(p_period_start_date,
7317 p_period_end_date)
7318 LOOP
7319 l_index := l_index + 1;
7320 x_inv_dates_tbl(l_index).start_date := group_date_rec.start_date;
7321 x_inv_dates_tbl(l_index).end_date := group_date_rec.end_date;
7322 END LOOP;
7323 ELSIF p_pn_var_rent_dates_rec.invg_freq_code = 'YR' THEN
7324 FOR group_date_rec in group_date_ann(p_period_start_date,
7325 p_period_end_date)
7326 LOOP
7327 l_index := l_index + 1;
7328 x_inv_dates_tbl(l_index).start_date := group_date_rec.start_date;
7329 x_inv_dates_tbl(l_index).end_date := group_date_rec.end_date;
7330 END LOOP;
7331 END IF;
7332 ELSE
7333 -- use_gl_calendar = N
7334
7335 l_year_st_date := p_pn_var_rent_dates_rec.year_start_date;
7336 l_year_end_date := ADD_MONTHS(l_year_st_date,12);
7337 l_grp_st_date := l_year_st_date;
7338 l_grp_end_date := l_year_st_date;
7339 l_inv_st_date := l_year_st_date;
7340 l_inv_end_date := l_year_st_date;
7341
7342 l_index := 0;
7343 WHILE l_grp_end_date < l_year_end_date LOOP
7344 l_index := l_index + 1;
7345 IF p_pn_var_rent_dates_rec.reptg_freq_code = 'MON' THEN
7346 l_grp_end_date := ADD_MONTHS(l_grp_st_date,1);
7347 x_group_dates_tbl(l_index).start_date := l_grp_st_date;
7348 x_group_dates_tbl(l_index).end_date := l_grp_end_date;
7349 l_grp_st_date := l_grp_end_date + 1;
7350 ELSIF p_pn_var_rent_dates_rec.reptg_freq_code = 'QTR' THEN
7351 l_grp_end_date := ADD_MONTHS(l_grp_st_date,3);
7352 x_group_dates_tbl(l_index).start_date := l_grp_st_date;
7353 x_group_dates_tbl(l_index).end_date := l_grp_end_date;
7354 l_grp_st_date := l_grp_end_date + 1;
7355 ELSIF p_pn_var_rent_dates_rec.reptg_freq_code = 'SA' THEN
7356 l_grp_end_date := ADD_MONTHS(l_grp_st_date,6);
7357 x_group_dates_tbl(l_index).start_date := l_grp_st_date;
7358 x_group_dates_tbl(l_index).end_date := l_grp_end_date;
7359 l_grp_st_date := l_grp_end_date + 1;
7360 ELSIF p_pn_var_rent_dates_rec.reptg_freq_code = 'YR' THEN
7361 l_grp_end_date := ADD_MONTHS(l_grp_st_date,12);
7362 x_group_dates_tbl(l_index).start_date := l_grp_st_date;
7363 x_group_dates_tbl(l_index).end_date := l_grp_end_date;
7364 l_grp_st_date := l_grp_end_date + 1;
7365 END IF;
7366 -- end if of reptg freq code
7367 END LOOP;
7368 -- end loop while reptg
7369
7370 l_index := 0;
7371 WHILE l_inv_end_date < l_year_end_date LOOP
7372
7373 IF p_pn_var_rent_dates_rec.invg_freq_code = 'MON' THEN
7374 l_inv_end_date := ADD_MONTHS(l_inv_st_date,1);
7375 x_inv_dates_tbl(l_index).start_date := l_inv_st_date;
7376 x_inv_dates_tbl(l_index).end_date := l_inv_end_date;
7377 l_inv_st_date := l_inv_end_date + 1;
7378 ELSIF p_pn_var_rent_dates_rec.invg_freq_code = 'QTR' THEN
7379 l_inv_end_date := ADD_MONTHS(l_inv_st_date,3);
7380 x_inv_dates_tbl(l_index).start_date := l_inv_st_date;
7381 x_inv_dates_tbl(l_index).end_date := l_inv_end_date;
7382 l_inv_st_date := l_inv_end_date + 1;
7383 ELSIF p_pn_var_rent_dates_rec.invg_freq_code = 'SA' THEN
7384 l_inv_end_date := ADD_MONTHS(l_inv_st_date,6);
7385 x_inv_dates_tbl(l_index).start_date := l_inv_st_date;
7386 x_inv_dates_tbl(l_index).end_date := l_inv_end_date;
7387 l_inv_st_date := l_inv_end_date + 1;
7388 ELSIF p_pn_var_rent_dates_rec.invg_freq_code = 'YR' THEN
7389 l_inv_end_date := ADD_MONTHS(l_inv_st_date,12);
7390 x_inv_dates_tbl(l_index).start_date := l_inv_st_date;
7391 x_inv_dates_tbl(l_index).end_date := l_inv_end_date;
7392 l_inv_st_date := l_inv_end_date + 1;
7393 END IF;
7394
7395 END LOOP;
7396 -- end loop while invg
7397
7398 END IF;
7399 -- end if of gl_calendar = Y
7400
7401 END generate_group_inv_tbl;
7402
7403
7404 FUNCTION exists_bkpt_dtldateintersect ( p_var_rent_id IN NUMBER,
7405 p_line_default_id IN NUMBER,
7406 p_start_date IN DATE,
7407 p_end_date IN DATE)
7408 RETURN BOOLEAN
7409 IS
7410
7411 CURSOR c_1 IS
7412 SELECT 'z'
7413 FROM DUAL
7414 WHERE EXISTS ( SELECT a.var_rent_id
7415 FROM pn_var_bkdt_defaults_all a,
7416 pn_var_bkhd_defaults_all b
7417 WHERE a.var_rent_id = p_var_rent_id
7418 AND a.bkhd_default_id = b.bkhd_default_id
7419 AND b.line_default_id = p_line_default_id
7420 AND ( (bkdt_start_date < p_start_date AND
7421 bkdt_end_date > p_end_date) OR
7422 (bkdt_start_date < p_end_date AND
7423 bkdt_end_date > p_end_date))) ;
7424
7425 BEGIN
7426
7427 FOR c_rec in c_1 LOOP
7428 RETURN TRUE;
7429 END LOOP;
7430
7431 RETURN FALSE;
7432 END exists_bkpt_dtldateintersect;
7433
7434 PROCEDURE check_continious_def_dates ( p_var_rent_id IN NUMBER,
7435 p_line_default_id IN NUMBER,
7436 p_start_date IN DATE,
7437 p_end_date IN DATE,
7438 x_return_status OUT NOCOPY BOOLEAN,
7439 x_return_message OUT NOCOPY VARCHAR2,
7440 x_date1 OUT NOCOPY DATE,
7441 x_date2 OUT NOCOPY DATE)
7442 IS
7443
7444
7445
7446 CURSOR header_cur IS
7447 SELECT bkhd_default_id,
7448 bkhd_start_date,
7449 bkhd_end_date
7450 FROM pn_var_bkhd_defaults_all
7451 WHERE var_rent_id = p_var_rent_id
7452 AND line_default_id = p_line_default_id
7453 ORDER BY bkhd_start_date;
7454
7455
7456 CURSOR exist_next_header_date (p_end_date DATE) IS
7457 SELECT 'x'
7458 FROM dual
7459 WHERE EXISTS ( SELECT var_Rent_id
7460 FROM pn_var_bkhd_defaults_all
7461 WHERE var_rent_id = p_var_rent_id
7462 AND line_default_id = p_line_default_id
7463 AND bkhd_start_date = p_end_date + 1);
7464
7465 CURSOR detail_cur (p_header_id NUMBER) IS
7466 SELECT
7467 bkdt_start_date,
7468 bkdt_end_date
7469 FROM pn_var_bkdt_defaults_all
7470 WHERE var_rent_id = p_var_rent_id
7471 AND bkhd_default_id = p_header_id
7472 ORDER BY bkdt_start_date;
7473
7474 CURSOR exist_next_detail_date (p_header_id NUMBER,p_end_date DATE) IS
7475 SELECT 'x'
7476 FROM dual
7477 WHERE EXISTS ( SELECT var_Rent_id
7478 FROM pn_var_bkdt_defaults_all
7479 WHERE var_rent_id = p_var_rent_id
7480 AND bkhd_default_id = p_header_id
7481 AND bkdt_start_date = p_end_date + 1);
7482
7483 l_dummy VARCHAR2(1) ;
7484 BEGIN
7485
7486 pnp_debug_pkg.debug('p_var_rent_id = '|| p_var_rent_id);
7487 pnp_debug_pkg.debug('p_line_default_id =' || p_line_default_id);
7488 pnp_debug_pkg.debug('p_start_date = '|| p_start_date);
7489 pnp_debug_pkg.debug('p_end_date = '|| p_end_date);
7490 pnp_debug_pkg.debug(' char p_end_date = '|| to_char(p_end_date,'MM/DD/YYYY'));
7491 pnp_debug_pkg.debug(' RR p_end_date = '|| to_char(p_end_date,'MM/DD/RRRR'));
7492
7493 x_return_status := FALSE;
7494 FOR header_rec in header_cur LOOP
7495
7496
7497 pnp_debug_pkg.debug(' header_rec.bkhd_end_date = '|| to_char(header_rec.bkhd_end_date,'MM/DD/RRRR'));
7498 IF header_rec.bkhd_end_date = p_end_date THEN
7499 pnp_debug_pkg.debug('HEADER = TRUE');
7500 x_return_status := TRUE;
7501 ELSE
7502 l_dummy := NULL;
7503 OPEN exist_next_header_date ( header_rec.bkhd_end_date) ;
7504 FETCH exist_next_header_date INTO l_dummy;
7505 CLOSE exist_next_header_date;
7506
7507 IF l_dummy IS NULL THEN
7508 x_return_status := FALSE;
7509 x_return_message := 'PN_VAR_BKHD_DEF_DATE_GAPS';
7510 EXIT;
7511 END IF;
7512 END IF;
7513
7514 FOR detail_rec in detail_cur (header_rec.bkhd_default_id) LOOP
7515 pnp_debug_pkg.debug(' detail_rec.bkdt_end_date = '|| to_char(detail_rec.bkdt_end_date,'MM/DD/RRRR'));
7516 IF detail_rec.bkdt_end_date = header_rec.bkhd_end_date THEN
7517 pnp_debug_pkg.debug('DETAIL = TRUE');
7518 x_return_status := TRUE;
7519 ELSE
7520 l_dummy := NULL;
7521 OPEN exist_next_detail_date ( header_rec.bkhd_default_id,
7522 detail_rec.bkdt_end_date) ;
7523 FETCH exist_next_detail_date INTO l_dummy;
7524 CLOSE exist_next_detail_date;
7525 IF l_dummy IS NULL THEN
7526 x_return_status := FALSE;
7527 x_return_message := 'PN_VAR_BKDT_DEF_DATE_GAPS';
7528 x_date1 := header_rec.bkhd_start_date;
7529 x_date2 := header_rec.bkhd_end_date;
7530 EXIT;
7531 END IF;
7532 END IF;
7533 END LOOP; -- end loop for detail rec
7534 END LOOP; -- end loop for header rec
7535
7536
7537 END;
7538
7539 PROCEDURE check_continious_def_dates ( p_var_rent_id IN NUMBER,
7540 p_line_item_id IN NUMBER,
7541 p_start_date IN DATE,
7542 p_end_date IN DATE,
7543 x_return_status OUT NOCOPY BOOLEAN,
7544 x_return_message OUT NOCOPY VARCHAR2,
7545 x_date1 OUT NOCOPY DATE,
7546 x_date2 OUT NOCOPY DATE)
7547 IS
7548
7549 l_filename VARCHAR2(50) := 'CHECK'||to_char(sysdate,'MMDDYYHHMMSS');
7550 l_pathname VARCHAR2(20) := '/usr/tmp/';
7551
7552
7553 CURSOR header_cur IS
7554 SELECT bkpt_header_id,
7555 bkhd_start_date,
7556 bkhd_end_date
7557 FROM pn_var_bkpts_head_all
7558 WHERE var_rent_id = p_var_rent_id
7559 AND line_item_id = p_line_item_id
7560 ORDER BY bkhd_start_date;
7561
7562
7563 CURSOR exist_next_header_date (p_end_date DATE) IS
7564 SELECT 'x'
7565 FROM dual
7566 WHERE EXISTS ( SELECT var_Rent_id
7567 FROM pn_var_bkpts_head_all
7568 WHERE var_rent_id = p_var_rent_id
7569 AND line_item_id = p_line_item_id
7570 AND bkhd_start_date = p_end_date + 1);
7571
7572 CURSOR detail_cur (p_header_id NUMBER) IS
7573 SELECT
7574 bkpt_start_date,
7575 bkpt_end_date
7576 FROM pn_var_bkpts_det_all
7577 WHERE var_rent_id = p_var_rent_id
7578 AND bkpt_header_id = p_header_id
7579 ORDER BY bkpt_start_date;
7580
7581 CURSOR exist_next_detail_date (p_header_id NUMBER,p_end_date DATE) IS
7582 SELECT 'x'
7583 FROM dual
7584 WHERE EXISTS ( SELECT var_Rent_id
7585 FROM pn_var_bkpts_det_all
7586 WHERE var_rent_id = p_var_rent_id
7587 AND bkpt_header_id = p_header_id
7588 AND bkpt_start_date = p_end_date + 1);
7589
7590 l_dummy VARCHAR2(1) ;
7591 BEGIN
7592
7593 pnp_debug_pkg.debug('p_var_rent_id = '|| p_var_rent_id);
7594 pnp_debug_pkg.debug('p_line_item_id =' || p_line_item_id);
7595 pnp_debug_pkg.debug('p_start_date = '|| p_start_date);
7596 pnp_debug_pkg.debug('p_end_date = '|| p_end_date);
7597 pnp_debug_pkg.debug(' char p_end_date = '|| to_char(p_end_date,'MM/DD/YYYY'));
7598 pnp_debug_pkg.debug(' RR p_end_date = '|| to_char(p_end_date,'MM/DD/RRRR'));
7599
7600 x_return_status := FALSE;
7601 FOR header_rec in header_cur LOOP
7602
7603
7604 pnp_debug_pkg.debug(' header_rec.bkhd_end_date = '|| to_char(header_rec.bkhd_end_date,'MM/DD/RRRR'));
7605 IF header_rec.bkhd_end_date = p_end_date THEN
7606 pnp_debug_pkg.debug('HEADER = TRUE');
7607 x_return_status := TRUE;
7608 ELSE
7609 l_dummy := NULL;
7610 OPEN exist_next_header_date ( header_rec.bkhd_end_date) ;
7611 FETCH exist_next_header_date INTO l_dummy;
7612 CLOSE exist_next_header_date;
7613
7614 IF l_dummy IS NULL THEN
7615 x_return_status := FALSE;
7616 x_return_message := 'PN_VAR_BKHD_DEF_DATE_GAPS';
7617 EXIT;
7618 END IF;
7619 END IF;
7620
7621 FOR detail_rec in detail_cur (header_rec.bkpt_header_id) LOOP
7622 pnp_debug_pkg.debug(' detail_rec.bkpt_end_date = '|| to_char(detail_rec.bkpt_end_date,'MM/DD/RRRR'));
7623 IF detail_rec.bkpt_end_Date = header_rec.bkhd_end_date THEN
7624 pnp_debug_pkg.debug('DETAIL = TRUE');
7625 x_return_status := TRUE;
7626 ELSE
7627 l_dummy := NULL;
7628 OPEN exist_next_detail_date ( header_rec.bkpt_header_id,
7629 detail_rec.bkpt_end_date) ;
7630 FETCH exist_next_detail_date INTO l_dummy;
7631 CLOSE exist_next_detail_date;
7632 IF l_dummy IS NULL THEN
7633 x_return_status := FALSE;
7634 x_return_message := 'PN_VAR_BKDT_DEF_DATE_GAPS';
7635 x_date1 := header_rec.bkhd_start_date;
7636 x_date2 := header_rec.bkhd_end_date;
7637 EXIT;
7638 END IF;
7639 END IF;
7640 END LOOP; -- end loop for detail rec
7641 END LOOP; -- end loop for header rec
7642
7643
7644 END;
7645
7646
7647
7648
7649 FUNCTION is_template_used ( p_template_id IN NUMBER)
7650 RETURN BOOLEAN
7651 IS
7652
7653 CURSOR var_rent_cur IS
7654 SELECT 'x'
7655 FROM dual
7656 WHERE EXISTS ( SELECT var_rent_id
7657 FROM pn_var_rents_all
7658 WHERE agreement_template_id = p_template_id);
7659
7660 l_return BOOLEAN := FALSE;
7661 BEGIN
7662
7663 For c_rec in var_rent_cur
7664 LOOP
7665
7666 l_return := TRUE;
7667 EXIT;
7668 END LOOP;
7669
7670 RETURN l_return;
7671
7672 END ;
7673
7674
7675 -- Function returs true if we have generated
7676 -- setup infomration like ytd /annual/prorated bkpts.
7677
7678
7679 FUNCTION FIND_IF_BKPTS_SETUP_EXISTS (p_var_rent_id NUMBER)
7680 RETURN BOOLEAN IS
7681
7682 l_bkpts_exists NUMBER;
7683
7684 BEGIN
7685
7686 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.FIND_IF_BKPTS_SETUP_EXISTS (+)');
7687
7688 /*SELECT 1
7689 INTO l_bkpts_exists
7690 FROM dual
7691 WHERE EXISTS ( SELECT 1
7692 FROM pn_var_transactions_all
7693 WHERE var_rent_id = p_var_rent_id);
7694
7695 IF l_bkpts_exists is NOT NULL THEN
7696 RETURN TRUE;
7697 ELSE
7698 RETURN FALSE;
7699 END IF;*/
7700 NULL;
7701
7702
7703 EXCEPTION
7704
7705 WHEN OTHERS
7706 THEN
7707 RETURN FALSE;
7708
7709 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.FIND_IF_BKPTS_SETUP_EXISTS (-)');
7710
7711 END FIND_IF_BKPTS_SETUP_EXISTS;
7712
7713 Procedure put_log(p_string VARCHAR2)
7714 IS
7715 BEGIN
7716
7717 pnp_debug_pkg.debug(p_string);
7718 pnp_debug_pkg.put_log_msg(p_string);
7719
7720 END;
7721 -- M2M End
7722
7723 FUNCTION is_partial_period (p_period_id IN NUMBER)
7724 RETURN VARCHAR2 IS
7725 CURSOR is_partial_period_cur IS
7726 SELECT partial_period
7727 FROM pn_var_periods_all
7728 WHERE period_id = p_period_id;
7729 l_return VARCHAR2(1) := 'X';
7730 BEGIN
7731 OPEN is_partial_period_cur;
7732 FETCH is_partial_period_cur INTO l_return;
7733 IF is_partial_period_cur%NOTFOUND THEN
7734 CLOSE is_partial_period_cur;
7735 pnp_debug_pkg.debug('Cursor is_partial_period_cur NO_DATA_FOUND');
7736 RAISE NO_DATA_FOUND;
7737 END IF;
7738 CLOSE is_partial_period_cur;
7739 RETURN l_return;
7740 END is_partial_period;
7741
7742 /*===========================================================================+
7743 | PROCEDURE
7744 | DETERMINE_FREQUENCY
7745 |
7746 | DESCRIPTION
7747 | Determines frequency to be chosen for REPTG and INVG for 'No Proration'
7748 | calculation method
7749 |
7750 | SCOPE - PUBLIC
7751 |
7752 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
7753 |
7754 | ARGUMENTS : IN:
7755 | X_VAR_RENT_START_DATE
7756 | X_VAR_RENT_END_DATE
7757 |
7758 | OUT:
7759 | X_FREQUENCY_CODE
7760 |
7761 | RETURNS : None
7762 |
7763 | NOTES :
7764 |
7765 | MODIFICATION HISTORY
7766 |
7767 | 30-JAN-2004 Daniel Thota o Created
7768 +===========================================================================*/
7769 FUNCTION DETERMINE_FREQUENCY (
7770 X_VAR_RENT_START_DATE IN PN_VAR_RENTS_ALL.COMMENCEMENT_DATE%TYPE
7771 ,X_VAR_RENT_END_DATE IN PN_VAR_RENTS_ALL.TERMINATION_DATE%TYPE
7772 ) RETURN PN_VAR_RENT_DATES_ALL.REPTG_FREQ_CODE%TYPE
7773 is
7774
7775 l_days NUMBER;
7776 l_freq_code PN_VAR_RENT_DATES_ALL.REPTG_FREQ_CODE%TYPE;
7777
7778 BEGIN
7779
7780 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.DETERMINE_FREQUENCY (+)');
7781
7782 SELECT X_VAR_RENT_END_DATE - X_VAR_RENT_START_DATE + 1
7783 INTO l_days
7784 FROM dual;
7785
7786 IF l_days > 0 AND l_days <= 31 THEN
7787 l_freq_code := 'MON';
7788 ELSIF l_days > 31 AND l_days <= 92 THEN
7789 l_freq_code := 'QTR';
7790 ELSIF l_days > 92 AND l_days <= 184 THEN
7791 l_freq_code := 'SA';
7792 ELSIF l_days > 184 AND l_days <= 366 THEN
7793 l_freq_code := 'YR';
7794 ELSE l_freq_code := NULL;
7795 END IF;
7796
7797 RETURN l_freq_code;
7798
7799 EXCEPTION
7800
7801 WHEN OTHERS
7802 THEN
7803 RETURN NULL;
7804
7805 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.DETERMINE_FREQUENCY (-)');
7806
7807 END DETERMINE_FREQUENCY;
7808
7809 PROCEDURE update_bkpt_details(p_var_rent_id IN NUMBER,
7810 p_bkdt_dflt_id IN NUMBER,
7811 p_bkpt_rate IN NUMBER)
7812 IS
7813 BEGIN
7814
7815 UPDATE pn_var_bkpts_det_all
7816 SET bkpt_rate = p_bkpt_rate
7817 WHERE var_rent_id = p_var_rent_id
7818 AND bkdt_default_id = p_bkdt_dflt_id;
7819
7820 PN_VAR_CHG_CAL_PKG.POPULATE_TRANSACTIONS(p_var_rent_id => p_var_rent_id);
7821
7822 END update_bkpt_details;
7823
7824 PROCEDURE change_stratified_rows(p_bkhd_default_id IN NUMBER,
7825 p_bkdt_st_date_old IN DATE,
7826 p_bkdt_end_date_old IN DATE,
7827 p_bkdt_default_id IN NUMBER,
7828 p_bkdt_st_date IN DATE,
7829 p_bkdt_end_date IN DATE)
7830 IS
7831 BEGIN
7832
7833 Update pn_var_bkdt_defaults_all
7834 SET bkdt_start_date = p_bkdt_st_date,
7835 bkdt_end_date = p_bkdt_end_date
7836 where bkhd_default_id = p_bkhd_default_id
7837 and bkdt_start_date = p_bkdt_st_date_old
7838 and bkdt_end_date = p_bkdt_end_date_old
7839 and bkdt_default_id <> p_bkdt_default_id;
7840
7841 END change_stratified_rows;
7842
7843 -------------------------------------------------------------------------------
7844 -- NAME : delete_vr_setup
7845 -- DESCRIPTION : This procedure deletes all the set up data for dates >
7846 -- new termination date e.g breakpoint records, volume history
7847 -- etc
7848 -- PURPOSE :
7849 -- INVOKED FROM : process_vr_early_term
7850 -- ARGUMENTS : IN : p_var_rent_id, p_new_termn_date
7851 -- REFERENCE : PN_COMMON.debug()
7852 -- HISTORY :
7853 -- 01-JUN-06 piagrawa o Created
7854 -- 20-MAR-07 lbala o Added code to delete from pn_var_abat_defaults_all
7855 -- 03-MAY-10 acprakas o Changed condition to line_start_date > p_new_termn_date
7856 -- in DELETE pn_var_line_defaults_all
7857 -------------------------------------------------------------------------------
7858 PROCEDURE delete_vr_setup ( p_var_rent_id IN NUMBER
7859 ,p_new_termn_date IN DATE)
7860 IS
7861 BEGIN
7862 pnp_debug_pkg.debug ('pn_var_rent_pkg.delete_vr_setup (+)');
7863
7864 /* Delete the data from main tables */
7865 DELETE pn_var_vol_hist_all
7866 WHERE start_date > p_new_termn_date
7867 AND period_id IN (SELECT period_id
7868 FROM pn_var_periods_all
7869 WHERE var_rent_id = p_var_rent_id);
7870
7871 DELETE pn_var_bkpts_det_all
7872 WHERE bkpt_start_date > p_new_termn_date
7873 AND var_rent_id = p_var_rent_id;
7874
7875 DELETE pn_var_bkpts_head_all
7876 WHERE bkhd_start_date > p_new_termn_date
7877 AND var_rent_id = p_var_rent_id;
7878
7879 DELETE pn_var_deductions_all
7880 WHERE start_date > p_new_termn_date
7881 AND period_id IN (SELECT period_id
7882 FROM pn_var_periods_all
7883 WHERE var_rent_id = p_var_rent_id);
7884
7885 DELETE pn_var_rent_summ_all
7886 WHERE grp_date_id IN (SELECT grp_date_id
7887 FROM pn_var_grp_dates_all
7888 WHERE var_rent_id = p_var_rent_id
7889 AND grp_start_date > p_new_termn_date);
7890
7891 DELETE pn_var_constraints_all
7892 WHERE constr_start_date > p_new_termn_date
7893 AND period_id IN (SELECT period_id
7894 FROM pn_var_periods_all
7895 WHERE var_rent_id = p_var_rent_id);
7896
7897
7898 DELETE pn_var_lines_all
7899 WHERE period_id IN (SELECT period_id
7900 FROM pn_var_periods_all
7901 WHERE var_rent_id = p_var_rent_id
7902 AND start_date > p_new_termn_date);
7903
7904 /* Delete data from defaults table */
7905
7906 DELETE pn_var_bkdt_defaults_all
7907 WHERE var_rent_id = p_var_rent_id
7908 AND bkdt_start_date > p_new_termn_date;
7909
7910 DELETE pn_var_bkhd_defaults_all
7911 WHERE var_rent_id = p_var_rent_id
7912 AND bkhd_start_date > p_new_termn_date;
7913
7914 DELETE pn_var_line_defaults_all
7915 WHERE line_start_date > p_new_termn_date
7916 AND var_rent_id = p_var_rent_id;
7917
7918 DELETE pn_var_constr_defaults_all
7919 WHERE constr_start_date > p_new_termn_date
7920 AND var_rent_id = p_var_rent_id;
7921
7922 DELETE pn_var_abat_defaults_all
7923 WHERE start_date > p_new_termn_date
7924 AND var_rent_id = p_var_rent_id;
7925
7926 pnp_debug_pkg.debug ('pn_var_rent_pkg.delete_vr_setup (-)');
7927
7928 END delete_vr_setup;
7929
7930 -------------------------------------------------------------------------------
7931 -- NAME : remove_later_periods
7932 -- DESCRIPTION : This procedure process periods which start after the new
7933 -- termination date
7934 -- PURPOSE :
7935 -- INVOKED FROM : process_vr_early_term
7936 -- ARGUMENTS : IN : p_var_rent_id, p_new_termn_date, p_old_termn_date
7937 -- REFERENCE : PN_COMMON.debug()
7938 -- HISTORY :
7939 -- 01-JUN-06 piagrawa o Created
7940 -- 03-DEC-07 acprakas o Bug#6490896. Modified to avoid auto creation of payment/billing terms
7941 -- 21-JUL-08 acprakas o Bug#6524437. Modified cursors invoice_cur, term_status_cur,
7942 -- max_adjust_num_cur, actual_invoice_amount to pick up true up term invoices
7943 -- also for reversing.
7944 -------------------------------------------------------------------------------
7945 PROCEDURE remove_later_periods ( p_var_rent_id IN NUMBER
7946 , p_new_termn_date IN DATE
7947 , p_old_termn_date IN DATE
7948 , x_return_status OUT NOCOPY VARCHAR2
7949 , x_return_message OUT NOCOPY VARCHAR2)
7950 IS
7951
7952 /* This cursor fetches the distinct invoices for periods starting after new termination date */
7953 CURSOR invoice_date_cur IS
7954 SELECT DISTINCT pvi.invoice_date, pvi.period_id
7955 FROM pn_var_rent_inv_all pvi, pn_var_periods_all pvp
7956 WHERE pvp.period_id = pvi.period_id
7957 AND pvp.start_date > p_new_termn_date
7958 AND pvp.var_rent_id = p_var_rent_id;
7959
7960 /* This cursor fetches the invoices, which are not deleted, for the
7961 periods starting after new termination date */
7962 CURSOR rent_inv_cur ( p_period_id NUMBER
7963 ,p_invoice_date DATE
7964 ,p_adjust_num NUMBER) IS
7965 SELECT *
7966 FROM pn_var_rent_inv_all
7967 WHERE period_id = p_period_id
7968 AND (NVL(actual_exp_code, 'N') = 'Y' OR
7969 NVL(variance_exp_code, 'N') = 'Y' OR
7970 NVL(forecasted_exp_code, 'N') = 'Y' OR
7971 NVL(true_up_exp_code,'N') = 'Y')
7972 /*AND NVL(actual_invoiced_amount, 0) <> 0*/
7973 AND invoice_date = p_invoice_date
7974 AND adjust_num = p_adjust_num;
7975 /*Bug#6524437
7976 AND true_up_amt IS NULL
7977 AND true_up_status IS NULL
7978 AND true_up_exp_code IS NULL;
7979 */
7980
7981 /* This cursor fetches the invoices, which are not deleted, for the
7982 periods starting after new termination date */
7983 CURSOR term_status_cur ( p_period_id NUMBER
7984 ,p_invoice_date DATE
7985 ,p_adjust_num NUMBER) IS
7986 SELECT variance_exp_code, forecasted_exp_code
7987 FROM pn_var_rent_inv_all
7988 WHERE period_id = p_period_id
7989 AND (NVL(actual_exp_code, 'N') = 'Y' OR
7990 NVL(variance_exp_code, 'N') = 'Y' OR
7991 NVL(forecasted_exp_code, 'N') = 'Y' OR
7992 NVL(true_up_exp_code,'N') = 'Y')
7993 /*AND NVL(actual_invoiced_amount, 0) <> 0*/
7994 AND invoice_date = p_invoice_date
7995 AND adjust_num = p_adjust_num;
7996
7997 /*Bug#6524437
7998 AND true_up_amt IS NULL
7999 AND true_up_status IS NULL
8000 AND true_up_exp_code IS NULL;
8001 */
8002
8003 /* This cursor fetches periods starting after new termination date in descending order of start date */
8004 CURSOR period_cur IS
8005 SELECT period_id
8006 FROM pn_var_periods_all
8007 WHERE var_rent_id = p_var_rent_id
8008 AND start_date > p_new_termn_date
8009 ORDER BY start_date DESC;
8010
8011 /* this cursor fetches invoice for a particular period */
8012 CURSOR invoice_cur (p_period_id NUMBER) IS
8013 SELECT var_rent_inv_id
8014 FROM pn_var_rent_inv_all
8015 WHERE period_id = p_period_id;
8016
8017 /* This cursor fetches periods staring after new termination date for which there exists invoices */
8018 CURSOR period_inv_cur IS
8019 SELECT period_id
8020 FROM pn_var_periods_all per
8021 WHERE per.var_rent_id = p_var_rent_id
8022 AND per.start_date > p_new_termn_date
8023 AND EXISTS (SELECT var_rent_inv_id
8024 FROM pn_var_rent_inv_all
8025 WHERE period_id = per.period_id);
8026
8027 /* Fetches payment term information for a invoice id */
8028 CURSOR payment_cur(p_invoice_date DATE) IS
8029 SELECT payment_term_id
8030 FROM pn_payment_terms_all
8031 WHERE var_rent_inv_id IN (SELECT var_rent_inv_id
8032 FROM pn_var_rent_inv_all
8033 WHERE invoice_date = p_invoice_date
8034 AND var_rent_id = p_var_rent_id);
8035
8036 /* Fetches the maximum adjust num cursor */
8037 CURSOR max_adjust_num_cur (p_period_id NUMBER,
8038 p_invoice_date DATE) IS
8039 SELECT max(adjust_num) max_adjust_num
8040 FROM pn_var_rent_inv_all
8041 WHERE period_id = p_period_id
8042 AND invoice_date = p_invoice_date;
8043
8044 /*Bug#6524437
8045 AND true_up_amt IS NULL
8046 AND true_up_status IS NULL
8047 AND true_up_exp_code IS NULL;
8048 */
8049
8050 /* Fetches the amount for the particular invoice date */
8051 CURSOR actual_invoice_amount (p_period_id NUMBER,
8052 p_invoice_date DATE) IS
8053 SELECT SUM(actual_invoiced_amount) actual_amount
8054 FROM pn_var_rent_inv_all
8055 WHERE var_rent_inv_id IN ( SELECT var_rent_inv_id
8056 FROM pn_var_rent_inv_all
8057 WHERE period_id = p_period_id
8058 AND (NVL(actual_exp_code, 'N') = 'Y' OR
8059 NVL(variance_exp_code, 'N') = 'Y' OR
8060 NVL(forecasted_exp_code, 'N') = 'Y' OR
8061 NVL(true_up_exp_code, 'N') = 'Y')
8062 /*AND NVL(actual_invoiced_amount, 0) <> 0*/
8063 AND invoice_date = p_invoice_date);
8064
8065 l_invoice_exists VARCHAR2(1) := 'N';
8066 l_actual_invoiced_amount pn_var_rent_inv_all.actual_invoiced_amount%TYPE;
8067 l_rowid ROWID;
8068 l_var_rent_inv_id NUMBER;
8069 l_date DATE := SYSDATE;
8070 l_errbuf VARCHAR2(250) := NULL;
8071 l_retcode VARCHAR2(250);
8072 l_max_adjust_num NUMBER := 0;
8073 l_forecasted_exp_code VARCHAR2(1) := 'N';
8074 l_variance_exp_code VARCHAR2(1) := 'N';
8075 l_var_term_status VARCHAR2(1);
8076
8077 BEGIN
8078 pnp_debug_pkg.debug ('pn_var_rent_pkg.remove_later_periods (+)');
8079 pnp_debug_pkg.debug (' Parameters :');
8080 pnp_debug_pkg.debug (' ------------------------------------------- :');
8081 pnp_debug_pkg.debug (' p_var_rent_id = '|| p_var_rent_id);
8082 pnp_debug_pkg.debug (' p_new_termn_date = '|| p_new_termn_date);
8083 pnp_debug_pkg.debug (' p_old_termn_date = '|| p_old_termn_date);
8084 pnp_debug_pkg.debug (' ------------------------------------------- :');
8085
8086 /* Delete draft terms for invoices for all periods which lie after the new termination date */
8087 DELETE pn_payment_terms_all
8088 WHERE status = 'DRAFT'
8089 AND var_rent_inv_id IN (SELECT var_rent_inv_id
8090 FROM pn_var_rent_inv_all pvi, pn_var_periods_all pvp
8091 WHERE pvi.period_id = pvp.period_id
8092 AND pvp.var_rent_id = p_var_rent_id
8093 AND pvp.start_date > p_new_termn_date);
8094
8095 /* Delete invoices for which there are no terms */
8096 DELETE pn_var_rent_inv_all
8097 WHERE var_rent_inv_id NOT IN (SELECT ppt.var_rent_inv_id
8098 FROM pn_payment_terms_all ppt, pn_var_rent_inv_all pvi, pn_var_periods_all pvp
8099 WHERE ppt.var_rent_inv_id = pvi.var_rent_inv_id
8100 AND pvi.period_id = pvp.period_id
8101 AND pvp.var_rent_id = p_var_rent_id
8102 AND pvp.start_date > p_new_termn_date)
8103 AND var_rent_id = p_var_rent_id
8104 AND period_id IN (SELECT period_id
8105 FROM pn_var_periods_all
8106 WHERE var_rent_id = p_var_rent_id
8107 AND start_date > p_new_termn_date);
8108
8109 pnp_debug_pkg.debug ('Loop through the period which start after new termination date');
8110 /* Loop through the period which start after new termination date, starting from last and keep on deleting till you get a period which has an approved term associated with it */
8111 FOR period_rec IN period_cur LOOP
8112
8113 pnp_debug_pkg.debug ('period id = '||period_rec.period_id);
8114 l_invoice_exists := 'N';
8115
8116 /* Check if the period has an invoice associated with it */
8117 FOR invoice_rec IN invoice_cur (period_rec.period_id) LOOP
8118 pnp_debug_pkg.debug ('invoice exists ...');
8119 l_invoice_exists := 'Y';
8120 END LOOP;
8121
8122 IF l_invoice_exists = 'Y' THEN
8123 /* If invoice exists in this period then exit from the loop as you need not delete any more periods */
8124 pnp_debug_pkg.debug ('exiting ...');
8125 EXIT;
8126 ELSE
8127
8128 pnp_debug_pkg.debug ('deleting group date and periods ...');
8129 /* Delete group dates and periods for which there exists no invoice */
8130 DELETE pn_var_grp_dates_all
8131 WHERE period_id = period_rec.period_id;
8132
8133 DELETE pn_var_periods_all
8134 WHERE period_id = period_rec.period_id;
8135 END IF;
8136
8137 END LOOP;
8138
8139 pnp_debug_pkg.debug ('Loop through the invoices which are not deleted to create negative terms for each of the approved term ...');
8140 /* Loop through the invoices which are not deleted to create negative terms for each of the approved term */
8141 FOR invoice_date_rec IN invoice_date_cur LOOP
8142
8143 FOR max_adjust_num_rec IN max_adjust_num_cur(invoice_date_rec.period_id, invoice_date_rec.invoice_date)
8144 LOOP
8145 l_max_adjust_num := max_adjust_num_rec.max_adjust_num;
8146 END LOOP;
8147
8148 /* Fetch the total amount that needs to be invoiced */
8149 FOR rec IN actual_invoice_amount(invoice_date_rec.period_id, invoice_date_rec.invoice_date) LOOP
8150 l_actual_invoiced_amount := rec.actual_amount;
8151 END LOOP;
8152
8153 /* Fetch the term status for invoice with amx adjust number*/
8154 FOR term_status_rec IN term_status_cur(invoice_date_rec.period_id, invoice_date_rec.invoice_date, l_max_adjust_num)
8155 LOOP
8156 l_variance_exp_code := term_status_rec.variance_exp_code;
8157 l_forecasted_exp_code := term_status_rec.forecasted_exp_code;
8158 END LOOP;
8159
8160 /* If the amount for reversal term is 0 , do not insert an invoice */
8161 IF l_actual_invoiced_amount <> 0 OR (l_variance_exp_code = 'N' AND l_forecasted_exp_code = 'Y' )THEN
8162
8163 /* Loop for the invoice with amx adjust num for a aprticular invoice date */
8164 FOR rent_inv_rec IN rent_inv_cur(invoice_date_rec.period_id, invoice_date_rec.invoice_date, l_max_adjust_num )
8165 LOOP
8166
8167 IF l_variance_exp_code = 'N' AND l_forecasted_exp_code = 'Y'
8168 THEN
8169 l_var_term_status := 'N';
8170 ELSE
8171 l_var_term_status := rent_inv_rec.variance_term_status;
8172 END IF;
8173
8174 pnp_debug_pkg.debug ('Actual_invoiced_amount ...'||l_actual_invoiced_amount);
8175 pnp_debug_pkg.debug ('var rent inv id ...'||rent_inv_rec.var_rent_inv_id);
8176
8177 /* Set var rent inv id to null before inserting a row */
8178 l_var_rent_inv_id := NULL;
8179 l_rowid := NULL;
8180
8181
8182 pn_var_rent_inv_pkg.insert_row ( x_rowid => l_rowid,
8183 x_var_rent_inv_id => l_var_rent_inv_id,
8184 x_adjust_num => l_max_adjust_num + 1,
8185 x_invoice_date => rent_inv_rec.invoice_date,
8186 x_for_per_rent => rent_inv_rec.for_per_rent ,
8187 x_tot_act_vol => 0,
8188 x_act_per_rent => 0,
8189 x_constr_actual_rent => 0,
8190 x_abatement_appl => rent_inv_rec.abatement_appl,
8191 x_rec_abatement => rent_inv_rec.rec_abatement,
8192 x_rec_abatement_override => rent_inv_rec.rec_abatement_override,
8193 x_negative_rent => rent_inv_rec.negative_rent ,
8194 x_actual_invoiced_amount => -l_actual_invoiced_amount,
8195 x_period_id => rent_inv_rec.period_id,
8196 x_var_rent_id => p_var_rent_id,
8197 x_forecasted_term_status => rent_inv_rec.forecasted_term_status,
8198 x_variance_term_status => l_var_term_status,
8199 x_actual_term_status => 'N', --rent_inv_rec.actual_term_status, --Bug#6490896
8200 x_forecasted_exp_code => 'N',
8201 x_variance_exp_code => 'N',
8202 x_actual_exp_code => 'N',
8203 x_credit_flag => 'Y',
8204 x_comments => 'negative invoices',
8205 x_attribute_category => rent_inv_rec.attribute_category,
8206 x_attribute1 => rent_inv_rec.attribute1,
8207 x_attribute2 => rent_inv_rec.attribute2,
8208 x_attribute3 => rent_inv_rec.attribute3,
8209 x_attribute4 => rent_inv_rec.attribute4,
8210 x_attribute5 => rent_inv_rec.attribute5,
8211 x_attribute6 => rent_inv_rec.attribute6,
8212 x_attribute7 => rent_inv_rec.attribute7,
8213 x_attribute8 => rent_inv_rec.attribute8,
8214 x_attribute9 => rent_inv_rec.attribute9,
8215 x_attribute10 => rent_inv_rec.attribute10,
8216 x_attribute11 => rent_inv_rec.attribute11,
8217 x_attribute12 => rent_inv_rec.attribute12,
8218 x_attribute13 => rent_inv_rec.attribute13,
8219 x_attribute14 => rent_inv_rec.attribute14,
8220 x_attribute15 => rent_inv_rec.attribute15,
8221 x_creation_date => l_date,
8222 x_created_by => nvl(fnd_profile.value('user_id'),1),
8223 x_last_update_date => l_date,
8224 x_last_updated_by => nvl(fnd_profile.value('user_id'),1),
8225 x_last_update_login => nvl(fnd_profile.value('user_id'),1),
8226 x_true_up_amount => rent_inv_rec.true_up_amt,
8227 x_true_up_status => rent_inv_rec.true_up_status,
8228 x_true_up_exp_code => rent_inv_rec.true_up_exp_code,
8229 x_org_id => rent_inv_rec.org_id);
8230
8231 pnp_debug_pkg.debug ('l_var_rent_inv_id ...'||l_var_rent_inv_id);
8232 pnp_debug_pkg.debug ('For every period, call create_payment_term...'||rent_inv_rec.var_rent_inv_id);
8233
8234 /*
8235 FOR payment_rec IN payment_cur(invoice_date_rec.invoice_date) LOOP
8236 pn_variable_term_pkg.create_reversal_terms(p_payment_term_id => payment_rec.payment_term_id
8237 ,p_var_rent_inv_id => l_var_rent_inv_id
8238 ,p_var_rent_type => 'ADJUSTMENT');
8239 END LOOP;
8240 Bug#6490896 */
8241 END LOOP;
8242
8243 END IF;
8244
8245 END LOOP;
8246
8247 /* OPEN ISSUE */
8248 /* Update the periods after new termination date - set status = 'Reversed' */
8249 UPDATE pn_var_periods_all
8250 SET status = pn_var_rent_pkg.status
8251 WHERE var_rent_id = p_var_rent_id
8252 AND start_date > p_new_termn_date;
8253
8254 pnp_debug_pkg.debug ('pn_var_rent_pkg.remove_later_periods (-)');
8255
8256 EXCEPTION
8257 WHEN OTHERS THEN
8258 pnp_debug_pkg.debug (' Remove Later Periods Error:'||SQLERRM);
8259 x_return_status := FND_API.G_RET_STS_ERROR;
8260 x_return_message := SQLERRM;
8261
8262 END remove_later_periods ;
8263
8264 -------------------------------------------------------------------------------
8265 -- NAME : early_terminate_setup
8266 -- DESCRIPTION : This procedure updates the end date of set up data for
8267 -- partial groups or periods
8268 -- PURPOSE :
8269 -- INVOKED FROM : process_vr_early_term
8270 -- ARGUMENTS : IN : p_var_rent_id, p_period_id, p_new_termn_date
8271 -- REFERENCE : PN_COMMON.debug()
8272 -- HISTORY :
8273 -- 01-JUN-06 piagrawa o Created
8274 -- 11-JAN-07 Prabhakar o Added the call delete_report_date_row to delete
8275 -- the report records which fall after new termination date.
8276 -- 20-MAR-07 lbala o Added code to update or delete pn_var_abat_defaults_all
8277 -- BUg # 5933345
8278 -- 21-Nov-11 ppenumar o Bug Bug 9844162 . Fwd port for Bug 9235577 when variable rent span is decreased the
8279 -- periods are not getting deleted.
8280 -- 06-Feb-12 ppenumar o Bug 13711733 As part of CU8.
8281
8282 -------------------------------------------------------------------------------
8283 PROCEDURE early_terminate_setup ( p_var_rent_id IN NUMBER
8284 , p_period_id IN NUMBER
8285 , p_new_termn_date IN DATE)
8286 IS
8287
8288 /* Get the details of group dates */
8289 CURSOR var_rent_cur IS
8290 SELECT cal.reptg_day_of_month,
8291 cal.invg_day_of_month,
8292 cal.reptg_days_after,
8293 cal.invg_days_after,
8294 vr.cumulative_vol,
8295 DECODE(cal.reptg_freq_code, 'MON', 1,
8296 'QTR', 3,
8297 'SA', 6,
8298 'YR', 12,
8299 NULL) reptg_freq_code
8300 FROM pn_var_rents_all vr, pn_var_rent_dates_all cal
8301 WHERE vr.var_rent_id = p_var_rent_id
8302 AND cal.var_rent_id = vr.var_rent_id;
8303
8304 /* Get the details of grp dates for group in which the new termination date falls */
8305 CURSOR grp_date_cur IS
8306 SELECT grp_start_date,
8307 grp_date_id,
8308 grp_end_date,
8309 inv_start_date,
8310 inv_end_date,
8311 group_date,
8312 invoice_date,
8313 period_id
8314 FROM pn_var_grp_dates_all
8315 WHERE var_rent_id = p_var_rent_id
8316 AND p_new_termn_date BETWEEN grp_start_date AND grp_end_date;
8317
8318 /* Get the details of breakpoint header default */
8319 CURSOR bkhd_default_cur IS
8320 SELECT bkhd_default_id
8321 FROM pn_var_bkhd_defaults_all
8322 WHERE var_rent_id = p_var_rent_id
8323 AND p_new_termn_date BETWEEN bkhd_start_date AND bkhd_end_date;
8324
8325 /* Get the details of breakpoint details default */
8326 CURSOR bkdt_defaults_cur IS
8327 SELECT bkdt_default_id, bkhd_default_id
8328 FROM pn_var_bkdt_defaults_all
8329 WHERE var_rent_id = p_var_rent_id
8330 AND p_new_termn_date BETWEEN bkdt_start_date AND bkdt_end_date;
8331
8332 /* Get the details of volume history */
8333 CURSOR vol_his_cur IS
8334 SELECT vol_hist_id, line_item_id
8335 FROM pn_var_vol_hist_all
8336 WHERE period_id = p_period_id
8337 AND p_new_termn_date BETWEEN start_date AND end_date;
8338
8339
8340 CURSOR bkpt_data_exists IS
8341 SELECT 'x' bkpt_exists
8342 FROM DUAL
8343 WHERE EXISTS (SELECT bkhd_default_id
8344 FROM pn_var_bkpts_head_all
8345 WHERE var_rent_id = p_var_rent_id
8346 AND bkhd_default_id IS NOT NULL);
8347
8348 /* Get the max invoice end date corresponding to the new termination date*/
8349 CURSOR inv_end_dt_cur(p_var_rent_id IN NUMBER) IS
8350 SELECT max(inv_end_date) inv_end_date
8351 FROM pn_var_grp_dates_all
8352 WHERE var_rent_id = p_var_rent_id
8353 AND inv_end_date <= p_new_termn_date;
8354
8355 l_reptg_day_of_month NUMBER := 0;
8356 l_cumulative_vol VARCHAR2(1) := 'Y';
8357 l_grp_start_date DATE := NULL;
8358 l_grp_end_date DATE := NULL;
8359 l_proration_factor NUMBER := 0;
8360 l_reptg_days_after NUMBER := 0;
8361 l_due_date DATE := NULL;
8362 l_group_date DATE := NULL;
8363 l_rept_freq NUMBER := 0;
8364 l_group_date_id NUMBER := NULL;
8365 l_inv_end_dt DATE := NULL;
8366 l_inv_start_dt DATE := NULL;
8367 l_invoice_date DATE := NULL;
8368 l_inv_sch_date DATE := NULL;
8369 l_period_id NUMBER := 0;
8370
8371 BEGIN
8372 pnp_debug_pkg.debug ('pn_var_rent_pkg.early_terminate_setup (+)');
8373 pnp_debug_pkg.debug ('p_var_rent_id ....'||p_var_rent_id);
8374 pnp_debug_pkg.debug ('p_period_id ......'||p_period_id);
8375 pnp_debug_pkg.debug ('p_new_termn_date ...'||p_new_termn_date);
8376
8377 FOR rec IN vol_his_cur LOOP
8378 PN_VAR_VOL_HIST_PKG.MODIFY_ROW( X_VOL_HIST_ID => rec.vol_hist_id,
8379 X_LINE_ITEM_ID => rec.line_item_id,
8380 X_END_DATE => p_new_termn_date);
8381 END LOOP;
8382
8383 UPDATE pn_var_deductions_all
8384 SET end_date = p_new_termn_date
8385 WHERE period_id = p_period_id
8386 AND p_new_termn_date BETWEEN start_date AND end_date;
8387
8388 FOR rec IN var_rent_cur LOOP
8389 l_reptg_day_of_month := rec.reptg_day_of_month;
8390 l_reptg_days_after := rec.reptg_days_after;
8391 l_cumulative_vol := rec.cumulative_vol;
8392 l_rept_freq := rec.reptg_freq_code;
8393 END LOOP;
8394
8395 FOR grp_date_rec IN grp_date_cur LOOP
8396 l_grp_start_date := grp_date_rec.grp_start_date;
8397 l_grp_end_date := grp_date_rec.grp_end_date;
8398 l_group_date := grp_date_rec.group_date;
8399 l_group_date_id := grp_date_rec.grp_date_id;
8400 l_invoice_date := grp_date_rec.invoice_date;
8401 l_period_id := grp_date_rec.period_id;
8402 l_inv_start_dt := grp_date_rec.inv_start_date;
8403 l_inv_end_dt := grp_date_rec.inv_end_date;
8404 END LOOP;
8405
8406 -- Bug13711733
8407 DELETE pn_var_grp_dates_all
8408 WHERE period_id = p_period_id
8409 and grp_start_date > p_new_termn_date
8410 and var_rent_id = p_var_rent_id;
8411
8412 IF l_grp_end_date <> p_new_termn_date THEN
8413
8414 l_proration_factor := ((p_new_termn_date - l_grp_start_date) + 1) /
8415 ((LAST_DAY(ADD_MONTHS(LAST_DAY(l_group_date),l_rept_freq-1)) - l_group_date)+1);
8416
8417 IF (l_reptg_day_of_month IS NOT NULL) THEN
8418 l_due_date := (ADD_MONTHS(FIRST_DAY(p_new_termn_date),1)-1)+l_reptg_day_of_month;
8419 ELSE
8420 l_due_date := p_new_termn_date + nvl(l_reptg_days_after,0);
8421 END IF;
8422
8423 /*l_inv_sch_date := pn_var_rent_calc_pkg.inv_sch_date( inv_start_date => l_invoice_date
8424 ,vr_id => p_var_rent_id
8425 ,p_period_id => l_period_id);*/
8426
8427
8428 UPDATE pn_var_grp_dates_all
8429 SET grp_end_date = p_new_termn_date,
8430 proration_factor = round(l_proration_factor,10),
8431 reptg_due_date = l_due_date
8432 WHERE var_rent_id = p_var_rent_id
8433 AND p_new_termn_date BETWEEN grp_start_date AND grp_end_date;
8434
8435 PN_VAR_RENT_PKG.DELETE_REPORT_DATE_ROW(p_var_rent_id, p_new_termn_date);
8436
8437 UPDATE pn_var_report_dates_all
8438 SET report_end_date = p_new_termn_date
8439 WHERE grp_date_id = l_group_date_id
8440 AND p_new_termn_date BETWEEN report_start_date AND report_end_date;
8441
8442 END IF;
8443
8444 l_inv_sch_date := pn_var_rent_calc_pkg.inv_sch_date( inv_start_date => l_invoice_date
8445 ,vr_id => p_var_rent_id
8446 ,p_period_id => l_period_id);
8447
8448 UPDATE pn_var_grp_dates_all
8449 SET inv_end_date = p_new_termn_date,
8450 inv_schedule_date = l_inv_sch_date
8451 WHERE var_rent_id = p_var_rent_id
8452 AND p_new_termn_date BETWEEN inv_start_date AND inv_end_date;
8453
8454 UPDATE pn_var_constraints_all
8455 SET constr_end_date = p_new_termn_date
8456 WHERE period_id = p_period_id
8457 AND p_new_termn_date BETWEEN constr_start_date AND constr_end_date;
8458
8459 /* Update the Breakpoint detail records in defaults */
8460 FOR bkdt_defaults_rec IN bkdt_defaults_cur LOOP
8461 pn_var_bkdt_defaults_pkg.modify_row (x_bkdt_default_id => bkdt_defaults_rec.bkdt_default_id,
8462 x_bkhd_default_id => bkdt_defaults_rec.bkhd_default_id,
8463 x_bkdt_end_date => p_new_termn_date);
8464 END LOOP;
8465
8466 /* Update the Breakpoint header records in defaults */
8467 FOR rec IN bkhd_default_cur LOOP
8468 pn_var_bkhd_defaults_pkg.modify_row (x_bkhd_default_id => rec.bkhd_default_id,
8469 x_bkhd_end_date => p_new_termn_date);
8470 END LOOP;
8471
8472 /* This generates line items, breakpoint header and details in main tables */
8473
8474 FOR rec IN bkpt_data_exists LOOP
8475 DELETE FROM pn_var_bkpts_det_all
8476 WHERE var_rent_id = p_var_rent_id;
8477
8478 DELETE FROM pn_var_bkpts_head_all
8479 WHERE var_rent_id = p_var_rent_id;
8480
8481 pn_var_defaults_pkg.create_setup_data (x_var_rent_id => p_var_rent_id);
8482 END LOOP;
8483
8484 UPDATE pn_var_constr_defaults_all
8485 SET constr_end_date = p_new_termn_date
8486 WHERE var_rent_id = p_var_rent_id
8487 AND p_new_termn_date BETWEEN constr_start_date AND constr_end_date;
8488
8489 UPDATE pn_var_line_defaults_all
8490 SET line_end_date = p_new_termn_date
8491 WHERE var_rent_id = p_var_rent_id
8492 AND p_new_termn_date BETWEEN line_start_date AND line_end_date;
8493
8494 /* Get max inv end date*/
8495 FOR inv_dt_rec IN inv_end_dt_cur(p_var_rent_id) LOOP
8496 l_inv_end_dt := inv_dt_rec.inv_end_date;
8497 END LOOP;
8498
8499 /* Delete all abatements whose start date is after the new max inv end date
8500 since start and end dates of abatements must correspond to that of
8501 invoice periods */
8502
8503 DELETE FROM pn_var_abat_defaults_all
8504 WHERE var_rent_id = p_var_rent_id
8505 AND p_new_termn_date BETWEEN start_date AND end_date
8506 AND start_date > l_inv_end_dt;
8507
8508 /*Update all abatements so that their end date is the new max inv end date*/
8509 UPDATE pn_var_abat_defaults_all
8510 SET end_date = l_inv_end_dt
8511 WHERE var_rent_id = p_var_rent_id
8512 AND p_new_termn_date BETWEEN start_date AND end_date;
8513
8514 UPDATE pn_var_periods_all
8515 SET end_date = p_new_termn_date,
8516 Partial_period = 'Y'
8517 WHERE var_rent_id = p_var_rent_id
8518 AND period_id = p_period_id;
8519
8520 pnp_debug_pkg.debug ('pn_var_rent_pkg.early_terminate_setup (-)');
8521 END;
8522
8523 -------------------------------------------------------------------------------
8524 -- NAME : early_terminate_period
8525 -- DESCRIPTION : This procedure process period in which the new
8526 -- termination date lies.
8527 -- PURPOSE :
8528 -- INVOKED FROM : process_vr_early_term
8529 -- ARGUMENTS : IN : p_var_rent_id, p_period_id, p_new_termn_date,
8530 -- p_old_termn_date
8531 -- REFERENCE : PN_COMMON.debug()
8532 -- HISTORY :
8533 -- 01-JUN-06 piagrawa o Created
8534 -- 03-DEC-07 acprakas o Bug#6490896. Modified to avoid auto creation of payment/billing terms
8535 -------------------------------------------------------------------------------
8536 PROCEDURE early_terminate_period ( p_var_rent_id IN NUMBER
8537 ,p_period_id IN NUMBER
8538 ,p_new_termn_date IN DATE
8539 ,p_old_termn_date IN DATE
8540 ,x_return_status OUT NOCOPY VARCHAR2
8541 ,x_return_message OUT NOCOPY VARCHAR2)
8542 IS
8543
8544 /* This cursor fetches the distinct invoices for periods starting after new termination date */
8545 CURSOR invoice_date_cur IS
8546 SELECT DISTINCT invoice_date
8547 FROM pn_var_rent_inv_all
8548 WHERE period_id = p_period_id
8549 AND invoice_date > p_new_termn_date;
8550
8551 /* This cursor fetches the invoices existing after the new termination date */
8552 CURSOR invoice_cur ( p_period_id NUMBER
8553 ,p_invoice_date DATE
8554 ,p_adjust_num NUMBER) IS
8555 SELECT *
8556 FROM pn_var_rent_inv_all
8557 WHERE period_id = p_period_id
8558 AND (NVL(actual_exp_code, 'N') = 'Y' OR
8559 NVL(variance_exp_code, 'N') = 'Y' OR
8560 NVL(forecasted_exp_code, 'N') = 'Y')
8561 /*AND NVL(actual_invoiced_amount, 0) <> 0*/
8562 AND invoice_date = p_invoice_date
8563 AND adjust_num = p_adjust_num
8564 AND true_up_amt IS NULL
8565 AND true_up_status IS NULL
8566 AND true_up_exp_code IS NULL;
8567
8568 /* This cursor fetches the invoices, which are not deleted, for the
8569 periods starting after new termination date */
8570 CURSOR term_status_cur ( p_period_id NUMBER
8571 ,p_invoice_date DATE
8572 ,p_adjust_num NUMBER) IS
8573 SELECT variance_exp_code, forecasted_exp_code
8574 FROM pn_var_rent_inv_all
8575 WHERE period_id = p_period_id
8576 AND (NVL(actual_exp_code, 'N') = 'Y' OR
8577 NVL(variance_exp_code, 'N') = 'Y' OR
8578 NVL(forecasted_exp_code, 'N') = 'Y')
8579 /*AND NVL(actual_invoiced_amount, 0) <> 0*/
8580 AND invoice_date = p_invoice_date
8581 AND adjust_num = p_adjust_num
8582 AND true_up_amt IS NULL
8583 AND true_up_status IS NULL
8584 AND true_up_exp_code IS NULL;
8585
8586 /* Fetches payment term information for a invoice id */
8587 CURSOR payment_cur(p_invoice_date DATE) IS
8588 SELECT payment_term_id
8589 FROM pn_payment_terms_all
8590 WHERE var_rent_inv_id IN (SELECT var_rent_inv_id
8591 FROM pn_var_rent_inv_all
8592 WHERE invoice_date = p_invoice_date
8593 AND var_rent_id = p_var_rent_id);
8594
8595 /* Fetches the maximum adjust num cursor */
8596 CURSOR max_adjust_num_cur (p_period_id NUMBER,
8597 p_invoice_date DATE) IS
8598 SELECT max(adjust_num) max_adjust_num
8599 FROM pn_var_rent_inv_all
8600 WHERE period_id = p_period_id
8601 AND invoice_date = p_invoice_date
8602 AND true_up_amt IS NULL
8603 AND true_up_status IS NULL
8604 AND true_up_exp_code IS NULL;
8605
8606 /* Fetches the amount for the particular invoice date */
8607 CURSOR actual_invoice_amount (p_period_id NUMBER,
8608 p_invoice_date DATE) IS
8609 SELECT SUM(actual_invoiced_amount) actual_amount
8610 FROM pn_var_rent_inv_all
8611 WHERE var_rent_inv_id IN ( SELECT var_rent_inv_id
8612 FROM pn_var_rent_inv_all
8613 WHERE period_id = p_period_id
8614 AND (NVL(actual_exp_code, 'N') = 'Y' OR
8615 NVL(variance_exp_code, 'N') = 'Y' OR
8616 NVL(forecasted_exp_code, 'N') = 'Y')
8617 /*AND NVL(actual_invoiced_amount, 0) <> 0*/
8618 AND invoice_date = p_invoice_date);
8619
8620
8621 l_actual_invoiced_amount pn_var_rent_inv_all.actual_invoiced_amount%TYPE;
8622 l_rowid ROWID;
8623 l_var_rent_inv_id NUMBER;
8624 l_date DATE := SYSDATE;
8625 l_errbuf VARCHAR2(250) := NULL;
8626 l_retcode VARCHAR2(250);
8627 l_max_adjust_num NUMBER := 0;
8628 l_forecasted_exp_code VARCHAR2(1) := 'N';
8629 l_variance_exp_code VARCHAR2(1) := 'N';
8630 l_var_term_status VARCHAR2(1);
8631
8632 BEGIN
8633 pnp_debug_pkg.debug ('pn_var_rent_pkg.early_terminate_period (+)');
8634 pnp_debug_pkg.debug ('p_var_rent_id ...'||p_var_rent_id);
8635 pnp_debug_pkg.debug ('p_period_id ....'||p_period_id);
8636 pnp_debug_pkg.debug ('p_new_termn_date ...'||p_new_termn_date);
8637 pnp_debug_pkg.debug ('p_old_termn_date ....'||p_old_termn_date);
8638
8639
8640 /* Delete draft terms for invoices for this period */
8641 DELETE pn_payment_terms_all
8642 WHERE status = 'DRAFT'
8643 AND var_rent_inv_id IN (SELECT var_rent_inv_id
8644 FROM pn_var_rent_inv_all pvi, pn_var_periods_all pvp
8645 WHERE pvi.period_id = p_period_id );
8646
8647 /* Delete invoices for which there are no terms */
8648 DELETE pn_var_rent_inv_all
8649 WHERE period_id = p_period_id
8650 AND actual_exp_code = 'N'
8651 AND forecasted_exp_code = 'N'
8652 AND variance_exp_code = 'N';
8653
8654 pnp_debug_pkg.debug ('p_old_termn_date ....'||p_old_termn_date);
8655
8656 pnp_debug_pkg.debug ('Loop for invoices that start after new termination date for this period and create adjustment terms for them');
8657 /* Loop for invoices that start after new termination date for this period and create adjustment terms for them */
8658 FOR invoice_date_rec IN invoice_date_cur LOOP
8659
8660 FOR max_adjust_num_rec IN max_adjust_num_cur(p_period_id, invoice_date_rec.invoice_date)
8661 LOOP
8662 l_max_adjust_num := max_adjust_num_rec.max_adjust_num;
8663 END LOOP;
8664
8665 /* Fetch the total amount that needs to be invoiced */
8666 FOR rec IN actual_invoice_amount(p_period_id, invoice_date_rec.invoice_date) LOOP
8667 l_actual_invoiced_amount := rec.actual_amount;
8668 END LOOP;
8669
8670 /* Fetch the term status for invoice with amx adjust number*/
8671 FOR term_status_rec IN term_status_cur(p_period_id, invoice_date_rec.invoice_date, l_max_adjust_num)
8672 LOOP
8673 l_variance_exp_code := term_status_rec.variance_exp_code;
8674 l_forecasted_exp_code := term_status_rec.forecasted_exp_code;
8675 END LOOP;
8676
8677 /* If the amount for reversal term is 0 , do not insert an invoice */
8678 IF l_actual_invoiced_amount <> 0 OR (l_variance_exp_code = 'N' AND l_forecasted_exp_code = 'Y' ) THEN
8679
8680 /* Loop for the invoice with amx adjust num for a aprticular invoice date */
8681 FOR invoice_rec IN invoice_cur(p_period_id, invoice_date_rec.invoice_date, l_max_adjust_num )
8682 LOOP
8683
8684 IF l_variance_exp_code = 'N' AND l_forecasted_exp_code = 'Y'
8685 THEN
8686 l_var_term_status := 'N';
8687 ELSE
8688 l_var_term_status := invoice_rec.variance_term_status;
8689 END IF;
8690
8691 pnp_debug_pkg.debug ('Actual_invoiced_amount ...'||l_actual_invoiced_amount);
8692 pnp_debug_pkg.debug ('var rent inv id ...'||invoice_rec.var_rent_inv_id);
8693 /* Set var rent inv id to null before inserting a row */
8694 l_var_rent_inv_id := NULL;
8695 l_rowid := NULL;
8696
8697 pn_var_rent_inv_pkg.insert_row ( x_rowid => l_rowid,
8698 x_var_rent_inv_id => l_var_rent_inv_id,
8699 x_adjust_num => l_max_adjust_num + 1,
8700 x_invoice_date => invoice_rec.invoice_date,
8701 x_for_per_rent => invoice_rec.for_per_rent,
8702 x_tot_act_vol => 0,
8703 x_act_per_rent => 0,
8704 x_constr_actual_rent => 0,
8705 x_abatement_appl => invoice_rec.abatement_appl,
8706 x_rec_abatement => invoice_rec.rec_abatement,
8707 x_rec_abatement_override => invoice_rec.rec_abatement_override,
8708 x_negative_rent => invoice_rec.negative_rent ,
8709 x_actual_invoiced_amount => - l_actual_invoiced_amount,
8710 x_period_id => invoice_rec.period_id,
8711 x_var_rent_id => p_var_rent_id,
8712 x_forecasted_term_status => invoice_rec.forecasted_term_status,
8713 x_variance_term_status => l_var_term_status,
8714 x_actual_term_status => 'N', --invoice_rec.actual_term_status, Bug#6490896
8715 x_forecasted_exp_code => 'N',
8716 x_variance_exp_code => 'N',
8717 x_actual_exp_code => 'N',
8718 x_credit_flag => 'Y',
8719 x_comments => 'negative invoices',
8720 x_attribute_category => invoice_rec.attribute_category,
8721 x_attribute1 => invoice_rec.attribute1,
8722 x_attribute2 => invoice_rec.attribute2,
8723 x_attribute3 => invoice_rec.attribute3,
8724 x_attribute4 => invoice_rec.attribute4,
8725 x_attribute5 => invoice_rec.attribute5,
8726 x_attribute6 => invoice_rec.attribute6,
8727 x_attribute7 => invoice_rec.attribute7,
8728 x_attribute8 => invoice_rec.attribute8,
8729 x_attribute9 => invoice_rec.attribute9,
8730 x_attribute10 => invoice_rec.attribute10,
8731 x_attribute11 => invoice_rec.attribute11,
8732 x_attribute12 => invoice_rec.attribute12,
8733 x_attribute13 => invoice_rec.attribute13,
8734 x_attribute14 => invoice_rec.attribute14,
8735 x_attribute15 => invoice_rec.attribute15,
8736 x_creation_date => l_date,
8737 x_created_by => nvl(fnd_profile.value('user_id'),1),
8738 x_last_update_date => l_date,
8739 x_last_updated_by => nvl(fnd_profile.value('user_id'),1),
8740 x_last_update_login => nvl(fnd_profile.value('user_id'),1),
8741 x_true_up_amount => invoice_rec.true_up_amt,
8742 x_true_up_status => invoice_rec.true_up_status,
8743 x_true_up_exp_code => invoice_rec.true_up_exp_code,
8744 x_org_id => invoice_rec.org_id);
8745
8746 pnp_debug_pkg.debug ('l_var_rent_inv_id ...'||l_var_rent_inv_id);
8747 pnp_debug_pkg.debug ('For every period, call create_payment_term...'||invoice_rec.var_rent_inv_id);
8748 /*
8749
8750 FOR payment_rec IN payment_cur(invoice_date_rec.invoice_date) LOOP
8751 pn_variable_term_pkg.create_reversal_terms(p_payment_term_id => payment_rec.payment_term_id
8752 ,p_var_rent_inv_id => l_var_rent_inv_id
8753 ,p_var_rent_type => 'ADJUSTMENT');
8754 END LOOP;
8755 Bug#6490896*/
8756
8757 END LOOP;
8758
8759 END IF;
8760
8761 END LOOP;
8762
8763 pnp_debug_pkg.debug ('pn_var_rent_pkg.early_terminate_period (-)');
8764
8765 END early_terminate_period;
8766
8767
8768 PROCEDURE delete_var_agreement ( p_var_rent_id IN NUMBER)
8769 IS
8770 BEGIN
8771 pnp_debug_pkg.debug ('pn_var_rent_pkg.delete_var_agreement (+)');
8772
8773 /* Delete the data from main tables */
8774 DELETE pn_var_vol_hist_all
8775 WHERE period_id IN (SELECT period_id
8776 FROM pn_var_periods_all
8777 WHERE var_rent_id = p_var_rent_id);
8778
8779 DELETE pn_var_bkpts_det_all
8780 WHERE var_rent_id = p_var_rent_id;
8781
8782 DELETE pn_var_bkpts_head_all
8783 WHERE var_rent_id = p_var_rent_id;
8784
8785 DELETE pn_var_deductions_all
8786 WHERE period_id IN (SELECT period_id
8787 FROM pn_var_periods_all
8788 WHERE var_rent_id = p_var_rent_id);
8789
8790 DELETE pn_var_rent_summ_all
8791 WHERE grp_date_id IN (SELECT grp_date_id
8792 FROM pn_var_grp_dates_all
8793 WHERE var_rent_id = p_var_rent_id);
8794
8795 DELETE pn_var_constraints_all
8796 WHERE period_id IN (SELECT period_id
8797 FROM pn_var_periods_all
8798 WHERE var_rent_id = p_var_rent_id);
8799
8800 DELETE pn_var_lines_all
8801 WHERE period_id IN (SELECT period_id
8802 FROM pn_var_periods_all
8803 WHERE var_rent_id = p_var_rent_id);
8804
8805 /* Delete data from defaults table */
8806
8807 DELETE pn_var_bkdt_defaults_all
8808 WHERE var_rent_id = p_var_rent_id;
8809
8810 DELETE pn_var_bkhd_defaults_all
8811 WHERE var_rent_id = p_var_rent_id;
8812
8813 DELETE pn_var_line_defaults_all
8814 WHERE var_rent_id = p_var_rent_id;
8815
8816 DELETE pn_var_constr_defaults_all
8817 WHERE var_rent_id = p_var_rent_id;
8818
8819 DELETE pn_payment_terms_all
8820 WHERE var_rent_inv_id IN (SELECT var_rent_inv_id
8821 FROM pn_var_rent_inv_all
8822 WHERE var_rent_id = p_var_rent_id);
8823
8824 DELETE pn_var_rent_inv_all
8825 WHERE var_rent_id = p_var_rent_id;
8826
8827 DELETE pn_var_grp_dates_all
8828 WHERE var_rent_id = p_var_rent_id;
8829
8830 DELETE pn_var_periods_all
8831 WHERE var_rent_id = p_var_rent_id;
8832
8833 DELETE pn_var_rents_all
8834 WHERE var_rent_id = p_var_rent_id;
8835
8836 pnp_debug_pkg.debug ('pn_var_rent_pkg.delete_var_agreement (-)');
8837
8838 END delete_var_agreement;
8839
8840 -------------------------------------------------------------------------------
8841 -- NAME : process_vr_early_term
8842 -- DESCRIPTION : This is the main procedure, which handles the processing of
8843 -- VR agreement when it is contracted either directly or from
8844 -- lease
8845 -- PURPOSE :
8846 -- INVOKED FROM :
8847 -- ARGUMENTS : IN : p_lease_id, p_var_rent_id, p_new_termn_date
8848 -- p_old_termn_date
8849 -- REFERENCE : PN_COMMON.debug()
8850 -- HISTORY :
8851 -- 01-JUN-06 piagrawa o Created
8852 -- 20-MAR-07 lbala o Bug # 5933345, Added code to delete/update from
8853 -- pn_var_abat_defaults_all
8854 -------------------------------------------------------------------------------
8855 PROCEDURE process_vr_early_term ( p_lease_id IN NUMBER
8856 ,p_var_rent_id IN NUMBER
8857 ,p_new_termn_date IN DATE
8858 ,p_old_termn_date IN DATE
8859 ,x_return_status OUT NOCOPY VARCHAR2
8860 ,x_return_message OUT NOCOPY VARCHAR2)
8861 IS
8862
8863 l_period_exists NUMBER := NULL;
8864 l_errbuf VARCHAR2(250);
8865 l_retcode VARCHAR2(250);
8866 l_appr_term_exists VARCHAR2(1) := 'N';
8867 l_inv_end_dt DATE :=NULL;
8868
8869 /* This cursor fetches all variable rent agreements, which end after the new
8870 termination date for a given lease or fetches information for a given agreement */
8871
8872 CURSOR var_rent_cur IS
8873 SELECT var_rent_id, commencement_date
8874 FROM pn_var_rents_all
8875 WHERE lease_id = NVL(p_lease_id, lease_id)
8876 AND var_rent_id = NVL (p_var_rent_id, var_rent_id)
8877 AND (( termination_date = p_old_termn_date) OR
8878 (termination_date < p_old_termn_date AND termination_date > p_new_termn_date))
8879 AND commencement_date <= p_new_termn_date ;
8880
8881 /* Fetch the period in which the new termination date lies */
8882 CURSOR period_id_cur(l_var_rent_id NUMBER) IS
8883 SELECT period_id, end_date
8884 FROM pn_var_periods_all
8885 WHERE var_rent_id = l_var_rent_id
8886 AND p_new_termn_date BETWEEN start_date AND end_date;
8887
8888 /* Fetch the agreements which start after the new termination date */
8889 CURSOR variable_rent_cur IS
8890 SELECT var_rent_id
8891 FROM pn_var_rents_all
8892 WHERE lease_id = p_lease_id
8893 AND commencement_date > p_new_termn_date
8894 AND commencement_date < p_old_termn_date ;
8895
8896 /* Check if the specified variable rent agreement has an approved term */
8897 CURSOR approved_term_exists_cur (p_var_rent_id NUMBER) IS
8898 SELECT 'Y' approve_term_exits
8899 FROM pn_payment_terms_all
8900 WHERE status = 'APPROVED'
8901 AND var_rent_inv_id IN (SELECT var_rent_inv_id
8902 FROM pn_var_rent_inv_all pvi, pn_var_periods_all pvp,
8903 pn_var_rents_all pvr
8904 WHERE pvi.period_id = pvp.period_id
8905 AND pvr.var_rent_id = pvp.var_rent_id
8906 AND pvr.var_rent_id = p_var_rent_id);
8907
8908 /* Get the details of breakpoint header default */
8909 CURSOR bkhd_default_cur (p_var_rent_id NUMBER) IS
8910 SELECT bkhd_default_id
8911 FROM pn_var_bkhd_defaults_all
8912 WHERE var_rent_id = p_var_rent_id
8913 AND p_new_termn_date BETWEEN bkhd_start_date AND bkhd_end_date;
8914
8915 /* Get the details of breakpoint details default */
8916 CURSOR bkdt_defaults_cur(p_var_rent_id NUMBER) IS
8917 SELECT bkdt_default_id, bkhd_default_id
8918 FROM pn_var_bkdt_defaults_all
8919 WHERE var_rent_id = p_var_rent_id
8920 AND p_new_termn_date BETWEEN bkdt_start_date AND bkdt_end_date;
8921
8922 /* Get the max invoice end date corresponding to the new termination date*/
8923 CURSOR inv_end_dt_cur(p_var_rent_id IN NUMBER) IS
8924 SELECT max(inv_end_date) inv_end_date
8925 FROM pn_var_grp_dates_all
8926 WHERE var_rent_id = p_var_rent_id
8927 AND inv_end_date <= p_new_termn_date;
8928
8929 BEGIN
8930 pnp_debug_pkg.debug ('pn_var_rent_pkg.process_vr_early_term (+)');
8931 pnp_debug_pkg.debug (' Parameters :');
8932 pnp_debug_pkg.debug (' ------------------------------------------- :');
8933 pnp_debug_pkg.debug ('p_lease_id..'||p_lease_id);
8934 pnp_debug_pkg.debug ('p_var_rent_id ...'||p_var_rent_id);
8935 pnp_debug_pkg.debug ('p_new_termn_date....'||p_new_termn_date);
8936 pnp_debug_pkg.debug ('p_old_termn_date...'||p_old_termn_date);
8937 pnp_debug_pkg.debug (' ------------------------------------------- :');
8938
8939 /* Loop through the rent agreements whose termination date > new termination date */
8940 FOR var_rent_rec IN var_rent_cur LOOP
8941
8942 pnp_debug_pkg.debug ('**************************************************************');
8943 pnp_debug_pkg.debug ('looping through variable rent ...'||var_rent_rec.var_rent_id);
8944 pnp_debug_pkg.debug ('**************************************************************');
8945
8946 l_period_exists := 0;
8947
8948 /* Delete Vol hist, Bkpt Details, bkpt headers, lines, deductions, vr summary rows,
8949 group dates, constraints for agreement */
8950 Delete_vr_setup ( p_var_rent_id => var_rent_rec.var_rent_id
8951 ,p_new_termn_date => p_new_termn_date);
8952
8953 /* Make a call to procedure remove_later_periods */
8954 remove_later_periods (p_var_rent_id => var_rent_rec.var_rent_id,
8955 p_new_termn_date => p_new_termn_date,
8956 p_old_termn_date => p_old_termn_date,
8957 x_return_status => x_return_status,
8958 x_return_message => x_return_message);
8959
8960 pnp_debug_pkg.debug ('after remove later periods'||p_var_rent_id||'....'||p_new_termn_date);
8961 /* Fetch the period in which new termination date lies */
8962 FOR period_id_rec IN period_id_cur(var_rent_rec.var_rent_id) LOOP
8963
8964 pnp_debug_pkg.debug ('current period with new termination date ...'||period_id_rec.period_id);
8965 pnp_debug_pkg.debug ('end date for period with new termination date ...'||period_id_rec.end_date);
8966
8967 /* Check if the new period is partial. Early terminate the setup and process the
8968 period if the new period is partial */
8969 IF period_id_rec.end_date <> p_new_termn_date THEN
8970
8971 /* Make a call to procedure early_terminate setup to contract setup information
8972 like breakpoints, volume history, constarints etc */
8973
8974 early_terminate_setup ( p_var_rent_id => var_rent_rec.var_rent_id
8975 ,p_period_id => period_id_rec.period_id
8976 ,p_new_termn_date => p_new_termn_date);
8977
8978 /* Make a call to procedure early_terminate_period */
8979 early_terminate_period ( p_var_rent_id => var_rent_rec.var_rent_id,
8980 p_period_id => period_id_rec.period_id,
8981 p_new_termn_date => p_new_termn_date,
8982 p_old_termn_date => p_old_termn_date,
8983 x_return_status => x_return_status,
8984 x_return_message => x_return_message);
8985
8986 ELSE
8987
8988 pnp_debug_pkg.debug(' contract the defaults only ...');
8989
8990 FOR bkdt_defaults_rec IN bkdt_defaults_cur(var_rent_rec.var_rent_id) LOOP
8991 pn_var_bkdt_defaults_pkg.modify_row (x_bkdt_default_id => bkdt_defaults_rec.bkdt_default_id,
8992 x_bkhd_default_id => bkdt_defaults_rec.bkhd_default_id,
8993 x_bkdt_end_date => p_new_termn_date);
8994 END LOOP;
8995
8996 /* Update the Breakpoint header records in defaults */
8997 FOR rec IN bkhd_default_cur(var_rent_rec.var_rent_id) LOOP
8998 pn_var_bkhd_defaults_pkg.modify_row (x_bkhd_default_id => rec.bkhd_default_id,
8999 x_bkhd_end_date => p_new_termn_date);
9000 END LOOP;
9001
9002 UPDATE pn_var_constr_defaults_all
9003 SET constr_end_date = p_new_termn_date
9004 WHERE var_rent_id = var_rent_rec.var_rent_id
9005 AND p_new_termn_date BETWEEN constr_start_date AND constr_end_date;
9006
9007 UPDATE pn_var_line_defaults_all
9008 SET line_end_date = p_new_termn_date
9009 WHERE var_rent_id = var_rent_rec.var_rent_id
9010 AND p_new_termn_date BETWEEN line_start_date AND line_end_date;
9011
9012 /* Get max inv end date*/
9013 FOR inv_dt_rec IN inv_end_dt_cur(var_rent_rec.var_rent_id) LOOP
9014 l_inv_end_dt := inv_dt_rec.inv_end_date;
9015 END LOOP;
9016
9017 /* Delete all abatements whose start date is after the new max inv end date
9018 since start and end dates of abatements must correspond to that of
9019 invoice periods */
9020 DELETE FROM pn_var_abat_defaults_all
9021 WHERE var_rent_id = var_rent_rec.var_rent_id
9022 AND p_new_termn_date BETWEEN start_date AND end_date
9023 AND start_date > l_inv_end_dt;
9024
9025 /*Update all abatements so that their end date is the new max inv end date*/
9026 UPDATE pn_var_abat_defaults_all
9027 SET end_date = l_inv_end_dt
9028 WHERE var_rent_id = var_rent_rec.var_rent_id
9029 AND p_new_termn_date BETWEEN start_date AND end_date;
9030
9031 END IF;
9032
9033 END LOOP;
9034
9035 pnp_debug_pkg.debug ('after for loop');
9036
9037 /* update the end date of agreement to new termination date */
9038 UPDATE pn_var_rents_all
9039 SET termination_date = p_new_termn_date
9040 WHERE var_rent_id = var_rent_rec.var_rent_id;
9041
9042 /* update the bkpt_update_flag to 'Y for VR agreement */
9043 UPDATE pn_var_lines_all
9044 SET bkpt_update_flag = 'Y',
9045 sales_vol_update_flag = 'Y'
9046 WHERE var_rent_id = var_rent_rec.var_rent_id;
9047
9048
9049 END LOOP;
9050
9051 /* Loop through the rent agreements whose commencement date > new termination date */
9052 pnp_debug_pkg.debug ( 'lease id is ...'||p_lease_id);
9053
9054 IF p_lease_id IS NOT NULL THEN
9055 pnp_debug_pkg.debug(' inside if ..');
9056 FOR variable_rent_rec IN variable_rent_cur LOOP
9057
9058 l_appr_term_exists := 'N';
9059 pnp_debug_pkg.debug(' var rent id ...'||variable_rent_rec.var_rent_id);
9060
9061 FOR rec IN approved_term_exists_cur(variable_rent_rec.var_rent_id) LOOP
9062 pnp_debug_pkg.debug (' approved term exists ...');
9063 l_appr_term_exists := rec.approve_term_exits;
9064 END LOOP;
9065
9066 pnp_debug_pkg.debug ('l_appr_term_exists ...'||l_appr_term_exists);
9067
9068 IF l_appr_term_exists = 'N' THEN
9069 delete_var_agreement(p_var_rent_id => variable_rent_rec.var_rent_id);
9070 END IF;
9071
9072 END LOOP;
9073 END IF;
9074
9075 pnp_debug_pkg.debug ('pn_var_rent_pkg.process_vr_early_term (-)');
9076
9077 EXCEPTION
9078 WHEN OTHERS THEN
9079 pnp_debug_pkg.debug ('Process_vr_early_term Error:'||SQLERRM);
9080 x_return_status := FND_API.G_RET_STS_ERROR;
9081 x_return_message := sqlerrm;
9082 END;
9083
9084 -------------------------------------------------------------------------------
9085 -- NAME : extend_defaults
9086 -- DESCRIPTION : This procedure handles the extension of existing break
9087 -- point set up
9088 -- PURPOSE :
9089 -- INVOKED FROM :
9090 -- ARGUMENTS : IN : p_var_rent_id, p_new_termn_date, p_old_termn_date
9091 -- OUT: p_return_status, p_return_message
9092 -- REFERENCE : PN_COMMON.debug()
9093 -- HISTORY :
9094 -- 01-JUN-06 piagrawa o Created
9095 -------------------------------------------------------------------------------
9096 PROCEDURE extend_defaults ( p_var_rent_id IN NUMBER
9097 ,p_old_termn_date IN DATE
9098 ,p_new_termn_date IN DATE)
9099 IS
9100
9101 CURSOR exists_line_cur IS
9102 SELECT line_default_id
9103 FROM pn_var_line_defaults_all
9104 WHERE var_rent_id = p_var_rent_id;
9105
9106 CURSOR exists_hd_def_cur (p_linedefid NUMBER) IS
9107 SELECT bkhd_default_id
9108 FROM pn_var_bkhd_defaults_all
9109 WHERE line_default_id = p_linedefid;
9110
9111 CURSOR bkpt_data_exists IS
9112 SELECT 'x' bkpt_exists
9113 FROM DUAL
9114 WHERE EXISTS (SELECT bkhd_default_id
9115 FROM pn_var_bkpts_head_all
9116 WHERE var_rent_id = p_var_rent_id
9117 AND bkhd_default_id IS NOT NULL);
9118
9119 CURSOR constr_data_exists IS
9120 SELECT 'x'
9121 FROM DUAL
9122 WHERE EXISTS (SELECT constraint_id
9123 FROM pn_var_constraints_all
9124 WHERE period_id IN (SELECT PERIOD_ID
9125 FROM pn_var_periods_all
9126 WHERE var_rent_id = p_var_rent_id)
9127 AND constr_default_id IS NOT NULL);
9128
9129 /* Get the details of breakpoint header default */
9130 CURSOR bkhd_default_cur IS
9131 SELECT bkhd_default_id
9132 FROM pn_var_bkhd_defaults_all
9133 WHERE var_rent_id = p_var_rent_id
9134 AND bkhd_end_date = p_old_termn_date;
9135
9136 /* Get the details of breakpoint details default */
9137 CURSOR bkdt_defaults_cur IS
9138 SELECT bkdt_default_id, bkhd_default_id
9139 FROM pn_var_bkdt_defaults_all
9140 WHERE var_rent_id = p_var_rent_id
9141 AND bkdt_end_date = p_old_termn_date
9142 AND bkhd_default_id IN ( SELECT bkhd_default_id
9143 FROM pn_var_bkhd_defaults_all
9144 WHERE var_rent_id = p_var_rent_id
9145 AND bkhd_end_date = p_new_termn_date
9146 AND break_type = 'ARTIFICIAL');
9147
9148
9149 l_linedefid NUMBER;
9150 l_errbuf VARCHAR2(250);
9151 l_ret_code VARCHAR2(250);
9152 l_bkpt_exists VARCHAR2(1);
9153
9154 BEGIN
9155 pnp_debug_pkg.debug ('pn_var_rent_pkg.extend_defaults (+)');
9156 pnp_debug_pkg.debug ('p_var_rent_id .. '||p_var_rent_id);
9157 pnp_debug_pkg.debug ('p_old_termn_date ..'||p_old_termn_date);
9158 pnp_debug_pkg.debug ('p_new_termn_date ..'||p_new_termn_date);
9159
9160 UPDATE pn_var_line_defaults_all
9161 SET line_end_date = p_new_termn_date
9162 WHERE var_rent_id = p_var_rent_id
9163 AND line_end_date = p_old_termn_date;
9164
9165 /* Update the Breakpoint header records in defaults */
9166 FOR rec IN bkhd_default_cur LOOP
9167 pn_var_bkhd_defaults_pkg.modify_row (x_bkhd_default_id => rec.bkhd_default_id,
9168 x_bkhd_end_date => p_new_termn_date);
9169 END LOOP;
9170
9171 /* Update the Breakpoint detail records in defaults */
9172 FOR bkdt_defaults_rec IN bkdt_defaults_cur LOOP
9173 pn_var_bkdt_defaults_pkg.modify_row (x_bkdt_default_id => bkdt_defaults_rec.bkdt_default_id,
9174 x_bkhd_default_id => bkdt_defaults_rec.bkhd_default_id,
9175 x_bkdt_end_date => p_new_termn_date);
9176 END LOOP;
9177
9178 UPDATE pn_var_constr_defaults_all
9179 SET constr_end_date = p_new_termn_date
9180 WHERE var_rent_id = p_var_rent_id
9181 AND constr_end_date = p_old_termn_date;
9182
9183 /* This generates line items, breakpoint header and details in main tables */
9184 pnp_debug_pkg.debug ('calling procedure pn_var_defaults_pkg.create_default_lines ..');
9185 FOR rec IN bkpt_data_exists LOOP
9186 l_bkpt_exists := rec.bkpt_exists;
9187 END LOOP;
9188
9189 /* This generates the breakpoint details for Natural breakpoints */
9190 pn_var_natural_bp_pkg.build_bkpt_details_main(errbuf => l_errbuf,
9191 retcode => l_ret_code,
9192 p_var_rent_id => p_var_rent_id);
9193
9194
9195 IF l_bkpt_exists IS NOT NULL THEN
9196
9197 DELETE FROM pn_var_bkpts_det_all
9198 WHERE var_rent_id = p_var_rent_id;
9199
9200 DELETE FROM pn_var_bkpts_head_all
9201 WHERE var_rent_id = p_var_rent_id;
9202
9203 pn_var_defaults_pkg.create_setup_data (x_var_rent_id => p_var_rent_id);
9204 END IF;
9205
9206 /* This generates constraint records in main tables */
9207 pnp_debug_pkg.debug ('calling procedure pn_var_defaults_pkg.create_default_constraints ..');
9208 FOR rec IN constr_data_exists LOOP
9209 DELETE FROM pn_var_constraints_all
9210 WHERE period_id IN (SELECT period_id
9211 FROM pn_var_periods_all
9212 WHERE var_rent_id = p_var_rent_id);
9213
9214 pn_var_defaults_pkg.create_default_constraints (x_var_rent_id => p_var_rent_id);
9215 END LOOP;
9216
9217 pnp_debug_pkg.debug ('pn_var_rent_pkg.extend_defaults (-)');
9218 END;
9219
9220 -------------------------------------------------------------------------------
9221 -- NAME : Create_setup_exp
9222 -- DESCRIPTION : This procedure handles the extension of existing break point
9223 -- setup
9224 -- PURPOSE :
9225 -- INVOKED FROM :
9226 -- ARGUMENTS : IN : p_var_rent_id, p_period_id
9227 -- OUT: p_return_status, p_return_message
9228 -- REFERENCE : PN_COMMON.debug()
9229 -- HISTORY :
9230 -- 01-JUN-06 piagrawa o Created
9231 -------------------------------------------------------------------------------
9232 PROCEDURE create_setup_exp ( p_var_rent_id IN NUMBER
9233 ,p_period_id IN NUMBER)
9234 IS
9235
9236 /* This cursor fetches period, which start after the last period */
9237 CURSOR period_cur IS
9238 SELECT period_id, start_date, end_date
9239 FROM pn_var_periods_all
9240 WHERE var_rent_id = p_var_rent_id
9241 AND start_date > ( SELECT end_date
9242 FROM pn_var_periods_all
9243 WHERE period_id = p_period_id);
9244
9245 /* This cursor fetches information abouth the period which was the last one
9246 before contraction */
9247 CURSOR last_period_cur IS
9248 SELECT end_date
9249 FROM pn_var_periods_all
9250 WHERE period_id = p_period_id;
9251
9252 /* This cursor fetches the line record data for last period before expansion */
9253 CURSOR line_cur IS
9254 SELECT sales_type_code
9255 ,item_category_code
9256 ,comments
9257 ,attribute_category
9258 ,attribute1
9259 ,attribute2
9260 ,attribute3
9261 ,attribute4
9262 ,attribute5
9263 ,attribute6
9264 ,attribute7
9265 ,attribute8
9266 ,attribute9
9267 ,attribute10
9268 ,attribute11
9269 ,attribute12
9270 ,attribute13
9271 ,attribute14
9272 ,attribute15
9273 ,org_id
9274 ,line_template_id
9275 ,agreement_template_id
9276 ,line_default_id
9277 ,var_rent_id
9278 ,line_item_id
9279 FROM pn_var_lines_all
9280 WHERE period_id = p_period_id;
9281
9282 /* This cursor fetches the breakpoint header record data,
9283 which ends on end date of last period before expansion */
9284 CURSOR bkpt_head_cur( p_line_item_id IN NUMBER
9285 ,p_end_date IN DATE)
9286 IS
9287 SELECT bkpt_header_id,
9288 line_item_id,
9289 break_type,
9290 base_rent_type,
9291 natural_break_rate,
9292 base_rent,
9293 breakpoint_type,
9294 bkhd_default_id,
9295 var_rent_id,
9296 attribute_category,
9297 attribute1,
9298 attribute2,
9299 attribute3,
9300 attribute4,
9301 attribute5,
9302 attribute6,
9303 attribute7,
9304 attribute8,
9305 attribute9,
9306 attribute10,
9307 attribute11,
9308 attribute12,
9309 attribute13,
9310 attribute14,
9311 attribute15,
9312 org_id
9313 FROM pn_var_bkpts_head_all
9314 WHERE line_item_id = p_line_item_id
9315 AND bkhd_end_date = p_end_date;
9316
9317 /* This cursor fetches the breakpoint detail record data,
9318 which ends on end date of last period before expansion */
9319 CURSOR bkpt_detail_cur( p_bkpt_header_id IN NUMBER
9320 ,p_end_date IN DATE)
9321 IS
9322 SELECT period_bkpt_vol_start,
9323 period_bkpt_vol_end,
9324 group_bkpt_vol_start,
9325 group_bkpt_vol_end,
9326 bkpt_rate,
9327 comments,
9328 attribute_category,
9329 attribute1,
9330 attribute2,
9331 attribute3,
9332 attribute4,
9333 attribute5,
9334 attribute6,
9335 attribute7,
9336 attribute8,
9337 attribute9,
9338 attribute10,
9339 attribute11,
9340 attribute12,
9341 attribute13,
9342 attribute14,
9343 attribute15,
9344 org_id,
9345 annual_basis_amount,
9346 bkdt_default_id
9347 FROM pn_var_bkpts_det_all
9348 WHERE bkpt_header_id = p_bkpt_header_id
9349 AND bkpt_end_date = p_end_date;
9350
9351
9352 /* This cursor fetches the constraint records for last period before expansion */
9353 CURSOR constraint_cur (p_end_date DATE) IS
9354 SELECT constr_cat_code
9355 ,type_code
9356 ,amount
9357 ,comments
9358 ,attribute_category
9359 ,attribute1
9360 ,attribute2
9361 ,attribute3
9362 ,attribute4
9363 ,attribute5
9364 ,attribute6
9365 ,attribute7
9366 ,attribute8
9367 ,attribute9
9368 ,attribute10
9369 ,attribute11
9370 ,attribute12
9371 ,attribute13
9372 ,attribute14
9373 ,attribute15
9374 ,org_id
9375 ,agreement_template_id
9376 ,constr_template_id
9377 ,constr_default_id
9378 FROM pn_var_constraints_all
9379 WHERE period_id = p_period_id
9380 AND constr_end_date = p_end_date;
9381
9382
9383 l_rowId VARCHAR2(18) := NULL;
9384 l_line_item_id NUMBER := NULL;
9385 l_line_item_num NUMBER := NULL;
9386 l_end_date DATE := NULL;
9387 l_bkpt_header_id NUMBER := NULL;
9388 l_bkpt_detail_id NUMBER := NULL;
9389 l_bkpt_detail_num NUMBER := NULL;
9390 l_constrid NUMBER := NULL;
9391 l_constrnum NUMBER := NULL;
9392
9393 BEGIN
9394
9395 pnp_debug_pkg.debug ('pn_var_rent_pkg.create_setup_exp (+)');
9396 pnp_debug_pkg.debug ('p_var_rent_id .. '||p_var_rent_id);
9397 pnp_debug_pkg.debug ('p_period_id ..'||p_period_id);
9398
9399 /* Fetch the end date of period which was the last one before expansion */
9400 FOR last_period_rec IN last_period_cur LOOP
9401 l_end_date := last_period_rec.end_date;
9402 END LOOP;
9403
9404 /* Loop through line records of period which was the last one before expansion */
9405 FOR line_rec IN line_cur LOOP
9406
9407 pnp_debug_pkg.debug ('refernce line record is ..'||line_rec.line_item_id);
9408
9409 /* Loop through the periods which have been created due to VR expansion to
9410 create setup data for them */
9411 FOR period_rec IN period_cur LOOP
9412
9413 pnp_debug_pkg.debug ('period for which data is being inserted is ..'||period_rec.period_id);
9414 l_rowid := NULL;
9415 l_line_item_id := NULL;
9416 l_line_item_num := NULL;
9417
9418 /* generate line item for this period using the data from last period */
9419 pn_var_lines_pkg.insert_row(x_rowid => l_rowid,
9420 x_line_item_id => l_line_item_id,
9421 x_line_item_num => l_line_item_num,
9422 x_period_id => period_rec.period_id,
9423 x_sales_type_code => line_rec.sales_type_code,
9424 x_item_category_code => line_rec.item_category_code,
9425 x_comments => line_rec.comments,
9426 x_attribute_category => line_rec.attribute_category ,
9427 x_attribute1 => line_rec.attribute1,
9428 x_attribute2 => line_rec.attribute2,
9429 x_attribute3 => line_rec.attribute3,
9430 x_attribute4 => line_rec.attribute4,
9431 x_attribute5 => line_rec.attribute5,
9432 x_attribute6 => line_rec.attribute6,
9433 x_attribute7 => line_rec.attribute7,
9434 x_attribute8 => line_rec.attribute8,
9435 x_attribute9 => line_rec.attribute9,
9436 x_attribute10 => line_rec.attribute10,
9437 x_attribute11 => line_rec.attribute11,
9438 x_attribute12 => line_rec.attribute12,
9439 x_attribute13 => line_rec.attribute13,
9440 x_attribute14 => line_rec.attribute14,
9441 x_attribute15 => line_rec.attribute15,
9442 x_org_id => line_rec.org_id,
9443 x_creation_date => sysdate,
9444 x_created_by => NVL(fnd_profile.value('USER_ID'),0),
9445 x_last_update_date => sysdate,
9446 x_last_updated_by => NVL(fnd_profile.value('USER_ID'),0),
9447 x_last_update_login => NVL(fnd_profile.value('USER_ID'),0),
9448 x_line_template_id => line_rec.line_template_id,
9449 x_agreement_template_id => line_rec.agreement_template_id,
9450 x_line_default_id => line_rec.line_default_id,
9451 x_var_rent_id => p_var_rent_id);
9452
9453 pnp_debug_pkg.debug ('line item inserted is l_line_item_id ..'||l_line_item_id);
9454 /* Generate the breakpoint header associated with this line item */
9455 FOR bkpt_head_rec IN bkpt_head_cur (line_rec.line_item_id, l_end_date) LOOP
9456 l_rowid := NULL;
9457 l_bkpt_header_id := NULL;
9458 pn_var_bkpts_head_pkg.insert_row(x_rowid => l_rowid,
9459 x_bkpt_header_id => l_bkpt_header_id,
9460 x_line_item_id => l_line_item_id,
9461 x_period_id => period_rec.period_id,
9462 x_break_type => bkpt_head_rec.break_type,
9463 x_base_rent_type => bkpt_head_rec.base_rent_type,
9464 x_natural_break_rate => bkpt_head_rec.natural_break_rate,
9465 x_base_rent => bkpt_head_rec.base_rent,
9466 x_breakpoint_type => bkpt_head_rec.breakpoint_type,
9467 x_bkhd_default_id => bkpt_head_rec.bkhd_default_id,
9468 x_bkhd_start_date => period_rec.start_date,
9469 x_bkhd_end_date => period_rec.end_date,
9470 x_var_rent_id => p_var_rent_id,
9471 x_attribute_category => bkpt_head_rec.attribute_category,
9472 x_attribute1 => bkpt_head_rec.attribute1,
9473 x_attribute2 => bkpt_head_rec.attribute2,
9474 x_attribute3 => bkpt_head_rec.attribute3,
9475 x_attribute4 => bkpt_head_rec.attribute4,
9476 x_attribute5 => bkpt_head_rec.attribute5,
9477 x_attribute6 => bkpt_head_rec.attribute6,
9478 x_attribute7 => bkpt_head_rec.attribute7,
9479 x_attribute8 => bkpt_head_rec.attribute8,
9480 x_attribute9 => bkpt_head_rec.attribute9,
9481 x_attribute10 => bkpt_head_rec.attribute10,
9482 x_attribute11 => bkpt_head_rec.attribute11,
9483 x_attribute12 => bkpt_head_rec.attribute12,
9484 x_attribute13 => bkpt_head_rec.attribute13,
9485 x_attribute14 => bkpt_head_rec.attribute14,
9486 x_attribute15 => bkpt_head_rec.attribute15,
9487 x_org_id => bkpt_head_rec.org_id,
9488 x_creation_date => sysdate,
9489 x_created_by => NVL(fnd_profile.value('USER_ID'),0),
9490 x_last_update_date => sysdate,
9491 x_last_updated_by => NVL(fnd_profile.value('USER_ID'),0),
9492 x_last_update_login => NVL(fnd_profile.value('LOGIN_ID'),0));
9493
9494 pnp_debug_pkg.debug ('breakpoint header inserted is l_bkpt_header_id ..'||l_bkpt_header_id);
9495
9496 /* Generate the breakpoint details associated with this breakpoint header */
9497 FOR bkpt_detail_rec IN bkpt_detail_cur( bkpt_head_rec.bkpt_header_id, l_end_date) LOOP
9498 l_rowid := NULL;
9499 l_bkpt_detail_id := NULL;
9500 l_bkpt_detail_num := NULL;
9501
9502 pn_var_bkpts_det_pkg.insert_row(x_rowid => l_rowid,
9503 x_bkpt_detail_id => l_bkpt_detail_id,
9504 x_bkpt_detail_num => l_bkpt_detail_num,
9505 x_bkpt_header_id => l_bkpt_header_id,
9506 x_bkpt_start_date => period_rec.start_date,
9507 x_bkpt_end_date => period_rec.end_date,
9508 x_period_bkpt_vol_start => bkpt_detail_rec.period_bkpt_vol_start,
9509 x_period_bkpt_vol_end => bkpt_detail_rec.period_bkpt_vol_end,
9510 x_group_bkpt_vol_start => bkpt_detail_rec.group_bkpt_vol_start,
9511 x_group_bkpt_vol_end => bkpt_detail_rec.group_bkpt_vol_end,
9512 x_bkpt_rate => bkpt_detail_rec.bkpt_rate,
9513 x_bkdt_default_id => bkpt_detail_rec.bkdt_default_id,
9514 x_var_rent_id => p_var_rent_id,
9515 x_comments => bkpt_detail_rec.comments,
9516 x_attribute_category => bkpt_detail_rec.attribute_category,
9517 x_attribute1 => bkpt_detail_rec.attribute1,
9518 x_attribute2 => bkpt_detail_rec.attribute2,
9519 x_attribute3 => bkpt_detail_rec.attribute3,
9520 x_attribute4 => bkpt_detail_rec.attribute4,
9521 x_attribute5 => bkpt_detail_rec.attribute5,
9522 x_attribute6 => bkpt_detail_rec.attribute6,
9523 x_attribute7 => bkpt_detail_rec.attribute7,
9524 x_attribute8 => bkpt_detail_rec.attribute8,
9525 x_attribute9 => bkpt_detail_rec.attribute9,
9526 x_attribute10 => bkpt_detail_rec.attribute10,
9527 x_attribute11 => bkpt_detail_rec.attribute11,
9528 x_attribute12 => bkpt_detail_rec.attribute12,
9529 x_attribute13 => bkpt_detail_rec.attribute13,
9530 x_attribute14 => bkpt_detail_rec.attribute14,
9531 x_attribute15 => bkpt_detail_rec.attribute15,
9532 x_org_id => bkpt_detail_rec.org_id,
9533 x_creation_date => sysdate,
9534 x_created_by => nvl(fnd_profile.value('user_id'),0),
9535 x_last_update_date => sysdate,
9536 x_last_updated_by => nvl(fnd_profile.value('user_id'),0),
9537 x_last_update_login => nvl(fnd_profile.value('user_id'),0),
9538 x_annual_basis_amount => bkpt_detail_rec.annual_basis_amount
9539 );
9540
9541 pnp_debug_pkg.debug ('breakpoint detail inserted is l_bkpt_detail_id ..'||l_bkpt_detail_id);
9542
9543 END LOOP; /* end loop for bkpt detail */
9544
9545 END LOOP; /* end loop for bkpt header */
9546
9547 END LOOP; /* end loop for period_rec */
9548
9549 END LOOP; /* end loop for line item */
9550
9551 /* Loop through constraint records of period which was the last one before expansion */
9552 FOR constraint_rec IN constraint_cur(l_end_date) LOOP
9553
9554 /* Loop through the periods which have been created due to VR expansion to
9555 create constraint data for them */
9556 FOR period_rec IN period_cur LOOP
9557 l_rowid := NULL;
9558 l_constrid := NULL;
9559 l_constrnum := NULL;
9560
9561 pn_var_constraints_pkg.insert_row( x_rowid => l_rowid,
9562 x_constraint_id => l_constrid,
9563 x_constraint_num => l_constrnum,
9564 x_period_id => period_rec.period_id,
9565 x_constr_cat_code => constraint_rec.constr_cat_code,
9566 x_type_code => constraint_rec.type_code,
9567 x_amount => constraint_rec.amount,
9568 x_agreement_template_id => constraint_rec.agreement_template_id,
9569 x_constr_template_id => constraint_rec.constr_template_id,
9570 x_constr_default_id => constraint_rec.constr_default_id,
9571 x_comments => constraint_rec.comments,
9572 x_attribute_category => constraint_rec.attribute_category,
9573 x_attribute1 => constraint_rec.attribute1,
9574 x_attribute2 => constraint_rec.attribute2,
9575 x_attribute3 => constraint_rec.attribute3,
9576 x_attribute4 => constraint_rec.attribute4,
9577 x_attribute5 => constraint_rec.attribute5,
9578 x_attribute6 => constraint_rec.attribute6,
9579 x_attribute7 => constraint_rec.attribute7,
9580 x_attribute8 => constraint_rec.attribute8,
9581 x_attribute9 => constraint_rec.attribute9,
9582 x_attribute10 => constraint_rec.attribute10,
9583 x_attribute11 => constraint_rec.attribute11,
9584 x_attribute12 => constraint_rec.attribute12,
9585 x_attribute13 => constraint_rec.attribute13,
9586 x_attribute14 => constraint_rec.attribute14,
9587 x_attribute15 => constraint_rec.attribute15,
9588 x_org_id => constraint_rec.org_id,
9589 x_creation_date => sysdate,
9590 x_created_by => nvl(fnd_profile.value('user_id'),0),
9591 x_last_update_date => sysdate,
9592 x_last_updated_by => nvl(fnd_profile.value('user_id'),0),
9593 x_last_update_login => nvl(fnd_profile.value('user_id'),0),
9594 x_constr_start_date => period_rec.start_date,
9595 x_constr_end_date => period_rec.end_date);
9596 END LOOP;
9597
9598 END LOOP;
9599
9600 pnp_debug_pkg.debug ('pn_var_rent_pkg.create_setup_exp (-)');
9601 END;
9602
9603 -------------------------------------------------------------------------------
9604 -- NAME : update_setup_exp
9605 -- DESCRIPTION : This procedure handles the extension of existing break point
9606 -- set up
9607 -- PURPOSE :
9608 -- INVOKED FROM :
9609 -- ARGUMENTS : IN : p_var_rent_id, p_old_termn_date, p_period_id
9610 -- REFERENCE : PN_COMMON.debug()
9611 -- HISTORY :
9612 -- 01-JUN-06 piagrawa o Created
9613 -------------------------------------------------------------------------------
9614 PROCEDURE update_setup_exp ( p_var_rent_id IN NUMBER
9615 ,p_old_termn_date IN DATE
9616 ,p_period_id IN NUMBER)
9617 IS
9618 CURSOR period_cur IS
9619 SELECT end_date
9620 FROM pn_var_periods_all
9621 WHERE var_rent_id = p_var_rent_id
9622 AND period_id = p_period_id;
9623
9624 BEGIN
9625 pnp_debug_pkg.debug ('pn_var_rent_pkg.update_setup_exp (+)');
9626 pnp_debug_pkg.debug ('p_var_rent_id .. '||p_var_rent_id);
9627 pnp_debug_pkg.debug ('p_old_termn_date ..'||p_old_termn_date);
9628
9629 FOR period_rec IN period_cur LOOP
9630
9631 pnp_debug_pkg.debug ('last_period_rec.period_id ...'||p_period_id);
9632 pnp_debug_pkg.debug ('last_period_rec.end_date ....'||period_rec.end_date);
9633
9634 UPDATE pn_var_bkpts_head_all
9635 SET bkhd_end_date = period_rec.end_date
9636 WHERE var_rent_id = p_var_rent_id
9637 AND bkhd_end_date = p_old_termn_date;
9638
9639 UPDATE pn_var_bkpts_det_all
9640 SET bkpt_end_date = period_rec.end_date
9641 WHERE var_rent_id = p_var_rent_id
9642 AND bkpt_end_date = p_old_termn_date;
9643
9644 UPDATE pn_var_constraints_all
9645 SET constr_end_date = period_rec.end_date
9646 WHERE period_id = p_period_id
9647 AND constr_end_date = p_old_termn_date;
9648
9649 create_setup_exp ( p_var_rent_id => p_var_rent_id
9650 , p_period_id => p_period_id);
9651
9652 END LOOP;
9653
9654 pnp_debug_pkg.debug ('pn_var_rent_pkg.update_setup_exp (-)');
9655
9656 END;
9657
9658 -------------------------------------------------------------------------------
9659 -- NAME : create_rev_term_LY_FLY
9660 -- DESCRIPTION : This procedure will be calle when reversal terms need to be
9661 -- created for variable rent agreements with proration rule
9662 -- as 'LY or 'FLY'
9663 -- PURPOSE :
9664 -- INVOKED FROM :
9665 -- ARGUMENTS : IN : p_var_rent_id, p_last_period_id
9666 -- OUT: NIL
9667 -- REFERENCE : PN_COMMON.debug()
9668 -- HISTORY :
9669 -- 21-SEP-06 piagrawa o Created
9670 -- 03-DEC-07 acprakas o Bug#6490896. Modified to avoid auto creation of payment/billing terms
9671 -------------------------------------------------------------------------------
9672 PROCEDURE create_rev_term_LY_FLY ( p_last_period_id IN NUMBER
9673 ,p_var_rent_id IN NUMBER)
9674 IS
9675
9676 /* This cursor fetches the invoices for LY/FLY calculation */
9677 CURSOR invoice_date_cur (p_period_id NUMBER) IS
9678 SELECT DISTINCT invoice_date
9679 FROM pn_var_rent_inv_all
9680 WHERE period_id = p_period_id
9681 AND NVL(actual_exp_code, 'N') = 'Y'
9682 AND NVL(actual_invoiced_amount, 0) <> 0;
9683
9684 /* This cursor fetches the invoices for LY/FLY calculation */
9685 CURSOR invoice_cur ( p_period_id NUMBER
9686 ,p_invoice_date DATE
9687 ,p_adjust_num NUMBER) IS
9688 SELECT *
9689 FROM pn_var_rent_inv_all
9690 WHERE period_id = p_period_id
9691 AND (NVL(actual_exp_code, 'N') = 'Y' OR
9692 NVL(variance_exp_code, 'N') = 'Y')
9693 AND NVL(actual_invoiced_amount, 0) <> 0
9694 AND invoice_date = p_invoice_date
9695 AND adjust_num = p_adjust_num;
9696
9697 /* Fetches the amount for the particular invoice date */
9698 CURSOR actual_invoice_amount (p_period_id NUMBER,
9699 p_invoice_date DATE) IS
9700 SELECT SUM(actual_invoiced_amount) actual_amount
9701 FROM pn_var_rent_inv_all
9702 WHERE var_rent_inv_id IN ( SELECT var_rent_inv_id
9703 FROM pn_var_rent_inv_all
9704 WHERE period_id = p_period_id
9705 AND (NVL(actual_exp_code, 'N') = 'Y' OR
9706 NVL(variance_exp_code, 'N') = 'Y')
9707 AND NVL(actual_invoiced_amount, 0) <> 0
9708 AND invoice_date = p_invoice_date);
9709
9710 /* Fetches payment term information for a invoice id */
9711 CURSOR payment_cur(p_period_id NUMBER) IS
9712 SELECT payment_term_id
9713 FROM pn_payment_terms_all
9714 WHERE var_rent_inv_id IN ( SELECT var_rent_inv_id
9715 FROM pn_var_rent_inv_all
9716 WHERE period_id = p_period_id
9717 AND NVL(actual_exp_code, 'N') = 'Y'
9718 AND NVL(actual_invoiced_amount, 0) <> 0);
9719
9720 /* Fetches the maximum adjust num cursor */
9721 CURSOR max_adjust_num_cur (p_period_id NUMBER,
9722 p_invoice_date DATE) IS
9723 SELECT max(adjust_num) max_adjust_num
9724 FROM pn_var_rent_inv_all
9725 WHERE period_id = p_period_id
9726 AND invoice_date = p_invoice_date;
9727
9728 l_rowid ROWID;
9729 l_var_rent_inv_id NUMBER;
9730 l_max_adjust_num NUMBER := 0;
9731 l_actual_invoiced_amount NUMBER := 0;
9732 l_invoice_inserted BOOLEAN := FALSE;
9733 BEGIN
9734
9735 pnp_debug_pkg.debug ('pn_var_rent_pkg.create_rev_term_LY_FLY (+) ');
9736
9737 DELETE pn_payment_terms_all
9738 WHERE var_rent_inv_id IN (SELECT var_rent_inv_id
9739 FROM pn_var_rent_inv_all
9740 WHERE period_id = p_last_period_id
9741 AND NVL(actual_exp_code, 'N') <> 'Y')
9742 AND status <> 'APPROVED';
9743
9744 DELETE pn_var_rent_inv_all
9745 WHERE period_id = p_last_period_id
9746 AND NVL(actual_exp_code, 'N') <> 'Y';
9747
9748 pnp_debug_pkg.debug ('Loop for invoices for true up and for last year calculation. ');
9749 /* Loop for invoices for true up and for last year calculation.*/
9750 FOR invoice_date_rec IN invoice_date_cur(p_last_period_id) LOOP
9751
9752 /* Fetch the maximum adjust number for a particular invoice date */
9753 FOR max_adjust_num_rec IN max_adjust_num_cur(p_last_period_id, invoice_date_rec.invoice_date)
9754 LOOP
9755 l_max_adjust_num := max_adjust_num_rec.max_adjust_num;
9756 END LOOP;
9757
9758 /* Fetch the total amount that needs to be invoiced */
9759 FOR rec IN actual_invoice_amount(p_last_period_id, invoice_date_rec.invoice_date) LOOP
9760 l_actual_invoiced_amount := rec.actual_amount;
9761 END LOOP;
9762
9763 /* If the amount for reversal term is 0 , do not insert an invoice */
9764 IF l_actual_invoiced_amount <> 0 THEN
9765
9766 /* Loop for the invoice with amx adjust num for a aprticular invoice date */
9767 FOR invoice_rec IN invoice_cur(p_last_period_id, invoice_date_rec.invoice_date, l_max_adjust_num ) LOOP
9768
9769 /* Set var rent inv id to null before inserting a row */
9770 l_var_rent_inv_id := NULL;
9771 l_rowid := NULL;
9772
9773 pn_var_rent_inv_pkg.insert_row ( x_rowid => l_rowid,
9774 x_var_rent_inv_id => l_var_rent_inv_id,
9775 x_adjust_num => l_max_adjust_num + 1,
9776 x_invoice_date => invoice_rec.invoice_date,
9777 x_for_per_rent => invoice_rec.for_per_rent,
9778 x_tot_act_vol => 0,
9779 x_act_per_rent => 0,
9780 x_constr_actual_rent => 0,
9781 x_abatement_appl => invoice_rec.abatement_appl,
9782 x_rec_abatement => invoice_rec.rec_abatement,
9783 x_rec_abatement_override => invoice_rec.rec_abatement_override,
9784 x_negative_rent => invoice_rec.negative_rent ,
9785 x_actual_invoiced_amount => -l_actual_invoiced_amount,
9786 x_period_id => invoice_rec.period_id,
9787 x_var_rent_id => p_var_rent_id,
9788 x_forecasted_term_status => invoice_rec.forecasted_term_status,
9789 x_variance_term_status => invoice_rec.variance_term_status,
9790 x_actual_term_status => 'N', --invoice_rec.actual_term_status, Bug#6490896
9791 x_forecasted_exp_code => 'N',
9792 x_variance_exp_code => 'N',
9793 x_actual_exp_code => 'N',
9794 x_credit_flag => 'Y',
9795 x_comments => 'negative invoices',
9796 x_attribute_category => invoice_rec.attribute_category,
9797 x_attribute1 => invoice_rec.attribute1,
9798 x_attribute2 => invoice_rec.attribute2,
9799 x_attribute3 => invoice_rec.attribute3,
9800 x_attribute4 => invoice_rec.attribute4,
9801 x_attribute5 => invoice_rec.attribute5,
9802 x_attribute6 => invoice_rec.attribute6,
9803 x_attribute7 => invoice_rec.attribute7,
9804 x_attribute8 => invoice_rec.attribute8,
9805 x_attribute9 => invoice_rec.attribute9,
9806 x_attribute10 => invoice_rec.attribute10,
9807 x_attribute11 => invoice_rec.attribute11,
9808 x_attribute12 => invoice_rec.attribute12,
9809 x_attribute13 => invoice_rec.attribute13,
9810 x_attribute14 => invoice_rec.attribute14,
9811 x_attribute15 => invoice_rec.attribute15,
9812 x_creation_date => SYSDATE,
9813 x_created_by => nvl(fnd_profile.value('user_id'),1),
9814 x_last_update_date => SYSDATE,
9815 x_last_updated_by => nvl(fnd_profile.value('user_id'),1),
9816 x_last_update_login => nvl(fnd_profile.value('user_id'),1),
9817 x_true_up_amount => invoice_rec.true_up_amt,
9818 x_true_up_status => invoice_rec.true_up_status,
9819 x_true_up_exp_code => invoice_rec.true_up_exp_code,
9820 x_org_id => invoice_rec.org_id);
9821
9822 pnp_debug_pkg.debug ('l_var_rent_inv_id ...'||l_var_rent_inv_id);
9823 pnp_debug_pkg.debug ('For every period, call create_payment_term...'||invoice_rec.var_rent_inv_id);
9824 /*
9825 FOR payment_rec IN payment_cur(invoice_rec.var_rent_inv_id) LOOP
9826 pn_variable_term_pkg.create_reversal_terms(p_payment_term_id => payment_rec.payment_term_id
9827 ,p_var_rent_inv_id => l_var_rent_inv_id
9828 ,p_var_rent_type => 'ADJUSTMENT');
9829 END LOOP;
9830 Bug#6490896*/
9831
9832 END LOOP;
9833 END IF;
9834 END LOOP;
9835
9836 pnp_debug_pkg.debug ('pn_var_rent_pkg.create_rev_term_LY_FLY (-) ');
9837
9838 END create_rev_term_LY_FLY;
9839
9840 -------------------------------------------------------------------------------
9841 -- NAME : process_vr_ext
9842 -- DESCRIPTION : This procedure will be calles when the termination date
9843 -- of the VR agreement is extended or if the start date is
9844 -- changed to an earlier start date due to either change in the
9845 -- lease agreement or the VR agreement
9846 -- PURPOSE :
9847 -- INVOKED FROM :
9848 -- ARGUMENTS : IN : p_lease_id, p_var_rent_id, p_new_termn_date
9849 -- p_old_termn_date, p_extend_setup
9850 -- OUT: p_return_status, p_return_message
9851 -- REFERENCE : PN_COMMON.debug()
9852 -- HISTORY :
9853 -- 01-JUN-06 piagrawa o Created
9854 -------------------------------------------------------------------------------
9855 PROCEDURE process_vr_ext (p_lease_id IN NUMBER
9856 ,p_var_rent_id IN NUMBER
9857 ,p_new_termn_date IN DATE
9858 ,p_old_termn_date IN DATE
9859 ,p_extend_setup IN VARCHAR2
9860 ,x_return_status OUT NOCOPY VARCHAR2
9861 ,x_return_message OUT NOCOPY VARCHAR2)
9862 IS
9863
9864 /* Fetches the period in which the old termination date falls */
9865 CURSOR last_period_cur (p_var_rent_id NUMBER) IS
9866 SELECT period_id, partial_period
9867 FROM pn_var_periods_all
9868 WHERE var_rent_id = p_var_rent_id
9869 AND p_old_termn_date BETWEEN start_date AND end_date;
9870
9871 /* This retrieves the variable rent agreements which need to be extended */
9872 CURSOR main_vr_cur IS
9873 SELECT pvr.var_rent_id
9874 , pvr.cumulative_vol
9875 , pvr.proration_rule
9876 , pvd.use_gl_calendar
9877 , pvd.year_start_date
9878 , pvr.commencement_date
9879 FROM pn_var_rents_all pvr, pn_var_rent_dates_all pvd
9880 WHERE pvr.lease_id = NVL (p_lease_id, pvr.lease_id)
9881 AND pvr.var_rent_id = NVL (p_var_rent_id, pvr.var_rent_id)
9882 AND pvr.termination_date = p_old_termn_date
9883 AND pvd.var_rent_id = pvr.var_rent_id;
9884
9885
9886 /* This returns Y if record exits in line or constraint defaults */
9887 CURSOR default_exists (p_var_rent_id NUMBER) IS
9888 SELECT 'Y'
9889 FROM DUAL
9890 WHERE EXISTS (SELECT var_rent_id
9891 FROM pn_var_line_defaults_all
9892 WHERE var_rent_id = p_var_rent_id)
9893 OR EXISTS (SELECT var_rent_id
9894 FROM pn_var_constr_defaults_all
9895 WHERE var_rent_id = p_var_rent_id);
9896
9897 l_default_exists VARCHAR2 (1) := 'N';
9898 l_partial_flag VARCHAR2 (1);
9899 l_last_period_id NUMBER;
9900 l_errbuf VARCHAR2(250) := NULL;
9901 l_retcode VARCHAR2(250);
9902 l_date DATE := SYSDATE;
9903
9904 BEGIN
9905 pnp_debug_pkg.debug ('pn_var_rent_pkg.process_vr_ext (+)');
9906 pnp_debug_pkg.debug ('p_lease_id '||p_lease_id );
9907 pnp_debug_pkg.debug ('p_var_rent_id '||p_var_rent_id );
9908 pnp_debug_pkg.debug ('p_new_termn_date'||p_new_termn_date);
9909 pnp_debug_pkg.debug ('p_old_termn_date'||p_old_termn_date);
9910 pnp_debug_pkg.debug ('p_extend_setup '||p_extend_setup );
9911
9912 FOR main_vr_rec IN main_vr_cur LOOP
9913
9914 pnp_debug_pkg.debug ('**************************************************************');
9915 pnp_debug_pkg.debug ('Processing variable rent agreement ...'||main_vr_rec.var_rent_id);
9916 pnp_debug_pkg.debug ('**************************************************************');
9917
9918 /* Fetch the last period id and partial flag before expansion */
9919 FOR last_period_rec IN last_period_cur(main_vr_rec.var_rent_id) LOOP
9920 l_partial_flag := last_period_rec.partial_period;
9921 l_last_period_id := last_period_rec.period_id;
9922 pnp_debug_pkg.debug ('l_last_period_id ...'||l_last_period_id);
9923 pnp_debug_pkg.debug ('l_partial_flag ...'||l_partial_flag);
9924 END LOOP;
9925
9926 /* Update the vr agreement with the new termination date */
9927 pnp_debug_pkg.debug ('Update the vr agreement with the new termination date ...');
9928
9929 UPDATE pn_var_rents_all
9930 SET termination_date = p_new_termn_date
9931 WHERE var_rent_id = main_vr_rec.var_rent_id;
9932
9933 /* call appropriate procedures to create new periods or activate the inactive one
9934 beyond the old termination date */
9935 IF NVL(main_vr_rec.use_gl_calendar,'N') = 'N' THEN
9936
9937 pnp_debug_pkg.debug ('making a call to create_var_rent_periods_nocal ...');
9938 pn_var_rent_pkg.create_var_rent_periods_nocal(p_var_rent_id => main_vr_rec.var_rent_id ,
9939 p_cumulative_vol => main_vr_rec.cumulative_vol ,
9940 p_yr_start_date => main_vr_rec.year_start_date);
9941
9942 ELSIF NVL(main_vr_rec.use_gl_calendar,'N') = 'Y' THEN
9943 pnp_debug_pkg.debug ('making a call to create_var_rent_periods ...');
9944 pn_var_rent_pkg.create_var_rent_periods( p_var_rent_id => main_vr_rec.var_rent_id,
9945 p_cumulative_vol => main_vr_rec.cumulative_vol,
9946 p_comm_date => main_vr_rec.commencement_date,
9947 p_term_date => p_new_termn_date,
9948 p_create_flag => 'Y');
9949 END IF;
9950
9951 /* Check if breakpoints need to be extended along with the agreement */
9952 IF p_extend_setup = 'Y' THEN
9953
9954 /* Check if data exists in defaults tables for this variable rent */
9955 FOR rec IN default_exists(main_vr_rec.var_rent_id) LOOP
9956 l_default_exists := 'Y';
9957 pnp_debug_pkg.debug ('l_default_exists is Y');
9958 END LOOP;
9959
9960 pnp_debug_pkg.debug ('calling appropriate proc after checking if defaults exist ...');
9961 IF l_default_exists = 'Y' THEN
9962 pnp_debug_pkg.debug ('calling proc extend_defaults .. if defaults exist ...');
9963 extend_defaults ( p_var_rent_id => main_vr_rec.var_rent_id
9964 , p_old_termn_date => p_old_termn_date
9965 , p_new_termn_date => p_new_termn_date );
9966 ELSE
9967 pnp_debug_pkg.debug ('calling proc update_setup_exp .. if defaults do not exist ...');
9968 update_setup_exp ( p_var_rent_id => main_vr_rec.var_rent_id
9969 , p_old_termn_date => p_old_termn_date
9970 , p_period_id => l_last_period_id);
9971 END IF;
9972
9973 ELSE
9974 /* Undo the breakpoint setup */
9975 pn_var_defaults_pkg.delete_default_lines (main_vr_rec.var_rent_id);
9976 END IF;
9977
9978 IF l_partial_flag = 'Y' THEN
9979
9980 /* Create reversal terms for Last year and first-last year */
9981 IF main_vr_rec.proration_rule IN ('LY', 'FLY')
9982 THEN
9983
9984 create_rev_term_LY_FLY ( p_last_period_id => l_last_period_id
9985 ,p_var_rent_id => main_vr_rec.var_rent_id);
9986
9987 /* Create reversal terms for cumulative volume = true-up. */
9988 /*ELSIF main_vr_rec.cumulative_vol = 'T'
9989 THEN
9990
9991 create_rev_term_trueup ( p_last_period_id => l_last_period_id
9992 ,p_var_rent_id => main_vr_rec.var_rent_id);*/
9993
9994 END IF;
9995 END IF;
9996
9997 /* update the bkpt_update_flag to 'Y for VR agreement */
9998 UPDATE pn_var_lines_all
9999 SET bkpt_update_flag = 'Y',
10000 sales_vol_update_flag = 'Y'
10001 WHERE var_rent_id = main_vr_rec.var_rent_id;
10002
10003 END LOOP;
10004
10005 pnp_debug_pkg.debug ('pn_var_rent_pkg.process_vr_ext (-)');
10006
10007 EXCEPTION
10008 WHEN OTHERS THEN
10009 pnp_debug_pkg.debug ('Process_vr_early_term Error:'||SQLERRM);
10010 x_return_status := FND_API.G_RET_STS_ERROR;
10011 x_return_message := sqlerrm;
10012 END;
10013
10014 -------------------------------------------------------------------------------
10015 -- NAME : process_vr_exp_con
10016 -- DESCRIPTION : This procedure is called from concurrent program 'PNVREXCO'.
10017 -- This procedure is responsible for calling process_vr_ext or
10018 -- process_vr_early_term according to the VR context
10019 -- PURPOSE :
10020 -- INVOKED FROM :
10021 -- ARGUMENTS : IN : p_lease_id, p_new_termn_date
10022 -- p_old_termn_date, p_setup_exp_context, p_vr_context
10023 -- OUT: errbuf, retcode
10024 -- REFERENCE : PN_COMMON.debug()
10025 -- HISTORY :
10026 -- 01-JUN-06 piagrawa o Created
10027 -- 20-NOV-06 Hareesha o MTM Uptake - Added parameter p_rollover to consider
10028 -- VR expansion due to lease-rollover.
10029 -- 19-JAN-07 lbala o Added call to delete_var_rent_agreeement to delete
10030 -- future dated VR agreements with no approved schedules
10031 -- 31-MAR-08 bifernan o Bug 6524475: Proceed with this procedure only if the
10032 -- associated schedules and items request has completed
10033 -- successfully.
10034 -------------------------------------------------------------------------------
10035 PROCEDURE process_vr_exp_con (errbuf OUT NOCOPY VARCHAR2,
10036 retcode OUT NOCOPY VARCHAR2,
10037 p_lease_id NUMBER,
10038 p_lease_change_id NUMBER,
10039 p_old_term_date VARCHAR2,
10040 p_new_term_date VARCHAR2,
10041 p_vr_context VARCHAR2,
10042 p_setup_exp_context VARCHAR2,
10043 p_rollover VARCHAR2,
10044 p_request_id NUMBER)
10045 IS
10046 l_old_term_date DATE;
10047 l_new_term_date DATE;
10048 l_ret_status VARCHAR2(250);
10049 l_ret_message VARCHAR2(250);
10050 l_old_date DATE := NULL;
10051 l_new_date DATE := NULL;
10052 l_max_lease_change_id NUMBER;
10053 INCORRECT_VR_CONTEXT_EXCEPTION EXCEPTION;
10054 INCORRECT_VR_DATES_EXCEPTION EXCEPTION;
10055 MISSING_CHANGE_ID_EXCEPTION EXCEPTION;
10056 MISSING_SETUP_EXCEPTION EXCEPTION;
10057
10058 -- Bug 6524475
10059 l_interval NUMBER := 60;
10060 l_max_wait NUMBER := 0;
10061 l_request_phase VARCHAR2(250);
10062 l_request_status VARCHAR2(250);
10063 l_dev_request_phase VARCHAR2(1000);
10064 l_dev_request_status VARCHAR2(1000);
10065 l_request_status_mesg VARCHAR2(1000);
10066 l_status Boolean;
10067 SCH_ITEMS_FAILED_EXCEPTION EXCEPTION;
10068
10069 /* Fetches the max lease change id */
10070 CURSOR max_lease_change_id_cur IS
10071 SELECT max(lease_change_id) max_lease_change_id
10072 FROM pn_lease_details_history
10073 WHERE lease_id = p_lease_id;
10074
10075 /* Fetches the old termination date for change id mentioned by the user */
10076 CURSOR old_term_date_cur IS
10077 SELECT lease_termination_date
10078 FROM pn_lease_details_history
10079 WHERE lease_id = p_lease_id
10080 AND new_lease_change_id = p_lease_change_id;
10081
10082 /* Fetches the new termination date for change id mentioned by the user */
10083 CURSOR new_term_date_cur IS
10084 SELECT lease_termination_date
10085 FROM pn_lease_details_history
10086 WHERE lease_id = p_lease_id
10087 AND lease_change_id = p_lease_change_id;
10088
10089 /* Fetches the current termination date from lease details table */
10090 CURSOR lease_details_cur IS
10091 SELECT lease_termination_date
10092 FROM pn_lease_details_all
10093 WHERE lease_change_id = p_lease_change_id;
10094
10095 BEGIN
10096 pnp_debug_pkg.log('pn_var_rent_pkg.process_vr_exp_con +Start+ (+)');
10097 pnp_debug_pkg.log('Lease_ID : '||p_lease_id);
10098 pnp_debug_pkg.log('Lease_Chang_ID : '||p_lease_change_id);
10099 pnp_debug_pkg.log('Old Termination date : '||p_old_term_date);
10100 pnp_debug_pkg.log('New Termination date : '||p_new_term_date);
10101 pnp_debug_pkg.log('Variable Rent Context : '||p_vr_context);
10102 pnp_debug_pkg.log('Setup Expansion Context : '||p_setup_exp_context);
10103
10104 -- Bug 6524475
10105 IF p_request_id IS NOT NULL AND p_request_id <> 0 THEN
10106 l_status := fnd_concurrent.wait_for_request(p_request_id, l_interval, l_max_wait,
10107 l_request_phase, l_request_status,
10108 l_dev_request_phase, l_dev_request_status,
10109 l_request_status_mesg);
10110 IF l_status = TRUE THEN
10111 IF l_dev_request_phase <> 'COMPLETE' OR l_dev_request_status <> 'NORMAL' THEN
10112 RAISE SCH_ITEMS_FAILED_EXCEPTION;
10113 END IF;
10114 ELSE
10115 RAISE SCH_ITEMS_FAILED_EXCEPTION;
10116 END IF;
10117 END IF;
10118
10119 l_old_term_date := fnd_date.canonical_to_date(p_old_term_date);
10120 l_new_term_date := fnd_date.canonical_to_date(p_new_term_date);
10121
10122 IF p_rollover IS NULL THEN
10123
10124 /* Fetch the max lease change id for this lease. It will always
10125 return some value if amendment done for a lease */
10126 FOR rec IN max_lease_change_id_cur LOOP
10127 l_max_lease_change_id := rec.max_lease_change_id;
10128 END LOOP;
10129
10130 /* Throw an exception if the user does not specify a lease change id
10131 in case of amended lease. l_max_lease_change_id will be NULL for
10132 draft leases.*/
10133 IF l_max_lease_change_id IS NOT NULL AND p_lease_change_id IS NULL THEN
10134
10135 RAISE MISSING_CHANGE_ID_EXCEPTION;
10136
10137 ELSIF (l_max_lease_change_id IS NOT NULL AND p_lease_change_id IS NOT NULL) THEN
10138
10139 /* Fetch the old termination date from pn_lease_details_history tables
10140 for the last amendment */
10141 FOR rec IN old_term_date_cur LOOP
10142 l_old_date := rec.lease_termination_date;
10143 END LOOP;
10144
10145 /* Fetch the new termination date from pn_lease_details_history table */
10146 FOR new_term_date_rec IN new_term_date_cur LOOP
10147 l_new_date := new_term_date_rec.lease_termination_date;
10148 END LOOP;
10149
10150 /* If new termination date is null that is the record for the mentioned
10151 change id is not present in the lease details history table then it
10152 implies that it is the current lease record. Thus fetch the date from
10153 pn_lease_details_all table */
10154 IF l_new_date IS NULL THEN
10155
10156 FOR lease_details_rec IN lease_details_cur LOOP
10157 l_new_date := lease_details_rec.lease_termination_date;
10158 END LOOP;
10159
10160 END IF;
10161
10162 /* Raise an exception that the dates entered by the user do not match with
10163 that in the database */
10164 /*IF (l_old_date <> l_old_term_date) OR (l_new_date <> l_new_term_date ) THEN
10165 pnp_debug_pkg.log('Throwing exception ....');
10166 RAISE INCORRECT_VR_DATES_EXCEPTION ;
10167 END IF;*/
10168
10169 END IF;
10170 END IF;
10171
10172
10173 /* Check if new termination date is same as old termination date */
10174 IF (l_old_term_date <> l_new_term_date) THEN
10175
10176 pnp_debug_pkg.log('New termination date is not equal to old termination date');
10177 /* Check if the dates and vr context are in sync i.e. if new termination date is less than old termination
10178 date then vr context should be 'CON' and if the new termination date is greater than old termination
10179 date then vr context should be 'EXP'. If this is not the case then throw an exception */
10180 IF (l_new_term_date < l_old_term_date) AND p_vr_context = 'CON' THEN
10181
10182 pnp_debug_pkg.log('Deleting VR agreements starting after new termination date');
10183 PN_VAR_RENTS_PKG.delete_var_rent_agreement(p_lease_id => p_lease_id ,
10184 p_termination_dt => l_new_term_date);
10185
10186 pnp_debug_pkg.log('Calling VR contraction ....');
10187 process_vr_early_term ( p_lease_id => p_lease_id
10188 ,p_var_rent_id => NULL
10189 ,p_new_termn_date => l_new_term_date
10190 ,p_old_termn_date => l_old_term_date
10191 ,x_return_status => l_ret_status
10192 ,x_return_message => l_ret_message);
10193
10194 ELSIF (l_new_term_date > l_old_term_date) AND p_vr_context = 'EXP' THEN
10195
10196 IF p_setup_exp_context IS NULL THEN
10197 pnp_debug_pkg.log('Throwing exception ....');
10198 RAISE MISSING_SETUP_EXCEPTION ;
10199 ELSE
10200 pnp_debug_pkg.log('Calling VR expansion ....');
10201 process_vr_ext ( p_lease_id => p_lease_id
10202 ,p_var_rent_id => NULL
10203 ,p_new_termn_date => l_new_term_date
10204 ,p_old_termn_date => l_old_term_date
10205 ,p_extend_setup => p_setup_exp_context
10206 ,x_return_status => l_ret_status
10207 ,x_return_message => l_ret_message);
10208 END IF;
10209
10210 ELSIF (((l_new_term_date < l_old_term_date) AND p_vr_context <> 'CON') OR
10211 ((l_new_term_date > l_old_term_date) AND p_vr_context <> 'EXP')) THEN
10212
10213 pnp_debug_pkg.log('Throwing exception ....');
10214 RAISE INCORRECT_VR_CONTEXT_EXCEPTION ;
10215 END IF;
10216
10217 END IF;
10218
10219 pnp_debug_pkg.log('pn_var_rent_pkg.process_vr_exp_con +End+ (+)');
10220
10221 EXCEPTION
10222 WHEN SCH_ITEMS_FAILED_EXCEPTION THEN
10223 fnd_message.set_name ('PN', 'PN_SCH_ITEMS_REQ_FAILED');
10224 fnd_message.set_token ('REQ_NUM',p_request_id);
10225 errbuf := fnd_message.get;
10226 pnp_debug_pkg.put_log_msg (errbuf);
10227 retcode := 2;
10228 WHEN INCORRECT_VR_CONTEXT_EXCEPTION THEN
10229 fnd_message.set_name ('PN', 'INCORRECT_VR_CONTEXT');
10230 errbuf := fnd_message.get;
10231 pnp_debug_pkg.put_log_msg (errbuf);
10232 retcode := 2;
10233 WHEN INCORRECT_VR_DATES_EXCEPTION THEN
10234 fnd_message.set_name ('PN', 'INCORRECT_VR_DATES');
10235 errbuf := fnd_message.get;
10236 pnp_debug_pkg.put_log_msg (errbuf);
10237 retcode := 2;
10238 WHEN MISSING_CHANGE_ID_EXCEPTION THEN
10239 fnd_message.set_name ('PN', 'MISSING_CHANGE_ID');
10240 errbuf := fnd_message.get;
10241 pnp_debug_pkg.put_log_msg (errbuf);
10242 retcode := 2;
10243 WHEN MISSING_SETUP_EXCEPTION THEN
10244 fnd_message.set_name ('PN', 'MISSING_SETUP_CONTEXT');
10245 errbuf := fnd_message.get;
10246 pnp_debug_pkg.put_log_msg (errbuf);
10247 retcode := 2;
10248 WHEN OTHERS THEN
10249 Errbuf := SQLERRM;
10250 Retcode := 2;
10251 ROLLBACK;
10252 END;
10253
10254
10255 -------------------------------------------------------------------------------
10256 -- NAME : copy_bkpt_main_to_setup
10257 -- DESCRIPTION : This procedure is called from concurrent program 'PNVRCASB'.
10258 -- This procedure will help the existing users to copy the
10259 -- lines and breakpoint definition main UI to SETUP UI
10260 -- PURPOSE :
10261 -- INVOKED FROM :
10262 -- ARGUMENTS : IN :
10263 --
10264 -- OUT: errbuf, retcode
10265 --
10266 -- REFERENCE : PN_COMMON.debug()
10267 -- HISTORY :
10268 -- 18-JAN-07 pikhar o Created
10269 -- 29-MAR-07 pikhar o Bug 5959082.Populated line defaults start and end dates
10270 -------------------------------------------------------------------------------
10271
10272 PROCEDURE copy_bkpt_main_to_setup (errbuf OUT NOCOPY VARCHAR2,
10273 retcode OUT NOCOPY VARCHAR2,
10274 p_prop_id IN NUMBER,
10275 p_loc_id IN NUMBER,
10276 p_lease_id IN NUMBER,
10277 p_var_rent_id IN NUMBER)
10278 IS
10279
10280 TYPE NUM_TBL IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
10281 l_sales_type_code pn_var_lines_all.sales_type_code%TYPE;
10282 l_item_category_code pn_var_lines_all.item_category_code%TYPE;
10283 l_lease_id NUMBER := NULL;
10284 l_prop_id NUMBER := NULL;
10285 l_loc_id NUMBER := NULL;
10286 l_var_rent_id NUMBER := NULL;
10287 l_rowId_lines VARCHAR2(30) := NULL;
10288 l_lineitemId NUMBER := NULL;
10289 l_lineitemNum NUMBER := NULL;
10290 l_rowid_line_defaults VARCHAR2(30) := NULL;
10291 l_linedefaultid NUMBER := NULL;
10292 l_linedefNum NUMBER := NULL;
10293 l_period_id NUMBER := NULL;
10294 l_bkhd_rowid VARCHAR2(30) := NULL;
10295 l_bkhddefault_id NUMBER := NULL;
10296 l_rowid_constr_defaults VARCHAR2(30) := NULL;
10297 l_constrdefaultid NUMBER := NULL;
10298 l_constrdefNum NUMBER := NULL;
10299 l_linenum NUMBER := NULL;
10300 l_bkpt_header_id NUMBER := NULL;
10301 l_bkdt_rowId VARCHAR2(30) := NULL;
10302 l_bkdtdefaultId NUMBER := NULL;
10303 l_bkdtdefaultNum NUMBER := NULL;
10304 l_date DATE := NULL;
10305 l_invalid_agr VARCHAR2(30) := NULL;
10306 l_rent_num VARCHAR2(30) := NULL;
10307
10308 l_varent_tab NUM_TBL;
10309
10310
10311 /* Cursor to get all var_rents for the given property */
10312 CURSOR varent_prop_cur (p_prop_id IN NUMBER)
10313 IS
10314 SELECT DISTINCT var.var_rent_id
10315 from pn_var_rents_all var
10316 where var.lease_id IN( SELECT distinct lease_id
10317 FROM ( SELECT lease_id
10318 FROM pn_tenancies_all
10319 WHERE location_id in (SELECT location_id
10320 FROM pn_locations_all
10321 WHERE property_id = p_prop_id)
10322 UNION
10323 SELECT lease_id
10324 FROM pn_leases_all
10325 WHERE location_id in (SELECT location_id
10326 FROM pn_locations_all
10327 WHERE property_id = p_prop_id)));
10328
10329
10330 /* Cursor to get all var_rents for the given location */
10331 CURSOR varent_loc_cur(p_loc_id IN NUMBER)
10332 IS
10333 SELECT DISTINCT var.var_rent_id
10334 FROM pn_var_rents_all var
10335 WHERE var.lease_id IN (SELECT lease_id
10336 FROM (SELECT lease_id
10337 FROM pn_tenancies_all
10338 WHERE location_id = p_loc_id
10339 UNION
10340 SELECT lease_id
10341 FROM pn_leases_all
10342 WHERE location_id = p_loc_id));
10343
10344
10345 /* Cursor to get all var_rents for the given lease */
10346 CURSOR varent_lease_cur(p_lease_id IN NUMBER)
10347 IS
10348 SELECT DISTINCT var.var_rent_id
10349 FROM pn_var_rents_all var
10350 WHERE var.lease_id = p_lease_id;
10351
10352
10353 /* Cursor used to fetch distinct periods */
10354 CURSOR periods_cur(p_var_rent_id NUMBER) IS
10355 SELECT DISTINCT per.period_id period_id,
10356 var.rent_num rent_num
10357 FROM pn_var_periods_all per,
10358 pn_var_rents_all var
10359 WHERE per.var_rent_id = p_var_rent_id
10360 AND var.var_rent_id = p_var_rent_id;
10361
10362
10363 /* Cursor used to fetch distinct lines */
10364 CURSOR lines_cur(p_var_rent_id NUMBER) IS
10365 SELECT DISTINCT
10366 sales_type_code,
10367 item_category_code,
10368 org_id
10369 FROM pn_var_lines_all
10370 WHERE var_rent_id = p_var_rent_id;
10371
10372
10373 /* Cursor used to count if a give periods has more than one occurance of a line */
10374 CURSOR lines_count_cur(p_per_id NUMBER,
10375 p_sales_type_code VARCHAR2,
10376 p_item_category_code VARCHAR2) IS
10377 SELECT count(*) lines_count
10378 FROM pn_var_lines_all
10379 WHERE sales_type_code = p_sales_type_code
10380 AND item_category_code = p_item_category_code
10381 AND period_id = p_per_id;
10382
10383
10384 /* Cursor used to fetch periods which does not have passed line */
10385 CURSOR no_per_lines_exists(p_var_rent_id NUMBER,
10386 p_sales_type_code VARCHAR2,
10387 p_item_category_code VARCHAR2) IS
10388 SELECT per.period_id, per.org_id
10389 FROM pn_var_periods_all per
10390 WHERE per.period_id not in (
10391 SELECT lines.period_id
10392 FROM pn_var_lines_all lines
10393 WHERE lines.var_rent_id = p_var_rent_id
10394 AND nvl(lines.sales_type_code,'-1') = nvl(p_sales_type_code,'-1')
10395 AND nvl(lines.item_category_code,'-1') = nvl(p_item_category_code,'-1'))
10396 AND var_rent_id = p_var_rent_id ;
10397
10398
10399 /* Cursor used to fetch breakpoint header */
10400 CURSOR bkhd_cur(p_var_rent_id NUMBER) IS
10401 SELECT bkpt.bkpt_header_id bkpt_header_id,
10402 bkpt.bkhd_start_date start_date,
10403 bkpt.bkhd_end_date end_date,
10404 bkpt.break_type break_type,
10405 bkpt.base_rent_type base_rent_type,
10406 bkpt.natural_break_rate natural_break_rate,
10407 bkpt.base_rent base_rent,
10408 bkpt.breakpoint_type breakpoint_type,
10409 bkpt.org_id org_id,
10410 bkpt.attribute_category attribute_category,
10411 bkpt.attribute1 attribute1,
10412 bkpt.attribute2 attribute2,
10413 bkpt.attribute3 attribute3,
10414 bkpt.attribute4 attribute4,
10415 bkpt.attribute5 attribute5,
10416 bkpt.attribute6 attribute6,
10417 bkpt.attribute7 attribute7,
10418 bkpt.attribute8 attribute8,
10419 bkpt.attribute9 attribute9,
10420 bkpt.attribute10 attribute10,
10421 bkpt.attribute11 attribute11,
10422 bkpt.attribute12 attribute12,
10423 bkpt.attribute13 attribute13,
10424 bkpt.attribute14 attribute14,
10425 bkpt.attribute15 attribute15,
10426 lines.line_default_id line_default_id
10427 FROM pn_var_bkpts_head_all bkpt,
10428 pn_var_lines_all lines
10429 WHERE bkpt.var_rent_id = p_var_rent_id
10430 AND bkpt.line_item_id = lines.line_item_id;
10431
10432
10433 /* Cursor used to fetch breakpoint details */
10434 CURSOR bkdt_cur(p_var_rent_id NUMBER) IS
10435 SELECT bkdt.bkpt_detail_id bkpt_detail_id,
10436 bkdt.bkpt_start_date bkpt_start_date,
10437 bkdt.bkpt_end_date bkpt_end_date,
10438 bkdt.period_bkpt_vol_start period_bkpt_vol_start,
10439 bkdt.period_bkpt_vol_end period_bkpt_vol_end,
10440 bkdt.group_bkpt_vol_start group_bkpt_vol_start,
10441 bkdt.group_bkpt_vol_end group_bkpt_vol_end,
10442 bkdt.bkpt_rate bkpt_rate,
10443 bkdt.comments comments ,
10444 bkdt.attribute_category attribute_category,
10445 bkdt.attribute1 attribute1,
10446 bkdt.attribute2 attribute2,
10447 bkdt.attribute3 attribute3,
10448 bkdt.attribute4 attribute4,
10449 bkdt.attribute5 attribute5,
10450 bkdt.attribute6 attribute6,
10451 bkdt.attribute7 attribute7,
10452 bkdt.attribute8 attribute8,
10453 bkdt.attribute9 attribute9,
10454 bkdt.attribute10 attribute10,
10455 bkdt.attribute11 attribute11,
10456 bkdt.attribute12 attribute12,
10457 bkdt.attribute13 attribute13,
10458 bkdt.attribute14 attribute14,
10459 bkdt.attribute15 attribute15,
10460 bkdt.org_id org_id,
10461 bkdt.annual_basis_amount annual_basis_amount,
10462 bkhd.bkhd_default_id bkhd_default_id
10463 FROM pn_var_bkpts_det_all bkdt,
10464 pn_var_bkpts_head_all bkhd
10465 WHERE bkdt.var_rent_id = p_var_rent_id
10466 AND bkdt.bkpt_header_id = bkhd.bkpt_header_id;
10467
10468
10469 /* Cursor used to fetch constraints details */
10470 CURSOR constr_cur(p_var_rent_id NUMBER) IS
10471 SELECT cons.constraint_id
10472 ,cons.constraint_num
10473 ,cons.last_update_date
10474 ,cons.last_updated_by
10475 ,cons.creation_date
10476 ,cons.created_by
10477 ,cons.last_update_login
10478 ,cons.period_id
10479 ,cons.constr_cat_code
10480 ,cons.type_code
10481 ,cons.amount
10482 ,cons.comments
10483 ,cons.attribute_category
10484 ,cons.attribute1
10485 ,cons.attribute2
10486 ,cons.attribute3
10487 ,cons.attribute4
10488 ,cons.attribute5
10489 ,cons.attribute6
10490 ,cons.attribute7
10491 ,cons.attribute8
10492 ,cons.attribute9
10493 ,cons.attribute10
10494 ,cons.attribute11
10495 ,cons.attribute12
10496 ,cons.attribute13
10497 ,cons.attribute14
10498 ,cons.attribute15
10499 ,cons.org_id
10500 ,cons.agreement_template_id
10501 ,cons.constr_template_id
10502 ,cons.constr_default_id
10503 ,cons.constr_start_date
10504 ,cons.constr_end_date
10505 FROM pn_var_constraints_all cons,
10506 pn_var_periods_all per
10507 WHERE per.var_rent_id = p_var_rent_id
10508 AND cons.period_id = per.period_id;
10509
10510
10511 /* Exceptions */
10512 BAD_CALL_EXCEPTION EXCEPTION;
10513
10514
10515 BEGIN
10516
10517 l_varent_tab.DELETE;
10518
10519 IF p_var_rent_id IS NOT NULL THEN
10520
10521 l_varent_tab(1) := p_var_rent_id;
10522
10523 ELSIF p_lease_id IS NOT NULL THEN
10524
10525 l_lease_id := p_lease_id;
10526 OPEN varent_lease_cur(p_lease_id => l_lease_id);
10527 FETCH varent_lease_cur BULK COLLECT INTO l_varent_tab;
10528 CLOSE varent_lease_cur;
10529
10530 ELSIF p_loc_id IS NOT NULL THEN
10531
10532 l_loc_id := p_loc_id;
10533 OPEN varent_loc_cur(p_loc_id => l_loc_id);
10534 FETCH varent_loc_cur BULK COLLECT INTO l_varent_tab;
10535 CLOSE varent_loc_cur;
10536
10537 ELSIF p_prop_id IS NOT NULL THEN
10538
10539 l_prop_id := p_prop_id;
10540 OPEN varent_prop_cur(p_prop_id => l_prop_id);
10541 FETCH varent_prop_cur BULK COLLECT INTO l_varent_tab;
10542 CLOSE varent_prop_cur;
10543
10544 ELSE
10545
10546 RAISE BAD_CALL_EXCEPTION;
10547
10548 END IF;
10549
10550 IF l_varent_tab.count > 0 THEN
10551 <<outer>>
10552 FOR var_rec in l_varent_tab.FIRST .. l_varent_tab.LAST
10553 LOOP
10554
10555 l_var_rent_id := l_varent_tab(var_rec);
10556 l_rent_num := NULL;
10557 l_invalid_agr := NULL;
10558
10559 IF l_var_rent_id IS NOT NULL THEN
10560
10561 SELECT rent_num
10562 INTO l_rent_num
10563 FROM pn_var_rents_all
10564 WHERE var_rent_id = l_var_rent_id;
10565
10566 /* Checking if the var rent agreement has a period with two or more similar lines */
10567
10568 FOR per_rec IN periods_cur(l_var_rent_id) LOOP
10569 --l_rent_num := per_rec.rent_num;
10570
10571 FOR lines_rec IN lines_cur(l_var_rent_id) LOOP
10572
10573 l_sales_type_code := lines_rec.sales_type_code;
10574 l_item_category_code := lines_rec.item_category_code;
10575
10576 FOR lines_count_rec IN lines_count_cur(per_rec.period_id, l_sales_type_code,l_item_category_code) LOOP
10577
10578 IF lines_count_rec.lines_count > 1 THEN
10579 l_invalid_agr := 'Y'; /* similar lines found */
10580 --Fnd_File.Put_Line ( Fnd_File.OutPut,' ---------------------------------------------------------------------------');
10581 --Fnd_File.Put_Line ( Fnd_File.OutPut,' Agreement ' || per_rec.rent_num || ' has two or more similar lines in same period and hence ');
10582 --Fnd_File.Put_Line ( Fnd_File.OutPut,' cannot be processed. You will need to recreate this agreement manually.');
10583 --Fnd_File.Put_Line ( Fnd_File.OutPut,' ---------------------------------------------------------------------------');
10584 pnp_debug_pkg.log (' ---------------------------------------------------------------------------');
10585 pnp_debug_pkg.log (' Agreement ' || per_rec.rent_num || ' has two or more similar lines in same period and hence ');
10586 pnp_debug_pkg.log (' cannot be processed. You will need to recreate this agreement manually.');
10587 pnp_debug_pkg.log (' ---------------------------------------------------------------------------');
10588
10589 EXIT outer;
10590 END IF;
10591 END LOOP;
10592
10593 END LOOP;
10594 END LOOP;
10595
10596 /* Completed Checking if the var rent agreement has a period with two or more similar lines */
10597
10598
10599 IF (nvl(l_invalid_agr,'N') <> 'Y') THEN
10600
10601 SELECT sysdate
10602 INTO l_date
10603 FROM dual;
10604
10605 DELETE FROM PN_VAR_LINE_DEFAULTS_ALL
10606 WHERE var_rent_id = l_var_rent_id;
10607
10608 DELETE FROM PN_VAR_BKHD_DEFAULTS_ALL
10609 WHERE var_rent_id = l_var_rent_id;
10610
10611 DELETE FROM PN_VAR_BKDT_DEFAULTS_ALL
10612 WHERE var_rent_id = l_var_rent_id;
10613
10614 DELETE FROM PN_VAR_CONSTR_DEFAULTS_ALL
10615 WHERE var_rent_id = l_var_rent_id;
10616
10617 l_sales_type_code := NULL;
10618 l_item_category_code := NULL;
10619
10620 /* Inserting line into lines defaults table and populating lines with the line default id */
10621
10622 /* Fetch distinct line items from the VR and then populate them into defaults table*/
10623
10624 FOR lines_rec IN lines_cur(l_var_rent_id) LOOP
10625
10626 l_sales_type_code := lines_rec.sales_type_code;
10627 l_item_category_code := lines_rec.item_category_code;
10628
10629 l_rowid_line_defaults := NULL;
10630 l_linedefaultid := NULL;
10631 l_linedefNum := NULL;
10632
10633 PN_VAR_LINE_DEFAULTS_PKG.INSERT_ROW(
10634 X_ROWID => l_rowid_line_defaults,
10635 X_LINE_DEFAULT_ID => l_linedefaultid,
10636 X_LINE_NUM => l_linedefNum,
10637 X_VAR_RENT_ID => l_var_rent_id,
10638 X_SALES_TYPE_CODE => l_sales_type_code,
10639 X_ITEM_CATEGORY_CODE => l_item_category_code,
10640 X_LINE_TEMPLATE_ID => NULL,
10641 X_AGREEMENT_TEMPLATE_ID => NULL,
10642 X_LINE_START_DATE => NULL,
10643 X_LINE_END_DATE => NULL,
10644 X_PROCESSED_FLAG => NULL,
10645 X_CREATION_DATE => l_date,
10646 X_CREATED_BY => -1,
10647 X_LAST_UPDATE_DATE => l_date,
10648 X_LAST_UPDATED_BY => -1,
10649 X_LAST_UPDATE_LOGIN => -1,
10650 X_ORG_ID => lines_rec.org_id,
10651 X_ATTRIBUTE_CATEGORY => NULL,
10652 X_ATTRIBUTE1 => NULL,
10653 X_ATTRIBUTE2 => NULL,
10654 X_ATTRIBUTE3 => NULL,
10655 X_ATTRIBUTE4 => NULL,
10656 X_ATTRIBUTE5 => NULL,
10657 X_ATTRIBUTE6 => NULL,
10658 X_ATTRIBUTE7 => NULL,
10659 X_ATTRIBUTE8 => NULL,
10660 X_ATTRIBUTE9 => NULL,
10661 X_ATTRIBUTE10 => NULL,
10662 X_ATTRIBUTE11 => NULL,
10663 X_ATTRIBUTE12 => NULL,
10664 X_ATTRIBUTE13 => NULL,
10665 X_ATTRIBUTE14 => NULL,
10666 X_ATTRIBUTE15 => NULL
10667 );
10668
10669 /* check nvl condition*/
10670 /* Insert the line item into pn_var_lines_all for thoses
10671 periods where this line does not exists*/
10672
10673
10674 FOR per_rec IN no_per_lines_exists(l_var_rent_id,
10675 l_sales_type_code,
10676 l_item_category_code) LOOP
10677
10678 l_rowId_lines := NULL;
10679 l_lineitemId := NULL;
10680 l_lineitemNum := NULL;
10681
10682 PN_VAR_LINES_PKG.INSERT_ROW (
10683 X_ROWID => l_rowId_lines,
10684 X_LINE_ITEM_ID => l_lineitemId,
10685 X_LINE_ITEM_NUM => l_lineitemNum,
10686 X_PERIOD_ID => per_rec.period_id,
10687 X_SALES_TYPE_CODE => l_sales_type_code,
10688 X_ITEM_CATEGORY_CODE => l_item_category_code,
10689 X_COMMENTS => NULL,
10690 X_ATTRIBUTE_CATEGORY => NULL,
10691 X_ATTRIBUTE1 => NULL,
10692 X_ATTRIBUTE2 => NULL,
10693 X_ATTRIBUTE3 => NULL,
10694 X_ATTRIBUTE4 => NULL,
10695 X_ATTRIBUTE5 => NULL,
10696 X_ATTRIBUTE6 => NULL,
10697 X_ATTRIBUTE7 => NULL,
10698 X_ATTRIBUTE8 => NULL,
10699 X_ATTRIBUTE9 => NULL,
10700 X_ATTRIBUTE10 => NULL,
10701 X_ATTRIBUTE11 => NULL,
10702 X_ATTRIBUTE12 => NULL,
10703 X_ATTRIBUTE13 => NULL,
10704 X_ATTRIBUTE14 => NULL,
10705 X_ATTRIBUTE15 => NULL,
10706 X_CREATION_DATE => l_date,
10707 X_CREATED_BY => -1,
10708 X_LAST_UPDATE_DATE => l_date,
10709 X_LAST_UPDATED_BY => -1,
10710 X_LAST_UPDATE_LOGIN => -1,
10711 X_ORG_ID => per_rec.org_id,
10712 X_VAR_RENT_ID => l_var_rent_id,
10713 X_LINE_TEMPLATE_ID => NULL,
10714 X_AGREEMENT_TEMPLATE_ID => NULL,
10715 X_LINE_DEFAULT_ID => l_linedefaultid
10716 );
10717
10718
10719 END LOOP; /* per_rec*/
10720
10721
10722
10723 UPDATE pn_var_lines_all
10724 SET line_default_id = l_linedefaultid
10725 WHERE var_rent_id = l_var_rent_id
10726 AND nvl(sales_type_code,'-1') = nvl(l_sales_type_code,'-1')
10727 AND nvl(item_category_code,'-1') = nvl(l_item_category_code,'-1');
10728
10729 END LOOP;
10730
10731
10732 /* Completed Inserting line into lines defaults table and
10733 populating lines with the line default id */
10734
10735
10736 /* Inserting into breakpoint Header defaults and populating
10737 breakpoints with the breakpoint default id */
10738
10739 FOR bkpt_rec IN bkhd_cur(l_var_rent_id) LOOP
10740
10741 l_bkhd_rowid := NULL;
10742 l_bkhddefault_id := NULL;
10743 l_linenum := NULL;
10744
10745 IF bkpt_rec.line_default_id IS NOT NULL THEN
10746
10747 PN_VAR_BKHD_DEFAULTS_PKG.INSERT_ROW(
10748 X_ROWID => l_bkhd_rowid,
10749 X_BKHD_DEFAULT_ID => l_bkhddefault_id,
10750 X_BKHD_DETAIL_NUM => l_linenum,
10751 X_LINE_DEFAULT_ID => bkpt_rec.line_default_id,
10752 X_BKPT_HEAD_TEMPLATE_ID => NULL,
10753 X_AGREEMENT_TEMPLATE_ID => NULL,
10754 X_BKHD_START_DATE => bkpt_rec.start_date,
10755 X_BKHD_END_DATE => bkpt_rec.end_date,
10756 X_BREAK_TYPE => bkpt_rec.break_type,
10757 X_BASE_RENT_TYPE => bkpt_rec.base_rent_type,
10758 X_NATURAL_BREAK_RATE => bkpt_rec.natural_break_rate,
10759 X_BASE_RENT => bkpt_rec.base_rent,
10760 X_BREAKPOINT_TYPE => bkpt_rec.breakpoint_type,
10761 X_BREAKPOINT_LEVEL => NULL,
10762 X_PROCESSED_FLAG => NULL,
10763 X_VAR_RENT_ID => l_var_rent_id,
10764 X_CREATION_DATE => l_date,
10765 X_CREATED_BY => -1,
10766 X_LAST_UPDATE_DATE => l_date,
10767 X_LAST_UPDATED_BY => -1,
10768 X_LAST_UPDATE_LOGIN => -1,
10769 X_ORG_ID => bkpt_rec.org_id,
10770 X_ATTRIBUTE_CATEGORY => bkpt_rec.ATTRIBUTE_CATEGORY,
10771 X_ATTRIBUTE1 => bkpt_rec.ATTRIBUTE1,
10772 X_ATTRIBUTE2 => bkpt_rec.ATTRIBUTE2,
10773 X_ATTRIBUTE3 => bkpt_rec.ATTRIBUTE3,
10774 X_ATTRIBUTE4 => bkpt_rec.ATTRIBUTE4,
10775 X_ATTRIBUTE5 => bkpt_rec.ATTRIBUTE5,
10776 X_ATTRIBUTE6 => bkpt_rec.ATTRIBUTE6,
10777 X_ATTRIBUTE7 => bkpt_rec.ATTRIBUTE7,
10778 X_ATTRIBUTE8 => bkpt_rec.ATTRIBUTE8,
10779 X_ATTRIBUTE9 => bkpt_rec.ATTRIBUTE9,
10780 X_ATTRIBUTE10 => bkpt_rec.ATTRIBUTE10,
10781 X_ATTRIBUTE11 => bkpt_rec.ATTRIBUTE11,
10782 X_ATTRIBUTE12 => bkpt_rec.ATTRIBUTE12,
10783 X_ATTRIBUTE13 => bkpt_rec.ATTRIBUTE13,
10784 X_ATTRIBUTE14 => bkpt_rec.ATTRIBUTE14,
10785 X_ATTRIBUTE15 => bkpt_rec.ATTRIBUTE15
10786 );
10787
10788 UPDATE pn_var_bkpts_head_all
10789 SET bkhd_default_id = l_bkhddefault_id
10790 WHERE bkpt_header_id = bkpt_rec.bkpt_header_id;
10791
10792 END IF;
10793
10794 UPDATE pn_var_line_defaults_all
10795 SET line_start_date = (select min(bkhd_start_date)
10796 from pn_var_bkhd_defaults_all
10797 where line_default_id = bkpt_rec.line_default_id)
10798 WHERE line_default_id = bkpt_rec.line_default_id;
10799
10800
10801 UPDATE pn_var_line_defaults_all
10802 SET line_end_date = (select max(bkhd_end_date)
10803 from pn_var_bkhd_defaults_all
10804 where line_default_id = bkpt_rec.line_default_id)
10805 WHERE line_default_id = bkpt_rec.line_default_id;
10806
10807
10808
10809 END LOOP; /*bkpt cursor*/
10810
10811 /* Completed Inserting breakpoints into breakpoint defaults table and
10812 populating breakpoints with the breakpoint default id */
10813
10814
10815
10816 /* Inserting into breakpoint detail defaults and populating breakpoints
10817 details with the breakpoint detail default id */
10818
10819
10820 FOR bkdt_rec IN bkdt_cur(l_var_rent_id) LOOP
10821
10822 l_bkdt_rowId := NULL;
10823 l_bkdtdefaultId := NULL;
10824 l_bkdtdefaultNum := NULL;
10825
10826 IF bkdt_rec.bkhd_default_id IS NOT NULL THEN
10827 PN_VAR_BKDT_DEFAULTS_PKG.INSERT_ROW(
10828 X_ROWID => l_bkdt_rowId,
10829 X_BKDT_DEFAULT_ID => l_bkdtdefaultId,
10830 X_BKDT_DETAIL_NUM => l_bkdtdefaultNum,
10831 X_BKHD_DEFAULT_ID => bkdt_rec.BKHD_DEFAULT_ID,
10832 X_BKDT_START_DATE => bkdt_rec.BKPT_START_DATE,
10833 X_BKDT_END_DATE => bkdt_rec.BKPT_END_DATE,
10834 X_PERIOD_BKPT_VOL_START => bkdt_rec.PERIOD_BKPT_VOL_START,
10835 X_PERIOD_BKPT_VOL_END => bkdt_rec.PERIOD_BKPT_VOL_END,
10836 X_GROUP_BKPT_VOL_START => bkdt_rec.GROUP_BKPT_VOL_START,
10837 X_GROUP_BKPT_VOL_END => bkdt_rec.GROUP_BKPT_VOL_END,
10838 X_BKPT_RATE => bkdt_rec.BKPT_RATE,
10839 X_PROCESSED_FLAG => NULL,
10840 X_VAR_RENT_ID => l_var_rent_id,
10841 X_CREATION_DATE => l_date,
10842 X_CREATED_BY => -1,
10843 X_LAST_UPDATE_DATE => l_date,
10844 X_LAST_UPDATED_BY => -1,
10845 X_LAST_UPDATE_LOGIN => -1,
10846 X_ORG_ID => bkdt_rec.org_id,
10847 X_ANNUAL_BASIS_AMOUNT => bkdt_rec.ANNUAL_BASIS_AMOUNT,
10848 X_ATTRIBUTE_CATEGORY => bkdt_rec.ATTRIBUTE_CATEGORY,
10849 X_ATTRIBUTE1 => bkdt_rec.ATTRIBUTE1,
10850 X_ATTRIBUTE2 => bkdt_rec.ATTRIBUTE2,
10851 X_ATTRIBUTE3 => bkdt_rec.ATTRIBUTE3,
10852 X_ATTRIBUTE4 => bkdt_rec.ATTRIBUTE4,
10853 X_ATTRIBUTE5 => bkdt_rec.ATTRIBUTE5,
10854 X_ATTRIBUTE6 => bkdt_rec.ATTRIBUTE6,
10855 X_ATTRIBUTE7 => bkdt_rec.ATTRIBUTE7,
10856 X_ATTRIBUTE8 => bkdt_rec.ATTRIBUTE8,
10857 X_ATTRIBUTE9 => bkdt_rec.ATTRIBUTE9,
10858 X_ATTRIBUTE10 => bkdt_rec.ATTRIBUTE10,
10859 X_ATTRIBUTE11 => bkdt_rec.ATTRIBUTE11,
10860 X_ATTRIBUTE12 => bkdt_rec.ATTRIBUTE12,
10861 X_ATTRIBUTE13 => bkdt_rec.ATTRIBUTE13,
10862 X_ATTRIBUTE14 => bkdt_rec.ATTRIBUTE14,
10863 X_ATTRIBUTE15 => bkdt_rec.ATTRIBUTE15
10864 );
10865
10866 UPDATE pn_var_bkpts_det_all
10867 SET BKDT_DEFAULT_ID = l_bkdtdefaultId
10868 WHERE BKPT_DETAIL_ID = bkdt_rec.bkpt_detail_id;
10869
10870 END IF;
10871
10872 END LOOP; /*bkdt cursor*/
10873
10874 /* Completed Inserting breakpoint detail into breakpoint defaults table
10875 and populating breakpoints with the breakpoint default id */
10876
10877 /* Inserting into constraints defaults and populating constraints
10878 details with the constraint detail default id */
10879
10880
10881 FOR constr_rec IN constr_cur(l_var_rent_id) LOOP
10882
10883 l_rowid_constr_defaults := NULL;
10884 l_constrdefaultid := NULL;
10885 l_constrdefNum := NULL;
10886
10887 PN_VAR_CONSTR_DEFAULTS_PKG.INSERT_ROW
10888 (
10889 X_ROWID => l_rowid_constr_defaults,
10890 X_CONSTR_DEFAULT_ID => l_constrdefaultid,
10891 X_CONSTR_DEFAULT_NUM => l_constrdefNum,
10892 X_VAR_RENT_ID => l_var_rent_id,
10893 X_AGREEMENT_TEMPLATE_ID => NULL,
10894 X_CONSTR_TEMPLATE_ID => NULL,
10895 X_CONSTR_START_DATE => constr_rec.constr_start_date,
10896 X_CONSTR_END_DATE => constr_rec.constr_end_date,
10897 X_CONSTR_CAT_CODE => constr_rec.constr_cat_code,
10898 X_TYPE_CODE => constr_rec.type_code,
10899 X_AMOUNT => constr_rec.amount,
10900 X_CREATION_DATE => l_date,
10901 X_CREATED_BY => -1,
10902 X_LAST_UPDATE_DATE => l_date,
10903 X_LAST_UPDATED_BY => -1,
10904 X_LAST_UPDATE_LOGIN => -1,
10905 X_ORG_ID => constr_rec.org_id,
10906 X_ATTRIBUTE_CATEGORY => NULL,
10907 X_ATTRIBUTE1 => NULL,
10908 X_ATTRIBUTE2 => NULL,
10909 X_ATTRIBUTE3 => NULL,
10910 X_ATTRIBUTE4 => NULL,
10911 X_ATTRIBUTE5 => NULL,
10912 X_ATTRIBUTE6 => NULL,
10913 X_ATTRIBUTE7 => NULL,
10914 X_ATTRIBUTE8 => NULL,
10915 X_ATTRIBUTE9 => NULL,
10916 X_ATTRIBUTE10 => NULL,
10917 X_ATTRIBUTE11 => NULL,
10918 X_ATTRIBUTE12 => NULL,
10919 X_ATTRIBUTE13 => NULL,
10920 X_ATTRIBUTE14 => NULL,
10921 X_ATTRIBUTE15 => NULL
10922 );
10923
10924 UPDATE pn_var_constraints_all
10925 SET constr_default_id = l_constrdefaultid
10926 WHERE constraint_id = constr_rec.constraint_id;
10927
10928
10929 END LOOP; /*constr_rec*/
10930
10931
10932 /* Completed Inserting constraints into constraint defaults table and
10933 populating constraints with the constraints default id */
10934
10935 pnp_debug_pkg.log (' ---------------------------------------------------------------------------');
10936 pnp_debug_pkg.log (' Agreement ' || l_rent_num || ' has been Updated');
10937 pnp_debug_pkg.log (' ---------------------------------------------------------------------------');
10938
10939 END IF;
10940
10941 END IF;
10942 END LOOP;
10943 ELSE
10944 pnp_debug_pkg.log (' ---------------------------------------------------------------------------');
10945 pnp_debug_pkg.log (' There is no Variable Rent Agreement with given search criteria');
10946 pnp_debug_pkg.log (' ---------------------------------------------------------------------------');
10947 END IF;
10948
10949 EXCEPTION
10950 WHEN BAD_CALL_EXCEPTION THEN
10951 pnp_debug_pkg.log (' ---------------------------------------------------------------------------');
10952 pnp_debug_pkg.log (' Input to the program is invalid');
10953 pnp_debug_pkg.log (' ---------------------------------------------------------------------------');
10954
10955 END copy_bkpt_main_to_setup;
10956
10957 /*===========================================================================+
10958 | FUNCTION
10959 | find_if_inv_exp
10960 |
10961 | DESCRIPTION
10962 | Finds if forecasted terms have been approved for an invoice date for
10963 | this variable rent.
10964 |
10965 | SCOPE - PUBLIC
10966 |
10967 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
10968 |
10969 | ARGUMENTS : IN:
10970 | p_var_rent_id, p_invoice_date
10971 |
10972 | OUT:
10973 |
10974 | RETURNS : None
10975 |
10976 | NOTES : Finds if forecasted terms have been approved for an invoice
10977 | date for this variable rent.
10978 |
10979 | MODIFICATION HISTORY
10980 |
10981 | 05-03-2007 piagrawa o Created
10982 +===========================================================================*/
10983
10984 FUNCTION find_if_inv_exp (p_var_rent_id NUMBER, p_invoice_date DATE) RETURN NUMBER IS
10985
10986 l_inv_exp NUMBER;
10987
10988 BEGIN
10989
10990 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.FIND_IF_INV_EXP (+)');
10991
10992 SELECT 1
10993 INTO l_inv_exp
10994 FROM dual
10995 WHERE EXISTS ( SELECT inv.var_rent_inv_id
10996 FROM pn_var_rent_inv_all inv
10997 WHERE inv.var_rent_id = p_var_rent_id
10998 AND inv.invoice_date = p_invoice_date
10999 AND (forecasted_exp_code = 'Y'));
11000
11001 RETURN l_inv_exp;
11002
11003 pnp_debug_pkg.debug ('PN_VAR_RENT_PKG.FIND_IF_INV_EXP (-)');
11004
11005 EXCEPTION
11006
11007 WHEN OTHERS THEN
11008 RETURN NULL;
11009
11010 END find_if_inv_exp;
11011
11012 -------------------------------------------------------------------------------
11013 -- NAME : rates_validation()
11014 -- PURPOSE : Vaidate Breakpoint Details Rates for FY,FLY,LY,CYP,CYNP
11015 -- DESCRIPTION :
11016 --
11017 -- 1. FY and FYLY do not need to support a case where there is a rate
11018 -- change in the FIRST12 months of the lease.
11019 -- 2. LY and FYLY do not need to support a case where there is a rate
11020 -- change in the LAST 12 months of the lease.
11021 -- 3. The two Combined Year methods do not need to support a case where
11022 -- there is a rate change in the first combined year.
11023 --
11024 --
11025 -- SCOPE : PUBLIC
11026 --
11027 -- ARGUMENTS : p_var_rent_id : variable rent ID (mandatory)
11028 --
11029 -- RETURNS : l_return_status
11030 -- HISTORY :
11031 --
11032 -- 04-MAY-07 Pikhar o Created.
11033 -- 23-MAY-07 Pikhar o Revamped the entire procedure.
11034 -------------------------------------------------------------------------------
11035 FUNCTION rates_validation (p_var_rent_id IN NUMBER
11036 ,p_agr_start_date IN DATE
11037 ,p_agr_end_date IN DATE) RETURN VARCHAR2
11038 IS
11039
11040 TYPE bkpt_rec is RECORD ( l_bkpt_det_id NUMBER,
11041 l_bkpt_start_date DATE,
11042 l_bkpt_end_date DATE,
11043 l_bkpt_vol_start NUMBER,
11044 l_bkpt_vol_end NUMBER,
11045 l_rate NUMBER);
11046
11047 TYPE bkpt_rec_type is TABLE OF bkpt_rec INDEX BY BINARY_INTEGER;
11048
11049 l_agr_start_date DATE;
11050 l_agr_end_date DATE;
11051 l_agreement_end_date DATE;
11052 l_prd_start_date DATE;
11053 l_prd_end_date DATE;
11054 l_proration_rule VARCHAR2(30);
11055 l_counter NUMBER;
11056 l_count_record NUMBER;
11057 l_return_status VARCHAR2(30) := 'NO_ERROR';
11058 l_bkpt_st_tab bkpt_rec_type;
11059 l_bkpt_end_tab bkpt_rec_type;
11060 l1_bkpt_start_volume NUMBER;
11061 l1_bkpt_end_volume NUMBER;
11062 l2_bkpt_start_volume NUMBER;
11063 l2_bkpt_end_volume NUMBER;
11064
11065 /* Cursor to get VR details */
11066
11067 CURSOR var_cur(p_vr_id IN NUMBER) IS
11068 SELECT commencement_date
11069 ,termination_date
11070 ,proration_rule
11071 FROM pn_var_rents_all
11072 WHERE var_rent_id = p_vr_id;
11073
11074 /* Cursor to get var periods */
11075 CURSOR periods_vr_c(p_vr_id IN NUMBER) IS
11076 SELECT start_date
11077 ,end_date
11078 FROM pn_var_periods_all
11079 WHERE var_rent_id = p_vr_id
11080 ORDER BY start_date;
11081
11082 /* Cursor to select Breakpoints whose start date
11083 is in between given start dates */
11084 CURSOR bkdt_st_dt_cur (p_vr_id IN NUMBER,
11085 p_start_date IN DATE,
11086 p_end_date IN DATE) IS
11087 SELECT bkdt_default_id,
11088 bkdt_start_date,
11089 bkdt_end_date,
11090 period_bkpt_vol_start,
11091 period_bkpt_vol_end,
11092 bkpt_rate
11093 FROM pn_var_bkdt_defaults_all
11094 WHERE var_rent_id = p_vr_id
11095 AND bkdt_start_date BETWEEN p_start_date AND p_end_date;
11096
11097 /* Cursor to select Breakpoints whose end date
11098 is in between given start dates */
11099 CURSOR bkdt_end_dt_cur (p_vr_id IN NUMBER,
11100 p_start_date IN DATE,
11101 p_end_date IN DATE) IS
11102 SELECT bkdt_default_id,
11103 bkdt_start_date,
11104 bkdt_end_date,
11105 period_bkpt_vol_start,
11106 period_bkpt_vol_end,
11107 bkpt_rate
11108 FROM pn_var_bkdt_defaults_all
11109 WHERE var_rent_id = p_vr_id
11110 AND bkdt_end_date BETWEEN p_start_date AND p_end_date;
11111
11112 BEGIN
11113
11114 pnp_debug_pkg.log('pn_var_rent_pkg.rates_validation (+)');
11115
11116 FOR var_rec in var_cur(p_vr_id => p_var_rent_id) LOOP
11117 IF p_agr_start_date IS NOT NULL THEN
11118 l_agr_start_date := p_agr_start_date;
11119 ELSE
11120 l_agr_start_date := var_rec.commencement_date;
11121 END IF;
11122
11123 IF p_agr_end_date IS NOT NULL THEN
11124 l_agr_end_date := p_agr_end_date;
11125 ELSE
11126 l_agr_end_date := var_rec.termination_date;
11127 END IF;
11128
11129 l_agreement_end_date := var_rec.termination_date;
11130 l_proration_rule := var_rec.proration_rule;
11131
11132
11133 END LOOP;
11134
11135
11136 IF l_proration_rule IN ('FY') THEN
11137
11138 l_prd_start_date := l_agr_start_date;
11139 l_prd_end_date := (add_months(l_prd_start_date,12) -1);
11140 l_bkpt_st_tab.DELETE;
11141
11142 IF ((l_prd_start_date IS NOT NULL) AND (l_prd_end_date IS NOT NULL)) THEN
11143
11144 OPEN bkdt_st_dt_cur(p_vr_id => p_var_rent_id,
11145 p_start_date => l_prd_start_date,
11146 p_end_date => l_prd_end_date);
11147 FETCH bkdt_st_dt_cur BULK COLLECT INTO l_bkpt_st_tab;
11148 CLOSE bkdt_st_dt_cur;
11149
11150 END IF;
11151
11152 ELSIF l_proration_rule IN ('LY') THEN
11153
11154 l_prd_end_date := l_agr_end_date;
11155 l_prd_start_date := (add_months(l_prd_end_date,-12) +1);
11156 l_bkpt_end_tab.DELETE;
11157
11158
11159 IF ((l_prd_start_date IS NOT NULL) AND (l_prd_end_date IS NOT NULL)) THEN
11160
11161 OPEN bkdt_end_dt_cur(p_vr_id => p_var_rent_id,
11162 p_start_date => l_prd_start_date,
11163 p_end_date => l_prd_end_date);
11164 FETCH bkdt_end_dt_cur BULK COLLECT INTO l_bkpt_end_tab;
11165 CLOSE bkdt_end_dt_cur;
11166
11167 END IF;
11168
11169 ELSIF l_proration_rule IN ('FLY') THEN
11170
11171 l_prd_start_date := l_agr_start_date;
11172 l_prd_end_date := (add_months(l_prd_start_date,12) -1);
11173 l_bkpt_st_tab.DELETE;
11174
11175 IF ((l_prd_start_date IS NOT NULL) AND (l_prd_end_date IS NOT NULL)) THEN
11176
11177 OPEN bkdt_st_dt_cur(p_vr_id => p_var_rent_id,
11178 p_start_date => l_prd_start_date,
11179 p_end_date => l_prd_end_date);
11180 FETCH bkdt_st_dt_cur BULK COLLECT INTO l_bkpt_st_tab;
11181 CLOSE bkdt_st_dt_cur;
11182
11183 END IF;
11184
11185 l_prd_end_date := l_agr_end_date;
11186 l_prd_start_date := (add_months(l_prd_end_date,-12) +1);
11187 l_bkpt_end_tab.DELETE;
11188
11189 IF ((l_prd_start_date IS NOT NULL) AND (l_prd_end_date IS NOT NULL)) THEN
11190
11191 OPEN bkdt_end_dt_cur(p_vr_id => p_var_rent_id,
11192 p_start_date => l_prd_start_date,
11193 p_end_date => l_prd_end_date);
11194 FETCH bkdt_end_dt_cur BULK COLLECT INTO l_bkpt_end_tab;
11195 CLOSE bkdt_end_dt_cur;
11196
11197 END IF;
11198
11199
11200 ELSIF l_proration_rule IN ('CYP','CYNP') THEN
11201
11202 l_counter := 0;
11203
11204 <<outer>>
11205 FOR period_rec in periods_vr_c(p_vr_id => p_var_rent_id) LOOP
11206 IF l_counter = 0 THEN
11207 l_prd_start_date := period_rec.start_date; /*Start date of first period*/
11208 l_prd_end_date := NULL;
11209 l_counter := 1;
11210 ELSE
11211 l_prd_end_date := period_rec.end_date; /* End date of second period*/
11212 EXIT outer;
11213 END IF;
11214 END LOOP;
11215
11216 l_bkpt_st_tab.DELETE;
11217
11218 IF ((l_prd_start_date IS NOT NULL) AND (l_prd_end_date IS NOT NULL)) THEN
11219
11220 OPEN bkdt_st_dt_cur(p_vr_id => p_var_rent_id,
11221 p_start_date => l_prd_start_date,
11222 p_end_date => l_prd_end_date);
11223 FETCH bkdt_st_dt_cur BULK COLLECT INTO l_bkpt_st_tab;
11224 CLOSE bkdt_st_dt_cur;
11225
11226 END IF;
11227
11228 END IF;
11229
11230
11231 /* Loop through Breakpoints table and check if there are
11232 any records with invalid rates */
11233 IF ((l_proration_rule IN ('CYP','CYNP', 'FY' , 'FLY')) AND (l_bkpt_st_tab.count > 0)) THEN
11234 <<outer_st_1>>
11235 FOR rec IN l_bkpt_st_tab.FIRST..l_bkpt_st_tab.LAST LOOP
11236
11237 l1_bkpt_start_volume := NVL(l_bkpt_st_tab(rec).l_bkpt_vol_start,0);
11238 l1_bkpt_end_volume := l_bkpt_st_tab(rec).l_bkpt_vol_end;
11239
11240 <<inner_1>>
11241 FOR j in l_bkpt_st_tab.FIRST .. l_bkpt_st_tab.LAST LOOP
11242
11243 IF l_bkpt_st_tab(rec).l_bkpt_det_id <> l_bkpt_st_tab(j).l_bkpt_det_id THEN
11244
11245 l2_bkpt_start_volume := NVL(l_bkpt_st_tab(j).l_bkpt_vol_start,0);
11246 l2_bkpt_end_volume := l_bkpt_st_tab(j).l_bkpt_vol_end;
11247
11248 IF l2_bkpt_end_volume IS NULL THEN
11249
11250 IF l1_bkpt_end_volume IS NULL THEN
11251
11252 IF l_bkpt_st_tab(rec).l_rate <> l_bkpt_st_tab(j).l_rate THEN
11253 l_return_status := 'ERROR';
11254 EXIT outer_st_1;
11255 END IF;
11256
11257 ELSE
11258
11259 IF ((l2_bkpt_start_volume BETWEEN l1_bkpt_start_volume AND l1_bkpt_end_volume) AND
11260 (l2_bkpt_start_volume <> l1_bkpt_end_volume) AND
11261 (l_bkpt_st_tab(rec).l_rate <> l_bkpt_st_tab(j).l_rate)) THEN
11262 l_return_status := 'ERROR';
11263 EXIT outer_st_1;
11264 END IF;
11265
11266 END IF;
11267
11268 ELSE
11269
11270 IF l1_bkpt_end_volume IS NULL THEN
11271
11272 IF ((l1_bkpt_start_volume BETWEEN l2_bkpt_start_volume AND l2_bkpt_end_volume) AND
11273 l1_bkpt_start_volume <> l2_bkpt_end_volume AND
11274 (l_bkpt_st_tab(rec).l_rate <> l_bkpt_st_tab(j).l_rate)) THEN
11275 l_return_status := 'ERROR';
11276 EXIT outer_st_1;
11277 END IF;
11278
11279 ELSE
11280
11281 IF ((l1_bkpt_start_volume < l2_bkpt_end_volume) AND (l2_bkpt_start_volume < l1_bkpt_end_volume )) AND
11282 ( (l_bkpt_st_tab(rec).l_rate <> l_bkpt_st_tab(j).l_rate) ) THEN
11283 l_return_status := 'ERROR';
11284 EXIT outer_st_1;
11285 END IF;
11286
11287 END IF;
11288
11289 END IF;
11290
11291 END IF;
11292
11293 END LOOP; -- inner
11294
11295 END LOOP; -- outer_st_1
11296
11297 END IF;
11298
11299 IF ((l_proration_rule IN ('LY','FLY')) AND (l_bkpt_end_tab.count > 0) AND l_return_status <> 'ERROR' )THEN
11300 <<outer_et_1>>
11301 FOR rec IN l_bkpt_end_tab.FIRST..l_bkpt_end_tab.LAST LOOP
11302
11303 l1_bkpt_start_volume := NVL(l_bkpt_end_tab(rec).l_bkpt_vol_start,0);
11304 l1_bkpt_end_volume := l_bkpt_end_tab(rec).l_bkpt_vol_end;
11305
11306 <<inner_2>>
11307 FOR j in l_bkpt_end_tab.FIRST .. l_bkpt_end_tab.LAST LOOP
11308
11309 IF l_bkpt_end_tab(rec).l_bkpt_det_id <> l_bkpt_end_tab(j).l_bkpt_det_id THEN
11310
11311 l2_bkpt_start_volume := NVL(l_bkpt_end_tab(j).l_bkpt_vol_start,0);
11312 l2_bkpt_end_volume := l_bkpt_end_tab(j).l_bkpt_vol_end;
11313
11314 IF l2_bkpt_end_volume IS NULL THEN
11315
11316 IF l1_bkpt_end_volume IS NULL THEN
11317
11318 IF l_bkpt_end_tab(rec).l_rate <> l_bkpt_end_tab(j).l_rate THEN
11319 l_return_status := 'ERROR';
11320 EXIT outer_et_1;
11321 END IF;
11322
11323 ELSE
11324
11325 IF ((l2_bkpt_start_volume BETWEEN l1_bkpt_start_volume AND l1_bkpt_end_volume) AND
11326 (l2_bkpt_start_volume <> l1_bkpt_end_volume) AND
11327 (l_bkpt_end_tab(rec).l_rate <> l_bkpt_end_tab(j).l_rate)) THEN
11328 l_return_status := 'ERROR';
11329 EXIT outer_et_1;
11330 END IF;
11331
11332 END IF;
11333
11334 ELSE
11335
11336 IF l1_bkpt_end_volume IS NULL THEN
11337
11338 IF ((l1_bkpt_start_volume BETWEEN l2_bkpt_start_volume AND l2_bkpt_end_volume) AND
11339 l1_bkpt_start_volume <> l2_bkpt_end_volume AND
11340 (l_bkpt_end_tab(rec).l_rate <> l_bkpt_end_tab(j).l_rate)) THEN
11341 l_return_status := 'ERROR';
11342 EXIT outer_et_1;
11343 END IF;
11344
11345 ELSE
11346
11347 IF ((l1_bkpt_start_volume < l2_bkpt_end_volume) AND (l2_bkpt_start_volume < l1_bkpt_end_volume )) AND
11348 ( (l_bkpt_end_tab(rec).l_rate <> l_bkpt_end_tab(j).l_rate) ) THEN
11349 l_return_status := 'ERROR';
11350 EXIT outer_et_1;
11351 END IF;
11352
11353 END IF;
11354
11355 END IF;
11356
11357 END IF;
11358
11359 END LOOP; -- inner2
11360
11361 END LOOP; -- outer_et_1
11362 END IF;
11363
11364 RETURN l_return_status;
11365
11366 pnp_debug_pkg.log('pn_var_rent_pkg.rates_validation (-)');
11367
11368 END rates_validation;
11369
11370
11371 END PN_VAR_RENT_PKG;