DBA Data[Home] [Help]

PACKAGE BODY: APPS.PN_VAR_ABATEMENTS_PKG

Source


1 PACKAGE BODY PN_VAR_ABATEMENTS_PKG AS
2 /* $Header: PNVRABTB.pls 120.7 2007/07/02 15:21:29 lbala noship $ */
3 
4 -------------------------------------------------------------------------------
5 -- PROCDURE : INSERT_ROW
6 -- INVOKED FROM : INSERT_row procedure
7 -- PURPOSE      : INSERTs the row
8 -- HISTORY      :
9 -- 14-JUL-05  HRodda o Bug 4284035 - REPLACEd PN_VAR_ABATEMENTS with _ALL
10 -- 28-NOV-05  pikhar o fetched org_id using cursor
11 -------------------------------------------------------------------------------
12 procedure INSERT_ROW (
13                      X_ROWID             IN out NOCOPY VARCHAR2,
14                      X_VAR_ABATEMENT_ID  IN out NOCOPY NUMBER,
15                      X_VAR_RENT_ID       IN NUMBER,
16                      X_VAR_RENT_INV_ID   IN NUMBER,
17                      X_PAYMENT_TERM_ID   IN NUMBER,
18                      X_INCLUDE_TERM      IN VARCHAR2,
19                      X_INCLUDE_INCREASES IN VARCHAR2,
20                      X_UPDATE_FLAG       IN VARCHAR2,
21                      X_CREATION_DATE     IN DATE,
22                      X_CREATED_BY        IN NUMBER,
23                      X_LAST_UPDATE_DATE  IN DATE,
24                      X_LAST_UPDATED_BY   IN NUMBER,
25                      X_LAST_UPDATE_LOGIN IN NUMBER,
26                      X_ORG_ID            IN NUMBER
27                      ) IS
28 
29   CURSOR var_abatements IS
30   SELECT ROWID
31   FROM   PN_VAR_ABATEMENTS_ALL
32   WHERE  VAR_ABATEMENT_ID = X_VAR_ABATEMENT_ID;
33 
34   CURSOR org_cur IS
35   SELECT org_id
36   FROM   pn_payment_terms_all
37   WHERE  payment_term_id = x_payment_term_id;
38 
39   l_org_id NUMBER;
40 
41 
42 BEGIN
43 
44         PNP_DEBUG_PKG.debug ('PN_VAR_ABATEMENTS_PKG.INSERT_ROW (+)');
45 
46         -------------------------------------------------------
47         -- SELECT the nextval fOR var abatement id
48         -------------------------------------------------------
49 
50         IF x_org_id IS NULL THEN
51           FOR rec IN org_cur LOOP
52             l_org_id := rec.org_id;
53           END LOOP;
54         ELSE
55           l_org_id := x_org_id;
56         END IF;
57 
58         IF ( X_VAR_ABATEMENT_ID IS NULL) THEN
59           SELECT  pn_var_abatements_s.nextval
60           INTO    X_VAR_ABATEMENT_ID
61           FROM    dual;
62         END IF;
63 
64         INSERT INTO PN_VAR_ABATEMENTS_ALL
65         (         VAR_RENT_ID,
66                   VAR_ABATEMENT_ID,
67                   VAR_RENT_INV_ID,
68                   PAYMENT_TERM_ID,
69                   INCLUDE_TERM,
70                   INCLUDE_INCREASES,
71                   UPDATE_FLAG,
72                   LAST_UPDATE_DATE,
73                   LAST_UPDATED_BY,
74                   CREATION_DATE,
75                   CREATED_BY,
76                   LAST_UPDATE_LOGIN,
77                   ORG_ID
78         )
79         VALUES
80         (         X_VAR_RENT_ID,
81                   X_VAR_ABATEMENT_ID,
82                   X_VAR_RENT_INV_ID,
83                   X_PAYMENT_TERM_ID,
84                   X_INCLUDE_TERM,
85                   X_INCLUDE_INCREASES,
86                   X_UPDATE_FLAG,
87                   X_LAST_UPDATE_DATE,
88                   X_LAST_UPDATED_BY,
89                   X_CREATION_DATE,
90                   X_CREATED_BY,
91                   X_LAST_UPDATE_LOGIN,
92                   l_ORG_ID
93         );
94 
95         OPEN var_abatements;
96         FETCH var_abatements INTO X_ROWID;
97         IF (var_abatements%notfound) THEN
98           CLOSE var_abatements;
99           RAISE no_data_found;
100         END IF;
101         CLOSE var_abatements;
102 
103         PNP_DEBUG_PKG.debug ('PN_VAR_ABATEMENTS_PKG.INSERT_ROW (-)');
104 
105 END INSERT_ROW;
106 
107 -------------------------------------------------------------------------------
108 -- PROCDURE     : lock_row
109 -- INVOKED FROM : lock_row procedure
110 -- PURPOSE      : locks the row
111 -- HISTORY      :
112 -- 14-JUL-05  hareesha o Bug 4284035 - REPLACEd pn_dIStributions with _ALL table.
113 -------------------------------------------------------------------------------
114 procedure LOCK_ROW
115         (X_VAR_RENT_ID         IN NUMBER,
116          X_VAR_RENT_INV_ID     IN NUMBER,
117          X_PAYMENT_TERM_ID     IN NUMBER
118          ) IS
119 
120 CURSOR c1 IS
121 SELECT *
122 FROM PN_VAR_ABATEMENTS_ALL
123 WHERE VAR_RENT_ID = X_VAR_RENT_ID AND
124       VAR_RENT_INV_ID = X_VAR_RENT_INV_ID AND
125       PAYMENT_TERM_ID = X_PAYMENT_TERM_ID
126 FOR UPDATE OF VAR_ABATEMENT_ID NOWAIT;
127 
128 tlINfo c1%ROWTYPE;
129 
130 BEGIN
131 
132         PNP_DEBUG_PKG.debug ('PN_VAR_ABATEMENTS_PKG.LOCK_ROW (+)');
133 
134         OPEN c1;
135             FETCH c1 INTO tlINfo;
136             IF (c1%NOTFOUND) THEN
137                     CLOSE c1;
138                     RETURN;
139             END IF;
140         CLOSE c1;
141         IF (tlINfo.VAR_RENT_ID = X_VAR_RENT_ID) THEN
142            NULL;
143         ELSE
144            PN_VAR_RENT_PKG.LOCK_ROW_EXCEPTION('VAR_RENT_ID',tlINfo.VAR_RENT_ID);
145         END IF;
146 
147 
148         IF (tlINfo.VAR_RENT_INV_ID = X_VAR_RENT_INV_ID) THEN
149            NULL;
150         ELSE
151            PN_VAR_RENT_PKG.LOCK_ROW_EXCEPTION('VAR_RENT_INV_ID',tlINfo.VAR_RENT_INV_ID);
152         END IF;
153 
154         IF (tlINfo.PAYMENT_TERM_ID = X_PAYMENT_TERM_ID) THEN
155            NULL;
156         ELSE
157            PN_VAR_RENT_PKG.LOCK_ROW_EXCEPTION('PAYMENT_TERM_ID',tlINfo.PAYMENT_TERM_ID);
158         END IF;
159 
160         PNP_DEBUG_PKG.debug ('PN_VAR_ABATEMENTS_PKG.LOCK_ROW (-)');
161 
162 END LOCK_ROW;
163 
164 -----------------------------------------------------------------------
165 -- PROCDURE : UPDATE_ROW
166 -----------------------------------------------------------------------
167 procedure UPDATE_ROW
168         (
169            X_VAR_RENT_ID       IN NUMBER,
170            X_VAR_RENT_INV_ID   IN NUMBER,
171            X_PAYMENT_TERM_ID   IN NUMBER,
172            X_INCLUDE_TERM      IN VARCHAR2,
173            X_INCLUDE_INCREASES IN VARCHAR2,
174            X_UPDATE_FLAG       IN VARCHAR2,
175            X_LAST_UPDATE_DATE  IN DATE,
176            X_LAST_UPDATED_BY   IN NUMBER,
177            X_LAST_UPDATE_LOGIN IN NUMBER
178         ) IS
179 
180 BEGIN
181 
182         PNP_DEBUG_PKG.debug ('PN_VAR_ABATEMENTS_PKG.UPDATE_ROW (+)');
183 
184         UPDATE PN_VAR_ABATEMENTS_ALL SET
185                VAR_RENT_ID       = X_VAR_RENT_ID,
186                VAR_RENT_INV_ID   = X_VAR_RENT_INV_ID,
187                PAYMENT_TERM_ID   = X_PAYMENT_TERM_ID,
188                INCLUDE_TERM      = X_INCLUDE_TERM,
189                INCLUDE_INCREASES = X_INCLUDE_INCREASES,
190                UPDATE_FLAG       = X_UPDATE_FLAG,
191                LAST_UPDATE_DATE  = X_LAST_UPDATE_DATE,
192                LAST_UPDATED_BY   = X_LAST_UPDATED_BY,
193                LAST_UPDATE_LOGIN = X_LAST_UPDATE_LOGIN
194         WHERE VAR_RENT_ID = X_VAR_RENT_ID
195         AND   VAR_RENT_INV_ID = X_VAR_RENT_INV_ID
196         AND PAYMENT_TERM_ID = X_PAYMENT_TERM_ID;
197 
198         IF (SQL%NOTFOUND) THEN
199           RAISE NO_DATA_FOUND;
200         END IF;
201 
202         PNP_DEBUG_PKG.debug ('PN_VAR_ABATEMENTS_PKG.UPDATE_ROW (-)');
203 
204 END UPDATE_ROW;
205 
206 -------------------------------------------------------------------------------
207 -- PROCDURE     : delete_row
208 -- INVOKED FROM : delete_row procedure
209 -- PURPOSE      : deletes the row
210 -- HISTORY      :
211 -- 14-JUL-05  hareesha o Bug 4284035 - REPLACEd pn_dIStributions with _ALL table.
212 -------------------------------------------------------------------------------
213 
214 procedure DELETE_ROW
215         ( X_VAR_RENT_ID       IN NUMBER,
216           X_VAR_RENT_INV_ID   IN NUMBER,
217           X_PAYMENT_TERM_ID   IN NUMBER
218         ) IS
219 
220 BEGIN
221 
222         PNP_DEBUG_PKG.debug ('PN_VAR_ABATEMENTS_PKG.DELETE_ROW (+)');
223 
224         DELETE FROM PN_VAR_ABATEMENTS_ALL
225         WHERE VAR_RENT_ID = X_VAR_RENT_ID
226         AND VAR_RENT_INV_ID = X_VAR_RENT_INV_ID
227         AND PAYMENT_TERM_ID = X_PAYMENT_TERM_ID;
228 
229         IF (SQL%NOTFOUND) THEN
230            RAISE NO_DATA_FOUND;
231         END IF;
232 
233 
234         PNP_DEBUG_PKG.debug ('PN_VAR_ABATEMENTS_PKG.DELETE_ROW (-)');
235 
236 END DELETE_ROW;
237 
238 --------------------------------------------------------------------
239 --
240 --  NAME         : CHECK_CALC_INV_EXISTS()
241 --  DESCRIPTION  :
242 --  PURPOSE      :
243 --  INVOKED FROM : KEY-COMMIT trigger at block level
244 --  ARGUMENTS    : NONE
245 --  REFERENCE    : PN_COMMON.debug()
246 --  HISTORY      :
247 --
248 --   27-NOV-06  Lokesh Bala   o Created
249 --
250 --------------------------------------------------------------------
251 
252 FUNCTION  CHECK_CALC_INV_EXISTS(p_var_rent_inv_id IN NUMBER,
253                                 p_var_rent_id IN NUMBER
254                                )
255 RETURN VARCHAR2 IS
256    -- Get the invoice date
257 CURSOR get_inv_date(p1_var_rent_inv_id IN NUMBER)
258 IS
259 SELECT invoice_date
260   FROM pn_var_rent_inv_all
261  WHERE var_rent_inv_id=p1_var_rent_inv_id;
262 
263   -- Get calculated invoices after this invoice
264 CURSOR calc_inv_exists(p1_inv_date IN DATE,p1_var_rent_id IN NUMBER)
265 IS
266 SELECT 'Y' calc_inv
267 FROM dual WHERE EXISTS
268 (SELECT *
269   FROM pn_var_rent_inv_all
270  WHERE var_rent_id=p1_var_rent_id
271    AND invoice_date > p1_inv_date);
272 
273 l_inv_date DATE := NULL;
274 l_dummy VARCHAR2(1) :=NULL;
275 
276 BEGIN
277 PNP_DEBUG_PKG.debug ('PNXVRENT_ABATEMENTS_CPG.CHECK_CALC_INV_EXISTS :'||' (+)');
278 
279 FOR get_inv_date_rec IN get_inv_date(p_var_rent_inv_id) LOOP
280    l_inv_date := get_inv_date_rec.invoice_date;
281 END LOOP;
282 FOR calc_inv_exists_rec IN calc_inv_exists(l_inv_date,p_var_rent_id)LOOP
283    l_dummy := calc_inv_exists_rec.calc_inv;
284 END LOOP;
285 RETURN l_dummy;
286 PNP_DEBUG_PKG.debug ('PNXVRENT_ABATEMENTS_CPG.CHECK_CALC_INV_EXISTS :'||' (-)');
287 END check_calc_inv_exists;
288 
289 --------------------------------------------------------------------
290 --
291 --  NAME         : ABTMT_EXISTS()
292 --  DESCRIPTION  :
293 --  PURPOSE      :
294 --  INVOKED FROM : KEY-COMMIT trigger at block level
295 --  ARGUMENTS    : NONE
296 --  REFERENCE    : PN_COMMON.debug()
297 --  HISTORY      :
298 --
299 --   27-NOV-06  Lokesh Bala   o Created
300 --
301 --------------------------------------------------------------------
302 
303 FUNCTION abtmt_exists(p_var_rentId      IN NUMBER,
304                       p_var_rent_inv_id IN NUMBER,
305                       p_pmt_term_id     IN NUMBER
306                      )
307 RETURN VARCHAR2 IS
308 -- Get the details of
309 CURSOR abtmt_exists_cur(p_var_rentId IN NUMBER,
310                         p_var_rent_inv_id IN NUMBER,
311                         p_pmt_term_id IN NUMBER)
312 IS
313   SELECT 'y'
314     FROM dual
315    WHERE exists ( select null from pn_var_abatements_all
316                   where var_rent_id=p_var_rentId AND
317                   var_rent_inv_id=p_var_rent_inv_id AND
318                   payment_term_id=p_pmt_term_id);
319 
320 l_abtmt_exists VARCHAR2(1):=NULL;
321 
322 BEGIN
323 PNP_DEBUG_PKG.debug ('PNXVRENT_ABATEMENTS_CPG.ABTMT_EXISTS :'||' (+)');
324 
325 OPEN abtmt_exists_cur(p_var_rentId ,p_var_rent_inv_id ,p_pmt_term_id );
326 FETCH abtmt_exists_cur INTO l_abtmt_exists;
327 CLOSE abtmt_exists_cur;
328 
329 RETURN l_abtmt_exists;
330 
331 PNP_DEBUG_PKG.debug ('PNXVRENT_ABATEMENTS_CPG.ABTMT_EXISTS :'||' (-)');
332 END abtmt_exists;
333 --------------------------------------------------------------------
334 --
335 --  NAME         : RESET_UPDATE_FLAG()
336 --  DESCRIPTION  :
337 --  PURPOSE      :
338 --  INVOKED FROM : ON-COMMIT trigger at form level
339 --  ARGUMENTS    : NONE
340 --  REFERENCE    : PN_COMMON.debug()
341 --  HISTORY      :
342 --
343 --   27-NOV-06  Lokesh Bala   o Created
344 --
345 --------------------------------------------------------------------
346 
347 PROCEDURE RESET_UPDATE_FLAG(p_var_rentId IN NUMBER,
348                             p_var_rent_inv_id IN NUMBER
349                            )
350 IS
351 -- Get the details of
352 CURSOR get_update_cur(p_var_rentId IN NUMBER,p_var_rent_inv_id IN NUMBER) IS
353   SELECT *
354     FROM pn_var_abatements_all
355    WHERE var_rent_id= p_var_rentId
356      AND var_rent_inv_id = p_var_rent_inv_id
357      AND update_flag = 'Y';
358 BEGIN
359 --
360 FOR get_update_rec IN get_update_cur(p_var_rentId,p_var_rent_inv_id) LOOP
361   PN_VAR_ABATEMENTS_PKG.UPDATE_ROW (
362   X_VAR_RENT_ID       =>  p_var_rentId  ,
363   X_VAR_RENT_INV_ID   => p_var_rent_inv_id,
364   X_PAYMENT_TERM_ID   => get_update_rec.PAYMENT_TERM_ID,
365   X_INCLUDE_TERM      => get_update_rec.INCLUDE_TERM ,
366   X_INCLUDE_INCREASES => get_update_rec.INCLUDE_INCREASES,
367   X_UPDATE_FLAG       => NULL,
368   X_LAST_UPDATE_DATE  => sysdate,
369   X_LAST_UPDATED_BY   => NVL(fnd_profile.value('USER_ID'),-1),
370   X_LAST_UPDATE_LOGIN => NVL(fnd_profile.value('USER_ID'),-1)
371   );
372 END LOOP;
373 
374 END RESET_UPDATE_FLAG;
375 
376 --------------------------------------------------------------------
377 --
378 --  NAME         : ROLL_FWD_ON_UPD()
379 --  DESCRIPTION  :
380 --  PURPOSE      :
381 --  INVOKED FROM : ON-UPDATE trigger at block level,ON-COMMIT trigger
382 --                 at form level
383 --  ARGUMENTS    : NONE
384 --  REFERENCE    : PN_COMMON.debug()
385 --  HISTORY      :
386 --
387 --   27-NOV-06  Lokesh Bala   o Created
388 --
389 --------------------------------------------------------------------
390 
391 PROCEDURE ROLL_FWD_ON_UPD(p_var_rentId      IN NUMBER,
392                           p_var_rent_inv_id IN NUMBER,
393                           p_pmt_term_id     IN NUMBER,
394                           flag              IN NUMBER
395                           )
396 IS
397 
398 l_inv_id            NUMBER :=NULL;
399 l_row_id            VARCHAR2(18):=NULL;
400 l_var_abmt_id       NUMBER :=NULL;
401 l_inv_dt            DATE :=NULL;
402 l_pmt_exists        VARCHAR2(2):=NULL;
403 l_abtmt_exists      VARCHAR2(2):=NULL;
404 
405 -- Get invoice date
406 CURSOR get_inv_dt(p_var_rent_inv_id IN NUMBER) IS
407   SELECT invoice_date
408     FROM pn_var_rent_inv_all
409    WHERE var_rent_inv_id=p_var_rent_inv_id;
410 
411 /*Cursor to get all invoices*/
412 CURSOR get_all_inv(p_var_rent_id IN NUMBER,l_invoice_dt IN DATE) IS
413   SELECT distinct gd1.invoice_date,decode(temp.inv_id,NULL,-1,temp.inv_id) v_inv_id
414     FROM pn_var_grp_dates_all gd1,
415     (SELECT gd.invoice_date inv_dt,vinv.var_rent_inv_id inv_id
416      FROM pn_var_grp_dates_all gd , pn_var_rent_inv_all vinv
417      WHERE vinv.var_rent_id=gd.var_rent_id
418      AND vinv.invoice_date=gd.invoice_date
419      AND vinv.period_id=gd.period_id
420      AND gd.var_rent_id=p_var_rent_id
421      AND vinv.adjust_num=0
422      ) temp
423     WHERE gd1.var_rent_id=p_var_rent_id
424     AND gd1.invoice_date=temp.inv_dt(+)
425     AND gd1.invoice_date>l_invoice_dt
426     ORDER BY gd1.invoice_date;
427 
428 
429 /*Cursor to check if a pmt term exists for a particular invoice*/
430 CURSOR check_pmt_terms(p_inv_id IN NUMBER,p_term_id IN NUMBER) IS
431   SELECT 'x' pterm_exists
432   FROM dual WHERE EXISTS
433   (SELECT  NULL
434   FROM pn_payment_terms_all pterm,
435      pn_var_rents_all vrent,
436      pn_var_rent_inv_all vinv
437   WHERE
438     vrent.lease_id = pterm.lease_id
439   AND vrent.var_rent_id = vinv.var_rent_id
440   AND pterm.start_date <=
441   (SELECT MAX(gd.grp_end_date)
442    FROM pn_var_grp_dates_all gd
443    WHERE gd.period_id = vinv.period_id
444    AND gd.invoice_date = vinv.invoice_date
445   )
446   AND pterm.end_date >=
447   (SELECT MIN(gd1.grp_start_date)
448    FROM pn_var_grp_dates_all gd1
449    WHERE gd1.period_id = vinv.period_id
450    AND gd1.invoice_date = vinv.invoice_date
451   )
452   AND pterm.var_rent_inv_id IS NULL
453   AND pterm.index_period_id IS NULL
454   AND vinv.adjust_num = 0
455   AND vinv.var_rent_inv_id=p_inv_id
456   AND pterm.payment_term_id=p_term_id);
457 
458 /*Cursor to check if an abtmt exists for a particular invoice*/
459 CURSOR check_abtmt_terms_inv(p_inv_id IN NUMBER,p_term_id IN NUMBER) IS
460   SELECT 'x' abatement_exists
461   FROM dual
462   WHERE EXISTS (SELECT  payment_term_id
463                 FROM pn_var_abatements_all
464                 WHERE var_rent_inv_id=p_inv_id
465                 AND payment_term_id=p_term_id);
466 
467 -- Get all abatement terms for an invoice with update_flag='Y'
468 CURSOR get_upd_terms(p_var_rentId IN NUMBER,p_var_rent_inv_id IN NUMBER) IS
469   SELECT payment_term_id,include_term,include_increases
470     FROM pn_var_abatements_all pva
471    WHERE pva.var_rent_id= p_var_rentId
472      AND pva.var_rent_inv_id = p_var_rent_inv_id
473      AND update_flag = 'Y';
474 
475 CURSOR org_cur(p_var_rentId IN NUMBER) IS
476   SELECT org_id
477   FROM   pn_var_rents_all
478   WHERE  var_rent_id =p_var_rentId;
479 
480 l_org_id NUMBER;
481 
482 BEGIN
483 
484 FOR rec IN org_cur(p_var_rentId) LOOP
485   l_org_id := rec.org_id;
486 END LOOP;
487 
488 --Get invoice date for the invoice id passed as parameter to this procedure
489 FOR get_inv_dt_rec IN get_inv_dt(p_var_rent_inv_id) LOOP
490   l_inv_dt := get_inv_dt_rec.invoice_date;
491 END LOOP;
492 
493 --Get all invoices with invoice_date > l_inv_dt
494 FOR get_inv_rec IN get_all_inv(p_var_rentId,l_inv_dt) LOOP
495   l_inv_id := get_inv_rec.v_inv_id;
496 
497 -- If gap exists between 2 invoices then stop roll forward
498   IF ( l_inv_id=-1 ) THEN
499     EXIT;
500   END IF;
501 
502 --Case 1 : p_pmt_term_id passed IS NULL , so roll fwd all abtmt terms with update_flag='y'
503   IF p_pmt_term_id IS NULL  THEN
504 
505     FOR upd_rec IN get_upd_terms(p_var_rentId ,p_var_rent_inv_id) LOOP
506 
507        l_pmt_exists:=NULL;
508        l_abtmt_exists:=NULL;
509 
510        FOR pmt_term_rec IN check_pmt_terms(l_inv_id,upd_rec.payment_term_id) LOOP
511          l_pmt_exists := pmt_term_rec.pterm_exists;
512        END LOOP;
513 
514        IF l_pmt_exists IS NOT NULL THEN
515 
516           FOR abtmt_rec IN check_abtmt_terms_inv(l_inv_id,upd_rec.payment_term_id) LOOP
517             l_abtmt_exists := abtmt_rec.abatement_exists;
518           END LOOP;
519 
520           IF  l_abtmt_exists IS NULL THEN
521             l_row_id := NULL;
522             l_var_abmt_id :=NULL;
523 
524             PN_VAR_ABATEMENTS_PKG.INSERT_ROW(
525             X_ROWID             => l_row_id,
526             X_VAR_ABATEMENT_ID  => l_var_abmt_id,
527             X_VAR_RENT_ID       => p_var_rentId,
528             X_VAR_RENT_INV_ID   => l_inv_id,
529             X_PAYMENT_TERM_ID   => upd_rec.payment_term_id,
530             X_INCLUDE_TERM      => upd_rec.include_term,
531             X_INCLUDE_INCREASES => upd_rec.include_increases,
532             X_UPDATE_FLAG       => NULL,
533             X_CREATION_DATE     => sysdate,
534             X_CREATED_BY        => NVL(fnd_profile.value('USER_ID'),-1),
535             X_LAST_UPDATE_DATE  => sysdate,
536             X_LAST_UPDATED_BY   => NVL(fnd_profile.value('USER_ID'),-1),
537             X_LAST_UPDATE_LOGIN => NVL(fnd_profile.value('USER_ID'),-1),
538             X_ORG_ID            => l_org_id  );
539 
540           ELSE
541              PN_VAR_ABATEMENTS_PKG.UPDATE_ROW(
542              X_VAR_RENT_ID       => p_var_rentId,
543              X_VAR_RENT_INV_ID   => l_inv_id,
544              X_PAYMENT_TERM_ID   => upd_rec.payment_term_id,
545              X_INCLUDE_TERM      => upd_rec.include_term,
546              X_INCLUDE_INCREASES => upd_rec.include_increases,
547              X_UPDATE_FLAG       => NULL,
548              X_LAST_UPDATE_DATE  => sysdate,
549              X_LAST_UPDATED_BY   => NVL(fnd_profile.value('USER_ID'),-1),
550              X_LAST_UPDATE_LOGIN => NVL(fnd_profile.value('USER_ID'),-1));
551           END IF;
552        END IF;
553     END LOOP;
554 
555  --Case 2   : p_pmt_term_id IS NOT NULL and flag=0 , candidate for delete_row
556   ELSIF flag=0  THEN
557 
558     l_pmt_exists:=NULL;
559     l_abtmt_exists:=NULL;
560 
561     FOR pmt_term_rec IN check_pmt_terms(l_inv_id,p_pmt_term_id) LOOP
562       l_pmt_exists := pmt_term_rec.pterm_exists;
563     END LOOP;
564 
565     IF   l_pmt_exists IS NOT NULL THEN
566       FOR abtmt_rec IN check_abtmt_terms_inv(l_inv_id,p_pmt_term_id) LOOP
567          l_abtmt_exists := abtmt_rec.abatement_exists;
568       END LOOP;
569 
570       IF  l_abtmt_exists IS NOT NULL THEN
571 
572          PN_VAR_ABATEMENTS_PKG.DELETE_ROW(
573             X_VAR_RENT_ID       =>  p_var_rentId,
574             X_VAR_RENT_INV_ID   =>  l_inv_id,
575             X_PAYMENT_TERM_ID   =>  p_pmt_term_id);
576 
577       END IF;
578     END IF;
579 
580 
581   END IF;
582 
583 END LOOP;
584 
585 PNP_DEBUG_PKG.debug ('PNXVRENT_ABATEMENTS_CPG.ROLL_FWD_ON_UPD :'||' (-)');
586 
587 END ROLL_FWD_ON_UPD;
588 --------------------------------------------------------------------
589 --
590 --  NAME         : get_include_term()
591 --  DESCRIPTION  :
592 --  PURPOSE      :
593 --  INVOKED FROM : form view of ABATEMENTS_BLK
594 --  ARGUMENTS    : NONE
595 --  REFERENCE    : PN_COMMON.debug()
596 --  HISTORY      :
597 --
598 --   27-NOV-06  Lokesh Bala   o Created
599 --
600 --------------------------------------------------------------------
601 
602 FUNCTION get_include_term(p_payment_term_id IN NUMBER,
603                           p_var_rent_inv_id IN NUMBER,
604                           p_var_rent_id IN NUMBER
605                           )
606 RETURN VARCHAR2 IS
607 -- Get the details of
608 CURSOR incl_term_cur(p_payment_term_id IN NUMBER,p_var_rent_inv_id IN NUMBER,
609                      p_var_rent_id IN NUMBER) IS
610   SELECT include_term
611     FROM pn_var_abatements_all
612    WHERE var_rent_id=p_var_rent_id
613      AND payment_term_id=p_payment_term_id
614      AND var_rent_inv_id=p_var_rent_inv_id;
615 
616 l_incl_term VARCHAR2(1):='N';
617 
618 BEGIN
619   OPEN incl_term_cur(p_payment_term_id,p_var_rent_inv_id,p_var_rent_id);
620   FETCH incl_term_cur INTO l_incl_term;
621     IF (incl_term_cur%notfound OR l_incl_term IS NULL) THEN
622         l_incl_term := 'N';
623     END IF;
624   CLOSE incl_term_cur;
625 
626   RETURN l_incl_term;
627 
628 EXCEPTION
629 WHEN no_data_found THEN
630 RETURN 'N';
631 END get_include_term;
632 --------------------------------------------------------------------
633 --
634 --  NAME         : get_include_increases()
635 --  DESCRIPTION  :
636 --  PURPOSE      :
637 --  INVOKED FROM : form view of ABATEMENTS_BLK
638 --  ARGUMENTS    : NONE
639 --  REFERENCE    : PN_COMMON.debug()
640 --  HISTORY      :
641 --
642 --   27-NOV-06  Lokesh Bala   o Created
643 --
644 --------------------------------------------------------------------
645 
646 FUNCTION get_include_increases(p_payment_term_id IN NUMBER,
647                                p_var_rent_inv_id IN NUMBER,
648                                p_var_rent_id IN NUMBER)
649 RETURN VARCHAR2 IS
650 -- Get the details of
651 CURSOR incl_increases_cur(p_payment_term_id IN NUMBER,p_var_rent_inv_id IN NUMBER,
652                           p_var_rent_id IN NUMBER) IS
653   SELECT include_increases
654     FROM pn_var_abatements_all
655    WHERE var_rent_id=p_var_rent_id
656      AND payment_term_id=p_payment_term_id
657      AND var_rent_inv_id=p_var_rent_inv_id;
658 l_incl_incr VARCHAR2(1):='N';
659 
660 BEGIN
661   OPEN incl_increases_cur(p_payment_term_id,p_var_rent_inv_id,p_var_rent_id);
662   FETCH incl_increases_cur INTO l_incl_incr;
663     IF (incl_increases_cur%notfound OR l_incl_incr IS NULL) THEN
664         l_incl_incr := 'N';
665     END IF;
666   CLOSE incl_increases_cur;
667 
668   RETURN l_incl_incr;
669 
670 EXCEPTION
671 WHEN no_data_found THEN
672 RETURN 'N';
673 END get_include_increases;
674 --------------------------------------------------------------------
675 --
676 --  NAME         : ROLL_FWD_FST_ON_UPD()
677 --  DESCRIPTION  :
678 --  PURPOSE      :
679 --  INVOKED FROM : ON-UPDATE trigger at block level,ON-COMMIT trigger
680 --                 at form level for 1st partial period
681 --  ARGUMENTS    : NONE
682 --  REFERENCE    : PN_COMMON.debug()
683 --  HISTORY      :
684 --
685 --   27-NOV-06  Lokesh Bala   o Created
686 --
687 --------------------------------------------------------------------
688 PROCEDURE ROLL_FWD_FST_ON_UPD(p_var_rentId IN NUMBER,
689                               p_var_rent_inv_id IN NUMBER,
690                               p_pmt_term_id IN NUMBER,
691                               flag IN NUMBER
692                               )
693 IS
694 l_inv_id            NUMBER :=NULL;
695 l_row_id            ROWID  :=NULL;
696 l_var_abmt_id       NUMBER :=NULL;
697 l_inv_dt            DATE :=NULL;
698 l_pmt_exists        VARCHAR2(2):=NULL;
699 l_abtmt_exists      VARCHAR2(2):=NULL;
700 
701 /*Cursor to get all invoices from 2nd annual period*/
702 CURSOR get_all_inv(p_var_rent_id IN NUMBER) IS
703   SELECT distinct gd1.invoice_date,decode(temp.inv_id,NULL,-1,temp.inv_id) v_inv_id
704     FROM pn_var_grp_dates_all gd1,
705          pn_var_periods_all vp,
706     (SELECT gd.invoice_date inv_dt,vinv.var_rent_inv_id inv_id
707      FROM pn_var_grp_dates_all gd , pn_var_rent_inv_all vinv
708      WHERE vinv.var_rent_id=gd.var_rent_id
709      AND vinv.invoice_date=gd.invoice_date
710      AND vinv.period_id=gd.period_id
711      AND gd.var_rent_id=p_var_rent_id
712      AND adjust_num=0
713     ) temp
714      WHERE gd1.var_rent_id=p_var_rent_id
715      AND gd1.invoice_date=temp.inv_dt(+)
716      AND gd1.period_id=vp.period_id
717      AND vp.period_num >1
718      --AND gd1.invoice_date>l_invoice_dt
719      ORDER BY gd1.invoice_date;
720 
721 /*Cursor to check if a pmt term exists for a particular invoice*/
722 CURSOR check_pmt_terms(p_inv_id IN NUMBER,p_term_id IN NUMBER) IS
723   SELECT 'x' pterm_exists
724   FROM dual WHERE EXISTS
725   (SELECT  NULL
726   FROM pn_payment_terms_all pterm,
727      pn_var_rents_all vrent,
728      pn_var_rent_inv_all vinv
729   WHERE
730     vrent.lease_id = pterm.lease_id
731   AND vrent.var_rent_id = vinv.var_rent_id
732   AND pterm.start_date <=
733   (SELECT MAX(gd.grp_end_date)
734    FROM pn_var_grp_dates_all gd
735    WHERE gd.period_id = vinv.period_id
736    AND gd.invoice_date = vinv.invoice_date
737   )
738   AND pterm.end_date >=
739   (SELECT MIN(gd1.grp_start_date)
740    FROM pn_var_grp_dates_all gd1
741    WHERE gd1.period_id = vinv.period_id
742    AND gd1.invoice_date = vinv.invoice_date
743   )
744   AND pterm.var_rent_inv_id IS NULL
745   AND pterm.index_period_id IS NULL
746   AND vinv.adjust_num = 0
747   AND vinv.var_rent_inv_id=p_inv_id
748   AND pterm.payment_term_id=p_term_id);
749 
750 /*Cursor to check if an abtmt exists for a particular invoice*/
751 CURSOR check_abtmt_terms_inv(p_inv_id IN NUMBER,p_term_id IN NUMBER) IS
752   SELECT 'x' abatement_exists
753   FROM dual
754   WHERE exists (select  payment_term_id
755   FROM pn_var_abatements_all
756   WHERE var_rent_inv_id=p_inv_id
757   AND payment_term_id=p_term_id);
758 
759 -- Get all abatement terms for an invoice with update_flag='Y'
760 CURSOR get_upd_terms(p_var_rentId IN NUMBER,p_var_rent_inv_id IN NUMBER) IS
761   SELECT payment_term_id,include_term,include_increases
762     FROM pn_var_abatements_all pva
763    WHERE pva.var_rent_id= p_var_rentId
764      AND pva.var_rent_inv_id = p_var_rent_inv_id
765      AND update_flag = 'Y';
766 
767 CURSOR org_cur(p_var_rentId IN NUMBER) IS
768   SELECT org_id
769   FROM   pn_var_rents_all
770   WHERE  var_rent_id =p_var_rentId;
771 
772 l_org_id NUMBER;
773 
774 BEGIN
775 pnp_debug_pkg.debug ('PNXVRENT_ABATEMENTS_CPG.ROLL_FWD_FST_ON_UPD :'||' (+)');
776 FOR rec IN org_cur(p_var_rentId) LOOP
777     l_org_id := rec.org_id;
778 END LOOP;
779 
780 /* Get all invoices from 2nd annual period*/
781 FOR get_inv_rec IN get_all_inv(p_var_rentId) LOOP
782   l_inv_id := get_inv_rec.v_inv_id;
783 
784 -- If gap exists between 2 invoices then stop roll forward
785   IF ( l_inv_id=-1 ) THEN
786     EXIT;
787   END IF;
788 
789 --Case 1 : p_pmt_term_id passed IS NULL , so roll fwd all abtmt terms with update_flag='y'
790   IF p_pmt_term_id IS NULL  THEN
791 
792     FOR upd_rec IN get_upd_terms(p_var_rentId ,p_var_rent_inv_id) LOOP
793 
794        l_pmt_exists:=NULL;
795        l_abtmt_exists:=NULL;
796 
797        FOR pmt_term_rec IN check_pmt_terms(l_inv_id,upd_rec.payment_term_id) LOOP
798          l_pmt_exists := pmt_term_rec.pterm_exists;
799        END LOOP;
800 
801        IF l_pmt_exists IS NOT NULL THEN
802 
803           FOR abtmt_rec IN check_abtmt_terms_inv(l_inv_id,upd_rec.payment_term_id) LOOP
804             l_abtmt_exists := abtmt_rec.abatement_exists;
805           END LOOP;
806 
807           IF  l_abtmt_exists IS NULL THEN
808             l_row_id := NULL;
809             l_var_abmt_id :=NULL;
810 
811             PN_VAR_ABATEMENTS_PKG.INSERT_ROW(
812             X_ROWID             => l_row_id,
813             X_VAR_ABATEMENT_ID  => l_var_abmt_id,
814             X_VAR_RENT_ID       => p_var_rentId,
815             X_VAR_RENT_INV_ID   => l_inv_id,
816             X_PAYMENT_TERM_ID   => upd_rec.payment_term_id,
817             X_INCLUDE_TERM      => upd_rec.include_term,
818             X_INCLUDE_INCREASES => upd_rec.include_increases,
819             X_UPDATE_FLAG       => NULL,
820             X_CREATION_DATE     => sysdate,
821             X_CREATED_BY        => NVL(fnd_profile.value('USER_ID'),-1),
822             X_LAST_UPDATE_DATE  => sysdate,
823             X_LAST_UPDATED_BY   => NVL(fnd_profile.value('USER_ID'),-1),
824             X_LAST_UPDATE_LOGIN => NVL(fnd_profile.value('USER_ID'),-1),
825             X_ORG_ID            => l_org_id  );
826 
827           ELSE
828              PN_VAR_ABATEMENTS_PKG.UPDATE_ROW(
829              X_VAR_RENT_ID       => p_var_rentId,
830              X_VAR_RENT_INV_ID   => l_inv_id,
831              X_PAYMENT_TERM_ID   => upd_rec.payment_term_id,
832              X_INCLUDE_TERM      => upd_rec.include_term,
833              X_INCLUDE_INCREASES => upd_rec.include_increases,
834              X_UPDATE_FLAG       => NULL,
835              X_LAST_UPDATE_DATE  => sysdate,
836              X_LAST_UPDATED_BY   => NVL(fnd_profile.value('USER_ID'),-1),
837              X_LAST_UPDATE_LOGIN => NVL(fnd_profile.value('USER_ID'),-1));
838           END IF;
839        END IF;
840     END LOOP;
841 
842  --Case 2   : p_pmt_term_id IS NOT NULL and flag=0 , candidate for delete_row
843   ELSIF flag=0  THEN
844 
845     l_pmt_exists:=NULL;
846     l_abtmt_exists:=NULL;
847 
848     FOR pmt_term_rec IN check_pmt_terms(l_inv_id,p_pmt_term_id) LOOP
849        l_pmt_exists := pmt_term_rec.pterm_exists;
850     END LOOP;
851 
852     IF   l_pmt_exists IS NOT NULL THEN
853       FOR abtmt_rec IN check_abtmt_terms_inv(l_inv_id,p_pmt_term_id) LOOP
854          l_abtmt_exists := abtmt_rec.abatement_exists;
855       END LOOP;
856 
857       IF  l_abtmt_exists IS NOT NULL THEN
858 
859          PN_VAR_ABATEMENTS_PKG.DELETE_ROW(
860             X_VAR_RENT_ID       => p_var_rentId,
861             X_VAR_RENT_INV_ID  =>  l_inv_id,
862             X_PAYMENT_TERM_ID  =>  p_pmt_term_id);
863 
864       END IF;
865     END IF;
866 
867   END IF;
868 
869 END LOOP;
870 pnp_debug_pkg.debug ('PNXVRENT_ABATEMENTS_CPG.ROLL_FWD_FST_ON_UPD :'||' (-)');
871 
872 END ROLL_FWD_FST_ON_UPD;
873 
874 FUNCTION CHECK_TRUE_UP_INVOICE(p_var_rent_inv_id IN NUMBER)
875 RETURN  VARCHAR2
876 IS
877 --------------------------------------------------------------------
878 --
879 --  NAME         : CHECK_TRUE_UP_INVOICE
880 --  DESCRIPTION  :
881 --  PURPOSE      :
882 --  INVOKED FROM : WHEN-BUTTON-PRESSED on PERIODS_INV_BLK.ABT_DETAILS_BTN
883 --  ARGUMENTS    : NONE
884 --  REFERENCE    : PN_COMMON.debug()
885 --  HISTORY      :
886 --   02-JUL-2007   lbala  o Determines whether it is a true-up invoice or not
887 --------------------------------------------------------------------
888 
889 -- Get the details of
890 CURSOR get_true_up_cur
891 IS
892   SELECT 'Y' as true_up_flag
893   FROM dual
894   WHERE EXISTS(SELECT NULL
895                FROM pn_var_rent_inv_all
896                WHERE var_rent_inv_id = p_var_rent_inv_id
897                AND true_up_amt IS NOT NULL
898                );
899 l_true_up_flag VARCHAR2(1) := 'N';
900 
901 BEGIN
902 
903   FOR rec IN  get_true_up_cur LOOP
904     l_true_up_flag := rec.true_up_flag ;
905   END LOOP;
906 
907   RETURN l_true_up_flag;
908 
909 EXCEPTION
910   WHEN others THEN
911     NULL;
912 END CHECK_TRUE_UP_INVOICE;
913 
914 END PN_VAR_ABATEMENTS_PKG;