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