DBA Data[Home] [Help]

PACKAGE BODY: APPS.PN_VAR_TRUEUP_PKG

Source


1 PACKAGE BODY PN_VAR_TRUEUP_PKG AS
2 -- $Header: PNVRTRPB.pls 120.0 2007/10/03 14:29:47 rthumma noship $
3 
4 TYPE two_nums_rec IS RECORD(
5     period_id NUMBER,
6     amount NUMBER);
7 TYPE NUM_T IS TABLE OF TWO_NUMS_REC INDEX BY BINARY_INTEGER;
8 G_ABATEMENT_APPLIED NUM_T;
9 G_ALLOWANCE_APPLIED NUM_T;
10 G_UNABATED_RENT NUM_T;
11 G_ABATED_RENT NUM_T;
12 G_TOT_ABATEMENT NUM_T;
13 G_IS_TU_CONC_FLAG VARCHAR2(1) := 'T'; /*Is this called as a result of calculate or of true up?*/
14 g_precision       NUMBER;
15 
16 --------------------------------------------------------------------------------
17 --  NAME         : can_do_trueup
18 --  DESCRIPTION  :
19 --  PURPOSE      :
20 --  INVOKED FROM :
21 --  ARGUMENTS    :
22 --  REFERENCE    : PN_COMMON.debug()
23 --  HISTORY      :
24 --  dd-mon-yyyy  name     o Created
25 --------------------------------------------------------------------------------
26 FUNCTION can_do_trueup( p_var_rent_id IN NUMBER
27                        ,p_period_id   IN NUMBER)
28 RETURN BOOLEAN IS
29 
30   l_exists_trx            BOOLEAN;
31   l_exists_approved_sales BOOLEAN;
32 
33   /* check if trx exists */
34   CURSOR trx_exists_c( p_vr_id IN NUMBER
35                       ,p_prd_id IN NUMBER) IS
36     SELECT 1 FROM DUAL WHERE EXISTS
37      (SELECT
38       trx_header_id
39       FROM
40       pn_var_trx_headers_all
41       WHERE
42       var_rent_id = p_vr_id AND
43       period_id = p_prd_id AND
44       reporting_group_sales IS NOT NULL);
45 
46   /* exists approved sales? */
47   CURSOR approved_sales_c( p_vr_id IN NUMBER
48                           ,p_prd_id IN NUMBER) IS
49     SELECT
50     invoice_date
51     FROM
52     pn_var_grp_dates_all g,
53     pn_var_periods_all   p
54     WHERE
55     g.var_rent_id = p_vr_id AND
56     g.period_id   = p_prd_id AND
57     g.period_id   = p.period_id AND
58     g.grp_end_date <= p.end_date
59     MINUS
60     SELECT
61     g.invoice_date
62     FROM
63     pn_var_trx_headers_all t,
64     pn_var_grp_dates_all g,
65     pn_var_periods_all   p
66     WHERE
67     t.grp_date_id = g.grp_date_id AND
68     t.var_rent_id = p_vr_id AND
69     t.period_id = p_prd_id AND
70     t.period_id = p.period_id AND
71     g.grp_end_date <= p.end_date AND
72     t.reporting_group_sales IS NOT NULL;
73 
74 BEGIN
75 
76   l_exists_approved_sales := FALSE;
77   l_exists_trx            := FALSE;
78 
79   FOR rec IN trx_exists_c( p_vr_id  => p_var_rent_id
80                           ,p_prd_id => p_period_id) LOOP
81 
82     l_exists_approved_sales := TRUE;
83     l_exists_trx            := TRUE;
84 
85     EXIT;
86 
87   END LOOP;
88 
89   IF l_exists_trx THEN
90 
91     FOR rec IN approved_sales_c( p_vr_id  => p_var_rent_id
92                                 ,p_prd_id => p_period_id) LOOP
93 
94       l_exists_approved_sales := FALSE;
95       EXIT;
96 
97     END LOOP;
98 
99   END IF;
100 
101   RETURN l_exists_approved_sales;
102 
103 EXCEPTION
104   WHEN OTHERS THEN RAISE;
105 
106 END can_do_trueup;
107 
108 --------------------------------------------------------------------------------
109 --  NAME         : post_summary_trueup - global procedure
110 --  DESCRIPTION  :
111 --  PURPOSE      :
112 --  INVOKED FROM :
113 --  ARGUMENTS    :
114 --  REFERENCE    : PN_COMMON.debug()
115 --  HISTORY      :
116 --
117 --  dd-mon-yyyy  name     o Created
118 --  23-MAY-2007  Lokesh   o Added rounding off for Bug # 6031202 for
119 --                          trueup_var_rent
120 --------------------------------------------------------------------------------
121 PROCEDURE post_summary_trueup ( p_var_rent_id IN NUMBER
122                                ,p_period_id   IN NUMBER
123                                ,p_proration_rule IN VARCHAR2)
124 IS
125 
126   /* get all lines to post summary for */
127   CURSOR trueup_rent_c( p_vr_id  IN NUMBER
128                        ,p_prd_id IN NUMBER) IS
129     SELECT
130      NVL(SUM(percent_rent_due),0)  AS billed_rent
131     ,NVL(SUM(trueup_rent_due),0)   AS trueup_rent
132     ,MAX(calc_prd_end_date)        AS trueup_date
133     ,line_item_id
134     FROM
135     pn_var_trx_headers_all
136     WHERE
137     var_rent_id = p_vr_id AND
138     period_id = p_prd_id
139     GROUP BY
140     line_item_id
141     ORDER BY
142     line_item_id;
143 
144   /* get the billed rent for first partial period */
145   CURSOR first_period_c( p_vr_id     IN NUMBER) IS
146     SELECT
147      NVL(SUM(percent_rent_due),0)  AS billed_rent
148     ,line_item_id
149     FROM
150     pn_var_periods_all prd,
151     pn_var_rents_all   var,
152     pn_var_trx_headers_all trx
153     WHERE
154     prd.var_rent_id = p_vr_id AND
155     prd.var_rent_id = var.var_rent_id AND
156     prd.start_date =  var.commencement_date AND
157     trx.var_rent_id = prd.var_rent_id AND
158     trx.period_id = prd.period_id
159     GROUP BY
160     trx.line_item_id
161     ORDER BY
162     trx.line_item_id;
163 
164   /* Fetch the second year period id */
165   CURSOR second_yr_cur (p_vr_id     IN NUMBER) IS
166     SELECT
167     period_id
168     FROM
169     pn_var_periods_all prd
170     WHERE
171     prd.var_rent_id = p_vr_id AND
172     prd.period_num = 2;
173 
174 
175   l_vr_summ_id NUMBER;
176   l_billed_rent_fst_yr NUMBER := 0;
177   l_billed_rent        NUMBER := 0;
178   l_second_yr_id       NUMBER;
179 
180 BEGIN
181 
182   pnp_debug_pkg.log('post_summary_trueup (+) .... ');
183 
184   FOR trueup_rec IN trueup_rent_c( p_vr_id  => p_var_rent_id
185                                   ,p_prd_id => p_period_id)
186   LOOP
187 
188     l_billed_rent := trueup_rec.billed_rent;
189     pnp_debug_pkg.log('l_billed_rent:'||l_billed_rent);
190     /* Note:
191        Handling to take the rent for first year in account
192        while calculating the true up for second year in CYNP
193        and CYP */
194     IF  p_proration_rule IN  (pn_var_rent_calc_pkg.G_PRORUL_CYP
195                             ,pn_var_rent_calc_pkg.G_PRORUL_CYNP) THEN
196 
197 
198        /* Fetch the details for the first partial year */
199       FOR first_period_rec IN  first_period_c(p_vr_id  => p_var_rent_id) LOOP
200         l_billed_rent_fst_yr := first_period_rec.billed_rent;
201       END LOOP;
202 
203       /* Fetch the period id for second period */
204       FOR second_yr_rec IN second_yr_cur(p_vr_id  => p_var_rent_id) LOOP
205         l_second_yr_id := second_yr_rec.period_id;
206       END LOOP;
207 
208       IF l_second_yr_id = p_period_id THEN
209         l_billed_rent := l_billed_rent + l_billed_rent_fst_yr;
210       END IF;
211 
212     END IF;
213 
214     pnp_debug_pkg.log('l_billed_rent:'||l_billed_rent);
215     pnp_debug_pkg.log('trup_rent:'||trueup_rec.trueup_rent);
216 
217     UPDATE
218     pn_var_rent_summ_all
219     SET
220     trueup_var_rent = 0
221     WHERE
222     var_rent_id  = p_var_rent_id AND
223     period_id    = p_period_id AND
224     line_item_id = trueup_rec.line_item_id;
225 
226     UPDATE
227     pn_var_rent_summ_all
228     SET
229     trueup_var_rent = round((trueup_rec.trueup_rent - l_billed_rent), g_precision)
230     WHERE
231     var_rent_id  = p_var_rent_id AND
232     period_id    = p_period_id AND
233     line_item_id = trueup_rec.line_item_id AND
234     grp_date_id  = (SELECT
235                     grp_date_id
236                     FROM
237                     pn_var_grp_dates_all
238                     WHERE
239                     period_id = p_period_id AND
240                     grp_end_date = trueup_rec.trueup_date)
241     RETURNING
242     var_rent_summ_id
243     INTO
244     l_vr_summ_id;
245 
246   END LOOP;
247 
248 EXCEPTION
249   WHEN OTHERS THEN RAISE;
250 
251 END post_summary_trueup;
252 
253 --------------------------------------------------------------------------------
254 --  NAME         : insert_invoice_trueup
255 --  DESCRIPTION  :
256 --  PURPOSE      :
257 --  INVOKED FROM :
258 --  ARGUMENTS    :
259 --  REFERENCE    : PN_COMMON.debug()
260 --  HISTORY      :
261 --
262 --  dd-mon-yyyy  name     o Created
263 --------------------------------------------------------------------------------
264 PROCEDURE insert_invoice_trueup( p_var_rent_id IN NUMBER
265                                 ,p_period_id   IN NUMBER) IS
266 
267   /* get invoice dates for a period */
268   CURSOR trueup_inv_dates_c( p_vr_id  IN NUMBER
269                             ,p_prd_id IN NUMBER
270                             ,p_new_termn_date DATE) IS
271     SELECT
272      MAX(invoice_date)            AS trueup_invoice_date
273     ,NVL(SUM(tot_act_vol), 0)     AS total_actual_sales
274     ,NVL(SUM(trueup_var_rent), 0) AS total_trueup_rent
275     FROM
276     pn_var_rent_summ_all
277     WHERE
278     var_rent_id = p_vr_id AND
279     period_id = p_prd_id  AND
280     invoice_date <= p_new_termn_date;
281 
282   /* get latest invoice */
283   CURSOR trueup_invoice2upd_c( p_vr_id  IN NUMBER
284                               ,p_prd_id IN NUMBER
285                               ,p_inv_dt IN DATE) IS
286     SELECT
287      var_rent_inv_id
288     ,var_rent_id
289     ,period_id
290     ,invoice_date
291     ,adjust_num
292     ,true_up_status
293     ,true_up_exp_code
294     ,true_up_amt
295     ,tot_act_vol
296     ,act_per_rent
297     ,actual_invoiced_amount
298     ,rec_abatement_override
299     FROM
300     pn_var_rent_inv_all
301     WHERE
302     var_rent_id = p_vr_id AND
303     period_id = p_prd_id AND
304     invoice_date = p_inv_dt AND
305     /*true_up_amt <> 0 AND*/
306     true_up_status IS NOT NULL AND
307     true_up_exp_code IS NOT NULL
308     ORDER BY adjust_num DESC;
309 
310   /* get the period rent */
311   CURSOR period_rent_c ( p_vr_id  IN NUMBER
312                         ,p_prd_id IN NUMBER) IS
313     SELECT
314      NVL(SUM(act_var_rent), 0)    AS total_period_rent
315     ,NVL(SUM(trueup_var_rent), 0) AS total_trueup_rent
316     FROM
317     pn_var_rent_summ_all
318     WHERE
319     var_rent_id = p_vr_id AND
320     period_id = p_prd_id;
321 
322   l_total_period_rent NUMBER;
323   l_total_period_unabt_rent NUMBER;
324 
325   /* get latest invoice */
326   CURSOR prev_invoiced_c( p_vr_id  IN NUMBER
327                          ,p_prd_id IN NUMBER) IS
328     SELECT
329     NVL(SUM(actual_invoiced_amount), 0) AS prev_inv_trueup_amt
330     FROM
331     pn_var_rent_inv_all
332     WHERE
333     var_rent_id = p_vr_id AND
334     period_id = p_prd_id AND
335     (true_up_amt IS NULL OR true_up_exp_code = 'Y');
336 
337   l_invoice_on           VARCHAR2(30);
338   l_row_id               ROWID;
339   l_var_rent_inv_id      NUMBER;
340   l_max_adjust_num       NUMBER;
341   l_prev_inv_trueup_rent NUMBER;
342   l_curr_inv_trueup_rent NUMBER;
343   l_rec_abatement_override NUMBER;
344   /* get ORG ID */
345   CURSOR org_c(p_vr_id IN NUMBER) IS
346     SELECT org_id, termination_date
347       FROM pn_var_rents_all
348      WHERE var_rent_id = p_vr_id;
349 
350   l_org_id NUMBER;
351 
352 
353 
354   l_exists_invoice BOOLEAN;
355   l_abated_rent    NUMBER;
356   l_tot_abatement  NUMBER;
357   l_allowance      NUMBER;
358   l_precision      NUMBER;
359   l_tot_period_rent NUMBER := NULL;
360   l_vr_termination_date DATE;
361 
362 BEGIN
363   pnp_debug_pkg.log('+++++++Insert_invoice_trueup++++++++');
364   FOR vr_rec IN org_c(p_vr_id => p_var_rent_id) LOOP
365     l_org_id := vr_rec.org_id;
366     l_vr_termination_date := vr_rec.termination_date;
367   END LOOP;
368 
369   l_precision := nvl(pn_var_rent_calc_pkg.get_currency_precision(l_org_id),4);
370   pnp_debug_pkg.log('l_precision:'||l_precision);
371   FOR i IN 1..G_ABATED_RENT.COUNT LOOP
372      IF G_ABATED_RENT(i).period_id = p_period_id THEN
373         l_total_period_rent := G_ABATED_RENT(i).AMOUNT;
374         EXIT;
375      END IF;
376 
377   END LOOP;
378 
379   FOR i IN 1..G_UNABATED_RENT.COUNT LOOP
380      IF G_UNABATED_RENT(i).period_id = p_period_id THEN
381         l_total_period_unabt_rent := G_UNABATED_RENT(i).AMOUNT;
382         EXIT;
383      END IF;
384   END LOOP;
385 
386   --
387   FOR i IN 1..G_TOT_ABATEMENT.COUNT  LOOP
388      IF G_TOT_ABATEMENT(i).period_id = p_period_id THEN
389         l_tot_abatement := G_TOT_ABATEMENT(i).AMOUNT;
390         EXIT;
391      END IF;
392   END LOOP;
393 
394   FOR i IN 1..G_ALLOWANCE_APPLIED.COUNT  LOOP
395      IF G_ALLOWANCE_APPLIED(i).period_id = p_period_id THEN
396         l_allowance := G_ALLOWANCE_APPLIED(i).AMOUNT;
397         EXIT;
398      END IF;
399   END LOOP;
400 
401   pnp_debug_pkg.log('s** l_total_period_rent'||l_total_period_rent);
402 /*  FOR summ_rec IN period_rent_c ( p_vr_id  => p_var_rent_id
403                                  ,p_prd_id => p_period_id)
404   LOOP
405     l_total_period_rent
406       := summ_rec.total_period_rent + summ_rec.total_trueup_rent;
407   END LOOP;
408 */
409 
410 
411 
412   /* loop for all invoice dates in the period */
413   FOR inv_rec IN trueup_inv_dates_c( p_vr_id  => p_var_rent_id
414                                     ,p_prd_id => p_period_id
415                                     ,p_new_termn_date => l_vr_termination_date)
416   LOOP
417 
418     l_row_id               := NULL;
419     l_var_rent_inv_id      := NULL;
420     l_max_adjust_num       := 0;
421     l_prev_inv_trueup_rent := 0;
422     l_curr_inv_trueup_rent := 0;
423     l_exists_invoice       := FALSE;
424 
425 
426     /* check if there exists an invoice for this invoice date */
427     FOR inv2upd_rec IN trueup_invoice2upd_c ( p_vr_id  => p_var_rent_id
428                                              ,p_prd_id => p_period_id
429                                              ,p_inv_dt => inv_rec.trueup_invoice_date)
430     LOOP
431 
432       /* invoice exists - we only look at the last invoice */
433       l_exists_invoice := TRUE;
434       l_rec_abatement_override := inv2upd_rec.rec_abatement_override;
435       /* invoice updateable? */
436       IF NVL(inv2upd_rec.true_up_exp_code, 'N') <> 'Y' THEN
437 
438         /* updateable */
439         l_var_rent_inv_id      := inv2upd_rec.var_rent_inv_id;
440         l_max_adjust_num       := inv2upd_rec.adjust_num;
441         l_curr_inv_trueup_rent := inv2upd_rec.actual_invoiced_amount;
442       ELSIF NVL(inv2upd_rec.true_up_exp_code, 'N') = 'Y' THEN
443 
444         /* NON - updateable */
445         l_var_rent_inv_id      := NULL;
446         l_max_adjust_num       := inv2upd_rec.adjust_num + 1;
447         l_curr_inv_trueup_rent := 0;
448         l_tot_period_rent := inv2upd_rec.act_per_rent;
449 
450       END IF; /* invoice updateable? */
451 
452       /* we only look at the last invoice - important to exit here */
453       EXIT;
454 
455     END LOOP; /* check if there exists an invoice for this invoice date */
456 
457 
458     /* get the previously billed amount from approved invoices */
459     FOR prev_inv_rec IN prev_invoiced_c( p_vr_id  => p_var_rent_id
460                                         ,p_prd_id => p_period_id)
461     LOOP
462       l_prev_inv_trueup_rent := prev_inv_rec.prev_inv_trueup_amt;
463     END LOOP;
464 
465     /* atleast one invoice exists? */
466     IF NOT l_exists_invoice AND
467        (round(l_total_period_rent, l_precision)- round(l_prev_inv_trueup_rent, l_precision)) <> 0  THEN
468 
469       /* first time for this invoice date - create invoice */
470       pn_var_rent_inv_pkg.insert_row
471       ( x_rowid                   => l_row_id
472        ,x_var_rent_inv_id         => l_var_rent_inv_id
473        ,x_adjust_num              => l_max_adjust_num
474        ,x_invoice_date            => inv_rec.trueup_invoice_date
475        ,x_for_per_rent            => NULL
476        ,x_tot_act_vol             => inv_rec.total_actual_sales
477        ,x_act_per_rent            => l_total_period_unabt_rent
478        ,x_constr_actual_rent      => l_total_period_unabt_rent
479        ,x_abatement_appl          => l_allowance
480        ,x_rec_abatement           => l_tot_abatement
481        ,x_rec_abatement_override  => l_rec_abatement_override
482        ,x_negative_rent           => 0
483        ,x_actual_invoiced_amount  => l_total_period_rent - l_prev_inv_trueup_rent
484        ,x_period_id               => p_period_id
485        ,x_var_rent_id             => p_var_rent_id
486        ,x_forecasted_term_status  => 'N'
487        ,x_variance_term_status    => 'N'
488        ,x_actual_term_status      => 'N'
489        ,x_forecasted_exp_code     => 'N'
490        ,x_variance_exp_code       => 'N'
491        ,x_actual_exp_code         => 'N'
492        ,x_comments                => 'created invoice'
493        ,x_attribute_category      => NULL
494        ,x_attribute1              => NULL
495        ,x_attribute2              => NULL
496        ,x_attribute3              => NULL
497        ,x_attribute4              => NULL
498        ,x_attribute5              => NULL
499        ,x_attribute6              => NULL
500        ,x_attribute7              => NULL
501        ,x_attribute8              => NULL
502        ,x_attribute9              => NULL
503        ,x_attribute10             => NULL
504        ,x_attribute11             => NULL
505        ,x_attribute12             => NULL
506        ,x_attribute13             => NULL
507        ,x_attribute14             => NULL
508        ,x_attribute15             => NULL
509        ,x_creation_date           => SYSDATE
510        ,x_created_by              => NVL(fnd_global.user_id,0)
511        ,x_last_update_date        => SYSDATE
512        ,x_last_updated_by         => NVL(fnd_global.user_id,0)
513        ,x_last_update_login       => NVL(fnd_global.login_id,0)
514        ,x_true_up_amount          => l_total_period_rent - l_prev_inv_trueup_rent
515        ,x_true_up_status          => 'N'
516        ,x_true_up_exp_code        => 'N'
517        ,x_org_id                  => l_org_id );
518 
519     ELSIF l_exists_invoice THEN
520 
521       /* no invoice to update - create a new one */
522       IF l_var_rent_inv_id IS NULL THEN
523 
524         /* if there a change in rent */
525         IF ((round(l_total_period_rent, l_precision) - round(l_prev_inv_trueup_rent, l_precision)) <> 0
526             OR round(l_total_period_rent, l_precision) <> round(l_tot_period_rent, l_precision)) THEN
527 
528           /* create new invoice for difference amt */
529           pn_var_rent_inv_pkg.insert_row
530           ( x_rowid                   => l_row_id
531            ,x_var_rent_inv_id         => l_var_rent_inv_id
532            ,x_adjust_num              => l_max_adjust_num
533            ,x_invoice_date            => inv_rec.trueup_invoice_date
534            ,x_for_per_rent            => NULL
535            ,x_tot_act_vol             => inv_rec.total_actual_sales
536            ,x_act_per_rent            => l_total_period_unabt_rent
537            ,x_constr_actual_rent      => l_total_period_unabt_rent
538            ,x_abatement_appl          => l_allowance
539            ,x_rec_abatement           => l_tot_abatement
540            ,x_rec_abatement_override  => l_rec_abatement_override
541            ,x_negative_rent           => 0
542            ,x_actual_invoiced_amount  => (l_total_period_rent - l_prev_inv_trueup_rent)
543            ,x_period_id               => p_period_id
544            ,x_var_rent_id             => p_var_rent_id
545            ,x_forecasted_term_status  => 'N'
546            ,x_variance_term_status    => 'N'
547            ,x_actual_term_status      => 'N'
548            ,x_forecasted_exp_code     => 'N'
549            ,x_variance_exp_code       => 'N'
550            ,x_actual_exp_code         => 'N'
551            ,x_comments                => 'created invoice'
552            ,x_attribute_category      => NULL
553            ,x_attribute1              => NULL
554            ,x_attribute2              => NULL
555            ,x_attribute3              => NULL
556            ,x_attribute4              => NULL
557            ,x_attribute5              => NULL
558            ,x_attribute6              => NULL
559            ,x_attribute7              => NULL
560            ,x_attribute8              => NULL
561            ,x_attribute9              => NULL
562            ,x_attribute10             => NULL
563            ,x_attribute11             => NULL
564            ,x_attribute12             => NULL
565            ,x_attribute13             => NULL
566            ,x_attribute14             => NULL
567            ,x_attribute15             => NULL
568            ,x_creation_date           => SYSDATE
569            ,x_created_by              => NVL(fnd_global.user_id,0)
570            ,x_last_update_date        => SYSDATE
571            ,x_last_updated_by         => NVL(fnd_global.user_id,0)
572            ,x_last_update_login       => NVL(fnd_global.login_id,0)
573            ,x_true_up_amount          => (l_total_period_rent - l_prev_inv_trueup_rent)
574            ,x_true_up_status          => 'N'
575            ,x_true_up_exp_code        => 'N'
576            ,x_org_id                  => l_org_id );
577 
578         END IF; /* IF inv_rec.total_actual_rent <> l_prev_inv_trueup_rent THEN */
579 
580       ELSIF l_var_rent_inv_id IS NOT NULL THEN
581 
582         /* if there a change in rent */
583         IF (round(l_total_period_rent, l_precision) - round(l_prev_inv_trueup_rent, l_precision)) <> round(l_curr_inv_trueup_rent, l_precision)
584         THEN
585 
586           DELETE
587           pn_payment_terms_all
588           WHERE
589           var_rent_inv_id = l_var_rent_inv_id AND
590           status <> pn_var_rent_calc_pkg.G_TERM_STATUS_APPROVED;
591 
592           /* update the invoice */
593           UPDATE
594           pn_var_rent_inv_all
595           SET
596            act_per_rent           = l_total_period_unabt_rent
597           ,constr_actual_rent     = l_total_period_unabt_rent
598           ,actual_invoiced_amount = (l_total_period_rent - l_prev_inv_trueup_rent)
599           ,true_up_amt            = (l_total_period_rent - l_prev_inv_trueup_rent)
600           ,tot_act_vol            = ROUND(inv_rec.total_actual_sales, l_precision)  -- bug # 6007571
601           ,actual_term_status     = 'N'
602           ,abatement_appl         = l_allowance
603           ,rec_abatement          = l_tot_abatement
604           ,last_update_date       = SYSDATE
605           ,last_updated_by        = NVL(fnd_global.user_id,0)
606           ,last_update_login      = NVL(fnd_global.login_id,0)
607           WHERE
608           var_rent_inv_id = l_var_rent_inv_id;
609 
610         END IF; /* if there a change in rent */
611 
612       END IF; /* IF l_var_rent_inv_id IS NULL THEN */
613 
614     END IF; /* IF NOT l_exists_invoice THEN */
615 
616   END LOOP; /* loop for all invoice dates in the period */
617 
618 EXCEPTION
619   WHEN OTHERS THEN RAISE;
620 
621 END insert_invoice_trueup;
622 
623 /*Procedures to calculate true_up abatements.*/
624 
625 --------------------------------------------------------------------------------
626 --  NAME         : apply_abatements
627 --  DESCRIPTION  : Applies abatements to given periods of a specific VR
628 --  PURPOSE      : Applies abatements.
629 --  INVOKED FROM : calculate_trueup
630 --  ARGUMENTS    : p_var_rent_id: Vr to apply abatements for.
631 --                 p_period_id: Period to calculate for.
632 --                 p_flag: If calculate then actual_invoiced amount is
633 --                 updated.
634 --  REFERENCE    : PN_COMMON.debug()
635 --  HISTORY      :
636 --  25/Nov/06    Shabda Created
637 --  4/Nov/07     o Shabda fix for bug 5724597. Modified so we now get the true up
638 --                 rent based on constr_actual_rent and subtrach the non cumulative
639 --                 values to get the TU amount.
640 --------------------------------------------------------------------------------
641 PROCEDURE apply_abatements(p_var_rent_id IN NUMBER,
642                  p_period_id IN NUMBER,
643                  p_flag IN VARCHAR2)
644 IS
645   -- Allowances first ot abatements?
646   CURSOR order_c(ip_var_rent_id NUMBER) IS
647   SELECT ORDER_OF_APPL_CODE, termination_date, org_id
648   FROM PN_VAR_RENTS_ALL abat
649   WHERE abat.var_rent_id = ip_var_rent_id;
650 
651   -- Get the details of
652   CURSOR inv_c( ip_var_rent_id NUMBER,
653                 ip_period_id NUMBER,
654                 p_new_termn_date DATE
655             ) IS
656     SELECT * FROM
657     (SELECT var_rent_inv_id, constr_actual_rent, true_up_amt,
658            true_up_exp_code, invoice_date
659     FROM pn_var_rent_inv_all inv1
660     WHERE inv1.var_rent_id = ip_var_rent_id
661     AND inv1.period_id = ip_period_id
662     AND inv1.invoice_date <= p_new_termn_date
663     AND inv1.adjust_num= (
664       SELECT MAX(adjust_num) from pn_var_rent_inv_all inv2
665       WHERE inv1.var_rent_id = inv2.var_rent_id
666       AND   inv1.period_id = inv2.period_id
667       AND inv1.invoice_date = inv2.invoice_date)
668     AND TRUE_UP_AMT IS NULL
669     ORDER BY INVOICE_DATE)
670 
671     UNION ALL
672     SELECT
673      NULL as var_rent_inv_id
674     ,(SELECT NVL((SUM(act_var_rent) + NVL(SUM(trueup_var_rent), 0) -  NVL(SUM(first_yr_rent), 0)), 0)
675     FROM
676     pn_var_rent_summ_all
677     WHERE
678     var_rent_id = ip_var_rent_id AND
679     period_id = ip_period_id
680     )   AS constr_actual_rent
681  ,(SELECT NVL((SUM(act_var_rent) + NVL(SUM(trueup_var_rent), 0) -  NVL(SUM(first_yr_rent), 0)), 0)
682     FROM
683     pn_var_rent_summ_all
684     WHERE
685     var_rent_id = ip_var_rent_id AND
686     period_id = ip_period_id
687     ) AS true_up_amt
688     ,'N'  true_up_exp_code
689     , invoice_date
690     FROM
691     pn_var_rent_summ_all summ,
692     pn_var_periods_all per,
693     pn_var_rents_all  vr
694     WHERE
695     summ.period_id = per.period_id AND
696     vr.var_rent_id = per.var_rent_id AND
697     (per.period_num <> 1 OR
698     vr.proration_rule NOT IN ('FY', 'FLY')) AND
699     summ.var_rent_id = ip_var_rent_id AND
700     summ.period_id = ip_period_id
701     AND summ.group_date = (select max(group_date) from pn_var_rent_summ_all
702     where period_id = ip_period_id)
703     AND G_IS_TU_CONC_FLAG = 'T'
704 
705     UNION ALL
706      SELECT
707      NULL as var_rent_inv_id
708     ,(SELECT NVL(SUM(first_yr_rent), 0)
709     FROM
710     pn_var_rent_summ_all summ,
711     pn_var_periods_all per
712     WHERE
713     per.period_id = summ.period_id AND
714     summ.var_rent_id = ip_var_rent_id AND
715     per.period_num = 2
716     )
717     +
718     (SELECT NVL(SUM(trueup_var_rent), 0)
719     FROM
720     pn_var_rent_summ_all
721     WHERE
722     var_rent_id = ip_var_rent_id AND
723     period_id = ip_period_id
724     )
725     as const_t
726  ,(SELECT NVL(SUM(first_yr_rent), 0)
727     FROM
728     pn_var_rent_summ_all summ,
729     pn_var_periods_all per
730     WHERE
731     per.period_id = summ.period_id AND
732     summ.var_rent_id = ip_var_rent_id AND
733     per.period_num = 2
734     )
735     +
736     (SELECT NVL(SUM(trueup_var_rent), 0)
737     FROM
738     pn_var_rent_summ_all
739     WHERE
740     var_rent_id = ip_var_rent_id AND
741     period_id = ip_period_id
742     )
743     AS true_up_amt
744     ,'N'  true_up_exp_code
745     , invoice_date
746     FROM
747     pn_var_rent_summ_all summ,
748     pn_var_periods_all per,
749     pn_var_rents_all  vr
750     WHERE
751     summ.period_id = per.period_id AND
752     vr.var_rent_id = per.var_rent_id AND
753     vr.proration_rule IN ('FY', 'FLY') AND
754     per.period_num = 1 AND
755     summ.var_rent_id = ip_var_rent_id AND
756     summ.period_id = ip_period_id
757     AND summ.group_date = (select max(group_date) from pn_var_rent_summ_all
758     where period_id = ip_period_id)
759     AND G_IS_TU_CONC_FLAG = 'T';
760 
761   /* get prev invoiced amount. */
762   CURSOR prev_invoiced_c( p_vr_id  IN NUMBER
763                          ,p_prd_id IN NUMBER
764                          ,p_inv_dt IN DATE) IS
765     SELECT
766     NVL(SUM(actual_invoiced_amount), 0) AS prev_invoiced_amt
767     FROM
768     pn_var_rent_inv_all
769     WHERE
770     var_rent_id = p_vr_id AND
771     period_id = p_prd_id AND
772     invoice_date = p_inv_dt AND
773     (actual_exp_code = 'Y'
774     OR variance_exp_code = 'Y')
775     AND
776     (NVL(true_up_amt, 0) = 0 AND
777     true_up_status IS NULL AND
778     true_up_exp_code IS NULL);
779 
780     --Previously invoiced true up rent.
781     CURSOR prev_invoiced_tu_c( p_vr_id  IN NUMBER
782                          ,p_prd_id IN NUMBER
783                          ,p_inv_dt IN DATE) IS
784     SELECT
785     NVL(SUM(actual_invoiced_amount), 0) AS prev_inv_trueup_amt
786     FROM
787     pn_var_rent_inv_all
788     WHERE
789     var_rent_id = p_vr_id AND
790     period_id = p_prd_id AND
791     invoice_date = p_inv_dt AND
792     (actual_exp_code = 'Y' OR true_up_exp_code = 'Y' OR variance_exp_code = 'Y') AND
793     /*true_up_amt <> 0 AND */
794     true_up_status IS NOT NULL AND
795     true_up_exp_code IS NOT NULL;
796 
797     -- Get the details of rolling allowance
798    CURSOR rolling_allow_c(ip_var_rent_id NUMBER) IS
799     SELECT NVL(amount, 0) rolling_allow
800             ,allowance_applied allow_applied
801             ,start_date
802             ,end_date
803             ,abatement_id
804     FROM PN_VAR_ABAT_DEFAULTS_ALL
805     WHERE var_rent_id = ip_var_rent_id
806     AND type_code = pn_var_rent_calc_pkg.G_ABAT_TYPE_CODE_ALLO
807     ORDER BY start_date;
808 
809       -- Get the details of exported status
810     CURSOR is_act_or_rec_exp_c(ip_var_rent_inv_id NUMBER) IS
811       SELECT DECODE(invoice_on,
812         pn_var_rent_calc_pkg.G_INV_ON_ACTUAL, actual_exp_code,
813         pn_var_rent_calc_pkg.G_INV_ON_FORECASTED, variance_exp_code) AS
814         exp_code,
815         inv.actual_invoiced_amount
816         FROM pn_var_rents_all vr,
817              pn_var_rent_inv_all inv
818        WHERE vr.var_rent_id = inv.var_rent_id
819          AND inv.var_rent_inv_id = ip_var_rent_inv_id;
820 
821     -- sum of non cumulative rents of a specific period
822     CURSOR non_cumm_rent_c(ip_var_rent_id NUMBER,
823                          ip_period_id   NUMBER
824               ) IS
825     SELECT SUM(actual_invoiced_amount) tot_nc_rent
826     FROM pn_var_rent_inv_all
827     WHERE var_rent_id = ip_var_rent_id
828     AND period_id = ip_period_id
829     AND true_up_amt IS NULL
830     AND true_up_status IS NULL
831     AND true_up_exp_code IS NULL;
832 
833 
834     -- Get all the details of a specific invoice.
835     CURSOR inv_all_c(ip_vr_inv_id NUMBER
836             ) IS
837     SELECT *
838     FROM pn_var_rent_inv_all
839     WHERE var_rent_inv_id = ip_vr_inv_id;
840 
841 
842   l_abat_order   VARCHAR(30);
843   l_prev_inv_exp NUMBER;
844   l_abated_rent  NUMBER;
845   l_allow_t      ALLOW_TBL;--Table to keep track of allowance for non-cumm inv
846   l_allow_tu_t   ALLOW_TBL;--Table to keep track of allowance for TU invoices
847   l_diff_amt     NUMBER;
848   l_is_inv_exp   VARCHAR2(30);
849   l_row_id       ROWID;
850   l_var_rent_inv_id NUMBER;
851   l_vr_termination_date DATE;
852   l_actual_invoiced_amount NUMBER;
853   l_org_id       NUMBER;
854   l_precision    NUMBER;
855 
856 BEGIN
857   /*To apply abatements we need to
858   1. Apply deffered negative rents.
859   2. Apply allowances/Abatements.
860   3. Apply/Allowances/Abatements.
861   */
862   pnp_debug_pkg.log('*apply_abatements start(+)*');
863   pnp_debug_pkg.log('p_flag:'||p_flag);
864   FOR rec IN order_c(p_var_rent_id) LOOP
865     l_abat_order := rec.ORDER_OF_APPL_CODE;
866     l_vr_termination_date := rec.termination_date;
867     l_org_id := rec.org_id;
868     --Since each record has same value for ORDER_OF_APPL_CODE exit after one looping.
869     EXIT;
870   END LOOP;
871 
872   OPEN rolling_allow_c(p_var_rent_id);
873   FETCH rolling_allow_c BULK COLLECT INTO l_allow_t;
874   CLOSE rolling_allow_c;
875 
876   OPEN rolling_allow_c(p_var_rent_id);
877   FETCH rolling_allow_c BULK COLLECT INTO l_allow_tu_t;
878   CLOSE rolling_allow_c;
879 
880 
881   l_precision := nvl(pn_var_rent_calc_pkg.get_currency_precision(l_org_id),4);
882 
883   FOR inv_rec IN inv_c(p_var_rent_id, p_period_id, l_vr_termination_date) LOOP
884 
885      --If this is a non cummulative apply_defered_neg_rent
886      --Do not apply def_neg_rent in TU invoices
887      IF (inv_rec.true_up_amt IS NULL) THEN
888        PN_VAR_TRUEUP_PKG.apply_def_neg_rent(p_var_rent_id, p_period_id, inv_rec.var_rent_inv_id, l_abated_rent);
889      ELSE
890        l_abated_rent := inv_rec.constr_actual_rent;
891        G_UNABATED_RENT(G_UNABATED_RENT.COUNT+1).period_id := p_period_id;
892        G_UNABATED_RENT(G_UNABATED_RENT.COUNT).amount := l_abated_rent;
893      END IF;
894 
895    IF (l_abat_order = pn_var_rent_calc_pkg.G_ALLOWANCE_FIRST) THEN
896     pnp_debug_pkg.log('call pnp_debug_pkg.log');
897     PN_VAR_TRUEUP_PKG.apply_allow(p_var_rent_id, p_period_id, inv_rec.var_rent_inv_id, l_allow_t, l_allow_tu_t, l_abated_rent);
898     pnp_debug_pkg.log('complete');
899    END IF;--Apply allowance.
900 
901 
902    pnp_debug_pkg.log('call populate_abat');
903    PN_VAR_TRUEUP_PKG.populate_abat(p_var_rent_id , p_period_id, inv_rec.var_rent_inv_id);
904    pnp_debug_pkg.log('complete');
905 
906 
907    pnp_debug_pkg.log('call apply_abat');
908    PN_VAR_TRUEUP_PKG.apply_abat(p_var_rent_id, p_period_id, inv_rec.var_rent_inv_id, l_abated_rent);
909    pnp_debug_pkg.log('complete');
910 
911 
912    IF(l_abat_order <> pn_var_rent_calc_pkg.G_ALLOWANCE_FIRST) THEN
913      pnp_debug_pkg.log('call pnp_debug_pkg.log');
914      PN_VAR_TRUEUP_PKG.apply_allow(p_var_rent_id, p_period_id, inv_rec.var_rent_inv_id, l_allow_t, l_allow_tu_t, l_abated_rent);
915      pnp_debug_pkg.log('complete');
916    END IF;--Apply allowance
917 
918 
919    pnp_debug_pkg.log('called populate_neg_rent');
920    IF (inv_rec.true_up_amt IS NULL) THEN
921       PN_VAR_TRUEUP_PKG.populate_neg_rent(p_var_rent_id, p_period_id, inv_rec.var_rent_inv_id, l_abated_rent);
922    END IF;
923    pnp_debug_pkg.log('complete');
924 
925 
926    /* update the invoice */
927    IF (p_flag = 'CALCULATE') THEN
928      IF (inv_rec.true_up_amt IS NULL) THEN
929        --Non true up invoice
930        FOR exp_rec IN is_act_or_rec_exp_c(inv_rec.var_rent_inv_id) LOOP
931          l_is_inv_exp := exp_rec.exp_code;
932          l_actual_invoiced_amount := exp_rec.actual_invoiced_amount;
933        END LOOP;
934        FOR rec IN prev_invoiced_c(p_var_rent_id, p_period_id, inv_rec.invoice_date) LOOP
935          l_prev_inv_exp := rec.prev_invoiced_amt;
936        END LOOP;
937 
938        IF (l_is_inv_exp = 'N' ) AND
939         (round(l_abated_rent,l_precision) - round(l_prev_inv_exp,l_precision))<> NVL(l_actual_invoiced_amount, 0) THEN
940 
941            DELETE
942            pn_payment_terms_all
943            WHERE
944            var_rent_inv_id = inv_rec.var_rent_inv_id AND
945            status <> pn_var_rent_calc_pkg.G_TERM_STATUS_APPROVED AND
946            var_rent_type = pn_var_rent_calc_pkg.G_INV_ON_ACTUAL;
947 
948            -- Update the current invoice
949            pnp_debug_pkg.log('Abatements - updating');
950            UPDATE
951            pn_var_rent_inv_all
952            SET
953            actual_invoiced_amount = (round(l_abated_rent,l_precision) - round(l_prev_inv_exp,l_precision))
954            ,actual_term_status    = 'N'
955            ,last_update_date       = SYSDATE
956            ,last_updated_by        = NVL(fnd_global.user_id,0)
957            ,last_update_login      = NVL(fnd_global.login_id,0)
958            WHERE
959            var_rent_inv_id = inv_rec.var_rent_inv_id;
960        ELSIF ((l_abated_rent - l_prev_inv_exp)<>0) AND (l_is_inv_exp = 'Y') THEN
961         -- Insert a new invoice. This happens only if your rents changes as a result of
962         -- applied allowance/abat when you add them after some calc have been done.
963         FOR inv_all_rec IN inv_all_c(inv_rec.var_rent_inv_id) LOOP
964           --This can loop only once
965           pnp_debug_pkg.log('l_prev_inv_exp:'||l_prev_inv_exp);
966           pnp_debug_pkg.log('l_abated_rent:'||l_abated_rent);
967           pnp_debug_pkg.log('Abatements - inserting');
968           l_row_id := NULL;
969           l_var_rent_inv_id := NULL;
970           pn_var_rent_inv_pkg.insert_row
971              ( x_rowid                   => l_row_id,
972                x_var_rent_inv_id         => l_var_rent_inv_id,
973                x_adjust_num              => inv_all_rec.adjust_num+1,
974                x_invoice_date            => inv_all_rec.invoice_date,
975                x_for_per_rent            => inv_all_rec.for_per_rent,
976                x_tot_act_vol             => inv_all_rec.tot_act_vol,
977                x_act_per_rent            => round(inv_all_rec.act_per_rent,l_precision),
978                x_constr_actual_rent      => round(inv_all_rec.constr_actual_rent,l_precision),
979                x_abatement_appl          => inv_all_rec.abatement_appl,
980                x_rec_abatement           => inv_all_rec.rec_abatement,
981                x_rec_abatement_override  => inv_all_rec.rec_abatement_override,
982                x_negative_rent           => inv_all_rec.negative_rent,
983                x_actual_invoiced_amount  => (round(l_abated_rent,l_precision) - round(l_prev_inv_exp,l_precision)),
984                x_period_id               => inv_all_rec.period_id,
985                x_var_rent_id             => inv_all_rec.var_rent_id,
986                x_forecasted_term_status  => 'N',
987                x_variance_term_status    => 'N',
988                x_actual_term_status      => 'N',
989                x_forecasted_exp_code     => 'N',
990                x_variance_exp_code       => 'N',
991                x_actual_exp_code         => 'N',
992                x_comments                => 'created invoice',
993                x_attribute_category      => NULL,
994                x_attribute1              => NULL,
995                x_attribute2              => NULL,
996                x_attribute3              => NULL,
997                x_attribute4              => NULL,
998                x_attribute5              => NULL,
999                x_attribute6              => NULL,
1000                x_attribute7              => NULL,
1001                x_attribute8              => NULL,
1002                x_attribute9              => NULL,
1003                x_attribute10             => NULL,
1004                x_attribute11             => NULL,
1005                x_attribute12             => NULL,
1006                x_attribute13             => NULL,
1007                x_attribute14             => NULL,
1008                x_attribute15             => NULL,
1009                x_creation_date           => SYSDATE,
1010                x_created_by              => NVL(fnd_global.user_id,0),
1011                x_last_update_date        => SYSDATE,
1012                x_last_updated_by         => NVL(fnd_global.user_id,0),
1013                x_last_update_login       => NVL(fnd_global.login_id,0),
1014                x_org_id                  => inv_all_rec.org_id );
1015          END LOOP;
1016        END IF;
1017      ELSE
1018        -- True up invoice
1019        --
1020        /*FOR nc_rent_rec IN non_cumm_rent_c(p_var_rent_id, p_period_id) LOOP
1021          l_diff_amt := nc_rent_rec.tot_nc_rent;
1022        END LOOP;
1023 
1024        l_abated_rent := l_abated_rent - l_diff_amt;
1025 
1026        FOR rec IN prev_invoiced_tu_c(p_var_rent_id, p_period_id, inv_rec.invoice_date) LOOP
1027          l_prev_inv_exp := rec.prev_inv_trueup_amt;
1028        END LOOP;
1029 
1030        IF (inv_rec.true_up_exp_code = 'N') THEN
1031          --Last invoice is not exported
1032          UPDATE
1033          pn_var_rent_inv_all
1034          SET
1035          actual_invoiced_amount = (l_abated_rent - l_prev_inv_exp)
1036          ,actual_term_status    = 'N'
1037          ,last_update_date       = SYSDATE
1038          ,last_updated_by        = NVL(fnd_global.user_id,0)
1039          ,last_update_login      = NVL(fnd_global.login_id,0)
1040           WHERE
1041           var_rent_inv_id = inv_rec.var_rent_inv_id;
1042        ELSIF ((l_abated_rent - l_prev_inv_exp)<>0) THEN
1043          -- Last invoice has been exported and an non zero adjustment terms needs to be created
1044           FOR inv_all_rec IN inv_all_c(inv_rec.var_rent_inv_id) LOOP
1045           --This can loop only once
1046           pnp_debug_pkg.log('l_prev_inv_exp:'||l_prev_inv_exp);
1047           pnp_debug_pkg.log('l_abated_rent:'||l_abated_rent);
1048           pnp_debug_pkg.log('Abatements - inserting');
1049           l_row_id := NULL;
1050           l_var_rent_inv_id := NULL;
1051           pn_var_rent_inv_pkg.insert_row
1052              ( x_rowid                   => l_row_id,
1053                x_var_rent_inv_id         => l_var_rent_inv_id,
1054                x_adjust_num              => inv_all_rec.adjust_num+1,
1055                x_invoice_date            => inv_all_rec.invoice_date,
1056                x_for_per_rent            => inv_all_rec.for_per_rent,
1057                x_tot_act_vol             => inv_all_rec.tot_act_vol,
1058                x_act_per_rent            => inv_all_rec.act_per_rent,
1059                x_constr_actual_rent      => inv_all_rec.constr_actual_rent,
1060                x_abatement_appl          => inv_all_rec.abatement_appl,
1061                x_rec_abatement           => inv_all_rec.rec_abatement,
1062                x_rec_abatement_override  => inv_all_rec.rec_abatement_override,
1063                x_negative_rent           => inv_all_rec.negative_rent,
1064                x_actual_invoiced_amount  => (l_abated_rent - l_prev_inv_exp),
1065                x_period_id               => inv_all_rec.period_id,
1066                x_var_rent_id             => inv_all_rec.var_rent_id,
1067                x_forecasted_term_status  => 'N',
1068                x_variance_term_status    => 'N',
1069                x_actual_term_status      => 'N',
1070                x_forecasted_exp_code     => 'N',
1071                x_variance_exp_code       => 'N',
1072                x_actual_exp_code         => 'N',
1073                x_comments                => 'created invoice',
1074                x_attribute_category      => NULL,
1075                x_attribute1              => NULL,
1076                x_attribute2              => NULL,
1077                x_attribute3              => NULL,
1078                x_attribute4              => NULL,
1079                x_attribute5              => NULL,
1080                x_attribute6              => NULL,
1081                x_attribute7              => NULL,
1082                x_attribute8              => NULL,
1083                x_attribute9              => NULL,
1084                x_attribute10             => NULL,
1085                x_attribute11             => NULL,
1086                x_attribute12             => NULL,
1087                x_attribute13             => NULL,
1088                x_attribute14             => NULL,
1089                x_attribute15             => NULL,
1090                x_creation_date           => SYSDATE,
1091                x_created_by              => NVL(fnd_global.user_id,0),
1092                x_last_update_date        => SYSDATE,
1093                x_last_updated_by         => NVL(fnd_global.user_id,0),
1094                x_last_update_login       => NVL(fnd_global.login_id,0),
1095                x_org_id                  => inv_all_rec.org_id );
1096          END LOOP;
1097        END IF;*/
1098        G_ABATED_RENT(G_ABATED_RENT.COUNT+1).period_id := p_period_id;
1099        G_ABATED_RENT(G_ABATED_RENT.COUNT).amount := l_abated_rent;
1100      END IF;
1101 
1102    END IF;
1103   END LOOP;--Loop for all required invoices.
1104   pnp_debug_pkg.log('apply_abatements end(-)');
1105 
1106 EXCEPTION
1107    WHEN others THEN
1108    pnp_debug_pkg.log('Raised exception');
1109    RAISE;
1110 END;
1111 
1112 
1113 
1114 --------------------------------------------------------------------------------
1115 --  NAME         : get_dated_allow
1116 --  DESCRIPTION  : Gets allowances between specific dates.
1117 --  PURPOSE      : Gets allowances between specific dates.
1118 --  INVOKED FROM : apply_allow()
1119 --  ARGUMENTS    : p_allow_t- table constaining all the allowances
1120 --                 p_start_date -
1121 --                 p_end_date - Dates between which to select the allowances.
1122 --  REFERENCE    :
1123 --  HISTORY      :
1124 --  22/Dec/06 Shabda o Found while fixing bug 5724597.If no allowances exist,
1125 --                     return a not null value.
1126 --
1127 --  25/Nov/2006      Shabda     o Created
1128 --------------------------------------------------------------------------------
1129 FUNCTION get_dated_allow(p_allow_t ALLOW_TBL,
1130                          p_start_date DATE,
1131                          p_end_date DATE) RETURN ALLOW_TBL IS
1132    l_allow_t ALLOW_TBL;
1133    l_count   NUMBER := 1;
1134    empty_rec       ALLOW_REC;
1135 BEGIN
1136   --
1137   pnp_debug_pkg.log('get_dated_allow start (+)');
1138   IF (p_allow_t.COUNT > 0) THEN
1139     --
1140     FOR i IN  1..p_allow_t.COUNT LOOP
1141     pnp_debug_pkg.log('get_dated_allow 1');
1142     IF(p_allow_t(i).start_date <= p_end_date
1143     AND NVL(p_allow_t(i).end_date, p_end_date) >= p_start_date) THEN
1144        l_allow_t(l_count) := p_allow_t(i);
1145        l_count := l_count + 1;
1146     END IF;
1147     pnp_debug_pkg.log('get_dated_allow 2');
1148     END LOOP;
1149   END IF;
1150   pnp_debug_pkg.log('get_dated_allow 3');
1151   IF (l_allow_t.COUNT >0) THEN
1152       RETURN l_allow_t;
1153   ELSE
1154     --
1155     l_allow_t(1) := NULL;
1156     RETURN l_allow_t;
1157   END IF;
1158 EXCEPTION
1159   WHEN others THEN
1160     pnp_debug_pkg.log('get_dated_allow raised exception');
1161     RAISE;
1162 END;
1163 
1164 --------------------------------------------------------------------------------
1165 --  NAME         : apply_def_neg_rent
1166 --  DESCRIPTION  : Applies deffered negative rent.
1167 --  PURPOSE      : Applies deffered negative rent.
1168 --  INVOKED FROM : apply_abatements()
1169 --  ARGUMENTS    : p_var_rent_id: Vr to apply abatements for.
1170 --                 p_period_id: Period to calculate for.
1171 --                 p_inv_id: Invoice to calculate for.
1172 --  REFERENCE    :
1173 --  HISTORY      :
1174 --
1175 --  25/Nov/2006      Shabda     o Created
1176 --------------------------------------------------------------------------------
1177 PROCEDURE apply_def_neg_rent(p_var_rent_id IN NUMBER,
1178                p_period_id IN NUMBER,
1179                p_inv_id IN NUMBER,
1180                x_abated_rent IN OUT NOCOPY NUMBER) IS
1181 
1182   -- Get the details of all invoices
1183   CURSOR invoices_c(ip_var_rent_id NUMBER, ip_period_id NUMBER, ip_inv_id NUMBER
1184             ) IS
1185     SELECT  constr_actual_rent
1186             ,actual_invoiced_amount
1187             ,true_up_amt
1188             ,negative_rent
1189             ,invoice_date
1190             ,var_rent_inv_id
1191      FROM pn_var_rent_inv_all inv1
1192      WHERE inv1.var_rent_id = ip_var_rent_id
1193      AND inv1.period_id = ip_period_id
1194      AND var_rent_inv_id = ip_inv_id
1195      AND inv1.adjust_num= (
1196       SELECT MAX(adjust_num) from pn_var_rent_inv_all inv2
1197       WHERE inv1.var_rent_id = inv2.var_rent_id
1198       AND   inv1.period_id = inv2.period_id
1199       AND inv1.invoice_date = inv2.invoice_date);
1200 
1201   CURSOR csr_last_inv(p_var_rent_id NUMBER)
1202      IS
1203      SELECT MAX(invoice_date) inv_date
1204      FROM pn_var_grp_dates_all
1205      WHERE var_rent_id = p_var_rent_id
1206      AND period_id = (SELECT max(period_id)
1207                       FROM pn_var_periods_all
1208                       WHERE var_rent_id = p_var_rent_id
1209                       AND   NVL(status, pn_var_rent_calc_pkg.G_PERIOD_ACTIVE_STATUS)
1210                             <> pn_var_rent_calc_pkg.G_PERIOD_REVERSED_STATUS);
1211 
1212   CURSOR csr_neg_avail (ip_var_rent_id  NUMBER,
1213                         ip_invoice_date DATE) IS
1214      SELECT ABS(NVL(SUM(def_neg_rent),0)) negative_available
1215      FROM pn_var_rent_inv_all inv
1216      WHERE inv.var_rent_id = ip_var_rent_id
1217      --AND period_id = p_period_id
1218      AND   inv.invoice_date < ip_invoice_date
1219      AND   inv.adjust_num = (select MAX(inv1.adjust_num)
1220                              from pn_var_rent_inv_all inv1
1221                              where inv1.var_rent_id = inv.var_rent_id
1222                              AND   inv1.invoice_date = inv.invoice_date);
1223 
1224   CURSOR csr_neg_appl (ip_var_rent_id  NUMBER,
1225                        ip_invoice_date DATE) IS
1226      SELECT NVL(SUM(negative_rent),0) negative_applied
1227      FROM pn_var_rent_inv_all inv
1228      WHERE inv.var_rent_id = ip_var_rent_id
1229      --AND period_id = p_period_id
1230      AND   inv.invoice_date < ip_invoice_date
1231      AND   inv.adjust_num = (select MAX(inv1.adjust_num)
1232                              from pn_var_rent_inv_all inv1
1233                              where inv1.var_rent_id = inv.var_rent_id
1234                              AND   inv1.invoice_date = inv.invoice_date);
1235    CURSOR csr_get_abt(ip_var_rent_id NUMBER)
1236         IS
1237         SELECT negative_rent
1238         FROM pn_var_rents_all
1239         WHERE var_rent_id = ip_var_rent_id;
1240 
1241 
1242    l_negative_rent        pn_var_rent_inv.negative_rent%TYPE := 0;
1243    l_negative_available   NUMBER := 0;
1244    l_negative_applied     NUMBER := 0;
1245    l_negative_remaining   NUMBER;
1246    l_abated_rent          NUMBER;
1247    l_negative_rent_flag   pn_var_rents.negative_rent%TYPE;
1248    l_last_invoice_dt      pn_var_grp_dates.invoice_date%TYPE;
1249 BEGIN
1250   pnp_debug_pkg.log('apply_def_neg_rent start(+)');
1251   -- Get the negative rent flag
1252   FOR rec IN csr_get_abt(p_var_rent_id) LOOP
1253       l_negative_rent_flag := rec.negative_rent;
1254       pnp_debug_pkg.log('l_negative_rent_flag:'||l_negative_rent_flag);
1255   END LOOP;
1256     -- Get the last invoice_date
1257   FOR rec IN csr_last_inv(p_var_rent_id) LOOP
1258      l_last_invoice_dt := rec.inv_date;
1259      pnp_debug_pkg.log('l_last_invoice_dt:'||l_last_invoice_dt);
1260   END LOOP;
1261 
1262   PNP_DEBUG_PKg.log('p_period_id:'||p_period_id);
1263   PNP_DEBUG_PKG.log('p_var_rent_id:'||p_var_rent_id);
1264 
1265   -- Loop for all invoices.
1266   FOR inv_rec IN invoices_c(p_var_rent_id, p_period_id, p_inv_id) LOOP
1267      pnp_debug_pkg.log('inv_rec.var_rent_inv_id:'||inv_rec.var_rent_inv_id);
1268      l_negative_rent := 0;
1269      l_negative_available := 0;
1270      l_negative_applied := 0;
1271      l_abated_rent :=inv_rec.constr_actual_rent;
1272 
1273 
1274      PNP_DEBUG_PKG.log('inv_rec.invoice_date:'||inv_rec.invoice_date);
1275      -- Get available negative rent.
1276      FOR rec IN csr_neg_avail(p_var_rent_id, inv_rec.invoice_date) LOOP
1277         l_negative_available :=rec.negative_available;
1278         pnp_debug_pkg.log('l_negative_available'||l_negative_available);
1279      END LOOP;
1280 
1281      -- Get applied negative rent
1282      FOR rec IN csr_neg_appl (p_var_rent_id, inv_rec.invoice_date) LOOP
1283         l_negative_applied := rec.negative_applied;
1284         pnp_debug_pkg.log('l_negative_applied:'||l_negative_applied);
1285      END LOOP;
1286 
1287      l_negative_remaining := ABS(l_negative_available - l_negative_applied);
1288      pnp_debug_pkg.log('l_negative_remaining:'||l_negative_remaining);
1289      IF (l_negative_rent_flag = pn_var_rent_calc_pkg.G_NEG_RENT_DEFER) THEN
1290        -- Deffered negative rent can be applied only when consT-rent >0
1291        IF (l_last_invoice_dt <> inv_rec.invoice_date AND inv_rec.constr_actual_rent > 0) THEN
1292          --This invoice is not the last invoice
1293          l_abated_rent := GREATEST(0, inv_rec.constr_actual_rent - l_negative_remaining);
1294          pnp_debug_pkg.log('l_abated_rent1:'||l_abated_rent);
1295          IF (inv_rec.constr_actual_rent > l_abated_rent) THEN
1296            l_negative_rent := inv_rec.constr_actual_rent - l_abated_rent;
1297          ELSE
1298            l_negative_rent := 0;
1299          END IF;
1300 
1301 
1302        ELSIF (l_last_invoice_dt = inv_rec.invoice_date) THEN
1303          --This is the last invoice. All deffered negative rent needs to be added
1304          l_abated_rent := inv_rec.constr_actual_rent - l_negative_remaining;
1305          pnp_debug_pkg.log('l_abated_rent2:'||l_abated_rent);
1306          l_negative_rent := inv_rec.constr_actual_rent - l_abated_rent;
1307        END IF;
1308      END IF;
1309      pnp_debug_pkg.log('l_abated_rent:'||l_abated_rent);
1310      pnp_debug_pkg.log('l_negative_rent:'||l_negative_rent);
1311      pnp_debug_pkg.log('inv_rec.var_rent_inv_id:'||inv_rec.var_rent_inv_id);
1312 
1313      UPDATE pn_var_rent_inv_all
1314      SET negative_rent = l_negative_rent
1315      WHERE var_rent_inv_id = inv_rec.var_rent_inv_id;
1316      x_abated_rent := l_abated_rent;
1317   END LOOP;
1318   pnp_debug_pkg.log('apply_def_neg_rent end(-)');
1319 
1320 EXCEPTION
1321   --
1322   WHEN others THEN
1323   pnp_debug_pkg.log('Raised exception');
1324     RAISE;
1325 END;
1326 
1327 
1328 --------------------------------------------------------------------------------
1329 --  NAME         : populate_neg_rent
1330 --  DESCRIPTION  : Populates the negative rent which needs to be deffered.
1331 --  PURPOSE      : Populates the negative rent which needs to be deffered.
1332 --  INVOKED FROM : apply_abatements()
1333 --  ARGUMENTS    : p_var_rent_id: Vr to apply abatements for.
1334 --                 p_period_id: Period to calculate for.
1335 --                 p_inv_id: Invoice to calculate for.
1336 --  REFERENCE    :
1337 --  HISTORY      :
1338 --
1339 --  25/Nov/2006      Shabda     o Created
1340 --------------------------------------------------------------------------------
1341 PROCEDURE populate_neg_rent(p_var_rent_id IN NUMBER,
1342                p_period_id IN NUMBER,
1343                p_inv_id IN NUMBER,
1344                x_abated_rent IN OUT NOCOPY NUMBER) IS
1345 
1346   -- Get the details of all invoices
1347   CURSOR invoices_c(ip_var_rent_id NUMBER, ip_period_id NUMBER, ip_inv_id NUMBER
1348             ) IS
1349     SELECT  invoice_date
1350             ,var_rent_inv_id
1351      FROM pn_var_rent_inv_all inv1
1352      WHERE inv1.var_rent_id = ip_var_rent_id
1353      AND inv1.period_id = ip_period_id
1354      AND var_rent_inv_id = ip_inv_id
1355      AND inv1.adjust_num= (
1356       SELECT MAX(adjust_num) from pn_var_rent_inv_all inv2
1357       WHERE inv1.var_rent_id = inv2.var_rent_id
1358       AND   inv1.period_id = inv2.period_id
1359       AND inv1.invoice_date = inv2.invoice_date);
1360 
1361   CURSOR csr_last_inv(p_var_rent_id NUMBER)
1362      IS
1363      SELECT MAX(invoice_date) inv_date
1364      FROM pn_var_grp_dates_all
1365      WHERE var_rent_id = p_var_rent_id
1366      AND period_id = (SELECT max(period_id)
1367                       FROM pn_var_periods_all
1368                       WHERE var_rent_id = p_var_rent_id
1369                       AND   NVL(status, pn_var_rent_calc_pkg.G_PERIOD_ACTIVE_STATUS)
1370                             <> pn_var_rent_calc_pkg.G_PERIOD_REVERSED_STATUS);
1371 
1372 
1373    CURSOR csr_get_abt(ip_var_rent_id NUMBER)
1374         IS
1375         SELECT negative_rent
1376         FROM pn_var_rents_all
1377         WHERE var_rent_id = ip_var_rent_id;
1378 
1379    l_neg_rent_def         NUMBER;
1380    l_negative_rent        pn_var_rent_inv.negative_rent%TYPE := 0;
1381    l_negative_available   NUMBER := 0;
1382    l_negative_applied     NUMBER := 0;
1383    l_negative_remaining   NUMBER;
1384    l_abated_rent          NUMBER;
1385    l_negative_rent_flag   pn_var_rents.negative_rent%TYPE;
1386    l_last_invoice_dt      pn_var_grp_dates.invoice_date%TYPE;
1387 BEGIN
1388   pnp_debug_pkg.log('populate_neg_rent start(+)');
1389   -- Get the negative rent flag
1390   FOR rec IN csr_get_abt(p_var_rent_id) LOOP
1391       l_negative_rent_flag := rec.negative_rent;
1392       pnp_debug_pkg.log('l_negative_rent_flag:'||l_negative_rent_flag);
1393   END LOOP;
1394   -- Get the last invoice_date
1395   FOR rec IN csr_last_inv(p_var_rent_id) LOOP
1396      l_last_invoice_dt := rec.inv_date;
1397      pnp_debug_pkg.log('l_last_invoice_dt:'||l_last_invoice_dt);
1398   END LOOP;
1399   -- Loop for all invoices.
1400   FOR inv_rec IN invoices_c(p_var_rent_id, p_period_id, p_inv_id) LOOP
1401     IF (l_negative_rent_flag = pn_var_rent_calc_pkg.G_NEG_RENT_IGNORE) THEN
1402       --We are ignoring negative rents. Set abated rent =0, if <0.
1403       l_abated_rent := GREATEST(0, x_abated_rent);
1404 
1405     ELSIF (l_negative_rent_flag = pn_var_rent_calc_pkg.G_NEG_RENT_CREDIT) THEN
1406       l_abated_rent := x_abated_rent;
1407     ELSIF (l_negative_rent_flag = pn_var_rent_calc_pkg.G_NEG_RENT_DEFER
1408            AND inv_rec.invoice_date <> l_last_invoice_dt) THEN
1409       l_abated_rent := GREATEST(0,x_abated_rent);
1410       l_neg_rent_def := ABS(x_abated_rent - l_abated_rent);
1411     ELSIF (l_negative_rent_flag = pn_var_rent_calc_pkg.G_NEG_RENT_DEFER
1412            AND inv_rec.invoice_date = l_last_invoice_dt) THEN
1413       l_abated_rent := x_abated_rent;
1414     END IF;
1415     pnp_debug_pkg.log('l_abated_rent:'||l_abated_rent);
1416     pnp_debug_pkg.log('l_neg_rent_def*:'||l_neg_rent_def);
1417     UPDATE pn_var_rent_inv_all
1418     SET def_neg_rent = l_neg_rent_def
1419     WHERE var_rent_inv_id = inv_rec.var_rent_inv_id;
1420     x_abated_rent := l_abated_rent;
1421   END LOOP;
1422   pnp_debug_pkg.log('populate_neg_rent end(-)');
1423 
1424 EXCEPTION
1425   --
1426   WHEN others THEN
1427   pnp_debug_pkg.log('Raised exception');
1428     RAISE;
1429 END;
1430 --------------------------------------------------------------------------------
1431 --  NAME         : apply_abat
1432 --  DESCRIPTION  : applies the fixed and recurring abatements.
1433 --  PURPOSE      : applies the fixed and recurring abatements.
1434 --  INVOKED FROM : apply_abatements()
1435 --  ARGUMENTS    : p_var_rent_id: Vr to apply abatements for.
1436 --                 p_period_id: Period to calculate for.
1437 --                 p_inv_id: Invoice to calculate for.
1438 --  REFERENCE    :
1439 --  HISTORY      :
1440 --
1441 --  25/Nov/2006      Shabda     o Created
1442 --  6/Jan/2007       Shabda     o Bug 5731479. Use rec_override field.
1443 --------------------------------------------------------------------------------
1444 PROCEDURE apply_abat(p_var_rent_id IN NUMBER,
1445            p_period_id IN NUMBER,
1446            p_inv_id IN NUMBER,
1447            x_abated_rent IN OUT NOCOPY NUMBER) IS
1448 
1449   -- Get the details of all invoices
1450   CURSOR invoices_c(ip_var_rent_id NUMBER, ip_period_id NUMBER,
1451                     ip_inv_id NUMBER
1452             ) IS
1453     SELECT   actual_invoiced_amount
1454             ,invoice_date
1455             ,NVL(rec_abatement,0) rec_abatement
1456             ,rec_abatement_override
1457             ,true_up_amt
1458             ,var_rent_inv_id
1459      FROM pn_var_rent_inv_all inv1
1460      WHERE inv1.var_rent_id = ip_var_rent_id
1461      AND inv1.period_id = ip_period_id
1462      AND inv1.var_rent_inv_id = ip_inv_id
1463      AND inv1.adjust_num= (
1464       SELECT MAX(adjust_num) from pn_var_rent_inv_all inv2
1465       where inv1.var_rent_id = inv2.var_rent_id
1466       AND   inv1.period_id = inv2.period_id
1467       AND inv1.invoice_date = inv2.invoice_date)
1468          AND TRUE_UP_AMT IS NULL
1469      UNION ALL
1470       SELECT
1471     (SELECT NVL(SUM(act_var_rent), 0)
1472     FROM
1473     pn_var_rent_summ_all
1474     WHERE
1475     var_rent_id = ip_var_rent_id AND
1476     period_id = ip_period_id
1477     )   AS actual_invoiced_amount
1478     , invoice_date
1479     , null rec_abatement
1480     , null rec_abatement_override
1481     ,(SELECT NVL(SUM(act_var_rent), 0)
1482     FROM
1483     pn_var_rent_summ_all
1484     WHERE
1485     var_rent_id = ip_var_rent_id AND
1486     period_id = ip_period_id
1487     )   AS true_up_amt
1488     ,NULL AS VAR_RENT_INV_ID
1489     FROM PN_VAR_RENT_SUMM_ALL
1490     WHERE ip_inv_id IS NULL
1491     AND var_rent_id = ip_var_rent_id
1492     AND period_id = ip_period_id
1493     AND group_date = (select max(group_date) from pn_var_rent_summ_all
1494     where period_id = ip_period_id)
1495     AND G_IS_TU_CONC_FLAG = 'T';
1496 
1497 
1498   -- Get the details of fixed abatements
1499   CURSOR fixed_abat_c(ip_var_rent_id NUMBER,
1500             ip_inv_start_date DATE,
1501             ip_inv_end_date DATE) IS
1502     SELECT NVL(SUM(amount),0) fixed_abat
1503     FROM PN_VAR_ABAT_DEFAULTS_ALL
1504     WHERE var_rent_id = ip_var_rent_id
1505     AND start_date <= ip_inv_end_date
1506     AND NVL(end_date, ip_inv_end_date) >= ip_inv_start_date
1507     AND type_code = pn_var_rent_calc_pkg.G_ABAT_TYPE_CODE_ABAT;
1508   -- Get the details of
1509   CURSOR EXCESS_ABAT_C(ip_var_rent_id NUMBER) IS
1510     SELECT EXCESS_ABAT_CODE
1511     FROM PN_VAR_RENTS_ALL ABAT
1512     WHERE abat.var_rent_id = ip_var_rent_id;
1513    -- Get the details of inv_start, end_date
1514   CURSOR invoice_dates_c(ip_var_rent_id NUMBER,
1515                          ip_invoice_date DATE
1516             ) IS
1517     SELECT inv_start_date, inv_end_date
1518     FROM pn_var_grp_dates_all
1519     WHERE var_rent_id = ip_var_rent_id
1520     AND invoice_date = ip_invoice_date;
1521   -- Get the details of actual start and end date for FY/LY/FLY
1522   CURSOR invoice_dates_fyly_c(ip_var_rent_inv_id NUMBER
1523             ) IS
1524     SELECT per.start_date, per.end_date
1525       FROM pn_var_rent_inv_all inv, pn_var_periods_all per
1526      WHERE per.period_id = inv.period_id
1527        AND inv.var_rent_inv_id = ip_var_rent_inv_id;
1528 
1529   -- Get the id of invoice created for first year.
1530   -- This has meaning only if proration is FY/FLY
1531   CURSOR get_fy_inv_c(ip_var_rent_id NUMBER
1532             ) IS
1533     SELECT inv.var_rent_inv_id
1534       FROM pn_var_rent_inv_all inv, pn_var_periods_all per
1535      WHERE per.period_id = inv.period_id
1536        AND inv.var_rent_id = ip_var_rent_id
1537        AND per.start_date = (SELECT MIN(start_date) from pn_var_periods_all
1538                              WHERE var_rent_id = ip_var_rent_id);
1539   -- Get the id of last invoice created.
1540   -- This has meaning only if proration is LY/FLY
1541   CURSOR get_ly_inv_c(ip_var_rent_id NUMBER
1542             ) IS
1543     SELECT inv.var_rent_inv_id
1544       FROM pn_var_rent_inv_all inv, pn_var_periods_all per
1545      WHERE per.period_id = inv.period_id
1546        AND inv.var_rent_id = ip_var_rent_id
1547        AND per.start_date = (SELECT MAX(start_date) from pn_var_periods_all
1548                              WHERE var_rent_id = ip_var_rent_id)
1549         AND inv.invoice_date = (SELECT MAX(invoice_date) FROM pn_var_rent_inv_all
1550                                 WHERE var_rent_id = ip_var_rent_id)
1551         AND inv.true_up_amt is NULL;
1552 
1553 
1554 
1555     --Get the details of inv_start, end_date for TU
1556     CURSOR invoice_dates_tu_c(ip_var_rent_id NUMBER,
1557                          ip_period_id NUMBER
1558             ) IS
1559     SELECT MIN(inv_start_date)inv_start_date,
1560     MAX(inv_end_date) inv_end_date
1561     FROM pn_var_grp_dates_all
1562     WHERE var_rent_id = ip_var_rent_id
1563     AND period_id = ip_period_id;
1564 
1565     -- Get the details of negative_rent
1566     CURSOR neg_rent_c(ip_var_rent_id NUMBER
1567             ) IS
1568     SELECT negative_rent
1569     FROM pn_var_rents_all
1570     WHERE var_rent_id = ip_var_rent_id;
1571 
1572     -- Get the details of negative_rent
1573     CURSOR calc_freq_c(ip_var_rent_id NUMBER
1574             ) IS
1575     SELECT REPTG_FREQ_CODE
1576     FROM pn_var_rent_dates_all
1577     WHERE var_rent_id = ip_var_rent_id;
1578 
1579      -- Get the details of
1580      CURSOR inv_in_prd_c(ip_var_rent_id NUMBER,
1581                       ip_period_id   NUMBER
1582               ) IS
1583       SELECT  COUNT(UNIQUE(invoice_date)) num_inv
1584       FROM  pn_var_rent_inv_all
1585       WHERE  var_rent_id = ip_var_rent_id
1586       AND  period_id = ip_period_id;
1587 
1588       -- Get the number of inv which should exist for a period
1589       CURSOR num_inv_c(ip_var_rent_inv_id NUMBER
1590             ) IS
1591       SELECT ceil(months_between(per.end_date, per.start_date)/decode(vrd.invg_freq_code,'YR', 12, 'SA', 6, 'QTR', 3, 'MON', 1, 1)) num_inv
1592       FROM pn_var_rent_inv_all inv, pn_var_periods_all per, pn_var_rents_all vr, pn_var_rent_dates_all vrd
1593       WHERE per.period_id = inv.period_id
1594        AND inv.var_rent_inv_id = ip_var_rent_inv_id
1595        AND per.var_rent_id = vr.var_rent_id
1596        AND vrd.var_rent_id = vr.var_rent_id;
1597 
1598       --Get the last invoice of the last year
1599       CURSOR ly_min_inv_c(ip_vr_id NUMBER
1600             ) IS
1601        SELECT inv.invoice_date,
1602               inv.var_rent_inv_id,
1603               inv.period_id
1604        FROM pn_var_rents_all vr,
1605             pn_var_periods_all per,
1606             pn_var_rent_inv_all inv
1607        WHERE per.var_rent_id = vr.var_rent_id
1608        AND   inv.period_id = per.period_id
1609        AND per.start_date = (select max(start_date) from pn_var_periods_all per1
1610                                where per1.var_rent_id = vr.var_rent_id)
1611        AND inv.invoice_date = (select max(invoice_date) from pn_var_rent_inv_all inv1
1612                                 where inv1.period_id = per.period_id)
1613        AND vr.var_rent_id = ip_vr_id;
1614 
1615        -- Get the proration type
1616        CURSOR proration_type_c(ip_var_rent_id NUMBER
1617             ) IS
1618        SELECT proration_rule
1619        FROM pn_var_rents_all
1620        WHERE var_rent_id = ip_var_rent_id;
1621 
1622      -- Get the details of
1623      CURSOR rec_abatement_c(ip_period_id NUMBER
1624                ) IS
1625        SELECT SUM(rec_abatement) AS AMOUNT
1626          FROM pn_var_rent_inv_all inv1
1627         WHERE period_id = ip_period_id
1628        AND inv1.adjust_num= (
1629         SELECT MAX(adjust_num) from pn_var_rent_inv_all inv2
1630               where inv1.var_rent_id = inv2.var_rent_id
1631               AND inv1.invoice_date = inv2.invoice_date
1632               AND true_up_amt IS NULL)
1633         AND true_up_amt IS NULL;
1634 
1635      -- Get the details of
1636      CURSOR get_rec_abat_over_tu_c(p_period_id NUMBER
1637                ) IS
1638        SELECT rec_abatement_override
1639          FROM pn_var_rent_inv_all
1640         WHERE period_id = p_period_id
1641           AND true_up_amt is NOT NULL
1642           AND adjust_num = (SELECT max(adjust_num)
1643                             FROM PN_VAR_RENT_INV_ALL
1644                             WHERE period_id = p_period_id
1645                             AND TRUE_UP_AMT IS NOT NULL);
1646 
1647 
1648 
1649 
1650 
1651   l_fixed_abat NUMBER := 0;
1652   l_rec_abat   NUMBER := 0;
1653   l_total_abat NUMBER;
1654   l_excess_abat VARCHAR2(30);
1655   l_abated_rent NUMBER;
1656   l_inv_start_date DATE;
1657   l_inv_end_date   DATE;
1658   l_neg_rent   VARCHAR2(30);
1659   l_grp_in_prd NUMBER; --Number of groups in this period
1660   l_unabated_rent NUMBER;
1661   l_abat_override NUMBER;
1662   l_proration_type VARCHAR2(30);
1663   l_first_inv_id   NUMBER;--inv_id of the first inv created
1664   l_last_inv_id    NUMBER;--inv_id of the last inv created
1665   l_months_in_inv NUMBER;
1666   l_num_inv       NUMBER := 1;
1667   l_ly_max_inv_id NUMBER;
1668   l_ly_max_prd_id NUMBER;
1669 
1670 BEGIN
1671   --
1672   pnp_debug_pkg.log('apply_abat start(+)');
1673     --The special cases this needs to handle are
1674   -- FY: The FY invoice would have invoice_date of next period.
1675   -- LY: Non last invoices are dummy, last invoice corresponds to the whole period.
1676   -- FLY: Both LY and FLY
1677   -- Get the proration type
1678   FOR proration_rec IN proration_type_c(p_var_rent_id)  LOOP
1679     l_proration_type := proration_rec.proration_rule;
1680   END LOOP;
1681   pnp_debug_pkg.log('apply_abat start(+)');
1682   -- is this in ly first inv? No abatements should be applied to this invoice
1683   FOR ly_inv_rec IN ly_min_inv_c(p_var_rent_id) LOOP
1684     l_ly_max_inv_id := ly_inv_rec.var_rent_inv_id;
1685     l_ly_max_prd_id := ly_inv_rec.period_id;
1686   END LOOP;
1687   pnp_debug_pkg.log('l_ly_max_inv_id:'||l_ly_max_inv_id);
1688   pnp_debug_pkg.log('l_ly_max_prd_id:'||l_ly_max_prd_id);
1689 
1690 
1691 
1692   --For LY/FLY, if last period and not last invoice,
1693   -- Invoices are dummy. Return immdiately.
1694   IF (p_period_id = l_ly_max_prd_id AND NOT(p_inv_id = l_ly_max_inv_id) AND l_proration_type IN (pn_var_rent_calc_pkg.G_PRORUL_FLY, pn_var_rent_calc_pkg.G_PRORUL_LY) ) THEN
1695     pnp_debug_pkg.log('Ly invoice, not last - return immedietly');
1696     RETURN;
1697   END IF;
1698   FOR abat_rec IN EXCESS_ABAT_C(p_var_rent_id) LOOP
1699     l_excess_abat := abat_rec.excess_abat_code;
1700     pnp_debug_pkg.log('l_excess_abat:'||l_excess_abat);
1701     EXIT;
1702   END LOOP;
1703 
1704   -- Get the number of invoices in this period
1705   FOR inv_in_prd_rec IN inv_in_prd_c(p_var_rent_id, p_period_id) LOOP
1706     l_grp_in_prd := inv_in_prd_rec.num_inv;
1707     pnp_debug_pkg.log('l_grp_in_prd:'||l_grp_in_prd);
1708   END LOOP;
1709   --
1710   FOR neg_rec IN neg_rent_c(p_var_rent_id) LOOP
1711     l_neg_rent := neg_rec.negative_rent;
1712     pnp_debug_pkg.log('l_neg_rent:'||l_neg_rent);
1713   END LOOP;
1714 
1715   --
1716   FOR fy_rec IN get_fy_inv_c(p_var_rent_id) LOOP
1717      l_first_inv_id := fy_rec.var_rent_inv_id;
1718   END LOOP;
1719 
1720   --
1721   FOR ly_rec IN get_ly_inv_c(p_var_rent_id) LOOP
1722      l_last_inv_id := ly_rec.var_rent_inv_id;
1723     pnp_debug_pkg.log('l_last_inv_id:'||l_last_inv_id);
1724   END LOOP;
1725 
1726   FOR inv_rec IN invoices_c(p_var_rent_id , p_period_id, p_inv_id) LOOP
1727     -- update rec abatements.
1728     IF (inv_rec.true_up_amt IS NULL) THEN
1729       FOR inv_dates_rec IN invoice_dates_c(p_var_rent_id, inv_rec.invoice_date) LOOP
1730       l_inv_start_date := inv_dates_rec.inv_start_date;
1731       l_inv_end_date := inv_dates_rec.inv_end_date;
1732       END LOOP;
1733 
1734 
1735     pnp_debug_pkg.log('l_inv_end_date:'||l_inv_end_date);
1736 
1737      -- The special handling is if this is FL/LY special invoice and non true up.
1738      IF ((l_proration_type IN (pn_var_rent_calc_pkg.G_PRORUL_FY, pn_var_rent_calc_pkg.G_PRORUL_FLY) AND p_inv_id = l_first_inv_id)
1739         OR (l_proration_type IN (pn_var_rent_calc_pkg.G_PRORUL_LY, pn_var_rent_calc_pkg.G_PRORUL_FLY) AND p_inv_id = l_last_inv_id) ) THEN
1740        --
1741        FOR inv_rec IN invoice_dates_fyly_c(p_inv_id) LOOP
1742          l_inv_start_date := inv_rec.start_date;
1743          l_inv_end_date := inv_rec.end_date;
1744        END LOOP;
1745        --
1746        pnp_debug_pkg.log('FY/LY modified dates');
1747        pnp_debug_pkg.log('l_inv_start_date:'||l_inv_start_date);
1748        pnp_debug_pkg.log('l_inv_end_date:'||l_inv_end_date);
1749        FOR num_rec IN num_inv_c(p_inv_id) LOOP
1750           l_num_inv := num_rec.num_inv;
1751        END LOOP;
1752        pnp_debug_pkg.log('l_num_inv:'||l_num_inv);
1753 
1754     END IF;
1755     ELSIF (inv_rec.true_up_amt IS NOT NULL) THEN
1756       --
1757       FOR inv_dates_rec IN invoice_dates_tu_c(p_var_rent_id, p_period_id) LOOP
1758       l_inv_start_date := inv_dates_rec.inv_start_date;
1759       l_inv_end_date := inv_dates_rec.inv_end_date;
1760       END LOOP;
1761     END IF;
1762 
1763     l_rec_abat := inv_rec.rec_abatement;
1764     pnp_debug_pkg.log('l_rec_abat:'||l_rec_abat);
1765 
1766   IF (inv_rec.true_up_amt IS NOT NULL) THEN
1767     pnp_debug_pkg.log('zxc:');
1768     --
1769     FOR i IN 1..G_ABATEMENT_APPLIED.COUNT LOOP
1770         IF G_ABATEMENT_APPLIED(i).PERIOD_ID = p_period_id THEN
1771             l_rec_abat := NVL(G_ABATEMENT_APPLIED(i).AMOUNT, 0);
1772             pnp_debug_pkg.log('l_rec_abat:'||l_rec_abat);
1773         END IF;
1774 
1775     END LOOP;
1776 
1777 
1778   END IF;
1779 
1780 
1781 
1782 
1783     l_abat_override := inv_rec.rec_abatement_override;
1784     IF inv_rec.true_up_amt IS NOT NULL THEN
1785        --
1786        FOR rec_over_rec IN get_rec_abat_over_tu_c(p_period_id) LOOP
1787            l_abat_override := rec_over_rec.rec_abatement_override;
1788        END LOOP;
1789 
1790     END IF;
1791 
1792     pnp_debug_pkg.log('l_abat_override:'||l_abat_override);
1793     l_abated_rent := x_abated_rent;
1794     l_unabated_rent := x_abated_rent;
1795     pnp_debug_pkg.log('l_abated_rent:'||l_abated_rent);
1796     pnp_debug_pkg.log('l_rec_abat:'||l_rec_abat);
1797     FOR rec IN fixed_abat_c(p_var_rent_id, l_inv_start_date, l_inv_end_date) LOOP
1798       IF (inv_rec.true_up_amt IS NULL) THEN
1799         --Fixed abatement is same sum of fixed abatement.
1800         l_fixed_abat := rec.fixed_abat * l_num_inv;
1801       ELSIF (inv_rec.true_up_amt IS NOT NULL) THEN
1802         --Fixed abatement is total * number of invoices
1803         l_fixed_abat := rec.fixed_abat * l_grp_in_prd;
1804 
1805       END IF;
1806       pnp_debug_pkg.log('l_fixed_abat:'||l_fixed_abat);
1807     END LOOP;
1808     l_total_abat := l_fixed_abat + l_rec_abat;
1809     IF (l_abat_override IS NOT NULL) THEN
1810       l_total_abat := l_abat_override;
1811     END IF;
1812 
1813     pnp_debug_pkg.log('l_total_abat:'||l_total_abat);
1814     IF (l_excess_abat = pn_var_rent_calc_pkg.G_EXC_ABAT_IGNORE
1815         AND x_abated_rent>0 )  THEN
1816       l_abated_rent := GREATEST(0, x_abated_rent - l_total_abat);
1817     ELSIF (l_excess_abat = pn_var_rent_calc_pkg.G_EXC_ABAT_NEG_RENT ) THEN
1818       l_abated_rent := x_abated_rent - l_total_abat;
1819     END IF;
1820     l_total_abat := l_unabated_rent - l_abated_rent;
1821     pnp_debug_pkg.log('total_abat_applied:'||l_total_abat);
1822     UPDATE pn_var_rent_inv_all
1823     SET rec_abatement = l_total_abat
1824     WHERE var_rent_inv_id = inv_rec.var_rent_inv_id;
1825     pnp_debug_pkg.log('l_abated_rent:'||l_abated_rent);
1826     x_abated_rent := l_abated_rent;
1827     IF inv_rec.var_rent_inv_id IS NULL  THEN
1828        G_TOT_ABATEMENT(G_TOT_ABATEMENT.COUNT+1).period_id := p_period_id;
1829        G_TOT_ABATEMENT(G_TOT_ABATEMENT.COUNT).amount := l_total_abat;
1830 
1831     END IF;
1832 
1833   END LOOP;
1834   pnp_debug_pkg.log('apply_abat end(-)');
1835 
1836 EXCEPTION
1837   --
1838   WHEN others THEN
1839   pnp_debug_pkg.log('apply_abat end(-)');
1840   RAISE;
1841 END;
1842 --------------------------------------------------------------------------------
1843 --  NAME         : apply_allow
1844 --  DESCRIPTION  : Applies the rolling allowance.
1845 --  PURPOSE      : Applies the rolling allowance.
1846 --  INVOKED FROM : apply_abatements()
1847 --  ARGUMENTS    : p_var_rent_id: Vr to apply abatements for.
1848 --                 p_period_id: Period to calculate for.
1849 --                 p_inv_id: Invoice to calculate for.
1850 --  REFERENCE    :
1851 --  HISTORY      :
1852 --
1853 --  25/Nov/2006      Shabda     o Created
1854 --------------------------------------------------------------------------------
1855 PROCEDURE apply_allow(p_var_rent_id IN NUMBER,
1856                       p_period_id   IN NUMBER,
1857                       p_inv_id IN NUMBER,
1858                       p_allow_t IN ALLOW_TBL,
1859                       p_allow_tu_t IN ALLOW_TBL,
1860                       x_abated_rent IN OUT NOCOPY NUMBER
1861           ) IS
1862   -- Get the details of
1863   CURSOR  invoices_c(ip_var_rent_id NUMBER,
1864                      ip_period_id   NUMBER,
1865                      ip_inv_id      NUMBER
1866             ) IS
1867     SELECT  inv1.abatement_appl
1868            ,inv1.invoice_date
1869            ,inv1.var_rent_inv_id
1870            ,inv1.true_up_amt
1871     FROM pn_var_rent_inv_all inv1
1872     WHERE var_rent_id = ip_var_rent_id
1873     AND period_id = ip_period_id
1874     AND var_rent_inv_id = ip_inv_id
1875     AND inv1.adjust_num= (
1876       SELECT MAX(adjust_num) from pn_var_rent_inv_all inv2
1877       where inv1.var_rent_id = inv2.var_rent_id
1878       AND   inv1.period_id = inv2.period_id
1879       AND inv1.invoice_date = inv2.invoice_date)
1880     AND TRUE_UP_AMT IS NULL
1881     UNION ALL
1882     SELECT
1883      0 abatement_appl
1884     , invoice_date
1885     , null var_rent_inv_id
1886     ,(SELECT NVL(SUM(act_var_rent), 0)
1887     FROM
1888     pn_var_rent_summ_all
1889     WHERE
1890     var_rent_id = ip_var_rent_id AND
1891     period_id = ip_period_id
1892     )   AS true_up_amt
1893     FROM PN_VAR_RENT_SUMM_ALL
1894     WHERE ip_inv_id IS NULL
1895     AND var_rent_id = ip_var_rent_id
1896     AND period_id = ip_period_id
1897     AND group_date = (select max(group_date) from pn_var_rent_summ_all
1898     where period_id = ip_period_id)
1899     AND G_IS_TU_CONC_FLAG = 'T';
1900 
1901    -- Get the details of rolling allowance
1902   CURSOR rolling_allow_c(ip_var_rent_id NUMBER,
1903             ip_inv_start_date DATE,
1904             ip_inv_end_date DATE) IS
1905     SELECT NVL(amount, 0) rolling_allow
1906            ,allowance_applied allow_applied
1907            ,abatement_id
1908     FROM PN_VAR_ABAT_DEFAULTS_ALL
1909     WHERE var_rent_id = ip_var_rent_id
1910     AND start_date <= ip_inv_start_date
1911     AND NVL(end_date, ip_inv_end_date) >= ip_inv_end_date
1912     AND type_code = pn_var_rent_calc_pkg.G_ABAT_TYPE_CODE_ALLO
1913     ORDER BY start_date;
1914   -- Get the details of inv_start, end_date
1915   CURSOR invoice_dates_c(ip_var_rent_id NUMBER,
1916                          ip_invoice_date DATE
1917             ) IS
1918     SELECT inv_start_date, inv_end_date
1919     FROM pn_var_grp_dates_all
1920     WHERE var_rent_id = ip_var_rent_id
1921     AND invoice_date = ip_invoice_date;
1922   --Get the details of inv_start, end_date for TU
1923   CURSOR invoice_dates_tu_c(ip_var_rent_id NUMBER,
1924                          ip_period_id NUMBER
1925             ) IS
1926     SELECT MIN(inv_start_date)inv_start_date,
1927     MAX(inv_end_date) inv_end_date
1928     FROM pn_var_grp_dates_all
1929     WHERE var_rent_id = ip_var_rent_id
1930     AND period_id = ip_period_id;
1931 
1932   -- Get the details of actual start and end date for FY/LY/FLY
1933   CURSOR invoice_dates_fyly_c(ip_var_rent_inv_id NUMBER
1934             ) IS
1935     SELECT per.start_date, per.end_date
1936       FROM pn_var_rent_inv_all inv, pn_var_periods_all per
1937      WHERE per.period_id = inv.period_id
1938        AND inv.var_rent_inv_id = ip_var_rent_inv_id;
1939   -- Get the id of invoice created for first year.
1940   -- This has meaning only if proration is FY/FLY
1941   CURSOR get_fy_inv_c(ip_var_rent_id NUMBER
1942             ) IS
1943     SELECT inv.var_rent_inv_id
1944       FROM pn_var_rent_inv_all inv, pn_var_periods_all per
1945      WHERE per.period_id = inv.period_id
1946        AND inv.var_rent_id = ip_var_rent_id
1947        AND per.start_date = (SELECT MIN(start_date) from pn_var_periods_all
1948                              WHERE var_rent_id = ip_var_rent_id);
1949   -- Get the id of last invoice created.
1950   -- This has meaning only if proration is LY/FLY
1951   CURSOR get_ly_inv_c(ip_var_rent_id NUMBER
1952             ) IS
1953     SELECT inv.var_rent_inv_id
1954       FROM pn_var_rent_inv_all inv, pn_var_periods_all per
1955      WHERE per.period_id = inv.period_id
1956        AND inv.var_rent_id = ip_var_rent_id
1957        AND per.start_date = (SELECT MAX(start_date) from pn_var_periods_all
1958                              WHERE var_rent_id = ip_var_rent_id)
1959        AND inv.invoice_date = (SELECT MAX(invoice_date) from pn_var_rent_inv_all
1960                                WHERE var_rent_id = ip_var_rent_id);
1961 
1962   -- Get the proration type
1963   CURSOR proration_type_c(ip_var_rent_id NUMBER
1964             ) IS
1965     SELECT proration_rule
1966       FROM pn_var_rents_all
1967       WHERE var_rent_id = ip_var_rent_id;
1968 
1969 
1970 
1971   l_allow_remain        NUMBER;
1972   l_allow_applied       NUMBER;--Allowance applied from a specific allow
1973   l_allow_applied_inv   NUMBER;--Allowance applied for a invoice
1974   l_cur_abt_rent        NUMBER;--Keeps track of abt rent between allowances
1975   l_prev_abt_rent       NUMBER;--Keeps track of abt rent between allowances
1976   l_unabated_rent       NUMBER;
1977   l_inv_start_date      DATE;
1978   l_inv_end_date        DATE;
1979   l_allow_tu_t          ALLOW_TBL;
1980   l_allow_rec           ALLOW_REC;
1981   l_proration_type      VARCHAR2(30);
1982   l_first_inv_id        NUMBER;
1983   l_last_inv_id         NUMBER;
1984 
1985 
1986 BEGIN
1987   pnp_debug_pkg.log('apply_allow start(+)');
1988 
1989   -- Special cases which need to be handled are
1990   -- FY/FLY first invoice AND LY/FLY last invoice.
1991   -- get first inv
1992   --
1993   FOR first_inv_rec IN get_fy_inv_c(p_var_rent_id) LOOP
1994     l_first_inv_id := first_inv_rec.var_rent_inv_id;
1995   END LOOP;
1996 
1997   FOR last_inv_rec IN get_ly_inv_c(p_var_rent_id) LOOP
1998     l_last_inv_id := last_inv_rec.var_rent_inv_id;
1999   END LOOP;
2000 
2001   --
2002   FOR vr_rec IN proration_type_c(p_var_rent_id) LOOP
2003     l_proration_type := vr_rec.proration_rule;
2004   END LOOP;
2005 
2006   FOR inv_rec IN invoices_c(p_var_rent_id, p_period_id, p_inv_id)  LOOP
2007     pnp_debug_pkg.log('inv_rec.var_rent_inv_id:'||inv_rec.var_rent_inv_id);
2008     l_allow_applied_inv := inv_rec.abatement_appl;
2009     pnp_debug_pkg.log('l_allow_applied_inv:'||l_allow_applied_inv);
2010     --
2011     IF (inv_rec.true_up_amt IS NULL) THEN
2012       -- Apply allowance to non cumm rents
2013       pnp_debug_pkg.log('Non true up invoice');
2014       FOR inv_dates_rec IN invoice_dates_c(p_var_rent_id, inv_rec.invoice_date) LOOP
2015       l_inv_start_date := inv_dates_rec.inv_start_date;
2016       l_inv_end_date := inv_dates_rec.inv_end_date;
2017       END LOOP;
2018       --Special FY/LY/FLY handling
2019       --If this invoice is FY/FLY and the first year
2020       --Or proration is LY/FLY and the last invoice
2021       IF ((l_proration_type IN (pn_var_rent_calc_pkg.G_PRORUL_FY, pn_var_rent_calc_pkg.G_PRORUL_FLY) AND p_inv_id = l_first_inv_id)
2022         OR (l_proration_type IN (pn_var_rent_calc_pkg.G_PRORUL_LY, pn_var_rent_calc_pkg.G_PRORUL_FLY) AND p_inv_id = l_last_inv_id) ) THEN
2023        --
2024         FOR inv_rec IN invoice_dates_fyly_c(p_inv_id) LOOP
2025           l_inv_start_date := inv_rec.start_date;
2026           l_inv_end_date := inv_rec.end_date;
2027         END LOOP;
2028       END IF;
2029       l_cur_abt_rent := x_abated_rent;
2030       l_prev_abt_rent := x_abated_rent;
2031       FOR allow_rec  IN rolling_allow_c(p_var_rent_id, l_inv_start_date, l_inv_end_date) LOOP
2032         --Allowances can only be applied if rent is >0
2033         IF (l_cur_abt_rent > 0) THEN
2034            pnp_debug_pkg.log('allow_rec.abatement_id'||allow_rec.abatement_id);
2035            l_allow_remain := allow_rec.rolling_allow -NVL(allow_rec.allow_applied,0);
2036            pnp_debug_pkg.log('l_allow_remain:'||l_allow_remain);
2037            l_cur_abt_rent := GREATEST(0,l_prev_abt_rent - l_allow_remain);
2038            pnp_debug_pkg.log('l_cur_abated_rent:'||l_cur_abt_rent);
2039            l_allow_applied := l_prev_abt_rent - l_cur_abt_rent;
2040            pnp_debug_pkg.log('l_allow_applied'||l_allow_applied);
2041            l_prev_abt_rent := l_cur_abt_rent;
2042            pnp_debug_pkg.log('l_prev_abt_rent:'||l_prev_abt_rent);
2043            l_allow_applied_inv := l_allow_applied_inv + l_allow_applied;
2044            pnp_debug_pkg.log('l_allow_applied_inv:'||l_allow_applied_inv);
2045            UPDATE pn_var_abat_defaults_all
2046            SET allowance_applied = NVL(allowance_applied,0)+l_allow_applied
2047            WHERE abatement_id = allow_rec.abatement_id;
2048         END IF;
2049       END LOOP;
2050       pnp_debug_pkg.log('l_cur_abt_rent:'||l_cur_abt_rent);
2051       UPDATE pn_var_rent_inv_all
2052       SET abatement_appl = l_allow_applied_inv
2053       WHERE var_rent_inv_id = inv_rec.var_rent_inv_id;
2054       x_abated_rent := l_cur_abt_rent;
2055       pnp_debug_pkg.log('inv_rec.var_rent_inv_id:'||inv_rec.var_rent_inv_id);
2056 
2057     ELSIF (inv_rec.true_up_amt IS NOT NULL)  THEN
2058       pnp_debug_pkg.log('true up invoice');
2059       -- Apply allowance to true up rents
2060       FOR inv_dates_rec IN invoice_dates_tu_c(p_var_rent_id, p_period_id) LOOP
2061         l_inv_start_date := inv_dates_rec.inv_start_date;
2062         l_inv_end_date := inv_dates_rec.inv_end_date;
2063       END LOOP;
2064       l_cur_abt_rent := x_abated_rent;
2065       l_prev_abt_rent := x_abated_rent;
2066       l_allow_tu_t := get_dated_allow(p_allow_tu_t, l_inv_start_date, l_inv_end_date);
2067       IF (l_allow_tu_t(1).abatement_id IS NULL) THEN
2068         --This will happen when there are now allowances. In this case we can skip
2069         --processing for this invoice.
2070         pnp_debug_pkg.log('No allowances for this invoice. Exit');
2071         RETURN;
2072       END IF;
2073 
2074       FOR  i IN l_allow_tu_t.FIRST..l_allow_tu_t.LAST LOOP
2075         --Allowances can only be applied if rent is >0
2076         l_allow_rec := l_allow_tu_t(i);
2077         IF (l_cur_abt_rent > 0) THEN
2078            pnp_debug_pkg.log('l_allow_rec.abatement_id'||l_allow_rec.abatement_id);
2079            l_allow_remain := l_allow_rec.rolling_allow -NVL(l_allow_rec.allow_applied,0);
2080            pnp_debug_pkg.log('l_allow_remain:'||l_allow_remain);
2081            l_cur_abt_rent := GREATEST(0,l_prev_abt_rent - l_allow_remain);
2082            pnp_debug_pkg.log('l_cur_abated_rent:'||l_cur_abt_rent);
2083            l_allow_applied := l_prev_abt_rent - l_cur_abt_rent;
2084            pnp_debug_pkg.log('l_allow_applied'||l_allow_applied);
2085            l_prev_abt_rent := l_cur_abt_rent;
2086            pnp_debug_pkg.log('l_prev_abt_rent:'||l_prev_abt_rent);
2087            l_allow_applied_inv := l_allow_applied_inv + l_allow_applied;
2088            pnp_debug_pkg.log('l_allow_applied_inv:'||l_allow_applied_inv);
2089            l_allow_tu_t(i).allow_applied := NVL(l_allow_tu_t(i).allow_applied,0)+l_allow_applied;
2090         END IF;
2091       END LOOP;
2092     pnp_debug_pkg.log('l_cur_abt_rent:'||l_cur_abt_rent);
2093     G_ALLOWANCE_APPLIED(G_ALLOWANCE_APPLIED.COUNT+1).period_id := p_period_id;
2094     G_ALLOWANCE_APPLIED(G_ALLOWANCE_APPLIED.COUNT).amount := l_allow_applied_inv;
2095     pnp_debug_pkg.log('***l_allow_applied_inv:'||l_allow_applied_inv);
2096 
2097 
2098     x_abated_rent := l_cur_abt_rent;
2099     --Whenever we have true up invoice, we need to reset allowances.
2100     --
2101     FOR i IN l_allow_tu_t.FIRST..l_allow_tu_t.LAST LOOP
2102       UPDATE pn_var_abat_defaults_all
2103       SET allowance_applied = l_allow_tu_t(i).allow_applied
2104       WHERE abatement_id = l_allow_tu_t(i).abatement_id;
2105     END LOOP;
2106 
2107     pnp_debug_pkg.log('inv_rec.var_rent_inv_id:'||inv_rec.var_rent_inv_id);
2108     END IF;
2109 
2110   END LOOP;
2111   pnp_debug_pkg.log('apply_allow end(-)');
2112 EXCEPTION
2113   WHEN others THEN
2114     RAISE;
2115 END;
2116 
2117 
2118 --------------------------------------------------------------------------------
2119 --  NAME         : populate_abat
2120 --  DESCRIPTION  : Populates the recurring abatements to abte in
2121 --                 pn_var_rent_inv_all.rec_abatement.
2122 --  PURPOSE      :
2123 --  INVOKED FROM : apply_abatements()
2124 --  ARGUMENTS    : p_var_rent_id: Vr to apply abatements for.
2125 --                 p_period_id: Period to calculate for.
2126 --                 p_inv_id: Invoice to calculate for.
2127 --  REFERENCE    :
2128 --  HISTORY      :
2129 --
2130 --  25/Nov/2006      Shabda     o Created
2131 --  29/may/07        Shabda     o Bug 6041521- call overloaded calc_abatement
2132 --------------------------------------------------------------------------------
2133 PROCEDURE populate_abat(p_var_rent_id IN NUMBER,
2134            p_period_id IN NUMBER,
2135            p_inv_id IN NUMBER) IS
2136 
2137      -- Get the details of all invoices
2138   CURSOR invoices_c(ip_var_rent_id NUMBER, ip_period_id NUMBER,
2139                      ip_inv_id NUMBER
2140             ) IS
2141     SELECT   invoice_date
2142             ,true_up_amt
2143             ,var_rent_inv_id
2144      FROM pn_var_rent_inv_all inv1
2145      WHERE inv1.var_rent_id = ip_var_rent_id
2146      AND inv1.period_id = ip_period_id
2147      AND var_rent_inv_id = ip_inv_id
2148      AND inv1.adjust_num= (
2149       SELECT MAX(adjust_num) from pn_var_rent_inv_all inv2
2150       where inv1.var_rent_id = inv2.var_rent_id
2151       AND inv1.invoice_date = inv2.invoice_date)
2152     AND TRUE_UP_AMT IS NULL
2153     UNION ALL
2154     SELECT
2155     invoice_date
2156     ,(SELECT NVL(SUM(act_var_rent), 0)
2157     FROM
2158     pn_var_rent_summ_all
2159     WHERE
2160     var_rent_id = ip_var_rent_id AND
2161     period_id = ip_period_id
2162     )   AS true_up_amt
2163     ,null var_rent_inv_id
2164     FROM PN_VAR_RENT_SUMM_ALL
2165     WHERE ip_inv_id IS NULL
2166     AND var_rent_id = ip_var_rent_id
2167     AND period_id = ip_period_id
2168     AND group_date = (select max(group_date) from pn_var_rent_summ_all
2169     where period_id = ip_period_id)
2170     AND G_IS_TU_CONC_FLAG = 'T';
2171 
2172       --Get the last and first invoice dates for this period.
2173       CURSOR csr_min_gd(ip_var_rent_id NUMBER, ip_period_id NUMBER) IS
2174       SELECT MIN(grp_start_date) min_date
2175       FROM pn_var_grp_dates_all
2176       WHERE period_id = ip_period_id
2177       AND var_rent_id = ip_var_rent_id;
2178 
2179       CURSOR csr_max_gd(ip_var_rent_id NUMBER, ip_period_id NUMBER) IS
2180       SELECT MAX(grp_end_date) max_date
2181       FROM pn_var_grp_dates_all
2182       WHERE period_id = ip_period_id
2183       AND var_rent_id = ip_var_rent_id;
2184 
2185    CURSOR get_first_tu_c(ip_period_id NUMBER
2186              ) IS
2187      SELECT  var_rent_inv_id
2188        FROM  pn_var_rent_inv_all
2189       WHERE  period_id = ip_period_id
2190         AND  true_up_amt is NOT NULL
2191         AND  adjust_num = 0;
2192 
2193 
2194       l_min_grp_date DATE;
2195       l_max_grp_date DATE;
2196       l_rec_abatement NUMBER;
2197       l_exists_period BOOLEAN := FALSE;
2198       l_tu_inv_id     NUMBER;
2199 
2200 BEGIN
2201 
2202   FOR inv_rec IN invoices_c(p_var_rent_id , p_period_id, p_inv_id) LOOP
2203     -- get the first grp date for this period
2204     IF (inv_rec.true_up_amt IS NOT NULL) THEN
2205 
2206       --
2207       FOR rec IN get_first_tu_c(p_period_id) LOOP
2208          l_tu_inv_id := rec.var_rent_inv_id;
2209          pnp_debug_pkg.log('l_tu_inv_id:'||l_tu_inv_id);
2210 
2211       END LOOP;
2212 
2213       --Populate for TU
2214       FOR min_rec IN csr_min_gd(p_var_rent_id , p_period_id) LOOP
2215         l_min_grp_date := min_rec.min_date;
2216       END LOOP;
2217 
2218        FOR max_rec IN csr_max_gd(p_var_rent_id , p_period_id) LOOP
2219         l_max_grp_date := max_rec.max_date;
2220       END LOOP;
2221       l_rec_abatement := pn_var_abatement_amount_pkg.calc_abatement(
2222                          p_var_rent_id
2223 			 ,p_period_id
2224                          ,l_tu_inv_id
2225                          ,l_min_grp_date
2226                          ,l_max_grp_date
2227 			 ,'Y');
2228     G_ABATEMENT_APPLIED(G_ABATEMENT_APPLIED.COUNT+1).period_id := p_period_id;
2229     G_ABATEMENT_APPLIED(G_ABATEMENT_APPLIED.COUNT).amount := l_rec_abatement;
2230     pnp_debug_pkg.log('G_ABATEMENT_APPLIED(G_ABATEMENT_APPLIED.COUNT).period_id'||G_ABATEMENT_APPLIED(G_ABATEMENT_APPLIED.COUNT).period_id);
2231     pnp_debug_pkg.log('G_ABATEMENT_APPLIED(G_ABATEMENT_APPLIED.COUNT).amount'||G_ABATEMENT_APPLIED(G_ABATEMENT_APPLIED.COUNT).amount);
2232 
2233     --
2234 /*    FOR i IN 1..G_REC_ABATEMENT.COUNT LOOP
2235        IF G_REC_ABATEMENT(i).PERIOD_ID = p_period_id THEN
2236           G_REC_ABATEMENT(i).AMOUNT = G_REC_ABATEMENT(i).AMOUNT +  l_rec_abatement;
2237           l_exists_period := TRUE:
2238        END IF;
2239 
2240     END LOOP;
2241 
2242     IF NOT l_exists_period  THEN
2243           G_REC_ABATEMENT(G_REC_ABATEMENT.COUNT+1).period_id := p_period_id;
2244           G_REC_ABATEMENT(G_REC_ABATEMENT.COUNT).AMOUNT := l_rec_abatement;
2245     END IF;*/
2246 
2247 
2248     ELSE
2249       --Populate for non cumulative. Just call the normal populate_abat
2250       pn_var_rent_calc_pkg.populate_abat(p_var_rent_id, p_period_id, p_inv_id);
2251 
2252     END IF;
2253   END LOOP;
2254 
2255 EXCEPTION
2256   --
2257   WHEN others THEN
2258   RAISE;
2259 END;
2260 
2261 --------------------------------------------------------------------------------
2262 --  NAME         : reset_abatements
2263 --  DESCRIPTION  : Resets the allowance applied for each invoice, allowance.
2264 --                 This needs to be called between subsequent calls
2265 --                 to apply_abatements.
2266 --  PURPOSE      : resets the allowances.
2267 --  INVOKED FROM : apply_abatements()
2268 --  ARGUMENTS    : p_var_rent_id: Vr to apply abatements for.
2269 --                 p_period_id: Period to calculate for.
2270 --                 p_inv_id: Invoice to calculate for.
2271 --  REFERENCE    :
2272 --  HISTORY      :
2273 --
2274 --  25/Nov/2006      Shabda     o Created
2275 --------------------------------------------------------------------------------
2276 PROCEDURE reset_abatements(p_var_rent_id IN NUMBER
2277           ) IS
2278 BEGIN
2279   pnp_debug_pkg.log('Reset_abatement start(+)');
2280   UPDATE pn_var_abat_defaults_all
2281   SET allowance_applied =0
2282   WHERE var_rent_id = p_var_rent_id;
2283   UPDATE pn_var_rent_inv_all
2284   SET abatement_appl =0
2285   WHERE var_rent_id = p_var_rent_id;
2286   pnp_debug_pkg.log('Reset_abatement end(-)');
2287 
2288 EXCEPTION
2289   WHEN others THEN
2290   RAISE;
2291 END;
2292 
2293 
2294 
2295 --------------------------------------------------------------------------------
2296 --  NAME         : calculate_trueup
2297 --  DESCRIPTION  :
2298 --  PURPOSE      :
2299 --  INVOKED FROM :
2300 --  ARGUMENTS    :
2301 --  REFERENCE    : PN_COMMON.debug()
2302 --  HISTORY      :
2303 --
2304 --  dd-mon-yyyy  name     o Created
2305 --  23/05/07     Lokesh   o Modified for bug # 6031202, added rounding off for
2306 --                          TRUEUP_RENT_DUE
2307 --------------------------------------------------------------------------------
2308 PROCEDURE calculate_trueup( p_var_rent_id IN NUMBER
2309                            ,p_prd_date    IN DATE)
2310 IS
2311 
2312   CURSOR vr_c(p_vr_id IN NUMBER) IS
2313     SELECT
2314      proration_rule
2315     ,cumulative_vol
2316     ,negative_rent
2317     ,commencement_date
2318     ,termination_date
2319     ,org_id
2320     FROM
2321     pn_var_rents_all
2322     WHERE
2323     var_rent_id = p_vr_id;
2324 
2325   l_vr_start_date  DATE;
2326   l_vr_end_date    DATE;
2327   l_proration_rule VARCHAR2(30);
2328   l_calc_method    VARCHAR2(30);
2329   l_org_id         pn_var_rents_all.org_id%TYPE;
2330 
2331   CURSOR periods_c( p_vr_id IN NUMBER
2332                    ,p_date  IN DATE) IS
2333     SELECT
2334      org_id
2335     ,period_id
2336     ,start_date
2337     ,end_date
2338     ,partial_period
2339     FROM
2340     pn_var_periods_all
2341     WHERE
2342     var_rent_id = p_vr_id AND
2343     end_date <= p_prd_date
2344     AND    NVL(status, pn_var_rent_calc_pkg.G_PERIOD_ACTIVE_STATUS)
2345       <> pn_var_rent_calc_pkg.G_PERIOD_REVERSED_STATUS;
2346 
2347   -- Get the details of periods to calculate abatements for.
2348   -- We need to calculate abatements for all periods.
2349   -- The idea is that True up calc runs from start to a specific period
2350   -- So we need to run abatements till that period. Now the abatements after that
2351   -- periods might have changed so we need to apply_abatements to subsequent periods.
2352   CURSOR periods_abat_c(ip_var_rent_id NUMBER
2353           ) IS
2354    SELECT period_id
2355    FROM   pn_var_periods_all
2356    WHERE  var_rent_id = ip_var_rent_id
2357    AND    NVL(status, pn_var_rent_calc_pkg.G_PERIOD_ACTIVE_STATUS)
2358       <> pn_var_rent_calc_pkg.G_PERIOD_REVERSED_STATUS;
2359 
2360 
2361 
2362   l_prd_counter NUMBER;
2363 
2364   /* get line items for a period */
2365   CURSOR lines_c( p_vr_id IN NUMBER
2366                  ,p_prd_id IN NUMBER) IS
2367     SELECT
2368     line_item_id
2369     FROM
2370     pn_var_trx_headers_all
2371     WHERE
2372     var_rent_id = p_vr_id AND
2373     period_id = p_prd_id
2374     GROUP BY
2375     line_item_id;
2376 
2377   /* get the dates when we need to create the trueup invoice */
2378   CURSOR trueup_trx_c( p_vr_id   IN NUMBER
2379                       ,p_prd_id  IN NUMBER
2380                       ,p_line_id IN NUMBER) IS
2381     SELECT
2382      MIN(calc_prd_start_date)  AS trueup_start_date
2383     ,MAX(calc_prd_end_date)    AS trueup_end_date
2384     ,reset_group_id
2385     FROM
2386     pn_var_trx_headers_all
2387     WHERE
2388     var_rent_id = p_vr_id AND
2389     period_id = p_prd_id AND
2390     line_item_id = p_line_id
2391     GROUP BY
2392     reset_group_id
2393     ORDER BY
2394     trueup_start_date;
2395 
2396   /* get YTD sales for the gives calc prd end date */
2397   CURSOR ytd_sales_c( p_vr_id   IN NUMBER
2398                      ,p_prd_id  IN NUMBER
2399                      ,p_line_id IN NUMBER
2400                      ,p_end_dt  IN DATE) IS
2401     SELECT
2402     ytd_sales
2403     FROM
2404     pn_var_trx_headers_all
2405     WHERE
2406     var_rent_id = p_vr_id AND
2407     period_id = p_prd_id AND
2408     line_item_id = p_line_id AND
2409     calc_prd_end_date = p_end_dt;
2410 
2411   l_net_trueup_volume NUMBER;
2412   l_tot_trueup_rent   NUMBER;
2413   l_line_trueup_rent  NUMBER;
2414   l_part_trueup_rent  NUMBER;
2415 
2416   /* get the bkpts for trueup */
2417   CURSOR trueup_bkpt_c( p_vr_id        IN NUMBER
2418                        ,p_prd_id       IN NUMBER
2419                        ,p_line_id      IN NUMBER
2420                        ,p_reset_grp_id IN NUMBER
2421                        ,p_end_dt       IN DATE) IS
2422     SELECT
2423      ytd_group_vol_start AS trueup_bkpt_vol_start
2424     ,ytd_group_vol_end   AS trueup_bkpt_vol_end
2425     ,bkpt_rate
2426     FROM
2427     pn_var_trx_details_all
2428     WHERE
2429     trx_header_id IN (SELECT
2430                       trx_header_id
2431                       FROM
2432                       pn_var_trx_headers_all
2433                       WHERE
2434                       var_rent_id = p_vr_id AND
2435                       period_id = p_prd_id AND
2436                       line_item_id = p_line_id AND
2437                       reset_group_id = p_reset_grp_id AND
2438                       calc_prd_end_date = p_end_dt)
2439     ORDER BY
2440     trueup_bkpt_vol_start;
2441 
2442   TYPE TRUEUP_BKPT_TBL IS TABLE OF trueup_bkpt_c%ROWTYPE INDEX BY BINARY_INTEGER;
2443 
2444   trueup_bkpt_t TRUEUP_BKPT_TBL;
2445 
2446   CURSOR bkpt_type_c( p_line_id  IN NUMBER
2447                      ,p_start_dt IN DATE
2448                      ,p_end_dt   IN DATE) IS
2449     SELECT
2450      bkhd.bkpt_header_id
2451     ,bkhd.breakpoint_type
2452     FROM
2453     pn_var_bkpts_head_all bkhd
2454     WHERE
2455     bkhd.line_item_id = p_line_id AND
2456     bkhd_start_date <= p_end_dt AND
2457     bkhd_end_date >= p_start_dt;
2458 
2459 
2460   l_bkpt_type  VARCHAR2(30);
2461   l_bkpt_start NUMBER;
2462   l_bkpt_end   NUMBER;
2463   l_neg_rent_flag VARCHAR2(30);
2464 
2465 BEGIN
2466 
2467   pnp_debug_pkg.log('+++++ calculate_trueup - START +++++');
2468   pnp_debug_pkg.log(' ');
2469 
2470   FOR vr_rec IN vr_c(p_vr_id => p_var_rent_id) LOOP
2471 
2472     l_proration_rule := vr_rec.proration_rule;
2473     l_calc_method    := vr_rec.cumulative_vol;
2474     l_vr_start_date  := vr_rec.commencement_date;
2475     l_vr_end_date    := vr_rec.termination_date;
2476     l_neg_rent_flag  := vr_rec.negative_rent;
2477     l_org_id         := vr_rec.org_id;
2478 
2479   END LOOP;
2480 
2481   g_precision := nvl(pn_var_rent_calc_pkg.get_currency_precision(l_org_id),4);
2482 
2483   l_prd_counter := 0;
2484 
2485   /* loop for all periods ending before p_prd_date */
2486   FOR prd_rec IN periods_c( p_vr_id => p_var_rent_id
2487                            ,p_date  => p_prd_date)
2488   LOOP
2489 
2490     l_prd_counter := l_prd_counter + 1;
2491 
2492     pnp_debug_pkg.log('Period Details: ');
2493     pnp_debug_pkg.log('      Period #    : '||l_prd_counter);
2494     pnp_debug_pkg.log('      Period Start: '||prd_rec.start_date);
2495     pnp_debug_pkg.log('      Period End  : '||prd_rec.end_date);
2496     pnp_debug_pkg.log(' ');
2497 
2498     /* init the trueup rent for the period */
2499     l_tot_trueup_rent := 0;
2500     --TODO
2501     G_ABATEMENT_APPLIED.DELETE;
2502     G_ALLOWANCE_APPLIED.DELETE;
2503     G_ABATED_RENT.DELETE;
2504     G_UNABATED_RENT.DELETE;
2505     G_TOT_ABATEMENT.DELETE;
2506 
2507     /* check if we need to calculate TRUE UP */
2508     IF prd_rec.start_date = l_vr_start_date AND
2509        l_proration_rule IN ( pn_var_rent_calc_pkg.G_PRORUL_FY
2510                             ,pn_var_rent_calc_pkg.G_PRORUL_FLY
2511                             ,pn_var_rent_calc_pkg.G_PRORUL_CYP
2512                             ,pn_var_rent_calc_pkg.G_PRORUL_CYNP) AND
2513        prd_rec.partial_period = 'Y'
2514     THEN
2515 
2516       /* no true up for the first partial in case of
2517          FY, FLY, CYP, CYNP
2518       */
2519       NULL;
2520 
2521     ELSIF prd_rec.end_date = l_vr_end_date AND
2522           l_proration_rule IN ( pn_var_rent_calc_pkg.G_PRORUL_LY
2523                                ,pn_var_rent_calc_pkg.G_PRORUL_FLY) AND
2524           prd_rec.partial_period = 'Y'
2525     THEN
2526 
2527       /* no true up for the last partial in case of
2528          LY, FLY
2529       */
2530       NULL;
2531 
2532     ELSIF pn_var_trueup_pkg.can_do_trueup
2533           ( p_var_rent_id => p_var_rent_id
2534            ,p_period_id   => prd_rec.period_id)
2535     THEN
2536       /* no true up if calculation not done for all invoiceing periods
2537          assuming all invoicing periods will have some sales populated
2538          - need to validate this
2539       */
2540 
2541       /* loop for all lines in the period */
2542       FOR line_rec IN lines_c ( p_vr_id  => p_var_rent_id
2543                                ,p_prd_id => prd_rec.period_id) LOOP
2544 
2545         /* re init the TRUEUP amount */
2546         UPDATE
2547         pn_var_trx_headers_all
2548         SET
2549         trueup_rent_due = 0
2550         WHERE
2551         var_rent_id = p_var_rent_id AND
2552         period_id = prd_rec.period_id AND
2553         line_item_id = line_rec.line_item_id;
2554 
2555         /* now start re-calculating the TRUEUP again */
2556         l_line_trueup_rent := 0;
2557 
2558         /* loop for all resets for a line */
2559         FOR trueup_rec IN trueup_trx_c( p_vr_id   => p_var_rent_id
2560                                        ,p_prd_id  => prd_rec.period_id
2561                                        ,p_line_id => line_rec.line_item_id)
2562         LOOP
2563 
2564           l_part_trueup_rent := 0;
2565 
2566           /* get YTD sales for trueup_rec.trueup_end_date */
2567           FOR sales_rec IN ytd_sales_c( p_vr_id   => p_var_rent_id
2568                                        ,p_prd_id  => prd_rec.period_id
2569                                        ,p_line_id => line_rec.line_item_id
2570                                        ,p_end_dt  => trueup_rec.trueup_end_date)
2571           LOOP
2572             l_net_trueup_volume := NVL(sales_rec.ytd_sales,0);
2573           END LOOP; /* get YTD sales for trueup_rec.trueup_end_date */
2574 
2575           IF l_net_trueup_volume <> 0 THEN
2576 
2577             /* get bkpts */
2578             trueup_bkpt_t.DELETE;
2579 
2580             OPEN trueup_bkpt_c( p_vr_id        => p_var_rent_id
2581                                ,p_prd_id       => prd_rec.period_id
2582                                ,p_line_id      => line_rec.line_item_id
2583                                ,p_reset_grp_id => trueup_rec.reset_group_id
2584                                ,p_end_dt       => trueup_rec.trueup_end_date);
2585             FETCH trueup_bkpt_c BULK COLLECT INTO trueup_bkpt_t;
2586             CLOSE trueup_bkpt_c; /* get bkpts */
2587 
2588             IF trueup_bkpt_t.COUNT > 0 THEN
2589 
2590               FOR bkpt_hdr_rec IN bkpt_type_c ( p_line_id  => line_rec.line_item_id
2591                                                ,p_start_dt => trueup_rec.trueup_start_date
2592                                                ,p_end_dt   => trueup_rec.trueup_end_date)
2593               LOOP
2594                 l_bkpt_type := bkpt_hdr_rec.breakpoint_type;
2595               END LOOP;
2596 
2597               /* net volume trips any bkpt? */
2598               IF l_net_trueup_volume < trueup_bkpt_t(1).trueup_bkpt_vol_start THEN
2599 
2600                 /* this is the functionality that exists today
2601                    does not exist in Macerich code
2602                    Once no breakpoints are tripped, Macerich consider the rent to be = 0 */
2603                 /*Well no, because in case of true up the non cumulative calculations can be negative,
2604                 but the true up calculations which are similar to cumulative can not be.
2605                 They are not even deferred. - Shabda*/
2606 
2607                 IF (l_neg_rent_flag = 'IGNORE')  THEN
2608                     l_part_trueup_rent := 0;
2609                 ELSE
2610                     l_part_trueup_rent
2611                       := (l_net_trueup_volume - trueup_bkpt_t(1).trueup_bkpt_vol_start)
2612                       * trueup_bkpt_t(1).bkpt_rate;
2613                 END IF;
2614 
2615 
2616 
2617 
2618 
2619               /* net volume trips any bkpt? - YES */
2620               ELSE
2621 
2622                 /* get rent based on breakpoint type */
2623                 IF l_bkpt_type = pn_var_rent_calc_pkg.G_BKPT_TYP_STRATIFIED
2624                 THEN
2625 
2626                   l_part_trueup_rent := 0;
2627 
2628                   /* loop for all bkpt details */
2629                   FOR i IN trueup_bkpt_t.FIRST..trueup_bkpt_t.LAST LOOP
2630 
2631                     l_bkpt_start := trueup_bkpt_t(i).trueup_bkpt_vol_start;
2632                     l_bkpt_end   := trueup_bkpt_t(i).trueup_bkpt_vol_end;
2633 
2634                     IF l_bkpt_end IS NULL OR l_bkpt_end = 0 THEN
2635                       l_bkpt_end := NULL;
2636                     END IF;
2637 
2638                     /* net vol > bkpt start */
2639                     IF l_net_trueup_volume >= l_bkpt_start THEN
2640 
2641                       IF l_net_trueup_volume
2642                          <= NVL(l_bkpt_end, l_net_trueup_volume)
2643                       THEN
2644 
2645                         l_part_trueup_rent
2646                         := l_part_trueup_rent
2647                            + (l_net_trueup_volume - l_bkpt_start)
2648                               * trueup_bkpt_t(i).bkpt_rate;
2649 
2650                       ELSIF l_net_trueup_volume > l_bkpt_end THEN
2651 
2652                         l_part_trueup_rent
2653                         := l_part_trueup_rent
2654                            + (l_bkpt_end - l_bkpt_start)
2655                               * trueup_bkpt_t(i).bkpt_rate;
2656 
2657                       END IF;
2658 
2659                     ELSE
2660 
2661                       EXIT;
2662 
2663                     END IF; /* net vol > bkpt start */
2664 
2665                   END LOOP; /* loop for all bkpt details */
2666 
2667                 ELSIF l_bkpt_type IN ( pn_var_rent_calc_pkg.G_BKPT_TYP_FLAT
2668                                       ,pn_var_rent_calc_pkg.G_BKPT_TYP_SLIDING)
2669                 THEN
2670 
2671                   /* loop for all bkpt details */
2672                   FOR i IN trueup_bkpt_t.FIRST..trueup_bkpt_t.LAST LOOP
2673 
2674                     l_bkpt_start := trueup_bkpt_t(i).trueup_bkpt_vol_start;
2675                     l_bkpt_end   := trueup_bkpt_t(i).trueup_bkpt_vol_end;
2676 
2677                     IF l_bkpt_end IS NULL OR l_bkpt_end = 0 THEN
2678                       l_bkpt_end := NULL;
2679                     END IF;
2680 
2681                     IF l_net_trueup_volume >= l_bkpt_start AND
2682                        l_net_trueup_volume <= NVL(l_bkpt_end, l_net_trueup_volume)
2683                     THEN
2684 
2685                       IF l_bkpt_type = pn_var_rent_calc_pkg.G_BKPT_TYP_SLIDING THEN
2686 
2687                         l_part_trueup_rent
2688                         := l_net_trueup_volume * trueup_bkpt_t(i).bkpt_rate;
2689 
2690                       ELSIF l_bkpt_type = pn_var_rent_calc_pkg.G_BKPT_TYP_FLAT THEN
2691 
2692                         l_part_trueup_rent
2693                         := (l_net_trueup_volume - l_bkpt_start)
2694                             * trueup_bkpt_t(i).bkpt_rate;
2695 
2696                       END IF;
2697 
2698                       EXIT;
2699 
2700                     END IF;
2701 
2702                   END LOOP; /* loop for all bkpt details */
2703 
2704                 END IF; /* get rent based on breakpoint type */
2705 
2706               END IF; /* net volume trips any bkpt? */
2707 
2708             END IF; /* IF trueup_bkpt_t.COUNT > 0 THEN */
2709 
2710           END IF; /* IF l_net_trueup_volume <> 0 THEN */
2711 
2712           pnp_debug_pkg.log('');
2713           /* update the line trueup rent */
2714           l_line_trueup_rent := l_line_trueup_rent + l_part_trueup_rent;
2715 
2716           pnp_debug_pkg.log(' part_trueup_rent: '||l_part_trueup_rent);
2717           pnp_debug_pkg.log(' ');
2718 
2719         END LOOP; /* loop for all resets for a line */
2720 
2721         l_tot_trueup_rent := l_tot_trueup_rent + l_line_trueup_rent;
2722 
2723         UPDATE
2724         pn_var_trx_headers_all
2725         SET
2726         trueup_rent_due = round(l_line_trueup_rent,g_precision)
2727         WHERE
2728         var_rent_id = p_var_rent_id AND
2729         period_id = prd_rec.period_id AND
2730         line_item_id = line_rec.line_item_id AND
2731         calc_prd_end_date = prd_rec.end_date;
2732 
2733         pnp_debug_pkg.log(' line_trueup_rent: '||l_line_trueup_rent);
2734         pnp_debug_pkg.log(' ');
2735 
2736       END LOOP; /* loop for all lines in the period */
2737 
2738       pnp_debug_pkg.log(' tot_trueup_rent for Period : '||l_tot_trueup_rent);
2739       pnp_debug_pkg.log(' ');
2740       pn_var_trueup_pkg.post_summary_trueup
2741         ( p_var_rent_id    => p_var_rent_id
2742          ,p_period_id      => prd_rec.period_id
2743          ,p_proration_rule => l_proration_rule);
2744 
2745     END IF; /* check if we need to calculate TRUE UP */
2746 
2747   --Rest the abatements, and reapply them.
2748   pn_var_rent_calc_pkg.reset_abatements(p_var_rent_id);
2749 
2750   END LOOP;
2751 
2752  FOR period_rec IN periods_abat_c(p_var_rent_id) LOOP
2753     apply_abatements(p_var_rent_id,
2754                      period_rec.period_id,
2755                      'CALCULATE');
2756   END LOOP;
2757 
2758   FOR prd_rec IN periods_c( p_vr_id => p_var_rent_id
2759                            ,p_date  => p_prd_date) LOOP
2760 
2761     IF NOT ((prd_rec.start_date = l_vr_start_date AND
2762        l_proration_rule IN (pn_var_rent_calc_pkg.G_PRORUL_CYP
2763                            ,pn_var_rent_calc_pkg.G_PRORUL_CYNP
2764 			   ,pn_var_rent_calc_pkg.G_PRORUL_FY
2765 			   ,pn_var_rent_calc_pkg.G_PRORUL_FLY) AND
2766 	     prd_rec.partial_period = 'Y')
2767        OR (prd_rec.end_date = l_vr_end_date AND
2768        l_proration_rule IN (pn_var_rent_calc_pkg.G_PRORUL_LY
2769 			   ,pn_var_rent_calc_pkg.G_PRORUL_FLY) AND
2770           prd_rec.partial_period = 'Y'))
2771     THEN
2772        pn_var_trueup_pkg.insert_invoice_trueup
2773           ( p_var_rent_id => p_var_rent_id
2774            ,p_period_id   => prd_rec.period_id);
2775     END IF;
2776   END LOOP;
2777 
2778 EXCEPTION
2779   WHEN OTHERS THEN RAISE;
2780 
2781 END calculate_trueup;
2782 
2783 --------------------------------------------------------------------------------
2784 --  NAME         : trueup_batch_process
2785 --  DESCRIPTION  :
2786 --  PURPOSE      :
2787 --  INVOKED FROM :
2788 --  ARGUMENTS    :
2789 --  REFERENCE    : PN_COMMON.debug()
2790 --  HISTORY      :
2791 --
2792 --  dd-mon-yyyy  name     o Created
2793 --------------------------------------------------------------------------------
2794 PROCEDURE trueup_batch_process( errbuf           OUT NOCOPY VARCHAR2
2795                                ,retcode          OUT NOCOPY VARCHAR2
2796                                ,p_property_code  IN VARCHAR2
2797                                ,p_lease_num_low  IN VARCHAR2
2798                                ,p_lease_num_high IN VARCHAR2
2799                                ,p_vr_num_low     IN VARCHAR2
2800                                ,p_vr_num_high    IN VARCHAR2
2801                                ,p_date           IN VARCHAR2)
2802 IS
2803 
2804   l_lease_num_low  VARCHAR2(30);
2805   l_lease_num_high VARCHAR2(30);
2806   l_vr_num_low     VARCHAR2(30);
2807   l_vr_num_high    VARCHAR2(30);
2808   l_date           DATE;
2809 
2810   /* get the VR to do trueup for */
2811   CURSOR get_vr_c IS
2812     SELECT
2813      vr.var_rent_id
2814     FROM
2815      pn_leases_all    lease
2816     ,pn_var_rents_all vr
2817     WHERE
2818     vr.cumulative_vol = 'T' AND
2819     vr.lease_id = lease.lease_id AND
2820     lease.lease_num BETWEEN l_lease_num_low AND l_lease_num_high AND
2821     vr.rent_num BETWEEN l_vr_num_low AND l_vr_num_high
2822     ORDER BY
2823     vr.rent_num;
2824 
2825   /* get the VR to do trueup for - used when property code is passed */
2826   CURSOR get_vr_prop_c(p_building_id IN NUMBER) IS
2827     SELECT
2828      vr.var_rent_id
2829     FROM
2830      pn_leases_all    lease
2831     ,pn_var_rents_all vr
2832     WHERE
2833     vr.cumulative_vol = pn_var_rent_calc_pkg.G_CALC_TRUE_UP AND
2834     vr.lease_id = lease.lease_id AND
2835     lease.lease_num BETWEEN l_lease_num_low AND l_lease_num_high AND
2836     vr.rent_num BETWEEN l_vr_num_low AND l_vr_num_high AND
2837     vr.location_id IN
2838       (SELECT
2839        location_id
2840        FROM
2841        pn_locations_all
2842        START WITH location_id = p_building_id
2843        CONNECT BY PRIOR location_id = parent_location_id)
2844     ORDER BY
2845     vr.rent_num;
2846 
2847   CURSOR get_buildings_c(p_prop_code IN VARCHAR2) IS
2848     SELECT DISTINCT
2849     loc.location_id
2850     FROM
2851      pn_locations_all loc
2852     ,pn_properties_all prop
2853     WHERE
2854     loc.property_id = prop.property_id AND
2855     prop.property_code = p_prop_code;
2856 
2857 BEGIN
2858    pnp_debug_pkg.log('+++*process_trueup_batch*++++++');
2859   /* init */
2860   IF p_lease_num_low IS NOT NULL THEN
2861     l_lease_num_low := p_lease_num_low;
2862   ELSE
2863     l_lease_num_low := ' ';
2864   END IF;
2865 
2866   IF p_lease_num_high IS NOT NULL THEN
2867     l_lease_num_high := p_lease_num_high;
2868   ELSE
2869     BEGIN
2870       SELECT MAX(lease_num)
2871       INTO l_lease_num_high
2872       FROM pn_leases;
2873     EXCEPTION
2874       WHEN OTHERS THEN RAISE;
2875     END;
2876   END IF;
2877 
2878   IF p_vr_num_low IS NOT NULL THEN
2879     l_vr_num_low := p_vr_num_low;
2880   ELSE
2881     l_vr_num_low := ' ';
2882   END IF;
2883 
2884   IF p_vr_num_high IS NOT NULL THEN
2885     l_vr_num_high := p_vr_num_high;
2886   ELSE
2887     BEGIN
2888       SELECT MAX(rent_num)
2889       INTO l_vr_num_high
2890       FROM pn_var_rents;
2891     EXCEPTION
2892       WHEN OTHERS THEN RAISE;
2893     END;
2894   END IF;
2895 
2896   IF p_date IS NOT NULL THEN
2897     l_date := fnd_date.canonical_to_date(p_date);
2898   ELSIF p_date IS NULL THEN
2899     l_date := TO_DATE('31-12-4712', 'DD-MM-YYYY');
2900   END IF;
2901 
2902   IF p_property_code IS NOT NULL THEN
2903 
2904     FOR bld_rec IN get_buildings_c(p_prop_code => p_property_code)
2905     LOOP
2906 
2907       FOR vr_rec IN get_vr_prop_c(p_building_id => bld_rec.location_id)
2908       LOOP
2909 
2910         pn_var_trueup_pkg.calculate_trueup
2911          ( p_var_rent_id => vr_rec.var_rent_id
2912           ,p_prd_date    => l_date);
2913 
2914       END LOOP;
2915 
2916     END LOOP;
2917 
2918   ELSIF p_property_code IS NULL THEN
2919 
2920     FOR vr_rec IN get_vr_c LOOP
2921 
2922       pn_var_trueup_pkg.calculate_trueup
2923        ( p_var_rent_id => vr_rec.var_rent_id
2924         ,p_prd_date    => l_date);
2925 
2926     END LOOP;
2927 
2928   END IF;
2929 
2930 EXCEPTION
2931   WHEN OTHERS THEN RAISE;
2932 
2933 END trueup_batch_process;
2934 
2935 
2936 PROCEDURE set_trueup_flag(l_flag VARCHAR2
2937           ) IS
2938 BEGIN
2939    --VALID VALUES ARE T AND C
2940    G_IS_TU_CONC_FLAG := l_flag;
2941 EXCEPTION
2942   WHEN others THEN
2943     RAISE;
2944 END;
2945 
2946 
2947 END PN_VAR_TRUEUP_PKG;