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