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