DBA Data[Home] [Help]

PACKAGE BODY: APPS.PN_VAR_RENT_CALC_PKG

Source


1 PACKAGE BODY pn_var_rent_calc_pkg AS
2 -- $Header: PNVRCALB.pls 120.9 2011/12/22 12:53:39 bpottipa ship $
3 /* -------------------------------------------------------------------------
4    ------------------------- COMMON DATA STRUCTURES ------------------------
5    ------------------------------------------------------------------------- */
6 TYPE NUM_T IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
7 TYPE inv_date_rec IS RECORD(
8       inv_date             pn_var_grp_dates_all.invoice_date%TYPE,
9       period_id            pn_var_periods_all.period_id%TYPE,
10       inv_flag             VARCHAR2(1));
11 
12 TYPE inv_date_type IS
13       TABLE OF inv_date_rec
14       INDEX BY BINARY_INTEGER;
15 
16  /* -------------------------------------------------------------------------
17    ------------------------- GLOBAL VARIABLES ------------------------------
18    ------------------------------------------------------------------------- */
19    g_calc_type       VARCHAR2(30);
20    g_invoice_on      VARCHAR2(30);
21    inv_date_tab      inv_date_type;
22    g_precision       NUMBER;
23    g_partial_prd_flag     VARCHAR2(1); ---- roll forward flag for 1st partial period
24 
25 /* -------------------------------------------------------------------------
26    ------------------------ PROCEDURES AND FUNCTIONS -----------------------
27    ------------------------------------------------------------------------- */
28 
29 --------------------------------------------------------------------------------
30 --  NAME         : cache_vr_details
31 --  DESCRIPTION  :
32 --  PURPOSE      :
33 --  INVOKED FROM :
34 --  ARGUMENTS    :
35 --  REFERENCE    : PN_COMMON.debug()
36 --  HISTORY      :
37 --
38 --  dd-mon-yyyy  name     o Created
39 --------------------------------------------------------------------------------
40 PROCEDURE cache_vr_details(p_var_rent_id IN NUMBER) IS
41 
42 BEGIN
43 
44   /* get the VR details */
45   FOR vr_rec IN vr_c(p_vr_id => p_var_rent_id) LOOP
46 
47     g_org_id               := vr_rec.org_id;
48     g_vr_commencement_date := vr_rec.commencement_date;
49     g_vr_termination_date  := vr_rec.termination_date;
50     g_proration_rule       := vr_rec.proration_rule;
51     g_calculation_method   := vr_rec.cumulative_vol;
52     g_negative_rent        := vr_rec.negative_rent;
53 
54   END LOOP;
55 
56 EXCEPTION
57   WHEN OTHERS THEN RAISE;
58 
59 END cache_vr_details;
60 
61 --------------------------------------------------------------------------------
62 --  NAME         : get_fy_proration_factor
63 --  DESCRIPTION  :
64 --  PURPOSE      :
65 --  INVOKED FROM :
66 --  ARGUMENTS    :
67 --  REFERENCE    : PN_COMMON.debug()
68 --  HISTORY      :
69 --
70 --  dd-mon-yyyy  name     o Created
71 --------------------------------------------------------------------------------
72 FUNCTION get_fy_proration_factor(p_var_rent_id IN NUMBER)
73 RETURN NUMBER IS
74 
75   /* get VR start date */
76   CURSOR vr_start_date_c(p_vr_id IN NUMBER) IS
77     SELECT
78     commencement_date
79     FROM
80     pn_var_rents_all
81     WHERE
82     var_rent_id = p_vr_id;
83 
84   /* get first period details */
85   CURSOR first_period_c( p_vr_id IN NUMBER
86                         ,p_st_dt IN DATE) IS
87     SELECT
88      period_id
89     ,start_date
90     ,end_date
91     FROM
92     pn_var_periods_all
93     WHERE
94     var_rent_id = p_vr_id AND
95     start_date = p_st_dt AND
96     partial_period = 'Y';
97 
98   l_fy_proration_factor NUMBER;
99 
100 BEGIN
101 
102   l_fy_proration_factor := 0;
103 
104   FOR vr_rec IN vr_start_date_c(p_vr_id => p_var_rent_id) LOOP
105 
106     FOR prd_rec IN first_period_c( p_vr_id => p_var_rent_id
107                                   ,p_st_dt => vr_rec.commencement_date) LOOP
108 
109       l_fy_proration_factor
110       := ((prd_rec.end_date - prd_rec.start_date) + 1)
111           / (ADD_MONTHS(vr_rec.commencement_date, 12)
112              - vr_rec.commencement_date);
113 
114     END LOOP;
115 
116   END LOOP;
117 
118   RETURN l_fy_proration_factor;
119 
120 EXCEPTION
121   WHEN OTHERS THEN RAISE;
122 
123 END get_fy_proration_factor;
124 
125 --------------------------------------------------------------------------------
126 --  NAME         : get_ly_proration_factor
127 --  DESCRIPTION  :
128 --  PURPOSE      :
129 --  INVOKED FROM :
130 --  ARGUMENTS    :
131 --  REFERENCE    : PN_COMMON.debug()
132 --  HISTORY      :
133 --
134 --  dd-mon-yyyy  name     o Created
135 --------------------------------------------------------------------------------
136 FUNCTION get_ly_proration_factor(p_var_rent_id IN NUMBER)
137 RETURN NUMBER IS
138 
139   /* get VR end date */
140   CURSOR vr_end_date_c(p_vr_id IN NUMBER) IS
141     SELECT
142     termination_date
143     FROM
144     pn_var_rents_all
145     WHERE
146     var_rent_id = p_vr_id;
147 
148   /* get last period details */
149   CURSOR last_period_c( p_vr_id  IN NUMBER
150                        ,p_end_dt IN DATE) IS
151     SELECT
152      period_id
153     ,start_date
154     ,end_date
155     FROM
156     pn_var_periods_all
157     WHERE
158     var_rent_id = p_vr_id AND
159     end_date = p_end_dt AND
160     partial_period = 'Y';
161 
162   l_ly_proration_factor NUMBER;
163 
164 BEGIN
165 
166   l_ly_proration_factor := 0;
167 
168   FOR vr_rec IN vr_end_date_c(p_vr_id => p_var_rent_id) LOOP
169 
170     FOR prd_rec IN last_period_c( p_vr_id => p_var_rent_id
171                                  ,p_end_dt => vr_rec.termination_date) LOOP
172 
173       l_ly_proration_factor
174       := ((prd_rec.end_date - prd_rec.start_date) + 1)
175           / (vr_rec.termination_date
176             - ADD_MONTHS(vr_rec.termination_date, -12));
177 
178     END LOOP;
179 
180   END LOOP;
181 
182   RETURN l_ly_proration_factor;
183 
184 EXCEPTION
185   WHEN OTHERS THEN RAISE;
186 
187 END get_ly_proration_factor;
188 
189 --------------------------------------------------------------------------------
190 --  NAME         : exists_approved_sales
191 --  DESCRIPTION  :
192 --  PURPOSE      :
193 --  INVOKED FROM :
194 --  ARGUMENTS    :
195 --  REFERENCE    : PN_COMMON.debug()
196 --  HISTORY      :
197 --
198 --  dd-mon-yyyy  name     o Created
199 --------------------------------------------------------------------------------
200 FUNCTION exists_approved_sales( p_line_item_id IN NUMBER
201                                ,p_grp_date_id  IN NUMBER)
202 RETURN BOOLEAN IS
203 
204   l_exists_approved_sales BOOLEAN;
205 
206   /* exists approved sales? */
207   CURSOR approved_sales_c( p_line_id IN NUMBER
208                           ,p_grp_id  IN NUMBER) IS
209     SELECT
210     1
211     FROM dual
212     WHERE
213     EXISTS
214      (SELECT
215       vol_hist_id
216       FROM
217       pn_var_vol_hist_all
218       WHERE
219       line_item_id = p_line_id AND
220       grp_date_id  = p_grp_id AND
221       vol_hist_status_code = pn_var_rent_calc_pkg.G_SALESVOL_STATUS_APPROVED);
222 
223 BEGIN
224 
225   l_exists_approved_sales := FALSE;
226 
227   FOR rec IN approved_sales_c( p_line_id => p_line_item_id
228                               ,p_grp_id  => p_grp_date_id) LOOP
229 
230     l_exists_approved_sales := TRUE;
231     EXIT;
232 
233   END LOOP;
234 
235   RETURN l_exists_approved_sales;
236 
237 EXCEPTION
238   WHEN OTHERS THEN RAISE;
239 
240 END exists_approved_sales;
241 
242 --------------------------------------------------------------------------------
243 --  NAME         : find_prev_billed - regular
244 --  DESCRIPTION  :
245 --  PURPOSE      :
246 --  INVOKED FROM :
247 --  ARGUMENTS    :
248 --  REFERENCE    : PN_COMMON.debug()
249 --  HISTORY      :
250 --
251 --  dd-mon-yyyy  name     o Created
252 --------------------------------------------------------------------------------
253 FUNCTION find_prev_billed( p_var_rent_id      IN NUMBER
254                           ,p_period_id        IN NUMBER
255                           ,p_line_item_id     IN NUMBER
256                           ,p_calc_prd_st_dt   IN DATE
257                           ,p_calc_prd_end_dt  IN DATE
258                           ,p_reset_grp_id     IN NUMBER)
259 RETURN NUMBER IS
260 
261   /* get previous billed */
262   CURSOR prev_billed_c( p_vr_id      IN NUMBER
263                        ,p_prd_id     IN NUMBER
264                        ,p_line_id    IN NUMBER
265                        ,p_rst_grp_id IN NUMBER
266                        ,p_date       IN DATE) IS
267     SELECT NVL(SUM(percent_rent_due), 0) AS prev_billed_amt
268     FROM
269     pn_var_trx_headers_all
270     WHERE
271     var_rent_id = p_vr_id AND
272     period_id = p_prd_id AND
273     line_item_id = p_line_id AND
274     reset_group_id = p_rst_grp_id AND
275     calc_prd_start_date < p_date;
276 
277   l_prev_billed_rent NUMBER;
278 
279 BEGIN
280 
281   l_prev_billed_rent := 0;
282 
283   FOR rec IN prev_billed_c( p_vr_id      => p_var_rent_id
284                            ,p_prd_id     => p_period_id
285                            ,p_line_id    => p_line_item_id
286                            ,p_rst_grp_id => p_reset_grp_id
287                            ,p_date       => p_calc_prd_st_dt) LOOP
288 
289     l_prev_billed_rent := rec.prev_billed_amt;
290 
291   END LOOP;
292 
293   RETURN l_prev_billed_rent;
294 
295 EXCEPTION
296   WHEN OTHERS THEN RAISE;
297 
298 END find_prev_billed;
299 
300 --------------------------------------------------------------------------------
301 --  NAME         : find_prev_billed - invoice_flag = P
302 --  DESCRIPTION  :
303 --  PURPOSE      :
304 --  INVOKED FROM :
305 --  ARGUMENTS    :
306 --  REFERENCE    : PN_COMMON.debug()
307 --  HISTORY      :
308 --
309 --  dd-mon-yyyy  name     o Created
310 --------------------------------------------------------------------------------
311 FUNCTION find_prev_billed( p_var_rent_id      IN NUMBER
312                           ,p_line_item_grp_id IN NUMBER
313                           ,p_calc_prd_st_dt   IN DATE
314                           ,p_calc_prd_end_dt  IN DATE
315                           ,p_reset_grp_id     IN NUMBER)
316 RETURN NUMBER IS
317 
318   /* get previous billed */
319   CURSOR prev_billed_c( p_vr_id       IN NUMBER
320                        ,p_part_prd_id IN NUMBER
321                        ,p_full_prd_id IN NUMBER
322                        ,p_line_grp_id IN NUMBER
323                        ,p_rst_grp_id  IN NUMBER
324                        ,p_date        IN DATE) IS
325     SELECT NVL(SUM(percent_rent_due), 0) AS prev_billed_amt
326     FROM
327     pn_var_trx_headers_all
328     WHERE
329     var_rent_id = p_vr_id AND
330     period_id IN (p_part_prd_id, p_full_prd_id) AND
331     line_item_group_id = p_line_grp_id AND
332     reset_group_id = p_rst_grp_id AND
333     calc_prd_start_date < p_date;
334 
335   l_prev_billed_rent NUMBER;
336 
337   /* get the period details - we use the first 2 periods */
338   CURSOR periods_c(p_vr_id IN NUMBER) IS
339     SELECT
340     period_id
341     FROM
342     pn_var_periods_all
343     WHERE
344     var_rent_id = p_vr_id
345     ORDER BY
346     start_date;
347 
348   /* period info */
349   l_part_prd_id NUMBER;
350   l_full_prd_id NUMBER;
351   l_counter1    NUMBER;
352 
353 BEGIN
354 
355   l_counter1 := 0;
356 
357   FOR rec IN periods_c(p_vr_id => p_var_rent_id) LOOP
358 
359     l_counter1 := l_counter1 + 1;
360 
361     IF l_counter1 = 1 THEN
362       l_part_prd_id := rec.period_id;
363 
364     ELSIF l_counter1 = 2 THEN
365       l_full_prd_id := rec.period_id;
366 
367     END IF;
368 
369   END LOOP;
370 
371   l_prev_billed_rent := 0;
372 
373   FOR rec IN prev_billed_c( p_vr_id       => p_var_rent_id
374                            ,p_part_prd_id => l_part_prd_id
375                            ,p_full_prd_id => l_full_prd_id
376                            ,p_line_grp_id => p_line_item_grp_id
377                            ,p_rst_grp_id  => p_reset_grp_id
378                            ,p_date        => p_calc_prd_st_dt) LOOP
379 
380     l_prev_billed_rent := rec.prev_billed_amt;
381 
382   END LOOP;
383 
384   RETURN l_prev_billed_rent;
385 
386 EXCEPTION
387   WHEN OTHERS THEN RAISE;
388 
389 END find_prev_billed;
390 
391 --------------------------------------------------------------------------------
392 --  NAME         : get_rent_applicable
393 --  DESCRIPTION  :
394 --  PURPOSE      :
395 --  INVOKED FROM :
396 --  ARGUMENTS    :
397 --  REFERENCE    : PN_COMMON.debug()
398 --  HISTORY      :
399 --
400 --  dd-mon-yyyy  name     o Created
401 --------------------------------------------------------------------------------
402 PROCEDURE get_rent_applicable
403 (p_trx_hdr_rec IN OUT NOCOPY pn_var_rent_calc_pkg.trx_hdr_c%ROWTYPE)
404 IS
405 
406   /* cache trx hdr passed */
407   l_trx_hdr_rec pn_var_rent_calc_pkg.trx_hdr_c%ROWTYPE;
408 
409   /* get bkpt type */
410   CURSOR bkpt_type_c(p_bkdt_id IN NUMBER) IS
411     SELECT
412      bkhd.bkpt_header_id
413     ,bkhd.breakpoint_type
414     FROM
415      pn_var_bkpts_head_all bkhd
416     ,pn_var_bkpts_det_all  bkdt
417      WHERE
418     bkdt.bkpt_detail_id = p_bkdt_id AND
419     bkdt.bkpt_header_id = bkhd.bkpt_header_id;
420 
421   l_bkpt_type VARCHAR2(30);
422 
423   l_bkpts_t TRX_DTL_TBL;
424 
425   l_net_volume NUMBER;
426   l_bkpt_start NUMBER;
427   l_bkpt_end   NUMBER;
428   l_calc_rent  NUMBER;
429 
430   /* get FY sales */
431   CURSOR fy_sales_c( p_vr_id            IN NUMBER
432                     ,p_vr_comm_date     IN DATE
433                     ,p_line_item_grp_id IN NUMBER) IS
434     SELECT
435     NVL(SUM(fy_proration_sales - NVL(fy_proration_deductions,0) ),0) AS sales
436     FROM
437     pn_var_trx_headers_all
438     WHERE
439     var_rent_id = p_vr_id AND
440     line_item_group_id = p_line_item_grp_id AND
441     calc_prd_start_date <= (ADD_MONTHS(p_vr_comm_date, 12) - 1) ;
442 
443   /* get FY breakpoints */
444   CURSOR fy_bkpts_c( p_vr_id            IN NUMBER
445                     ,p_vr_comm_date     IN DATE
446                     ,p_line_item_grp_id IN NUMBER) IS
447     SELECT
448      NVL(SUM(fy_pr_grp_vol_start),0) AS bkpt_start
449     ,NVL(SUM(fy_pr_grp_vol_end),0)   AS bkpt_end
450     ,bkpt_rate
451     FROM
452     pn_var_trx_details_all
453     WHERE
454     trx_header_id IN
455      (SELECT
456       trx_header_id
457       FROM
458       pn_var_trx_headers_all
459       WHERE
460       var_rent_id = p_vr_id AND
461       line_item_group_id = p_line_item_grp_id AND
462       calc_prd_start_date <= (ADD_MONTHS(p_vr_comm_date, 12) - 1))
463     GROUP BY
464     bkpt_rate
465     ORDER BY
466     bkpt_start;
467 
468   /* sum the proration factor in groups - FY */
469   CURSOR grp_pro_factor_sum_fy_c( p_vr_id        IN NUMBER
470                                  ,p_vr_comm_date IN DATE) IS
471     SELECT
472     NVL(SUM(proration_factor),0) proration_factor_sum
473     FROM
474     pn_var_grp_dates_all
475     WHERE
476     period_id IN (SELECT
477                   period_id
478                   FROM
479                   pn_var_periods_all
480                   WHERE
481                   var_rent_id = p_vr_id AND
482                   start_date = p_vr_comm_date);
483 
484   /* get LY sales */
485   CURSOR ly_sales_c( p_vr_id            IN NUMBER
486                     ,p_vr_term_date     IN DATE
487                     ,p_line_item_grp_id IN NUMBER) IS
488     SELECT
489     NVL(SUM(ly_proration_sales - NVL(ly_proration_deductions,0) ),0) AS sales
490     FROM
491     pn_var_trx_headers_all
492     WHERE
493     var_rent_id = p_vr_id AND
494     line_item_group_id = p_line_item_grp_id AND
495     calc_prd_end_date >= (ADD_MONTHS(p_vr_term_date, -12) + 1);
496 
497   /* get LY breakpoints */
498   CURSOR ly_bkpts_c( p_vr_id            IN NUMBER
499                     ,p_vr_term_date     IN DATE
500                     ,p_line_item_grp_id IN NUMBER) IS
501     SELECT
502      NVL(SUM(ly_pr_grp_vol_start),0) AS bkpt_start
503     ,NVL(SUM(ly_pr_grp_vol_end),0)   AS bkpt_end
504     ,bkpt_rate
505     FROM
506     pn_var_trx_details_all
507     WHERE
508     trx_header_id IN
509      (SELECT
510       trx_header_id
511       FROM
512       pn_var_trx_headers_all
513       WHERE
514       var_rent_id = p_vr_id AND
515       line_item_group_id = p_line_item_grp_id AND
516       calc_prd_end_date >= (ADD_MONTHS(p_vr_term_date, -12) + 1))
517     GROUP BY
518     bkpt_rate
519     ORDER BY
520     bkpt_start;
521 
522   /* sum the proration factor in groups - LY */
523   CURSOR grp_pro_factor_sum_ly_c( p_vr_id        IN NUMBER
524                                  ,p_vr_term_date IN DATE) IS
525     SELECT
526     NVL(SUM(proration_factor),0) proration_factor_sum
527     FROM
528     pn_var_grp_dates_all
529     WHERE
530     period_id IN (SELECT
531                   period_id
532                   FROM
533                   pn_var_periods_all
534                   WHERE
535                   var_rent_id = p_vr_id AND
536                   end_date = p_vr_term_date);
537 
538   /* get calc freq */
539   CURSOR calc_freq_c(p_vr_id IN NUMBER) IS
540     SELECT
541     reptg_freq_code AS report_freq_code
542     FROM
543     pn_var_rent_dates_all
544     WHERE
545     var_rent_id = p_vr_id;
546 
547   /* get the number of periods */
548   CURSOR period_num_c ( p_vr_id IN NUMBER) IS
549     SELECT
550     count(period_id) perion_num
551     FROM
552     pn_var_periods_all
553     WHERE
554     var_rent_id = p_vr_id AND
555     NVL(status, 'A') <> pn_var_rent_calc_pkg.G_PERIOD_REVERSED_STATUS;
556 
557   /* get the last partial period */
558   CURSOR last_period_c( p_vr_id     IN NUMBER) IS
559     SELECT
560      prd.period_id
561     ,prd.partial_period
562     FROM
563     pn_var_periods_all prd,
564     pn_var_rents_all   var
565     WHERE
566     prd.var_rent_id = p_vr_id AND
567     prd.var_rent_id = var.var_rent_id AND
568     prd.end_date = var.termination_date;
569 
570   /* get the first partial period */
571   CURSOR first_period_c( p_vr_id     IN NUMBER) IS
572     SELECT
573      prd.period_id
574     ,prd.partial_period
575     FROM
576     pn_var_periods_all prd,
577     pn_var_rents_all   var
578     WHERE
579     prd.var_rent_id = p_vr_id AND
580     prd.var_rent_id = var.var_rent_id AND
581     prd.start_date = var.commencement_date;
582 
583   CURSOR freq_cur(p_vr_id     IN NUMBER) IS
584     SELECT var_rent_id
585     FROM  pn_var_rent_dates_all
586     WHERE reptg_freq_code = 'YR'
587     AND   invg_freq_code = 'YR'
588     AND   var_rent_id = p_vr_id;
589 
590   l_prorat_factor_sum NUMBER;
591 
592   l_prev_billed NUMBER;
593 
594   l_context VARCHAR2(255);
595 
596   l_first_partial VARCHAR2(1);
597   l_last_partial  VARCHAR2(1);
598   l_period_num    NUMBER  := 0;
599 
600 BEGIN
601 
602   pnp_debug_pkg.log('++++ get_rent_applicable - START ++++');
603 
604   IF NVL(p_trx_hdr_rec.invoice_flag, 'Y') = 'N' THEN
605     RETURN;
606   END IF;
607 
608   /* cache the trx header rec passed in */
609   l_trx_hdr_rec := p_trx_hdr_rec;
610 
611   /* if VR details are not availabe at the package level, cache it */
612   IF g_proration_rule IS NULL OR
613      g_calculation_method IS NULL OR
614      g_negative_rent IS NULL
615   THEN
616 
617     /* cache VR details */
618     pn_var_rent_calc_pkg.cache_vr_details
619       (p_var_rent_id => l_trx_hdr_rec.var_rent_id);
620 
621   END IF;
622 
623   l_context := ' Cache volume and bkpts ';
624 
625   /* cache bkpt details */
626   l_bkpts_t.DELETE;
627 
628   OPEN pn_var_rent_calc_pkg.trx_dtl_c(p_hdr_id => p_trx_hdr_rec.trx_header_id);
629   FETCH pn_var_rent_calc_pkg.trx_dtl_c BULK COLLECT INTO l_bkpts_t;
630   CLOSE pn_var_rent_calc_pkg.trx_dtl_c;
631 
632   /* get the breakpoint type - flat, sliding, stratified */
633   FOR rec IN bkpt_type_c(p_bkdt_id => l_bkpts_t(1).bkpt_detail_id)
634   LOOP
635     l_bkpt_type := rec.breakpoint_type;
636   END LOOP;
637 
638   IF g_calculation_method IN ( pn_var_rent_calc_pkg.G_CALC_NON_CUMULATIVE
639                               ,pn_var_rent_calc_pkg.G_CALC_TRUE_UP)
640   THEN
641     l_net_volume := (l_trx_hdr_rec.prorated_group_sales - NVL(l_trx_hdr_rec.prorated_group_deductions,0));
642 
643   ELSIF g_calculation_method IN ( pn_var_rent_calc_pkg.G_CALC_CUMULATIVE
644                                  ,pn_var_rent_calc_pkg.G_CALC_YTD)
645   THEN
646     l_net_volume := (l_trx_hdr_rec.ytd_sales - NVL(l_trx_hdr_rec.ytd_deductions,0));
647 
648   END IF;
649 
650   pnp_debug_pkg.log(l_context||' COMPLETE  - net Volume: '||l_net_volume);
651 
652 
653   /* --------------------- GET calculated_rent START --------------------- */
654   /* handling the case of volume not tripping any bkpts */
655   l_context := ' Get calculated rent ';
656 
657   /* init the calculated rent to 0 - it will be re-calculated */
658   l_trx_hdr_rec.calculated_rent := 0;
659 
660   IF g_calculation_method IN ( pn_var_rent_calc_pkg.G_CALC_NON_CUMULATIVE
661                               ,pn_var_rent_calc_pkg.G_CALC_TRUE_UP)
662      AND
663      ((g_proration_rule IN ( pn_var_rent_calc_pkg.G_PRORUL_NP
664                             ,pn_var_rent_calc_pkg.G_PRORUL_STD
665                             ,pn_var_rent_calc_pkg.G_PRORUL_FY
666                             ,pn_var_rent_calc_pkg.G_PRORUL_LY
667                             ,pn_var_rent_calc_pkg.G_PRORUL_FLY
668                             ,pn_var_rent_calc_pkg.G_PRORUL_CYP) AND
669        l_net_volume < l_bkpts_t(1).prorated_grp_vol_start)
670       OR
671       (g_proration_rule = pn_var_rent_calc_pkg.G_PRORUL_CYNP AND
672        l_net_volume < l_bkpts_t(1).pr_grp_blended_vol_start))
673   THEN
674 
675      pnp_debug_pkg.log('No volumes tripped.');
676      pnp_debug_pkg.log('l_net_volume:'||l_net_volume);
677      pnp_debug_pkg.log
678      ('l_bkpts_t(1).prorated_grp_vol_start:'||l_bkpts_t(1).prorated_grp_vol_start);
679     /* Once no breakpoints are tripped, Macerich consider the rent to be = 0 */
680     IF (g_proration_rule IN ( pn_var_rent_calc_pkg.G_PRORUL_NP
681                             ,pn_var_rent_calc_pkg.G_PRORUL_STD
682                             ,pn_var_rent_calc_pkg.G_PRORUL_FY
683                             ,pn_var_rent_calc_pkg.G_PRORUL_LY
684                             ,pn_var_rent_calc_pkg.G_PRORUL_FLY
685                             ,pn_var_rent_calc_pkg.G_PRORUL_CYP))  THEN
686 
687         l_trx_hdr_rec.calculated_rent
688           := (l_net_volume - l_bkpts_t(1).prorated_grp_vol_start)
689           * l_bkpts_t(1).bkpt_rate;
690 
691     ELSE
692       l_trx_hdr_rec.calculated_rent
693           := (l_net_volume - l_bkpts_t(1).pr_grp_blended_vol_start)
694           * l_bkpts_t(1).bkpt_rate;
695 
696     END IF;
697     pnp_debug_pkg.log('l_trx_hdr_rec.calculated_rent'||l_trx_hdr_rec.calculated_rent);
698 
699 
700   ELSE
701 
702     /* get l_trx_hdr_rec.calculated_rent - CALCULATED RENT */
703     IF l_bkpt_type = pn_var_rent_calc_pkg.G_BKPT_TYP_STRATIFIED
704     THEN
705 
706       l_trx_hdr_rec.calculated_rent := 0;
707 
708       /* loop for all bkpt details */
709       FOR i IN l_bkpts_t.FIRST..l_bkpts_t.LAST LOOP
710 
711         IF g_calculation_method IN ( pn_var_rent_calc_pkg.G_CALC_NON_CUMULATIVE
712                                     ,pn_var_rent_calc_pkg.G_CALC_TRUE_UP)
713         THEN
714 
715           IF g_proration_rule = pn_var_rent_calc_pkg.G_PRORUL_CYNP THEN
716 
717             l_bkpt_start := NVL(l_bkpts_t(i).pr_grp_blended_vol_start
718                                 ,l_bkpts_t(i).prorated_grp_vol_start);
719             l_bkpt_end   := NVL(l_bkpts_t(i).pr_grp_blended_vol_end
720                                 ,l_bkpts_t(i).prorated_grp_vol_end);
721 
722           ELSE
723 
724             l_bkpt_start := l_bkpts_t(i).prorated_grp_vol_start;
725             l_bkpt_end   := l_bkpts_t(i).prorated_grp_vol_end;
726 
727           END IF; /* g_proration_rule */
728 
729         ELSIF g_calculation_method = pn_var_rent_calc_pkg.G_CALC_CUMULATIVE
730         THEN
731 
732           IF g_proration_rule = pn_var_rent_calc_pkg.G_PRORUL_NP THEN
733 
734             l_bkpt_start := l_bkpts_t(i).prorated_grp_vol_start;
735             l_bkpt_end   := l_bkpts_t(i).prorated_grp_vol_end;
736 
737           ELSE
738 
739             l_bkpt_start := l_bkpts_t(i).blended_period_vol_start;
740             l_bkpt_end   := l_bkpts_t(i).blended_period_vol_end;
741 
742           END IF;
743 
744         ELSIF g_calculation_method = pn_var_rent_calc_pkg.G_CALC_YTD
745         THEN
746 
747           l_bkpt_start := l_bkpts_t(i).ytd_group_vol_start;
748           l_bkpt_end   := l_bkpts_t(i).ytd_group_vol_end;
749 
750         END IF; /* g_calculation_method */
751 
752         IF l_bkpt_end IS NULL OR l_bkpt_end = 0 THEN
753           l_bkpt_end := NULL;
754         END IF;
755 
756         IF l_net_volume >= l_bkpt_start THEN
757 
758           IF l_net_volume <= NVL(l_bkpt_end, l_net_volume) THEN
759 
760             l_trx_hdr_rec.calculated_rent
761             := l_trx_hdr_rec.calculated_rent
762                + (l_net_volume - l_bkpt_start) * l_bkpts_t(i).bkpt_rate;
763 
764           ELSIF l_net_volume > l_bkpt_end THEN
765 
766             l_trx_hdr_rec.calculated_rent
767             := l_trx_hdr_rec.calculated_rent
768                + (l_bkpt_end - l_bkpt_start) * l_bkpts_t(i).bkpt_rate;
769 
770           END IF;
771 
772         ELSE
773 
774           EXIT;
775 
776         END IF; /* net vol > bkpt start */
777 
778       END LOOP; /* loop for all bkpt details */
779 
780     ELSIF l_bkpt_type IN ( pn_var_rent_calc_pkg.G_BKPT_TYP_FLAT
781                           ,pn_var_rent_calc_pkg.G_BKPT_TYP_SLIDING)
782     THEN
783 
784       FOR i IN l_bkpts_t.FIRST..l_bkpts_t.LAST LOOP
785 
786         IF g_calculation_method IN ( pn_var_rent_calc_pkg.G_CALC_NON_CUMULATIVE
787                                     ,pn_var_rent_calc_pkg.G_CALC_TRUE_UP)
788         THEN
789 
790           IF g_proration_rule = pn_var_rent_calc_pkg.G_PRORUL_CYNP THEN
791 
792             l_bkpt_start := NVL(l_bkpts_t(i).pr_grp_blended_vol_start
793                                 ,l_bkpts_t(i).prorated_grp_vol_start);
794             l_bkpt_end   := NVL(l_bkpts_t(i).pr_grp_blended_vol_end
795                                 ,l_bkpts_t(i).prorated_grp_vol_end);
796 
797           ELSE
798 
799             l_bkpt_start := l_bkpts_t(i).prorated_grp_vol_start;
800             l_bkpt_end   := l_bkpts_t(i).prorated_grp_vol_end;
801 
802           END IF; /* g_proration_rule */
803 
804         ELSIF g_calculation_method = pn_var_rent_calc_pkg.G_CALC_CUMULATIVE
805         THEN
806 
807           IF g_proration_rule = pn_var_rent_calc_pkg.G_PRORUL_NP THEN
808 
809             l_bkpt_start := l_bkpts_t(i).prorated_grp_vol_start;
810             l_bkpt_end   := l_bkpts_t(i).prorated_grp_vol_end;
811 
812           ELSE
813 
814             l_bkpt_start := l_bkpts_t(i).blended_period_vol_start;
815             l_bkpt_end   := l_bkpts_t(i).blended_period_vol_end;
816 
817           END IF;
818 
819         ELSIF g_calculation_method = pn_var_rent_calc_pkg.G_CALC_YTD
820         THEN
821 
822           l_bkpt_start := l_bkpts_t(i).ytd_group_vol_start;
823           l_bkpt_end   := l_bkpts_t(i).ytd_group_vol_end;
824 
825         END IF; /* g_calculation_method */
826 
827         IF l_bkpt_end IS NULL OR l_bkpt_end = 0 THEN
828           l_bkpt_end := NULL;
829         END IF;
830 
831         IF l_net_volume >= l_bkpt_start AND
832            l_net_volume <= NVL(l_bkpt_end, l_net_volume)
833         THEN
834 
835           IF l_bkpt_type = pn_var_rent_calc_pkg.G_BKPT_TYP_SLIDING THEN
836 
837             l_trx_hdr_rec.calculated_rent
838             := l_net_volume * l_bkpts_t(i).bkpt_rate;
839 
840           ELSIF l_bkpt_type = pn_var_rent_calc_pkg.G_BKPT_TYP_FLAT THEN
841 
842             l_trx_hdr_rec.calculated_rent
843             := (l_net_volume - l_bkpt_start) * l_bkpts_t(i).bkpt_rate;
844 
845           END IF;
846 
847           EXIT;
848 
849         END IF;
850 
851       END LOOP;
852 
853     END IF; /* breakpoint type */
854 
855   END IF; /* volume trips breakpoint?? */
856 
857   pnp_debug_pkg.log(l_context||' COMPLETE ');
858 
859   /* ---------------------- GET calculated_rent END ---------------------- */
860 
861   /* at this point, we have the calculated rent
862      need to find
863      - percent rent due
864      - ytd percent rent
865      - prorated rent due (if necessary) */
866 
867   /* -------------------- GET prorated_rent_due START --------------------- */
868   /* if we need to find the prorated_rent_due */
869   l_context := ' Get prorated rent ';
870 
871   /* init the prorated rent to 0 - it will be re-calculated */
872   l_trx_hdr_rec.prorated_rent_due := 0;
873 
874   IF NVL(l_trx_hdr_rec.invoice_flag, 'Y') = 'I' THEN
875 
876     pnp_debug_pkg.log('+++ Get Prorated Rent - START +++');
877     pnp_debug_pkg.log('Invoice Flag: '||l_trx_hdr_rec.invoice_flag);
878 
879     IF g_proration_rule IN ( pn_var_rent_calc_pkg.G_PRORUL_FY
880                             ,pn_var_rent_calc_pkg.G_PRORUL_FLY) AND
881        ((ADD_MONTHS(g_vr_commencement_date, 12) - 1) BETWEEN
882         l_trx_hdr_rec.calc_prd_start_date AND l_trx_hdr_rec.calc_prd_end_date)
883     THEN
884 
885       pnp_debug_pkg.log('Get Prorated Rent - FY');
886 
887       /* calculate FY prorated rent due */
888       FOR rec IN fy_sales_c
889                   ( p_vr_id            => l_trx_hdr_rec.var_rent_id
890                    ,p_vr_comm_date     => g_vr_commencement_date
891                    ,p_line_item_grp_id => l_trx_hdr_rec.line_item_group_id)
892       LOOP
893         l_net_volume := rec.sales;
894       END LOOP;
895 
896       /* get l_trx_hdr_rec.calculated_rent - CALCULATED RENT */
897       IF l_bkpt_type = pn_var_rent_calc_pkg.G_BKPT_TYP_STRATIFIED
898       THEN
899 
900         l_trx_hdr_rec.prorated_rent_due := 0;
901 
902         /* loop for all bkpt details */
903         FOR bkpt_rec IN fy_bkpts_c
904                         ( p_vr_id            => l_trx_hdr_rec.var_rent_id
905                          ,p_vr_comm_date     => g_vr_commencement_date
906                          ,p_line_item_grp_id => l_trx_hdr_rec.line_item_group_id)
907         LOOP
908 
909           l_bkpt_start := bkpt_rec.bkpt_start;
910           l_bkpt_end   := bkpt_rec.bkpt_end;
911 
912           IF l_bkpt_end IS NULL OR l_bkpt_end = 0 THEN
913             l_bkpt_end := NULL;
914           END IF;
915 
916           IF l_net_volume >= l_bkpt_start THEN
917 
918             IF l_net_volume <= NVL(l_bkpt_end, l_net_volume) THEN
919 
920               l_trx_hdr_rec.prorated_rent_due
921               := l_trx_hdr_rec.prorated_rent_due
922                  + (l_net_volume - l_bkpt_start) * bkpt_rec.bkpt_rate;
923 
924             ELSIF l_net_volume > l_bkpt_end THEN
925 
926               l_trx_hdr_rec.prorated_rent_due
927               := l_trx_hdr_rec.prorated_rent_due
928                  + (l_bkpt_end - l_bkpt_start) * bkpt_rec.bkpt_rate;
929 
930             END IF;
931 
932           ELSE
933 
934             EXIT;
935 
936           END IF; /* net vol > bkpt start */
937 
938         END LOOP; /* loop for all bkpt details */
939 
940       ELSIF l_bkpt_type IN ( pn_var_rent_calc_pkg.G_BKPT_TYP_FLAT
941                             ,pn_var_rent_calc_pkg.G_BKPT_TYP_SLIDING)
942       THEN
943 
944         /* loop for all bkpt details */
945         FOR bkpt_rec IN fy_bkpts_c
946                         ( p_vr_id            => l_trx_hdr_rec.var_rent_id
947                          ,p_vr_comm_date     => g_vr_commencement_date
948                          ,p_line_item_grp_id => l_trx_hdr_rec.line_item_group_id)
949         LOOP
950 
951           l_bkpt_start := bkpt_rec.bkpt_start;
952           l_bkpt_end   := bkpt_rec.bkpt_end;
953 
954           IF l_bkpt_end IS NULL OR l_bkpt_end = 0 THEN
955             l_bkpt_end := NULL;
956           END IF;
957 
958           IF l_net_volume >= l_bkpt_start AND
959              l_net_volume <= NVL(l_bkpt_end, l_net_volume)
960           THEN
961 
962             IF l_bkpt_type = pn_var_rent_calc_pkg.G_BKPT_TYP_SLIDING THEN
963 
964               l_trx_hdr_rec.prorated_rent_due
965               := l_net_volume * bkpt_rec.bkpt_rate;
966 
967             ELSIF l_bkpt_type = pn_var_rent_calc_pkg.G_BKPT_TYP_FLAT THEN
968 
969               l_trx_hdr_rec.prorated_rent_due
970               := (l_net_volume - l_bkpt_start) * bkpt_rec.bkpt_rate;
971 
972             END IF;
973 
974             EXIT;
975 
976           END IF;
977 
978         END LOOP;
979 
980       END IF; /* breakpoint type */
981 
982       /*Handle the case of volumes not tripping any breakpoints*/
983       FOR bkpt_rec IN fy_bkpts_c
984                         ( p_vr_id            => l_trx_hdr_rec.var_rent_id
985                          ,p_vr_comm_date     => g_vr_commencement_date
986                          ,p_line_item_grp_id => l_trx_hdr_rec.line_item_group_id)
987                          LOOP
988          IF (l_net_volume < bkpt_rec.bkpt_start)  THEN
989            -- The volumes did not trip any breakpoints
990                 l_trx_hdr_rec.prorated_rent_due
991                  := l_trx_hdr_rec.prorated_rent_due
992                     + (l_net_volume - l_bkpt_start) * bkpt_rec.bkpt_rate;
993          END IF;
994 
995          EXIT; -- LOOP only once
996 
997 
998       END LOOP;
999 
1000 
1001       /* calculate prorated rent due based on sum of proration factors */
1002 
1003       /* Macerich way of calculating */
1004 
1005       l_trx_hdr_rec.prorated_rent_due
1006         := l_trx_hdr_rec.prorated_rent_due
1007            * pn_var_rent_calc_pkg.
1008              get_fy_proration_factor(l_trx_hdr_rec.var_rent_id);
1009 
1010 
1011       l_trx_hdr_rec.first_yr_rent := l_trx_hdr_rec.prorated_rent_due;
1012 
1013       /* Ideal way of calculating */
1014       /*
1015       FOR freq_rec IN calc_freq_c(p_vr_id => l_trx_hdr_rec.var_rent_id) LOOP
1016 
1017         FOR rec IN grp_pro_factor_sum_fy_c
1018                     ( p_vr_id        => l_trx_hdr_rec.var_rent_id
1019                      ,p_vr_comm_date => g_vr_commencement_date)
1020         LOOP
1021           l_prorat_factor_sum := rec.proration_factor_sum;
1022         END LOOP;
1023 
1024         IF freq_rec.report_freq_code = pn_var_rent_calc_pkg.G_FREQ_MON THEN
1025           l_trx_hdr_rec.prorated_rent_due
1026           := l_trx_hdr_rec.prorated_rent_due
1027              * l_prorat_factor_sum
1028              / pn_var_rent_calc_pkg.G_CALC_PRD_IN_FREQ_MON;
1029 
1030         ELSIF freq_rec.report_freq_code = pn_var_rent_calc_pkg.G_FREQ_QTR THEN
1031           l_trx_hdr_rec.prorated_rent_due
1032           := l_trx_hdr_rec.prorated_rent_due
1033              * l_prorat_factor_sum
1034              / pn_var_rent_calc_pkg.G_CALC_PRD_IN_FREQ_QTR;
1035 
1036         ELSIF freq_rec.report_freq_code = pn_var_rent_calc_pkg.G_FREQ_SA THEN
1037           l_trx_hdr_rec.prorated_rent_due
1038           := l_trx_hdr_rec.prorated_rent_due
1039              * l_prorat_factor_sum
1040              / pn_var_rent_calc_pkg.G_CALC_PRD_IN_FREQ_SA;
1041 
1042         ELSIF freq_rec.report_freq_code = pn_var_rent_calc_pkg.G_FREQ_YR THEN
1043           l_trx_hdr_rec.prorated_rent_due
1044           := l_trx_hdr_rec.prorated_rent_due
1045              * l_prorat_factor_sum /
1046              pn_var_rent_calc_pkg.G_CALC_PRD_IN_FREQ_YR;
1047 
1048         END IF;
1049 
1050       END LOOP;
1051       */
1052 
1053     END IF;
1054 
1055     IF g_proration_rule IN ( pn_var_rent_calc_pkg.G_PRORUL_LY
1056                                ,pn_var_rent_calc_pkg.G_PRORUL_FLY) AND
1057        g_vr_termination_date = l_trx_hdr_rec.calc_prd_end_date
1058     THEN
1059 
1060       pnp_debug_pkg.log('Get Prorated Rent - LY');
1061 
1062       /* calculate LY prorated rent due */
1063       /* set the calculated rent to 0 */
1064       l_trx_hdr_rec.calculated_rent := 0;
1065 
1066       FOR rec IN ly_sales_c
1067                   ( p_vr_id            => l_trx_hdr_rec.var_rent_id
1068                    ,p_vr_term_date     => g_vr_termination_date
1069                    ,p_line_item_grp_id => l_trx_hdr_rec.line_item_group_id)
1070       LOOP
1071         l_net_volume := rec.sales;
1072       END LOOP;
1073 
1074       pnp_debug_pkg.log('Sales volume for LY: '||l_net_volume);
1075 
1076 
1077 
1078       /* get l_trx_hdr_rec.prorated_rent_due - PRORATED RENT */
1079       IF l_bkpt_type = pn_var_rent_calc_pkg.G_BKPT_TYP_STRATIFIED
1080       THEN
1081 
1082         l_trx_hdr_rec.prorated_rent_due := 0;
1083 
1084         pnp_debug_pkg.log('Get bkpt trips for');
1085         pnp_debug_pkg.log('    VR ID: '||l_trx_hdr_rec.var_rent_id);
1086         pnp_debug_pkg.log('    VR End Date: '|| g_vr_termination_date);
1087         pnp_debug_pkg.log('    Line Grp: '||l_trx_hdr_rec.line_item_group_id);
1088 
1089         /* loop for all bkpt details */
1090         FOR bkpt_rec IN ly_bkpts_c
1091                         ( p_vr_id            => l_trx_hdr_rec.var_rent_id
1092                          ,p_vr_term_date     => g_vr_termination_date
1093                          ,p_line_item_grp_id => l_trx_hdr_rec.line_item_group_id)
1094         LOOP
1095 
1096           l_bkpt_start := bkpt_rec.bkpt_start;
1097           l_bkpt_end   := bkpt_rec.bkpt_end;
1098 
1099           IF l_bkpt_end IS NULL OR l_bkpt_end = 0 THEN
1100             l_bkpt_end := NULL;
1101           END IF;
1102 
1103           pnp_debug_pkg.log('Bkpt trips - Start: '||l_bkpt_start||'  End: '||l_bkpt_end);
1104 
1105           IF l_net_volume >= l_bkpt_start THEN
1106 
1107             IF l_net_volume <= NVL(l_bkpt_end, l_net_volume) THEN
1108 
1109               l_trx_hdr_rec.prorated_rent_due
1110               := l_trx_hdr_rec.prorated_rent_due
1111                  + (l_net_volume - l_bkpt_start) * bkpt_rec.bkpt_rate;
1112 
1113             ELSIF l_net_volume > l_bkpt_end THEN
1114 
1115               l_trx_hdr_rec.prorated_rent_due
1116               := l_trx_hdr_rec.prorated_rent_due
1117                  + (l_bkpt_end - l_bkpt_start) * bkpt_rec.bkpt_rate;
1118 
1119             END IF;
1120 
1121             pnp_debug_pkg.log('Prorated Rent Due: '||l_trx_hdr_rec.prorated_rent_due);
1122 
1123           ELSE
1124 
1125             EXIT;
1126 
1127           END IF; /* net vol > bkpt start */
1128 
1129         END LOOP; /* loop for all bkpt details */
1130 
1131 
1132       ELSIF l_bkpt_type IN ( pn_var_rent_calc_pkg.G_BKPT_TYP_FLAT
1133                             ,pn_var_rent_calc_pkg.G_BKPT_TYP_SLIDING)
1134       THEN
1135         pnp_debug_pkg.log('l_bkpt_type:'||l_bkpt_type);
1136         /* loop for all bkpt details */
1137         FOR bkpt_rec IN ly_bkpts_c
1138                         ( p_vr_id            => l_trx_hdr_rec.var_rent_id
1139                          ,p_vr_term_date     => g_vr_termination_date
1140                          ,p_line_item_grp_id => l_trx_hdr_rec.line_item_group_id)
1141         LOOP
1142 
1143           l_bkpt_start := bkpt_rec.bkpt_start;
1144           l_bkpt_end   := bkpt_rec.bkpt_end;
1145           pnp_debug_pkg.log('1:'||bkpt_rec.bkpt_start);
1146           pnp_debug_pkg.log('2:'||bkpt_rec.bkpt_end);
1147 
1148           IF l_bkpt_end IS NULL OR l_bkpt_end = 0 THEN
1149             l_bkpt_end := NULL;
1150           END IF;
1151 
1152           IF l_net_volume >= l_bkpt_start AND
1153              l_net_volume <= NVL(l_bkpt_end, l_net_volume)
1154           THEN
1155 
1156             IF l_bkpt_type = pn_var_rent_calc_pkg.G_BKPT_TYP_SLIDING THEN
1157 
1158               l_trx_hdr_rec.prorated_rent_due
1159               := l_net_volume * bkpt_rec.bkpt_rate;
1160 
1161             ELSIF l_bkpt_type = pn_var_rent_calc_pkg.G_BKPT_TYP_FLAT THEN
1162 
1163               l_trx_hdr_rec.prorated_rent_due
1164               := (l_net_volume - l_bkpt_start) * bkpt_rec.bkpt_rate;
1165 
1166             END IF;
1167 
1168             EXIT;
1169 
1170           END IF;
1171 
1172         END LOOP;
1173 
1174       END IF; /* breakpoint type */
1175 
1176       /*Handle the case of volumes not tripping any breakpoints*/
1177       FOR bkpt_rec IN ly_bkpts_c
1178                         ( p_vr_id            => l_trx_hdr_rec.var_rent_id
1179                          ,p_vr_term_date     => g_vr_termination_date
1180                          ,p_line_item_grp_id => l_trx_hdr_rec.line_item_group_id) --
1181                          LOOP
1182          IF (l_net_volume < bkpt_rec.bkpt_start)  THEN
1183            -- The volumes did not trip any breakpoints
1184                 l_trx_hdr_rec.prorated_rent_due
1185                  := l_trx_hdr_rec.prorated_rent_due
1186                     + (l_net_volume - l_bkpt_start) * bkpt_rec.bkpt_rate;
1187          END IF;
1188 
1189          EXIT; -- LOOP only once
1190 
1191 
1192       END LOOP;
1193 
1194 
1195       /* calculate prorated rent due based on sum of proration factors */
1196 
1197       /* Macerich way of calculating */
1198 
1199       l_trx_hdr_rec.prorated_rent_due
1200         := l_trx_hdr_rec.prorated_rent_due
1201            * pn_var_rent_calc_pkg.
1202              get_ly_proration_factor(l_trx_hdr_rec.var_rent_id);
1203 
1204       /* Ideal way of calculating */
1205       /*
1206       FOR freq_rec IN calc_freq_c(p_vr_id => l_trx_hdr_rec.var_rent_id) LOOP
1207 
1208         FOR rec IN grp_pro_factor_sum_ly_c
1209                     ( p_vr_id        => l_trx_hdr_rec.var_rent_id
1210                      ,p_vr_term_date => g_vr_termination_date)
1211         LOOP
1212           l_prorat_factor_sum := rec.proration_factor_sum;
1213         END LOOP;
1214 
1215         IF freq_rec.report_freq_code = pn_var_rent_calc_pkg.G_FREQ_MON THEN
1216           l_trx_hdr_rec.prorated_rent_due
1217           := l_trx_hdr_rec.prorated_rent_due
1218              * l_prorat_factor_sum
1219              / pn_var_rent_calc_pkg.G_CALC_PRD_IN_FREQ_MON;
1220 
1221         ELSIF freq_rec.report_freq_code = pn_var_rent_calc_pkg.G_FREQ_QTR THEN
1222           l_trx_hdr_rec.prorated_rent_due
1223           := l_trx_hdr_rec.prorated_rent_due
1224              * l_prorat_factor_sum
1225              / pn_var_rent_calc_pkg.G_CALC_PRD_IN_FREQ_QTR;
1226 
1227         ELSIF freq_rec.report_freq_code = pn_var_rent_calc_pkg.G_FREQ_SA THEN
1228           l_trx_hdr_rec.prorated_rent_due
1229           := l_trx_hdr_rec.prorated_rent_due
1230              * l_prorat_factor_sum
1231              / pn_var_rent_calc_pkg.G_CALC_PRD_IN_FREQ_SA;
1232 
1233         ELSIF freq_rec.report_freq_code = pn_var_rent_calc_pkg.G_FREQ_YR THEN
1234           l_trx_hdr_rec.prorated_rent_due
1235           := l_trx_hdr_rec.prorated_rent_due
1236              * l_prorat_factor_sum
1237              / pn_var_rent_calc_pkg.G_CALC_PRD_IN_FREQ_YR;
1238 
1239         END IF;
1240 
1241       END LOOP;
1242       */
1243     END IF; /* calculate FY rent OR LY rent? */
1244 
1245     pnp_debug_pkg.log('+++ Get Prorated Rent - END +++');
1246 
1247   END IF; /* invoice flag = I - means calculate prorated_rent_due */
1248 
1249   pnp_debug_pkg.log(l_context||' COMPLETE ');
1250 
1251   /* --------------------- GET prorated_rent_due END ---------------------- */
1252 
1253   /* ------------ GET percent_rent_due, ytd_percent_rent START ------------ */
1254 
1255   l_context := ' Get percent_rent_due AND ytd_percent_rent ';
1256 
1257   IF NVL(l_trx_hdr_rec.invoice_flag, 'Y') = 'P' THEN
1258 
1259     l_prev_billed
1260       := pn_var_rent_calc_pkg.find_prev_billed
1261           ( p_var_rent_id      => l_trx_hdr_rec.var_rent_id
1262            ,p_line_item_grp_id => l_trx_hdr_rec.line_item_group_id
1263            ,p_calc_prd_st_dt   => l_trx_hdr_rec.calc_prd_start_date
1264            ,p_calc_prd_end_dt  => l_trx_hdr_rec.calc_prd_end_date
1265            ,p_reset_grp_id     => l_trx_hdr_rec.reset_group_id);
1266 
1267   ELSE
1268 
1269     l_prev_billed
1270       := pn_var_rent_calc_pkg.find_prev_billed
1271           ( p_var_rent_id      => l_trx_hdr_rec.var_rent_id
1272            ,p_period_id        => l_trx_hdr_rec.period_id
1273            ,p_line_item_id     => l_trx_hdr_rec.line_item_id
1274            ,p_calc_prd_st_dt   => l_trx_hdr_rec.calc_prd_start_date
1275            ,p_calc_prd_end_dt  => l_trx_hdr_rec.calc_prd_end_date
1276            ,p_reset_grp_id     => l_trx_hdr_rec.reset_group_id);
1277 
1278   END IF;
1279 
1280   pnp_debug_pkg.log(' get previously billed complete - l_prev_billed: '||l_prev_billed);
1281 
1282   IF g_calculation_method IN ( pn_var_rent_calc_pkg.G_CALC_NON_CUMULATIVE
1283                               ,pn_var_rent_calc_pkg.G_CALC_TRUE_UP)
1284   THEN
1285 
1286     l_trx_hdr_rec.percent_rent_due := l_trx_hdr_rec.calculated_rent;
1287     l_trx_hdr_rec.ytd_percent_rent := l_prev_billed
1288                                       + l_trx_hdr_rec.percent_rent_due;
1289 
1290   ELSIF g_calculation_method IN ( pn_var_rent_calc_pkg.G_CALC_CUMULATIVE
1291                                  ,pn_var_rent_calc_pkg.G_CALC_YTD)
1292   THEN
1293 
1294     l_trx_hdr_rec.percent_rent_due
1295       := l_trx_hdr_rec.calculated_rent - l_prev_billed;
1296 
1297     /* need to
1298        - apply constraints on l_trx_hdr_rec.percent_rent_due
1299        - update l_trx_hdr_rec.percent_rent_due
1300        - then get the YTD
1301     */
1302     l_trx_hdr_rec.ytd_percent_rent
1303       := l_prev_billed + l_trx_hdr_rec.percent_rent_due;
1304 
1305   END IF; /* IF g_calculation_method IN */
1306 
1307   FOR period_num_rec IN period_num_c (p_vr_id => l_trx_hdr_rec.var_rent_id)
1308   LOOP
1309 
1310     l_period_num := period_num_rec.perion_num;
1311 
1312   END LOOP;
1313 
1314   FOR last_period_rec IN last_period_c (p_vr_id => l_trx_hdr_rec.var_rent_id)
1315   LOOP
1316 
1317     l_last_partial := last_period_rec.partial_period;
1318 
1319   END LOOP;
1320 
1321   FOR first_period_rec IN first_period_c (p_vr_id => l_trx_hdr_rec.var_rent_id)
1322   LOOP
1323 
1324     l_first_partial := first_period_rec.partial_period;
1325 
1326   END LOOP;
1327 
1328   /* IMP: This condition is to nullify the rents for a special case.
1329      The case is for First-LAst year, when we have just 2 periods and
1330      first year and last year period is partial, in such a case we dont
1331      want to calculate the rent. */
1332   IF g_proration_rule IN (pn_var_rent_calc_pkg.G_PRORUL_FLY) AND
1333      l_period_num = 2 AND l_first_partial = 'Y' AND
1334      l_last_partial = 'Y'
1335   THEN
1336     l_trx_hdr_rec.percent_rent_due := 0;
1337     l_trx_hdr_rec.ytd_percent_rent := 0;
1338     l_trx_hdr_rec.calculated_rent  := 0;
1339 
1340     FOR rec IN  freq_cur(p_vr_id => l_trx_hdr_rec.var_rent_id) LOOP
1341       l_trx_hdr_rec.prorated_rent_due := l_trx_hdr_rec.prorated_rent_due + l_trx_hdr_rec.first_yr_rent;
1342     END LOOP;
1343 
1344   END IF;
1345 
1346 
1347   pnp_debug_pkg.log(' ');
1348   pnp_debug_pkg.log(' calculation_method: '||g_calculation_method);
1349   pnp_debug_pkg.log(' percent_rent_due_for: '||l_trx_hdr_rec.percent_rent_due);
1350   pnp_debug_pkg.log(' ytd_percent_rent_for: '||l_trx_hdr_rec.ytd_percent_rent);
1351   pnp_debug_pkg.log(' ');
1352 
1353   pnp_debug_pkg.log(l_context||' COMPLETE ');
1354 
1355   /* ------------- GET percent_rent_due, ytd_percent_rent END ------------- */
1356 
1357   l_trx_hdr_rec.update_flag := 'Y';
1358 
1359   p_trx_hdr_rec := l_trx_hdr_rec;
1360 
1361   pnp_debug_pkg.log('++++ get_rent_applicable - END ++++');
1362 
1363 EXCEPTION
1364   WHEN OTHERS THEN
1365     pnp_debug_pkg.log
1366     ('**********************************************************************');
1367     pnp_debug_pkg.log('*** ERROR IN get_rent_applicable ***');
1368     pnp_debug_pkg.log('*** ERROR WHEN: '||l_context||' ***');
1369     pnp_debug_pkg.log
1370     ('**********************************************************************');
1371     RAISE;
1372 
1373 END get_rent_applicable;
1374 
1375 --------------------------------------------------------------------------------
1376 --  NAME         : post_summary - global procedure
1377 --  DESCRIPTION  :
1378 --  PURPOSE      :
1379 --  INVOKED FROM :
1380 --  ARGUMENTS    :
1381 --  REFERENCE    : PN_COMMON.debug()
1382 --  HISTORY      : 5/Dec/2006 Shabda Populate deductions in var_rent_summ_all
1383 --                 fix for bug 5679847
1384 --               : Warning! This is not the procedure which is called from
1385 --                calculate_rent. It is other overloaded post_summary.
1386 --  dd-mon-yyyy  name     o Created
1387 --  21-MAY-07    Lokesh   o Added rounding off for bug # 6031202 in
1388 --                          pn_var_rent_summ_all
1389 --------------------------------------------------------------------------------
1390 PROCEDURE post_summary ( p_var_rent_id  IN NUMBER
1391                         ,p_period_id    IN NUMBER
1392                         ,p_line_item_id IN NUMBER
1393                         ,p_grp_date_id  IN NUMBER)
1394 IS
1395 
1396   /* get grp date */
1397   CURSOR grp_date_c( p_vr_id  IN NUMBER
1398                     ,p_prd_id IN NUMBER
1399                     ,p_grp_id IN NUMBER) IS
1400     SELECT
1401      grp.grp_date_id
1402     ,grp.group_date
1403     ,grp.invoice_date
1404     ,grp.org_id
1405     FROM
1406     pn_var_grp_dates_all grp
1407     WHERE
1408     grp.var_rent_id = p_vr_id  AND
1409     grp.period_id   = p_prd_id AND
1410     grp.grp_date_id = p_grp_id;
1411 
1412   /* Get rent and volume to store in pn_var_rent_summ_all */
1413   CURSOR summ_c( p_vr_id   IN NUMBER
1414                 ,p_prd_id  IN NUMBER
1415                 ,p_line_id IN NUMBER
1416                 ,p_grp_id  IN NUMBER) IS
1417     SELECT
1418      NVL(SUM(hdr.percent_rent_due),0)
1419      + NVL(SUM(DECODE(hdr.invoice_flag
1420                       ,'I',hdr.prorated_rent_due
1421                           ,0
1422                      )
1423               ), 0) AS rent
1424     ,NVL(SUM(hdr.prorated_group_sales)
1425          , 0) AS sales
1426     ,NVL(SUM(hdr.prorated_group_deductions)
1427          , 0) AS ded
1428     FROM
1429     pn_var_trx_headers_all hdr
1430     WHERE
1431     hdr.var_rent_id  = p_vr_id AND
1432     hdr.period_id    = p_prd_id AND
1433     hdr.line_item_id = p_line_id AND
1434     hdr.grp_date_id  = p_grp_id;
1435 
1436   /* exists VR summ record */
1437   CURSOR vr_summ_c ( p_vr_id  IN NUMBER
1438                     ,p_prd_id IN NUMBER
1439                     ,p_line_id IN NUMBER
1440                     ,p_grp_id IN NUMBER) IS
1441     SELECT
1442     var_rent_summ_id
1443     FROM
1444     pn_var_rent_summ_all
1445     WHERE
1446     var_rent_id = p_vr_id AND
1447     period_id = p_prd_id AND
1448     line_item_id = p_line_id AND
1449     grp_date_id = p_grp_id;
1450 
1451   l_vr_summ_id NUMBER;
1452 
1453 BEGIN
1454 
1455   pnp_debug_pkg.log('post_summary .....(+)');
1456   /* get the invoice date for the group
1457      loops only once
1458   */
1459   FOR grp_rec IN grp_date_c( p_vr_id  => p_var_rent_id
1460                             ,p_prd_id => p_period_id
1461                             ,p_grp_id => p_grp_date_id)
1462   LOOP
1463       pnp_debug_pkg.log('grp_rec.invoice_date...'||grp_rec.invoice_date);
1464     /* get the sum of rents and sales for
1465        vr -> period -> line item -> group combination
1466        from the trx tables
1467        loops only once
1468     */
1469     FOR summ_rec IN summ_c( p_vr_id   => p_var_rent_id
1470                            ,p_prd_id  => p_period_id
1471                            ,p_line_id => p_line_item_id
1472                            ,p_grp_id  => p_grp_date_id)
1473     LOOP
1474 
1475       pnp_debug_pkg.log('summ_rec.rent...'||summ_rec.rent);
1476       pnp_debug_pkg.log('summ_rec.sales...'||summ_rec.sales);
1477       l_vr_summ_id := NULL;
1478 
1479       /* chk if VR SUMM record exists for this
1480          vr -> period -> line item -> group combination */
1481       FOR vr_summ_rec IN vr_summ_c( p_vr_id   => p_var_rent_id
1482                                    ,p_prd_id  => p_period_id
1483                                    ,p_line_id => p_line_item_id
1484                                    ,p_grp_id  => p_grp_date_id)
1485       LOOP
1486         l_vr_summ_id := vr_summ_rec.var_rent_summ_id;
1487       END LOOP;
1488 
1489       pnp_debug_pkg.log('l_vr_summ_id...'||l_vr_summ_id);
1490 
1491       IF l_vr_summ_id IS NULL THEN
1492 
1493         pnp_debug_pkg.log('inserting ...');
1494         /* to insert a new summary record */
1495         INSERT INTO
1496         pn_var_rent_summ_all
1497           (var_rent_summ_id
1498           ,var_rent_id
1499           ,period_id
1500           ,line_item_id
1501           ,invoice_date
1502           ,tot_act_vol
1503           ,tot_ded
1504           ,act_var_rent
1505           ,grp_date_id
1506           ,group_date
1507           ,last_update_date
1508           ,last_updated_by
1509           ,creation_date
1510           ,created_by
1511           ,last_update_login
1512           ,org_id)
1513         VALUES
1514           (pn_var_rent_summ_s.NEXTVAL
1515           ,p_var_rent_id
1516           ,p_period_id
1517           ,p_line_item_id
1518           ,grp_rec.invoice_date
1519           ,summ_rec.sales
1520           ,summ_rec.ded
1521           ,round(summ_rec.rent,g_precision)
1522           ,grp_rec.grp_date_id
1523           ,grp_rec.group_date
1524           ,SYSDATE
1525           ,NVL(fnd_global.user_id, 0)
1526           ,SYSDATE
1527           ,NVL(fnd_global.user_id, 0)
1528           ,NVL(fnd_global.login_id, 0)
1529           ,NVL(grp_rec.org_id, g_org_id))
1530         RETURNING
1531         var_rent_summ_id
1532         INTO
1533         l_vr_summ_id;
1534 
1535       ELSIF l_vr_summ_id IS NOT NULL THEN
1536         /* update the summary record */
1537 
1538         pnp_debug_pkg.log('updating ...');
1539         UPDATE
1540         pn_var_rent_summ_all
1541         SET
1542          tot_act_vol  = summ_rec.sales
1543         ,tot_ded = summ_rec.ded
1544         ,act_var_rent = round(summ_rec.rent,g_precision)
1545         ,last_update_date  = SYSDATE
1546         ,last_updated_by   = NVL(fnd_global.user_id, 0)
1547         ,last_update_login = NVL(fnd_global.login_id, 0)
1548         WHERE
1549         var_rent_summ_id = l_vr_summ_id;
1550 
1551       END IF;
1552 
1553       UPDATE
1554       pn_var_trx_headers_all hdr
1555       SET
1556       hdr.var_rent_summ_id = l_vr_summ_id
1557       WHERE
1558       hdr.var_rent_id  = p_var_rent_id AND
1559       hdr.period_id    = p_period_id AND
1560       hdr.line_item_id = p_line_item_id AND
1561       hdr.grp_date_id  = p_grp_date_id;
1562 
1563       EXIT;
1564 
1565     END LOOP;
1566 
1567     EXIT;
1568 
1569   END LOOP;
1570 
1571 EXCEPTION
1572   WHEN OTHERS THEN RAISE;
1573 
1574 END post_summary;
1575 
1576 --------------------------------------------------------------------------------
1577 --  NAME         : post_summary_firstyr - global procedure
1578 --  DESCRIPTION  :
1579 --  PURPOSE      :
1580 --  INVOKED FROM :
1581 --  ARGUMENTS    :
1582 --  REFERENCE    : PN_COMMON.debug()
1583 --  HISTORY      :
1584 --
1585 --  dd-mon-yyyy  name     o Created
1586 --  21-MAY-07    Lokesh   o Added rounding off for bug # 6031202 in
1587 --                          pn_var_rent_summ_all
1588 --------------------------------------------------------------------------------
1589 PROCEDURE post_summary_firstyr ( p_var_rent_id  IN NUMBER)
1590 IS
1591 
1592   /* exists VR summ record */
1593   CURSOR vr_summ_fy_c IS
1594     SELECT *
1595     FROM
1596     pn_var_rent_summ_all
1597     WHERE
1598     var_rent_id = p_var_rent_id AND
1599     NVL(first_yr_rent, 0) <> 0;
1600 
1601   /* exists VR summ record */
1602   CURSOR vr_summ_c ( p_period_id NUMBER,
1603                      p_line_item_id  NUMBER) IS
1604     SELECT  var_rent_summ_id
1605            ,tot_act_vol
1606            ,act_var_rent
1607            ,tot_ded
1608     FROM
1609     pn_var_rent_summ_all
1610     WHERE
1611     var_rent_id = p_var_rent_id AND
1612     period_id   = p_period_id AND
1613     line_item_id = p_line_item_id;
1614 
1615 
1616   -- Get the details of
1617   CURSOR  line_item_cur ( p_period_id NUMBER,
1618                           p_line_item_id  NUMBER) IS
1619     SELECT trx.line_item_id
1620     FROM pn_var_trx_headers_all trx
1621     WHERE trx.period_id = p_period_id
1622     AND trx.line_item_group_id IN (SELECT line_item_group_id
1623                                    FROM pn_var_trx_headers_all
1624                                                        WHERE line_item_id = p_line_item_id);
1625 
1626     -- Get the details of
1627   CURSOR  first_period_cur IS
1628     SELECT period_id
1629     FROM pn_var_periods_all
1630     WHERE var_rent_id = p_var_rent_id
1631     AND   period_num = 1;
1632 
1633   l_period_id NUMBER;
1634   l_vr_summ_id NUMBER;
1635   l_line_item_id NUMBER;
1636 
1637 BEGIN
1638 
1639    pnp_debug_pkg.log('+++++++++ post_summary_firstyr START +++++++++++');
1640 
1641 
1642    FOR first_period_rec IN first_period_cur LOOP
1643      l_period_id := first_period_rec.period_id;
1644    END LOOP;
1645 
1646    pnp_debug_pkg.log('first year period id... '||l_period_id);
1647    /* get the first year rent for this vr agreement */
1648    FOR vr_summ_fy_rec IN vr_summ_fy_c LOOP
1649 
1650       l_vr_summ_id := NULL;
1651 
1652       FOR line_item_rec IN line_item_cur(l_period_id, vr_summ_fy_rec.line_item_id) LOOP
1653          l_line_item_id := line_item_rec.line_item_id;
1654       END LOOP;
1655 
1656       /* Check if for first period a sumamry record already exists */
1657       FOR vr_summ_rec IN vr_summ_c(l_period_id, l_line_item_id) LOOP
1658          l_vr_summ_id  := vr_summ_rec.var_rent_summ_id;
1659 
1660          IF vr_summ_fy_rec.tot_act_vol <> NVL(vr_summ_rec.tot_act_vol, 0) OR
1661             vr_summ_fy_rec.tot_ded <> NVL(vr_summ_rec.tot_ded, 0) OR
1662             vr_summ_fy_rec.first_yr_rent  <> NVL(vr_summ_rec.act_var_rent, 0)
1663          THEN
1664 
1665            UPDATE
1666            pn_var_rent_summ_all
1667            SET
1668             tot_act_vol  = vr_summ_fy_rec.tot_act_vol
1669            ,tot_ded      = vr_summ_fy_rec.tot_ded
1670            ,act_var_rent = round(vr_summ_fy_rec.first_yr_rent,g_precision)
1671            ,last_update_date  = SYSDATE
1672            ,last_updated_by   = NVL(fnd_global.user_id, 0)
1673            ,last_update_login = NVL(fnd_global.login_id, 0)
1674            WHERE
1675            var_rent_summ_id = l_vr_summ_id;
1676 
1677          END IF;
1678       END LOOP;
1679 
1680       IF l_vr_summ_id IS NULL THEN
1681 
1682 
1683           /* to insert a new summary record */
1684          INSERT INTO
1685          pn_var_rent_summ_all
1686            (var_rent_summ_id
1687            ,var_rent_id
1688            ,period_id
1689            ,line_item_id
1690            ,invoice_date
1691            ,tot_act_vol
1692            ,tot_ded
1693            ,act_var_rent
1694            ,grp_date_id
1695            ,group_date
1696            ,last_update_date
1697            ,last_updated_by
1698            ,creation_date
1699            ,created_by
1700            ,last_update_login
1701            ,org_id
1702            ,first_yr_rent)
1703          VALUES
1704            (pn_var_rent_summ_s.NEXTVAL
1705            ,p_var_rent_id
1706            ,l_period_id
1707            ,l_line_item_id
1708            ,vr_summ_fy_rec.invoice_date
1709            ,vr_summ_fy_rec.tot_act_vol
1710            ,vr_summ_fy_rec.tot_ded
1711            ,round(vr_summ_fy_rec.first_yr_rent,g_precision)
1712            ,vr_summ_fy_rec.grp_date_id
1713            ,vr_summ_fy_rec.group_date
1714            ,SYSDATE
1715            ,NVL(fnd_global.user_id, 0)
1716            ,SYSDATE
1717            ,NVL(fnd_global.user_id, 0)
1718            ,NVL(fnd_global.login_id, 0)
1719            ,vr_summ_fy_rec.org_id
1720            ,NULL)
1721          RETURNING
1722          var_rent_summ_id
1723          INTO
1724          l_vr_summ_id;
1725       END IF;
1726 
1727       UPDATE
1728       pn_var_trx_headers_all hdr
1729       SET
1730       hdr.var_rent_summ_id = l_vr_summ_id
1731       WHERE
1732       hdr.var_rent_id  = p_var_rent_id AND
1733       hdr.period_id    = l_period_id AND
1734       hdr.line_item_id = l_line_item_id;
1735 
1736       EXIT;
1737 
1738    END LOOP;
1739 
1740    pnp_debug_pkg.log('+++++++++ post_summary_firstyr END +++++++++++');
1741 
1742 END post_summary_firstyr;
1743 
1744 --------------------------------------------------------------------------------
1745 --  NAME         : insert_invoice_firstyr
1746 --  DESCRIPTION  :
1747 --  PURPOSE      :
1748 --  INVOKED FROM :
1749 --  ARGUMENTS    :
1750 --  REFERENCE    : PN_COMMON.debug()
1751 --  HISTORY      : 16/OCT/06 Shabda Bug# 5533253, Modified to apply constraints
1752 --
1753 --  dd-mon-yyyy  name     o Created
1754 --------------------------------------------------------------------------------
1755 PROCEDURE insert_invoice_firstyr( p_var_rent_id IN NUMBER) IS
1756 
1757   /* get invoice dates for a period */
1758   CURSOR invoice_dates_c( p_vr_id  IN NUMBER) IS
1759     SELECT
1760      invoice_date
1761     ,NVL(SUM(first_yr_rent), 0) AS total_actual_rent
1762     FROM
1763     pn_var_rent_summ_all
1764     WHERE
1765     var_rent_id = p_vr_id AND
1766     first_yr_rent IS NOT NULL
1767     GROUP BY
1768     invoice_date
1769     ORDER BY
1770     invoice_date;
1771 
1772   /* get latest invoice */
1773   CURSOR invoice2upd_c( p_vr_id  IN NUMBER
1774                        ,p_prd_id IN NUMBER
1775                        ,p_inv_dt IN DATE) IS
1776     SELECT
1777      var_rent_inv_id
1778     ,var_rent_id
1779     ,period_id
1780     ,invoice_date
1781     ,actual_term_status
1782     ,actual_exp_code
1783     ,adjust_num
1784     ,tot_act_vol
1785     ,act_per_rent
1786     ,actual_invoiced_amount
1787     ,constr_actual_rent
1788     ,rec_abatement_override
1789     FROM
1790     pn_var_rent_inv_all
1791     WHERE
1792     var_rent_id = p_vr_id AND
1793     period_id = p_prd_id AND
1794     invoice_date = p_inv_dt AND
1795     NVL(true_up_amt, 0) = 0 AND
1796     true_up_status IS NULL AND
1797     true_up_exp_code IS NULL
1798     ORDER BY adjust_num DESC;
1799 
1800   /* get latest invoice */
1801   CURSOR prev_invoiced_c( p_vr_id  IN NUMBER
1802                          ,p_prd_id IN NUMBER
1803                          ,p_inv_dt IN DATE) IS
1804     SELECT
1805     NVL(SUM(actual_invoiced_amount), 0) AS prev_invoiced_amt
1806     FROM
1807     pn_var_rent_inv_all
1808     WHERE
1809     var_rent_id = p_vr_id AND
1810     period_id = p_prd_id AND
1811     invoice_date = p_inv_dt AND
1812     actual_exp_code = 'Y' AND
1813     NVL(true_up_amt, 0) = 0 AND
1814     true_up_status IS NULL AND
1815     true_up_exp_code IS NULL;
1816 
1817   l_invoice_on      VARCHAR2(30);
1818   l_row_id          ROWID;
1819   l_var_rent_inv_id NUMBER;
1820   l_max_adjust_num  NUMBER;
1821   l_prev_inv_rent   NUMBER;
1822   l_prev_inv_exp_rent NUMBER;
1823   l_constr_rent     NUMBER;
1824   l_constr_prev_rent  NUMBER;
1825   l_vr_commencement_date DATE;
1826   l_rec_abatement_override NUMBER;
1827 
1828   /* get ORG ID */
1829   CURSOR org_c(p_vr_id IN NUMBER) IS
1830     SELECT org_id, commencement_date
1831       FROM pn_var_rents_all
1832      WHERE var_rent_id = p_vr_id;
1833 
1834 
1835   /* get FY sales */
1836   CURSOR fy_sales_c( p_vr_id            IN NUMBER
1837                     ,p_vr_comm_date     IN DATE) IS
1838     SELECT
1839     NVL(SUM(fy_proration_sales - NVL(fy_proration_deductions,0) ),0) AS sales
1840     FROM
1841     pn_var_trx_headers_all
1842     WHERE
1843     var_rent_id = p_vr_id AND
1844     calc_prd_start_date <= (ADD_MONTHS(p_vr_comm_date, 12) - 1) ;
1845 
1846   -- Get the details of
1847   CURSOR  first_period_cur(p_vr_id IN NUMBER) IS
1848     SELECT period_id
1849     FROM pn_var_periods_all
1850     WHERE var_rent_id = p_vr_id
1851     AND   period_num = 1;
1852 
1853   l_org_id NUMBER;
1854   l_period_id NUMBER;
1855   l_exists_invoice BOOLEAN := FALSE;
1856   l_tot_act_vol    NUMBER := 0;
1857   l_precision      NUMBER;
1858 BEGIN
1859 
1860   pnp_debug_pkg.log('+++++++++ insert_invoice_firstyr START +++++++++++');
1861 
1862   FOR vr_rec IN org_c(p_vr_id => p_var_rent_id) LOOP
1863     l_org_id := vr_rec.org_id;
1864     l_vr_commencement_date := vr_rec.commencement_date;
1865   END LOOP;
1866   l_precision := nvl(pn_var_rent_calc_pkg.get_currency_precision(l_org_id),4);
1867   pnp_debug_pkg.log('l_precision:'||l_precision);
1868   FOR first_period_rec IN first_period_cur(p_vr_id => p_var_rent_id) LOOP
1869     l_period_id := first_period_rec.period_id;
1870   END LOOP;
1871 
1872   pnp_debug_pkg.log('first year period id... '||l_period_id);
1873 
1874   /* loop for all invoice dates in the period */
1875   FOR inv_rec IN invoice_dates_c( p_vr_id  => p_var_rent_id)
1876   LOOP
1877 
1878     l_row_id          := NULL;
1879     l_var_rent_inv_id := NULL;
1880     l_max_adjust_num  := 0;
1881     l_prev_inv_rent   := 0;
1882     l_exists_invoice  := FALSE;
1883 
1884     FOR rec IN fy_sales_c (p_var_rent_id, l_vr_commencement_date) LOOP
1885        l_tot_act_vol := rec.sales;
1886     END LOOP;
1887 
1888     /* check if there exists an invoice for this invoice date */
1889     FOR inv2upd_rec IN invoice2upd_c( p_vr_id  => p_var_rent_id
1890                                      ,p_prd_id => l_period_id
1891                                      ,p_inv_dt => inv_rec.invoice_date)
1892     LOOP
1893 
1894       /* invoice exists - we only look at the last invoice */
1895       l_exists_invoice := TRUE;
1896       l_constr_prev_rent := inv2upd_rec.constr_actual_rent;
1897       l_prev_inv_rent := inv2upd_rec.act_per_rent;
1898       l_rec_abatement_override := inv2upd_rec.rec_abatement_override;
1899       /* invoice updateable? */
1900       IF NVL(inv2upd_rec.actual_exp_code, 'N') <> 'Y' THEN
1901 
1902         /* updateable */
1903         l_var_rent_inv_id := inv2upd_rec.var_rent_inv_id;
1904         l_max_adjust_num  := inv2upd_rec.adjust_num;
1905 
1906       ELSIF NVL(inv2upd_rec.actual_exp_code, 'N') = 'Y' THEN
1907 
1908         /* NON - updateable */
1909         l_var_rent_inv_id := NULL;
1910         l_max_adjust_num  := inv2upd_rec.adjust_num + 1;
1911 
1912       END IF; /* invoice updateable? */
1913 
1914       /* we only look at the last invoice */
1915       EXIT;
1916 
1917     END LOOP; /* check if there exists an invoice for this invoice date */
1918 
1919       pnp_debug_pkg.log('l_exists_invoice...');
1920     /* atleast one invoice exists? */
1921     IF NOT l_exists_invoice
1922        AND round(inv_rec.total_actual_rent, l_precision) <> 0 THEN
1923 
1924       /* not sure abt this part
1925          uncomment the AND inv_rec.total_actual_rent <> 0
1926          part if we do not want to create $0 invoices
1927       */
1928      l_constr_rent := pn_var_rent_calc_pkg.apply_constraints_fy(
1929                                             p_period_id => l_period_id,
1930                                             p_invoice_date => inv_rec.invoice_date,
1931                                             p_actual_rent => inv_rec.total_actual_rent);
1932 
1933       pnp_debug_pkg.log('inserting the row ...');
1934       /* first time for this invoice date - create invoice */
1935       pn_var_rent_inv_pkg.insert_row
1936       ( x_rowid                   => l_row_id,
1937         x_var_rent_inv_id         => l_var_rent_inv_id,
1938         x_adjust_num              => l_max_adjust_num,
1939         x_invoice_date            => inv_rec.invoice_date,
1940         x_for_per_rent            => NULL,
1941         x_tot_act_vol             => l_tot_act_vol,
1942         x_act_per_rent            => inv_rec.total_actual_rent,
1943         x_constr_actual_rent      => l_constr_rent,
1944         x_abatement_appl          => 0,
1945         x_rec_abatement           => NULL,
1946         x_rec_abatement_override  => l_rec_abatement_override,
1947         x_negative_rent           => 0,
1948         x_actual_invoiced_amount  => l_constr_rent,
1949         x_period_id               => l_period_id,
1950         x_var_rent_id             => p_var_rent_id,
1951         x_forecasted_term_status  => 'N',
1952         x_variance_term_status    => 'N',
1953         x_actual_term_status      => 'N',
1954         x_forecasted_exp_code     => 'N',
1955         x_variance_exp_code       => 'N',
1956         x_actual_exp_code         => 'N',
1957         x_comments                => 'created invoice',
1958         x_attribute_category      => NULL,
1959         x_attribute1              => NULL,
1960         x_attribute2              => NULL,
1961         x_attribute3              => NULL,
1962         x_attribute4              => NULL,
1963         x_attribute5              => NULL,
1964         x_attribute6              => NULL,
1965         x_attribute7              => NULL,
1966         x_attribute8              => NULL,
1967         x_attribute9              => NULL,
1968         x_attribute10             => NULL,
1969         x_attribute11             => NULL,
1970         x_attribute12             => NULL,
1971         x_attribute13             => NULL,
1972         x_attribute14             => NULL,
1973         x_attribute15             => NULL,
1974         x_creation_date           => SYSDATE,
1975         x_created_by              => NVL(fnd_global.user_id,0),
1976         x_last_update_date        => SYSDATE,
1977         x_last_updated_by         => NVL(fnd_global.user_id,0),
1978         x_last_update_login       => NVL(fnd_global.login_id,0),
1979         x_org_id                  => l_org_id );
1980 
1981     ELSIF l_exists_invoice THEN
1982 
1983       /* invoice has been created here in the past */
1984 
1985       /* get the previously billed amount from approved invoices */
1986       FOR prev_inv_rec IN prev_invoiced_c( p_vr_id  => p_var_rent_id
1987                                           ,p_prd_id => l_period_id
1988                                           ,p_inv_dt => inv_rec.invoice_date)
1989       LOOP
1990         l_prev_inv_exp_rent := prev_inv_rec.prev_invoiced_amt;
1991       END LOOP;
1992       l_constr_rent := pn_var_rent_calc_pkg.apply_constraints_fy(
1993                                  p_period_id => l_period_id,
1994                                  p_invoice_date => inv_rec.invoice_date,
1995                                  p_actual_rent => inv_rec.total_actual_rent);
1996       /* no invoice to update - create a new one */
1997       IF l_var_rent_inv_id IS NULL THEN
1998         pnp_debug_pkg.log('l_constr_rent:'||l_constr_rent);
1999         pnp_debug_pkg.log('l_constr_rent:'||l_constr_prev_rent);
2000         /* if there a change in rent */
2001         IF round(inv_rec.total_actual_rent, l_precision) <> round(l_prev_inv_rent, l_precision)
2002         OR round(l_constr_rent, l_precision) <> round(l_constr_prev_rent, l_precision)
2003         THEN
2004 
2005           /* create new invoice for difference amt */
2006           pn_var_rent_inv_pkg.insert_row
2007           ( x_rowid                   => l_row_id,
2008             x_var_rent_inv_id         => l_var_rent_inv_id,
2009             x_adjust_num              => l_max_adjust_num,
2010             x_invoice_date            => inv_rec.invoice_date,
2011             x_for_per_rent            => NULL,
2012             x_tot_act_vol             => l_tot_act_vol,
2013             x_act_per_rent            => inv_rec.total_actual_rent,
2014             x_constr_actual_rent      => l_constr_rent,
2015             x_abatement_appl          => 0,
2016             x_rec_abatement           => NULL,
2017             x_rec_abatement_override  => l_rec_abatement_override,
2018             x_negative_rent           => 0,
2019             x_actual_invoiced_amount  => (l_constr_rent - l_prev_inv_exp_rent),
2020             x_period_id               => l_period_id,
2021             x_var_rent_id             => p_var_rent_id,
2022             x_forecasted_term_status  => 'N',
2023             x_variance_term_status    => 'N',
2024             x_actual_term_status      => 'N',
2025             x_forecasted_exp_code     => 'N',
2026             x_variance_exp_code       => 'N',
2027             x_actual_exp_code         => 'N',
2028             x_comments                => 'created invoice',
2029             x_attribute_category      => NULL,
2030             x_attribute1              => NULL,
2031             x_attribute2              => NULL,
2032             x_attribute3              => NULL,
2033             x_attribute4              => NULL,
2034             x_attribute5              => NULL,
2035             x_attribute6              => NULL,
2036             x_attribute7              => NULL,
2037             x_attribute8              => NULL,
2038             x_attribute9              => NULL,
2039             x_attribute10             => NULL,
2040             x_attribute11             => NULL,
2041             x_attribute12             => NULL,
2042             x_attribute13             => NULL,
2043             x_attribute14             => NULL,
2044             x_attribute15             => NULL,
2045             x_creation_date           => SYSDATE,
2046             x_created_by              => NVL(fnd_global.user_id,0),
2047             x_last_update_date        => SYSDATE,
2048             x_last_updated_by         => NVL(fnd_global.user_id,0),
2049             x_last_update_login       => NVL(fnd_global.login_id,0),
2050             x_org_id                  => l_org_id );
2051 
2052         END IF; /* IF inv_rec.total_actual_rent <> l_prev_inv_rent THEN */
2053 
2054       ELSIF l_var_rent_inv_id IS NOT NULL THEN
2055         /* if there a change in rent */
2056         IF round(inv_rec.total_actual_rent, l_precision) <> round(l_prev_inv_rent, l_precision)
2057         OR round(l_constr_rent, l_precision) <> round(l_constr_prev_rent, l_precision)
2058         THEN
2059 
2060           DELETE
2061           pn_payment_terms_all
2062           WHERE
2063           var_rent_inv_id = l_var_rent_inv_id AND
2064           status <> pn_var_rent_calc_pkg.G_TERM_STATUS_APPROVED AND
2065           var_rent_type = pn_var_rent_calc_pkg.G_INV_ON_ACTUAL;
2066 
2067           /* update the invoice */
2068           UPDATE
2069           pn_var_rent_inv_all
2070           SET
2071            act_per_rent           = ROUND(inv_rec.total_actual_rent, g_precision)
2072           ,constr_actual_rent     = ROUND(l_constr_rent, g_precision)
2073           ,actual_invoiced_amount = ROUND((l_constr_rent - l_prev_inv_exp_rent), g_precision)
2074           ,tot_act_vol            = ROUND(l_tot_act_vol,g_precision)   -- bug # 6007571
2075           ,credit_flag            = 'N'      -- bug # 5937807
2076           ,actual_term_status     = 'N'
2077           ,last_update_date       = SYSDATE
2078           ,last_updated_by        = NVL(fnd_global.user_id,0)
2079           ,last_update_login      = NVL(fnd_global.login_id,0)
2080           WHERE
2081           var_rent_inv_id = l_var_rent_inv_id;
2082 
2083        END IF; /* if there a change in rent */
2084 
2085       END IF; /* IF l_var_rent_inv_id IS NULL THEN */
2086 
2087     END IF; /* IF NOT l_exists_invoice THEN */
2088 
2089   END LOOP; /* loop for all invoice dates in the period */
2090 
2091   pnp_debug_pkg.log('+++++++++ insert_invoice END +++++++++++');
2092 
2093 EXCEPTION
2094   WHEN OTHERS THEN RAISE;
2095 
2096 END insert_invoice_firstyr;
2097 
2098 --------------------------------------------------------------------------------
2099 --  NAME         :
2100 --  DESCRIPTION  :
2101 --  PURPOSE      :
2102 --  INVOKED FROM :
2103 --  ARGUMENTS    :
2104 --  REFERENCE    : PN_COMMON.debug()
2105 --  HISTORY      : 16/OCT/06 Shabda Bug# 5533253, Modified to apply constraints
2106 --
2107 --  dd-mon-yyyy  name     o Created
2108 --------------------------------------------------------------------------------
2109 PROCEDURE insert_invoice( p_var_rent_id IN NUMBER
2110                          ,p_period_id   IN NUMBER) IS
2111 
2112   /* get invoice dates for a period */
2113   CURSOR invoice_dates_c( p_vr_id  IN NUMBER
2114                          ,p_prd_id IN NUMBER
2115                          ,p_new_termn_date DATE) IS
2116     SELECT
2117      invoice_date
2118     ,NVL(SUM(tot_act_vol), 0)  AS total_actual_sales
2119     ,NVL((SUM(act_var_rent) - NVL(SUM(first_yr_rent), 0)), 0) AS total_actual_rent
2120     FROM
2121     pn_var_rent_summ_all
2122     WHERE
2123     var_rent_id = p_vr_id AND
2124     period_id = p_prd_id AND
2125     invoice_date <= p_new_termn_date
2126     GROUP BY
2127     invoice_date
2128     ORDER BY
2129     invoice_date;
2130 
2131   /* get latest invoice */
2132   CURSOR invoice2upd_c( p_vr_id  IN NUMBER
2133                        ,p_prd_id IN NUMBER
2134                        ,p_inv_dt IN DATE) IS
2135     SELECT
2136      var_rent_inv_id
2137     ,var_rent_id
2138     ,period_id
2139     ,invoice_date
2140     ,actual_term_status
2141     ,actual_exp_code
2142     ,adjust_num
2143     ,tot_act_vol
2144     ,act_per_rent
2145     ,actual_invoiced_amount
2146     ,constr_actual_rent
2147     ,rec_abatement_override
2148     FROM
2149     pn_var_rent_inv_all
2150     WHERE
2151     var_rent_id = p_vr_id AND
2152     period_id = p_prd_id AND
2153     invoice_date = p_inv_dt AND
2154     NVL(true_up_amt, 0) = 0 AND
2155     true_up_status IS NULL AND
2156     true_up_exp_code IS NULL
2157     ORDER BY adjust_num DESC;
2158 
2159   /* get latest invoice */
2160   CURSOR prev_invoiced_c( p_vr_id  IN NUMBER
2161                          ,p_prd_id IN NUMBER
2162                          ,p_inv_dt IN DATE) IS
2163     SELECT
2164     NVL(SUM(actual_invoiced_amount), 0) AS prev_invoiced_amt
2165     FROM
2166     pn_var_rent_inv_all
2167     WHERE
2168     var_rent_id = p_vr_id AND
2169     period_id = p_prd_id AND
2170     invoice_date = p_inv_dt AND
2171     actual_exp_code = 'Y' AND
2172     NVL(true_up_amt, 0) = 0 AND
2173     true_up_status IS NULL AND
2174     true_up_exp_code IS NULL;
2175 
2176     -- Does any volume exists for this invoice date?
2177   CURSOR vol_exists_c(ip_var_rent_id NUMBER,
2178                       ip_invoice_date DATE
2179             ) IS
2180       SELECT 1 as vol_exists
2181       FROM DUAL
2182       WHERE exists(
2183       SELECT vol_hist_id
2184       FROM pn_var_vol_hist_all
2185       WHERE grp_date_id in(
2186       SELECT grp_date_id
2187       FROM pn_var_grp_dates_all
2188       WHERE var_rent_id = ip_var_rent_id
2189       AND invoice_date = ip_invoice_date)
2190       AND vol_hist_status_code = pn_var_rent_calc_pkg.G_SALESVOL_STATUS_APPROVED);
2191 
2192   l_invoice_on      VARCHAR2(30);
2193   l_row_id          ROWID;
2194   l_var_rent_inv_id NUMBER;
2195   l_max_adjust_num  NUMBER;
2196   l_prev_inv_rent   NUMBER;
2197   l_prev_inv_exp_rent NUMBER;
2198   l_constr_rent     NUMBER;
2199   l_constr_prev_rent  NUMBER;
2200   l_rec_abatement_override NUMBER;
2201 
2202   /* get ORG ID */
2203   CURSOR org_c(p_vr_id IN NUMBER) IS
2204     SELECT org_id, termination_date
2205       FROM pn_var_rents_all
2206      WHERE var_rent_id = p_vr_id;
2207 
2208   /* get LY sales */
2209   CURSOR ly_sales_c( p_vr_id            IN NUMBER
2210                     ,p_vr_term_date     IN DATE) IS
2211     SELECT
2212     NVL(SUM(ly_proration_sales - NVL(ly_proration_deductions,0) ),0) AS sales
2213     FROM
2214     pn_var_trx_headers_all
2215     WHERE
2216     var_rent_id = p_vr_id AND
2217     calc_prd_end_date >= (ADD_MONTHS(p_vr_term_date, -12) + 1);
2218 
2219   CURSOR  last_period_cur(p_vr_id IN NUMBER, p_termination_date DATE) IS
2220     SELECT period_id
2221     FROM pn_var_periods_all
2222     WHERE var_rent_id = p_vr_id
2223     AND   end_date = p_termination_date
2224     AND   partial_period='Y';    --  bug # 5937807
2225 
2226   l_org_id NUMBER;
2227   l_tot_act_vol    NUMBER := 0;
2228   l_vr_termination_date DATE;
2229   l_exists_invoice BOOLEAN;
2230   l_period_id NUMBER;
2231   l_precision NUMBER;
2232 BEGIN
2233 
2234   pnp_debug_pkg.log('+++++++++ insert_invoice START (+) +++++++++++');
2235 
2236   FOR vr_rec IN org_c(p_vr_id => p_var_rent_id) LOOP
2237     l_org_id := vr_rec.org_id;
2238     l_vr_termination_date := vr_rec.termination_date;
2239   END LOOP;
2240 
2241   l_precision := nvl(pn_var_rent_calc_pkg.get_currency_precision(l_org_id),4);
2242   pnp_debug_pkg.log('l_precision:'||l_precision);
2243 
2244   /* loop for all invoice dates in the period */
2245   FOR inv_rec IN invoice_dates_c( p_vr_id  => p_var_rent_id
2246                                  ,p_prd_id => p_period_id
2247                                  ,p_new_termn_date => l_vr_termination_date)
2248   LOOP
2249       pnp_debug_pkg.log('inv_rec.invoice_date ...'||inv_rec.invoice_date);
2250       pnp_debug_pkg.log('inv_rec.total_actual_rent ...'||inv_rec.total_actual_rent);
2251 
2252     l_row_id          := NULL;
2253     l_var_rent_inv_id := NULL;
2254     l_max_adjust_num  := 0;
2255     l_prev_inv_rent   := 0;
2256     l_exists_invoice  := FALSE;
2257     l_tot_act_vol     := inv_rec.total_actual_sales;
2258 
2259     /* check if there exists an invoice for this invoice date */
2260     FOR inv2upd_rec IN invoice2upd_c( p_vr_id  => p_var_rent_id
2261                                      ,p_prd_id => p_period_id
2262                                      ,p_inv_dt => inv_rec.invoice_date)
2263     LOOP
2264 
2265       /* invoice exists - we only look at the last invoice */
2266       l_exists_invoice := TRUE;
2267       l_constr_prev_rent := inv2upd_rec.constr_actual_rent;
2268       l_prev_inv_rent := inv2upd_rec.act_per_rent;
2269       l_rec_abatement_override := inv2upd_rec.rec_abatement_override;
2270       /* invoice updateable? */
2271       IF NVL(inv2upd_rec.actual_exp_code, 'N') <> 'Y' THEN
2272 
2273         /* updateable */
2274         l_var_rent_inv_id := inv2upd_rec.var_rent_inv_id;
2275         l_max_adjust_num  := inv2upd_rec.adjust_num;
2276 
2277       ELSIF NVL(inv2upd_rec.actual_exp_code, 'N') = 'Y' THEN
2278 
2279         /* NON - updateable */
2280         l_var_rent_inv_id := NULL;
2281         l_max_adjust_num  := inv2upd_rec.adjust_num + 1;
2282 
2283       END IF; /* invoice updateable? */
2284 
2285       /* we only look at the last invoice */
2286       EXIT;
2287 
2288     END LOOP; /* check if there exists an invoice for this invoice date */
2289 
2290 
2291     /* Create the invoice for first partial year separately */
2292     IF g_proration_rule IN ( pn_var_rent_calc_pkg.G_PRORUL_LY
2293                          ,pn_var_rent_calc_pkg.G_PRORUL_FLY)
2294         AND g_invoice_on = G_INV_ON_ACTUAL
2295     THEN
2296 
2297       FOR rec IN last_period_cur(p_var_rent_id,l_vr_termination_date ) LOOP
2298          l_period_id := rec.period_id;
2299       END LOOP;
2300 
2301       IF p_period_id = l_period_id THEN
2302 
2303          FOR ly_sales_rec IN ly_sales_c (p_var_rent_id,l_vr_termination_date)LOOP
2304             l_tot_act_vol := ly_sales_rec.sales;
2305          END LOOP;
2306 
2307       END IF;
2308 
2309     END IF;
2310 
2311     /* atleast one invoice exists? */
2312     IF NOT l_exists_invoice
2313        /*AND inv_rec.total_actual_rent <> 0*/ THEN
2314 
2315       /* not sure abt this part
2316          uncomment the AND inv_rec.total_actual_rent <> 0
2317          part if we do not want to create $0 invoices
2318       */
2319             /*We donot want to create invoices if no volumes exist for this
2320       invoice date. However once we have create invoices, and you delete volumes
2321       for that we need to update/adfjust them.
2322       */
2323 
2324       -- check if vol exists. This can't loop more than once.
2325       FOR vol_exists_rec IN vol_exists_c( p_var_rent_id,
2326                                           inv_rec.invoice_date
2327                                           ) --
2328                                           LOOP
2329 
2330       l_constr_rent := pn_var_rent_calc_pkg.apply_constraints(
2331                                             p_period_id => p_period_id,
2332                                             p_invoice_date => inv_rec.invoice_date,
2333                                             p_actual_rent => inv_rec.total_actual_rent);
2334 
2335       /* first time for this invoice date - create invoice */
2336       pn_var_rent_inv_pkg.insert_row
2337       ( x_rowid                   => l_row_id,
2338         x_var_rent_inv_id         => l_var_rent_inv_id,
2339         x_adjust_num              => l_max_adjust_num,
2340         x_invoice_date            => inv_rec.invoice_date,
2341         x_for_per_rent            => NULL,
2342         x_tot_act_vol             => l_tot_act_vol,
2343         x_act_per_rent            => inv_rec.total_actual_rent,
2344         x_constr_actual_rent      => l_constr_rent,
2345         x_abatement_appl          => 0,
2346         x_rec_abatement           => NULL,
2347         x_rec_abatement_override  => l_rec_abatement_override,
2348         x_negative_rent           => 0,
2349         x_actual_invoiced_amount  => l_constr_rent,
2350         x_period_id               => p_period_id,
2351         x_var_rent_id             => p_var_rent_id,
2352         x_forecasted_term_status  => 'N',
2353         x_variance_term_status    => 'N',
2354         x_actual_term_status      => 'N',
2355         x_forecasted_exp_code     => 'N',
2356         x_variance_exp_code       => 'N',
2357         x_actual_exp_code         => 'N',
2358         x_comments                => 'created invoice',
2359         x_attribute_category      => NULL,
2360         x_attribute1              => NULL,
2361         x_attribute2              => NULL,
2362         x_attribute3              => NULL,
2363         x_attribute4              => NULL,
2364         x_attribute5              => NULL,
2365         x_attribute6              => NULL,
2366         x_attribute7              => NULL,
2367         x_attribute8              => NULL,
2368         x_attribute9              => NULL,
2369         x_attribute10             => NULL,
2370         x_attribute11             => NULL,
2371         x_attribute12             => NULL,
2372         x_attribute13             => NULL,
2373         x_attribute14             => NULL,
2374         x_attribute15             => NULL,
2375         x_creation_date           => SYSDATE,
2376         x_created_by              => NVL(fnd_global.user_id,0),
2377         x_last_update_date        => SYSDATE,
2378         x_last_updated_by         => NVL(fnd_global.user_id,0),
2379         x_last_update_login       => NVL(fnd_global.login_id,0),
2380         x_org_id                  => l_org_id );
2381       END LOOP;
2382 
2383 
2384 
2385 
2386     ELSIF l_exists_invoice THEN
2387 
2388       /* invoice has been created here in the past */
2389 
2390       /* get the previously billed amount from approved invoices */
2391       FOR prev_inv_rec IN prev_invoiced_c( p_vr_id  => p_var_rent_id
2392                                           ,p_prd_id => p_period_id
2393                                           ,p_inv_dt => inv_rec.invoice_date)
2394       LOOP
2395         l_prev_inv_exp_rent := prev_inv_rec.prev_invoiced_amt;
2396       END LOOP;
2397       l_constr_rent := pn_var_rent_calc_pkg.apply_constraints(
2398                                  p_period_id => p_period_id,
2399                                  p_invoice_date => inv_rec.invoice_date,
2400                                  p_actual_rent => inv_rec.total_actual_rent);
2401 
2402       /* no invoice to update - create a new one */
2403       IF l_var_rent_inv_id IS NULL THEN
2404         pnp_debug_pkg.log('l_constr_rent:'||l_constr_rent);
2405         pnp_debug_pkg.log('l_constr_rent:'||l_constr_prev_rent);
2406         /* if there a change in rent */
2407         IF round(inv_rec.total_actual_rent, l_precision) <> round(l_prev_inv_rent, l_precision)
2408         OR round(l_constr_rent, l_precision) <> round(l_constr_prev_rent, l_precision)
2409         THEN
2410 
2411           /* create new invoice for difference amt */
2412           pn_var_rent_inv_pkg.insert_row
2413           ( x_rowid                   => l_row_id,
2414             x_var_rent_inv_id         => l_var_rent_inv_id,
2415             x_adjust_num              => l_max_adjust_num,
2416             x_invoice_date            => inv_rec.invoice_date,
2417             x_for_per_rent            => NULL,
2418             x_tot_act_vol             => l_tot_act_vol,
2419             x_act_per_rent            => inv_rec.total_actual_rent,
2420             x_constr_actual_rent      => l_constr_rent,
2421             x_abatement_appl          => 0,
2422             x_rec_abatement           => NULL,
2423             x_rec_abatement_override  => l_rec_abatement_override,
2424             x_negative_rent           => 0,
2425             x_actual_invoiced_amount  => (l_constr_rent - l_prev_inv_exp_rent),
2426             x_period_id               => p_period_id,
2427             x_var_rent_id             => p_var_rent_id,
2428             x_forecasted_term_status  => 'N',
2429             x_variance_term_status    => 'N',
2430             x_actual_term_status      => 'N',
2431             x_forecasted_exp_code     => 'N',
2432             x_variance_exp_code       => 'N',
2433             x_actual_exp_code         => 'N',
2434             x_comments                => 'created invoice',
2435             x_attribute_category      => NULL,
2436             x_attribute1              => NULL,
2437             x_attribute2              => NULL,
2438             x_attribute3              => NULL,
2439             x_attribute4              => NULL,
2440             x_attribute5              => NULL,
2441             x_attribute6              => NULL,
2442             x_attribute7              => NULL,
2443             x_attribute8              => NULL,
2444             x_attribute9              => NULL,
2445             x_attribute10             => NULL,
2446             x_attribute11             => NULL,
2447             x_attribute12             => NULL,
2448             x_attribute13             => NULL,
2449             x_attribute14             => NULL,
2450             x_attribute15             => NULL,
2451             x_creation_date           => SYSDATE,
2452             x_created_by              => NVL(fnd_global.user_id,0),
2453             x_last_update_date        => SYSDATE,
2454             x_last_updated_by         => NVL(fnd_global.user_id,0),
2455             x_last_update_login       => NVL(fnd_global.login_id,0),
2456             x_org_id                  => l_org_id );
2457 
2458         END IF; /* IF inv_rec.total_actual_rent <> l_prev_inv_rent THEN */
2459 
2460 
2461       ELSIF l_var_rent_inv_id IS NOT NULL THEN
2462         /* if there a change in rent */
2463         IF round(inv_rec.total_actual_rent, l_precision) <> round(l_prev_inv_rent, l_precision)
2464         OR round(l_constr_rent, l_precision) <> round(l_constr_prev_rent, l_precision)
2465         THEN
2466 
2467           DELETE
2468           pn_payment_terms_all
2469           WHERE
2470           var_rent_inv_id = l_var_rent_inv_id AND
2471           status <> pn_var_rent_calc_pkg.G_TERM_STATUS_APPROVED AND
2472           var_rent_type = pn_var_rent_calc_pkg.G_INV_ON_ACTUAL;
2473 
2474           /* update the invoice */
2475           UPDATE
2476           pn_var_rent_inv_all
2477           SET
2478            act_per_rent           = ROUND(inv_rec.total_actual_rent, g_precision)
2479           ,constr_actual_rent     = ROUND(l_constr_rent, g_precision)
2480           ,actual_invoiced_amount = ROUND((l_constr_rent - l_prev_inv_exp_rent), g_precision)
2481           ,tot_act_vol            = ROUND(l_tot_act_vol, g_precision)  -- bug # 6007571
2482           ,credit_flag            = 'N'  --  bug # 5937807
2483           ,actual_term_status     = 'N'
2484           ,last_update_date       = SYSDATE
2485           ,last_updated_by        = NVL(fnd_global.user_id,0)
2486           ,last_update_login      = NVL(fnd_global.login_id,0)
2487           WHERE
2488           var_rent_inv_id = l_var_rent_inv_id;
2489 
2490        END IF; /* if there a change in rent */
2491 
2492       END IF; /* IF l_var_rent_inv_id IS NULL THEN */
2493 
2494     END IF; /* IF NOT l_exists_invoice THEN */
2495     pnp_debug_pkg.log('l_prev_inv_exp_rent:'||l_prev_inv_exp_rent);
2496 
2497   END LOOP; /* loop for all invoice dates in the period */
2498 
2499   pnp_debug_pkg.log('+++++++++ insert_invoice END +++++++++++');
2500 
2501 EXCEPTION
2502   WHEN OTHERS THEN RAISE;
2503 
2504 END insert_invoice;
2505 
2506 
2507 --------------------------------------------------------------------------------
2508 --  NAME         : apply_constraints
2509 --  DESCRIPTION  :
2510 --  PURPOSE      :
2511 --  INVOKED FROM :
2512 --  ARGUMENTS    :
2513 --  REFERENCE    : PN_COMMON.debug()
2514 --  HISTORY      :
2515 --
2516 --  9/10/06      Shabda     o Created
2517 --------------------------------------------------------------------------------
2518 FUNCTION apply_constraints(p_period_id IN NUMBER,
2519                            p_invoice_date IN DATE,
2520                            p_actual_rent IN NUMBER)
2521 RETURN NUMBER
2522 IS
2523 Cursor csr_get_constr(p_period_id NUMBER) is
2524 SELECT TYPE_code,
2525        amount,
2526        cons.constr_start_date const,
2527        grp.inv_start_date grpst
2528 FROM pn_var_constraints_all cons,
2529      pn_var_grp_dates_all grp
2530 WHERE cons.period_id = p_period_id
2531 AND cons.period_id = grp.period_id
2532 AND cons.constr_start_date <= grp.inv_start_date
2533 AND cons.constr_end_date >= grp.inv_end_date
2534 AND grp.invoice_date = p_invoice_date
2535 AND NVL(constr_cat_code, 'VARENT')= 'VARENT';
2536 
2537 l_lower_bound NUMBER;
2538 l_upper_bound NUMBER;
2539 l_constr_act_rent NUMBER;
2540 
2541 BEGIN
2542     pnp_debug_pkg.log( 'pn_variable_amount_pkg.apply_constraints  : (+) ');
2543 
2544     FOR rec_get_constr in csr_get_constr(p_period_id)
2545     LOOP
2546        IF rec_get_constr.TYPE_code = 'MIN' THEN
2547            l_lower_bound := rec_get_constr.amount;
2548        ELSIF rec_get_constr.TYPE_code = 'MAX' THEN
2549            l_upper_bound := rec_get_constr.amount;
2550        END IF;
2551     END LOOP;
2552 
2553     /* Apply constraints to Actual variable rent */
2554 
2555    pnp_debug_pkg.log('apply_constraints - Lower bound :'|| l_lower_bound);
2556    pnp_debug_pkg.log('apply_constraints - Upper bound :'|| l_upper_bound);
2557    pnp_debug_pkg.log('apply_constraints - Actual Rent :'|| p_actual_rent);
2558 
2559    IF p_actual_rent < NVL(l_lower_bound,p_actual_rent) THEN
2560         l_constr_act_rent := l_lower_bound;
2561    ELSIF p_actual_rent > NVL(l_upper_bound,p_actual_rent) THEN
2562         l_constr_act_rent := l_upper_bound;
2563    ELSE
2564         l_constr_act_rent := p_actual_rent;
2565    END IF;
2566 
2567    pnp_debug_pkg.log('apply_constraints - Constrained Actual rent :'||l_constr_act_rent);
2568 
2569    RETURN l_constr_act_rent;
2570    pnp_debug_pkg.log( 'pn_variable_amount_pkg.apply_constraints  : (-) ');
2571 END apply_constraints;
2572 
2573 --------------------------------------------------------------------------------
2574 --  NAME         : apply_constraints_fy
2575 --  DESCRIPTION  :
2576 --  PURPOSE      :
2577 --  INVOKED FROM : Insert_invoice_firstYr
2578 --  ARGUMENTS    :
2579 --  REFERENCE    : PN_COMMON.debug()
2580 --  HISTORY      :
2581 --
2582 --  9/11/06      Shabda     o Created
2583 --------------------------------------------------------------------------------
2584 FUNCTION apply_constraints_fy(p_period_id IN NUMBER,
2585                            p_invoice_date IN DATE,
2586                            p_actual_rent IN NUMBER)
2587 RETURN NUMBER
2588 IS
2589 Cursor csr_get_constr(p_period_id NUMBER) is
2590     SELECT TYPE_code,
2591            amount,
2592            cons.constr_start_date const
2593     FROM pn_var_periods_all per, pn_var_constraints_all cons
2594     WHERE per.var_rent_id = (select var_rent_id from pn_var_periods_all where period_id=p_period_id)
2595     AND per.period_id = cons.period_id
2596     AND cons.constr_start_date=(select
2597     MAX(const1.constr_start_date) from pn_var_constraints_all const1
2598     where const1.period_id = cons.period_id)
2599     AND   period_num = 1;
2600 
2601 l_lower_bound NUMBER;
2602 l_upper_bound NUMBER;
2603 l_constr_act_rent NUMBER;
2604 
2605 BEGIN
2606     pnp_debug_pkg.log( 'pn_variable_amount_pkg.apply_constraints_fy  : (+) ');
2607     pnp_debug_pkg.log('p_period_id'||p_period_id);
2608     FOR rec_get_constr in csr_get_constr(p_period_id)
2609     LOOP
2610        IF rec_get_constr.TYPE_code = 'MIN' THEN
2611            l_lower_bound := rec_get_constr.amount;
2612        ELSIF rec_get_constr.TYPE_code = 'MAX' THEN
2613            l_upper_bound := rec_get_constr.amount;
2614        END IF;
2615     END LOOP;
2616 
2617     /* Apply constraints to Actual variable rent */
2618 
2619    pnp_debug_pkg.log('apply_constraints - Lower bound :'|| l_lower_bound);
2620    pnp_debug_pkg.log('apply_constraints - Upper bound :'|| l_upper_bound);
2621    pnp_debug_pkg.log('apply_constraints - Actual Rent :'|| p_actual_rent);
2622 
2623    IF p_actual_rent < NVL(l_lower_bound,p_actual_rent) THEN
2624         l_constr_act_rent := l_lower_bound;
2625    ELSIF p_actual_rent > NVL(l_upper_bound,p_actual_rent) THEN
2626         l_constr_act_rent := l_upper_bound;
2627    ELSE
2628         l_constr_act_rent := p_actual_rent;
2629    END IF;
2630 
2631    pnp_debug_pkg.log('apply_constraints - Constrained Actual rent :'||l_constr_act_rent);
2632 
2633    RETURN l_constr_act_rent;
2634    pnp_debug_pkg.log( 'pn_variable_amount_pkg.apply_constraints  : (-) ');
2635 END apply_constraints_fy;
2636 
2637 
2638 /***************Procedures to apply abatements***********/
2639 
2640 --------------------------------------------------------------------------------
2641 --  NAME         : apply_abatements
2642 --  DESCRIPTION  : Applies abatements to given periods of a specific VR
2643 --  PURPOSE      : Applies abatements.
2644 --  INVOKED FROM : calculate_rent
2645 --  ARGUMENTS    : p_var_rent_id: Vr to apply abatements for.
2646 --                 p_period_id: Period to calculate for.
2647 --                 p_flag: If calculate then actual_invoiced amount is
2648 --                 updated.
2649 --  REFERENCE    : PN_COMMON.debug()
2650 --  HISTORY      :
2651 --
2652 --  25/Nov/06    Shabda Created
2653 --------------------------------------------------------------------------------
2654 PROCEDURE apply_abatements(p_var_rent_id IN NUMBER,
2655                  p_period_id IN NUMBER,
2656                  p_flag IN VARCHAR2)
2657 IS
2658   -- Allowances first ot abatements?
2659   CURSOR order_c(ip_var_rent_id NUMBER) IS
2660   SELECT ORDER_OF_APPL_CODE, invoice_on, termination_date
2661   FROM PN_VAR_RENTS_ALL abat
2662   WHERE abat.var_rent_id = ip_var_rent_id;
2663 
2664   -- Get the details of
2665   CURSOR inv_c( ip_var_rent_id NUMBER,
2666                 ip_period_id NUMBER,
2667                 p_new_termn_date DATE
2668             ) IS
2669     SELECT var_rent_inv_id, invoice_date, variance_exp_code,
2670            actual_exp_code, constr_actual_rent
2671     FROM pn_var_rent_inv_all inv1
2672     WHERE inv1.var_rent_id = ip_var_rent_id
2673     AND inv1.period_id = ip_period_id
2674     AND inv1.invoice_date <= p_new_termn_date
2675     AND inv1.adjust_num= (
2676       SELECT MAX(adjust_num) from pn_var_rent_inv_all inv2
2677       where inv1.var_rent_id = inv2.var_rent_id
2678       AND inv1.invoice_date = inv2.invoice_date)
2679     ORDER BY invoice_date;
2680 
2681   -- Get all the details of a specific invoice.
2682   CURSOR inv_all_c(ip_vr_inv_id NUMBER
2683             ) IS
2684     SELECT *
2685       FROM pn_var_rent_inv_all
2686      WHERE var_rent_inv_id = ip_vr_inv_id;
2687 
2688 
2689   /* get prev invoiced amount. */
2690   CURSOR prev_invoiced_c( p_vr_id  IN NUMBER
2691                          ,p_prd_id IN NUMBER
2692                          ,p_inv_dt IN DATE) IS
2693     SELECT
2694     NVL(SUM(actual_invoiced_amount), 0) AS prev_invoiced_amt
2695     FROM
2696     pn_var_rent_inv_all
2697     WHERE
2698     var_rent_id = p_vr_id AND
2699     period_id = p_prd_id AND
2700     invoice_date = p_inv_dt AND
2701     (actual_exp_code = 'Y'
2702     OR variance_exp_code = 'Y')--Both can not be Y at the same time
2703     AND
2704     NVL(true_up_amt, 0) = 0 AND
2705     true_up_status IS NULL AND
2706     true_up_exp_code IS NULL;
2707 
2708     -- Get the details of
2709     CURSOR is_act_or_rec_exp_c(ip_var_rent_inv_id NUMBER) IS
2710       SELECT DECODE(invoice_on,
2711         G_INV_ON_ACTUAL, actual_exp_code,
2712         G_INV_ON_FORECASTED, variance_exp_code) AS
2713         exp_code,
2714         inv.actual_invoiced_amount
2715         FROM pn_var_rents_all vr,
2716              pn_var_rent_inv_all inv
2717        WHERE vr.var_rent_id = inv.var_rent_id
2718          AND inv.var_rent_inv_id = ip_var_rent_inv_id;
2719 
2720   l_is_inv_exp VARCHAR(30);
2721   l_abat_order VARCHAR(30);
2722   l_prev_inv_exp NUMBER;
2723   l_abated_rent NUMBER;
2724   l_row_id ROWID := NULL;
2725   l_var_rent_inv_id NUMBER := NULL;
2726   l_actual_invoiced_amount NUMBER;
2727   l_vr_termination_date DATE;
2728 
2729 BEGIN
2730   /*To apply abatements we need to
2731   1. Apply deffered negative rents.
2732   2. Apply allowances/Abatements.
2733   3. Apply/Allowances/Abatements.
2734   */
2735   --
2736   pnp_debug_pkg.log('apply_abatements start(+)');
2737   pnp_debug_pkg.log('p_flag:'||p_flag);
2738   FOR rec IN order_c(p_var_rent_id) LOOP
2739     l_abat_order := rec.ORDER_OF_APPL_CODE;
2740     l_vr_termination_date := rec.termination_date;
2741   END LOOP;
2742   --
2743   FOR inv_rec IN inv_c(p_var_rent_id, p_period_id, l_vr_termination_date) LOOP
2744     pnp_debug_pkg.log('called apply_def_neg_rent');
2745     pn_var_rent_calc_pkg.apply_def_neg_rent(p_var_rent_id, p_period_id, inv_rec.var_rent_inv_id, l_abated_rent);
2746     pnp_debug_pkg.log('complete');
2747    IF (l_abat_order = pn_var_rent_calc_pkg.G_ALLOWANCE_FIRST) THEN
2748     pnp_debug_pkg.log('call pnp_debug_pkg.log');
2749     pn_var_rent_calc_pkg.apply_allow(p_var_rent_id, p_period_id, inv_rec.var_rent_inv_id, l_abated_rent);
2750     pnp_debug_pkg.log('complete');
2751    END IF;--Apply allowance.
2752 
2753    pnp_debug_pkg.log('call populate_abat');
2754    pn_var_rent_calc_pkg.populate_abat(p_var_rent_id , p_period_id, inv_rec.var_rent_inv_id);
2755    pnp_debug_pkg.log('complete');
2756 
2757    pnp_debug_pkg.log('call apply_abat');
2758    pn_var_rent_calc_pkg.apply_abat(p_var_rent_id, p_period_id, inv_rec.var_rent_inv_id, l_abated_rent);
2759    pnp_debug_pkg.log('complete');
2760 
2761    IF(l_abat_order <> pn_var_rent_calc_pkg.G_ALLOWANCE_FIRST) THEN
2762      pnp_debug_pkg.log('call pnp_debug_pkg.log');
2763      pn_var_rent_calc_pkg.apply_allow(p_var_rent_id, p_period_id, inv_rec.var_rent_inv_id, l_abated_rent);
2764      pnp_debug_pkg.log('complete');
2765    END IF;--Apply allowance
2766    pnp_debug_pkg.log('called populate_neg_rent');
2767    pn_var_rent_calc_pkg.populate_neg_rent(p_var_rent_id, p_period_id, inv_rec.var_rent_inv_id, l_abated_rent);
2768    pnp_debug_pkg.log('complete');
2769 
2770 
2771    --
2772    FOR rec IN prev_invoiced_c(p_var_rent_id, p_period_id, inv_rec.invoice_date) LOOP
2773      l_prev_inv_exp := rec.prev_invoiced_amt;
2774    END LOOP;
2775 
2776    /* update the invoice */
2777    IF (p_flag = 'CALCULATE') THEN
2778 
2779        FOR exp_rec IN is_act_or_rec_exp_c(inv_rec.var_rent_inv_id) LOOP
2780          l_is_inv_exp := exp_rec.exp_code;
2781          l_actual_invoiced_amount := exp_rec.actual_invoiced_amount;
2782        END LOOP;
2783 
2784      IF (l_is_inv_exp = 'N' ) AND
2785         ((l_abated_rent - l_prev_inv_exp)<> NVL(l_actual_invoiced_amount, 0)) THEN
2786 
2787        DELETE
2788        pn_payment_terms_all
2789        WHERE
2790        var_rent_inv_id = inv_rec.var_rent_inv_id AND
2791        status <> pn_var_rent_calc_pkg.G_TERM_STATUS_APPROVED AND
2792        var_rent_type = pn_var_rent_calc_pkg.G_INV_ON_ACTUAL;
2793 
2794        -- Update the current invoice
2795        pnp_debug_pkg.log('Abatements - updating');
2796        UPDATE
2797        pn_var_rent_inv_all
2798        SET
2799        actual_invoiced_amount  = ROUND((l_abated_rent - l_prev_inv_exp), g_precision)
2800        ,actual_term_status     = 'N'
2801        ,last_update_date       = SYSDATE
2802        ,last_updated_by        = NVL(fnd_global.user_id,0)
2803        ,last_update_login      = NVL(fnd_global.login_id,0)
2804        WHERE
2805        var_rent_inv_id = inv_rec.var_rent_inv_id;
2806 
2807      ELSIF ((l_abated_rent - l_prev_inv_exp)<>0) AND (l_is_inv_exp = 'Y') THEN
2808        -- Insert a new invoice. This happens only if your rents changes as a result of
2809        -- applied allowance/abat when you add them after some calc have been done.
2810        FOR inv_all_rec IN inv_all_c(inv_rec.var_rent_inv_id) LOOP
2811        --This can loop only once
2812        pnp_debug_pkg.log('l_prev_inv_exp:'||l_prev_inv_exp);
2813        pnp_debug_pkg.log('l_abated_rent:'||l_abated_rent);
2814        pnp_debug_pkg.log('Abatements - inserting');
2815       l_row_id := NULL;
2816       l_var_rent_inv_id := NULL;
2817        pn_var_rent_inv_pkg.insert_row
2818           ( x_rowid                   => l_row_id,
2819             x_var_rent_inv_id         => l_var_rent_inv_id,
2820             x_adjust_num              => inv_all_rec.adjust_num+1,
2821             x_invoice_date            => inv_all_rec.invoice_date,
2822             x_for_per_rent            => inv_all_rec.for_per_rent,
2823             x_tot_act_vol             => inv_all_rec.tot_act_vol,
2824             x_act_per_rent            => inv_all_rec.act_per_rent,
2825             x_constr_actual_rent      => inv_all_rec.constr_actual_rent,
2826             x_abatement_appl          => inv_all_rec.abatement_appl,
2827             x_rec_abatement           => inv_all_rec.rec_abatement,
2828             x_rec_abatement_override  => inv_all_rec.rec_abatement_override,
2829             x_negative_rent           => inv_all_rec.negative_rent,
2830             x_actual_invoiced_amount  => (l_abated_rent - l_prev_inv_exp),
2831             x_period_id               => inv_all_rec.period_id,
2832             x_var_rent_id             => inv_all_rec.var_rent_id,
2833             x_forecasted_term_status  => 'N',
2834             x_variance_term_status    => 'N',
2835             x_actual_term_status      => 'N',
2836             x_forecasted_exp_code     => 'N',
2837             x_variance_exp_code       => 'N',
2838             x_actual_exp_code         => 'N',
2839             x_comments                => 'created invoice',
2840             x_attribute_category      => NULL,
2841             x_attribute1              => NULL,
2842             x_attribute2              => NULL,
2843             x_attribute3              => NULL,
2844             x_attribute4              => NULL,
2845             x_attribute5              => NULL,
2846             x_attribute6              => NULL,
2847             x_attribute7              => NULL,
2848             x_attribute8              => NULL,
2849             x_attribute9              => NULL,
2850             x_attribute10             => NULL,
2851             x_attribute11             => NULL,
2852             x_attribute12             => NULL,
2853             x_attribute13             => NULL,
2854             x_attribute14             => NULL,
2855             x_attribute15             => NULL,
2856             x_creation_date           => SYSDATE,
2857             x_created_by              => NVL(fnd_global.user_id,0),
2858             x_last_update_date        => SYSDATE,
2859             x_last_updated_by         => NVL(fnd_global.user_id,0),
2860             x_last_update_login       => NVL(fnd_global.login_id,0),
2861             x_org_id                  => inv_all_rec.org_id );
2862        END LOOP;
2863      END IF;
2864 
2865    END IF;
2866 
2867 
2868 
2869   END LOOP;--Loop for all required invoices.
2870   pnp_debug_pkg.log('apply_abatements end1(-)');
2871   pnp_debug_pkg.log('l_prev_inv_exp:'||l_prev_inv_exp);
2872 
2873 
2874 EXCEPTION
2875    WHEN others THEN
2876    pnp_debug_pkg.log('Raised exception');
2877    RAISE;
2878 END;
2879 
2880 
2881 /*
2882 This is the way deffered negative rents were applied in old calc engine.
2883 Basically in old cal engine we decided what to do with neg rent before abatements were
2884 applied. This would work if the excess abatement was always set to ignore,
2885 as was the case previously.
2886 Now we need to apply def neg rent at begining of abatement alication and make
2887 other decisions at the end.
2888 PROCEDURE apply_neg_rent(p_var_rent_id IN NUMBER,
2889                p_period_id IN NUMBER,
2890                p_inv_id IN NUMBER) IS
2891   -- Get the details of all invoices
2892   CURSOR invoices_c(ip_var_rent_id NUMBER, ip_period_id NUMBER, ip_inv_id NUMBER
2893             ) IS
2894     SELECT  constr_actual_rent
2895             ,actual_invoiced_amount
2896             ,negative_rent
2897             ,invoice_date
2898             ,var_rent_inv_id
2899      FROM pn_var_rent_inv_all inv1
2900      WHERE inv1.var_rent_id = ip_var_rent_id
2901      AND inv1.period_id = ip_period_id
2902      AND var_rent_inv_id = ip_inv_id
2903      AND inv1.adjust_num= (
2904       SELECT MAX(adjust_num) from pn_var_rent_inv_all inv2
2905       where inv1.var_rent_id = inv2.var_rent_id
2906       AND inv1.invoice_date = inv2.invoice_date);
2907 
2908   CURSOR csr_last_inv(p_var_rent_id NUMBER)
2909      IS
2910      SELECT MAX(invoice_date) inv_date
2911      FROM pn_var_grp_dates_all
2912      WHERE var_rent_id = p_var_rent_id;
2913 
2914   CURSOR csr_neg_avail (ip_var_rent_id  NUMBER,
2915                         ip_invoice_date DATE) IS
2916      SELECT ABS(NVL(SUM(constr_actual_rent),0)) negative_available
2917      FROM pn_var_rent_inv_all inv
2918      WHERE inv.var_rent_id = ip_var_rent_id
2919      AND   inv.invoice_date < ip_invoice_date
2920      AND   inv.adjust_num = (select MAX(inv1.adjust_num)
2921                              from pn_var_rent_inv_all inv1
2922                              where inv1.var_rent_id = inv.var_rent_id
2923                              AND   inv1.invoice_date = inv.invoice_date)
2924      AND   inv.constr_actual_rent < 0;
2925 
2926   CURSOR csr_neg_appl (ip_var_rent_id  NUMBER,
2927                        ip_invoice_date DATE) IS
2928      SELECT NVL(SUM(negative_rent),0) negative_applied
2929      FROM pn_var_rent_inv_all inv
2930      WHERE inv.var_rent_id = ip_var_rent_id
2931      AND   inv.invoice_date < ip_invoice_date
2932      AND   inv.adjust_num = (select MAX(inv1.adjust_num)
2933                              from pn_var_rent_inv_all inv1
2934                              where inv1.var_rent_id = inv.var_rent_id
2935                              AND   inv1.invoice_date = inv.invoice_date);
2936    CURSOR csr_get_abt(ip_var_rent_id NUMBER)
2937         IS
2938         SELECT negative_rent
2939         FROM pn_var_rents_all
2940         WHERE var_rent_id = ip_var_rent_id;
2941    -- Get the details of
2942    CURSOR temp_c(ip_var_rent_inv_id NUMBER
2943              ) IS
2944      SELECT abated_rent,
2945             negative_rent
2946        FROM pn_var_rent_inv_all
2947       WHERE var_rent_inv_id = ip_var_rent_inv_id;
2948 
2949 
2950    l_negative_rent        pn_var_rent_inv.negative_rent%TYPE := 0;
2951    l_negative_available   NUMBER := 0;
2952    l_negative_applied     NUMBER := 0;
2953    l_negative_remaining   NUMBER;
2954    l_abated_rent          NUMBER;
2955    l_negative_rent_flag   pn_var_rents.negative_rent%TYPE;
2956    l_last_invoice_dt      pn_var_grp_dates.invoice_date%TYPE;
2957 BEGIN
2958   pnp_debug_pkg.log('apply_neg_rent start(+)');
2959   -- Get the negative rent flag
2960   FOR rec IN csr_get_abt(p_var_rent_id) LOOP
2961       l_negative_rent_flag := rec.negative_rent;
2962       pnp_debug_pkg.log('l_negative_rent_flag:'||l_negative_rent_flag);
2963   END LOOP;
2964   -- Get the last invoice_date
2965   FOR rec IN csr_last_inv(p_var_rent_id) LOOP
2966      l_last_invoice_dt := rec.inv_date;
2967      pnp_debug_pkg.log('l_last_invoice_dt:'||l_last_invoice_dt);
2968   END LOOP;
2969   -- Loop for all invoices.
2970   FOR inv_rec IN invoices_c(p_var_rent_id, p_period_id, p_inv_id) LOOP
2971      pnp_debug_pkg.log('inv_rec.var_rent_inv_id:'||inv_rec.var_rent_inv_id);
2972      l_negative_rent := 0;
2973      l_negative_available := 0;
2974      l_negative_applied := 0;
2975      -- Get available negative rent.
2976      FOR rec IN csr_neg_avail(p_var_rent_id, inv_rec.invoice_date) LOOP
2977         l_negative_available :=rec.negative_available;
2978         pnp_debug_pkg.log('l_negative_available'||l_negative_available);
2979      END LOOP;
2980      -- Get applied negative rent
2981      FOR rec IN csr_neg_appl (p_var_rent_id, inv_rec.invoice_date) LOOP
2982         l_negative_applied := rec.negative_applied;
2983         pnp_debug_pkg.log('l_negative_applied:'||l_negative_applied);
2984      END LOOP;
2985      l_negative_remaining := ABS(l_negative_available - l_negative_applied);
2986      pnp_debug_pkg.log('l_negative_remaining:'||l_negative_remaining);
2987      IF (l_negative_rent_flag = pn_var_rent_calc_pkg.G_NEG_RENT_IGNORE) THEN
2988        l_abated_rent := GREATEST(0, inv_rec.constr_actual_rent);
2989      ELSIF(l_negative_rent_flag = pn_var_rent_calc_pkg.G_NEG_RENT_CREDIT)  THEN
2990        l_abated_rent := inv_rec.constr_actual_rent;
2991      ELSE
2992        -- negative rent is deffred
2993        IF (l_last_invoice_dt <> inv_rec.invoice_date) THEN
2994          --This invoice is not the last invoice
2995          l_abated_rent := GREATEST(0, inv_rec.constr_actual_rent - l_negative_remaining);
2996          IF (inv_rec.constr_actual_rent > l_abated_rent) THEN
2997            l_negative_rent := inv_rec.constr_actual_rent - l_abated_rent;
2998 
2999          ELSE
3000            l_negative_rent := 0;
3001 
3002          END IF;
3003 
3004 
3005        ELSE
3006          --This is the last invoice. All deffered negative rent needs to be added
3007          l_abated_rent := inv_rec.constr_actual_rent - l_negative_remaining;
3008          l_negative_rent := inv_rec.constr_actual_rent - l_abated_rent;
3009        END IF;
3010      END IF;
3011      pnp_debug_pkg.log('l_abated_rent:'||l_abated_rent);
3012      pnp_debug_pkg.log('l_negative_rent:'||l_negative_rent);
3013      pnp_debug_pkg.log('inv_rec.var_rent_inv_id:'||inv_rec.var_rent_inv_id);
3014 
3015      UPDATE pn_var_rent_inv_all
3016      SET abated_rent = l_abated_rent,
3017          negative_rent = L_negative_rent
3018      WHERE var_rent_inv_id = inv_rec.var_rent_inv_id;
3019   END LOOP;
3020   pnp_debug_pkg.log('apply_neg_rent end(-)');
3021 
3022 EXCEPTION
3023   --
3024   WHEN others THEN
3025   pnp_debug_pkg.log('Raised exception');
3026     RAISE;
3027 END;
3028 */
3029 
3030 
3031 --------------------------------------------------------------------------------
3032 --  NAME         : apply_def_neg_rent
3033 --  DESCRIPTION  : Applies deffered negative rent.
3034 --  PURPOSE      : Applies deffered negative rent.
3035 --  INVOKED FROM : apply_abatements()
3036 --  ARGUMENTS    : p_var_rent_id: Vr to apply abatements for.
3037 --                 p_period_id: Period to calculate for.
3038 --                 p_inv_id: Invoice to calculate for.
3039 --  REFERENCE    :
3040 --  HISTORY      :
3041 --
3042 --  25/Nov/2006      Shabda     o Created
3043 --------------------------------------------------------------------------------
3044 PROCEDURE apply_def_neg_rent(p_var_rent_id IN NUMBER,
3045                p_period_id IN NUMBER,
3046                p_inv_id IN NUMBER,
3047                x_abated_rent IN OUT NOCOPY NUMBER) IS
3048 
3049   -- Get the details of all invoices
3050   CURSOR invoices_c(ip_var_rent_id NUMBER, ip_period_id NUMBER, ip_inv_id NUMBER
3051             ) IS
3052     SELECT  constr_actual_rent
3053             ,actual_invoiced_amount
3054             ,negative_rent
3055             ,invoice_date
3056             ,var_rent_inv_id
3057      FROM pn_var_rent_inv_all inv1
3058      WHERE inv1.var_rent_id = ip_var_rent_id
3059      AND inv1.period_id = ip_period_id
3060      AND var_rent_inv_id = ip_inv_id
3061      AND inv1.adjust_num= (
3062       SELECT MAX(adjust_num) from pn_var_rent_inv_all inv2
3063       where inv1.var_rent_id = inv2.var_rent_id
3064       AND inv1.invoice_date = inv2.invoice_date);
3065 
3066   CURSOR csr_last_inv(p_var_rent_id NUMBER)
3067      IS
3068      SELECT MAX(invoice_date) inv_date
3069      FROM pn_var_grp_dates_all
3070      WHERE var_rent_id = p_var_rent_id
3071      AND period_id = (SELECT max(period_id)
3072                       FROM pn_var_periods_all
3073                       WHERE var_rent_id = p_var_rent_id
3074                       AND   NVL(status, pn_var_rent_calc_pkg.G_PERIOD_ACTIVE_STATUS)
3075                             <> pn_var_rent_calc_pkg.G_PERIOD_REVERSED_STATUS);
3076 
3077   CURSOR csr_neg_avail (ip_var_rent_id  NUMBER,
3078                         ip_invoice_date DATE) IS
3079      SELECT ABS(NVL(SUM(def_neg_rent),0)) negative_available
3080      FROM pn_var_rent_inv_all inv
3081      WHERE inv.var_rent_id = ip_var_rent_id
3082      AND   inv.invoice_date < ip_invoice_date
3083      AND   inv.adjust_num = (select MAX(inv1.adjust_num)
3084                              from pn_var_rent_inv_all inv1
3085                              where inv1.var_rent_id = inv.var_rent_id
3086                              AND   inv1.invoice_date = inv.invoice_date);
3087 
3088   CURSOR csr_neg_appl (ip_var_rent_id  NUMBER,
3089                        ip_invoice_date DATE) IS
3090      SELECT NVL(SUM(negative_rent),0) negative_applied
3091      FROM pn_var_rent_inv_all inv
3092      WHERE inv.var_rent_id = ip_var_rent_id
3093      AND   inv.invoice_date < ip_invoice_date
3094      AND   inv.adjust_num = (select MAX(inv1.adjust_num)
3095                              from pn_var_rent_inv_all inv1
3096                              where inv1.var_rent_id = inv.var_rent_id
3097                              AND   inv1.invoice_date = inv.invoice_date);
3098    CURSOR csr_get_abt(ip_var_rent_id NUMBER)
3099         IS
3100         SELECT negative_rent
3101         FROM pn_var_rents_all
3102         WHERE var_rent_id = ip_var_rent_id;
3103 
3104 
3105    l_negative_rent        pn_var_rent_inv.negative_rent%TYPE := 0;
3106    l_negative_available   NUMBER := 0;
3107    l_negative_applied     NUMBER := 0;
3108    l_negative_remaining   NUMBER;
3109    l_abated_rent          NUMBER;
3110    l_negative_rent_flag   pn_var_rents.negative_rent%TYPE;
3111    l_last_invoice_dt      pn_var_grp_dates.invoice_date%TYPE;
3112 BEGIN
3113   pnp_debug_pkg.log('apply_def_neg_rent start(+)');
3114   -- Get the negative rent flag
3115   FOR rec IN csr_get_abt(p_var_rent_id) LOOP
3116       l_negative_rent_flag := rec.negative_rent;
3117       pnp_debug_pkg.log('l_negative_rent_flag:'||l_negative_rent_flag);
3118   END LOOP;
3119     -- Get the last invoice_date
3120   FOR rec IN csr_last_inv(p_var_rent_id) LOOP
3121      l_last_invoice_dt := rec.inv_date;
3122      pnp_debug_pkg.log('l_last_invoice_dt:'||l_last_invoice_dt);
3123   END LOOP;
3124   -- Loop for all invoices.
3125   FOR inv_rec IN invoices_c(p_var_rent_id, p_period_id, p_inv_id) LOOP
3126      pnp_debug_pkg.log('inv_rec.var_rent_inv_id:'||inv_rec.var_rent_inv_id);
3127      l_negative_rent := 0;
3128      l_negative_available := 0;
3129      l_negative_applied := 0;
3130      l_abated_rent :=inv_rec.constr_actual_rent;
3131      -- Get available negative rent.
3132      FOR rec IN csr_neg_avail(p_var_rent_id, inv_rec.invoice_date) LOOP
3133         l_negative_available :=rec.negative_available;
3134         pnp_debug_pkg.log('l_negative_available'||l_negative_available);
3135      END LOOP;
3136      -- Get applied negative rent
3137      FOR rec IN csr_neg_appl (p_var_rent_id, inv_rec.invoice_date) LOOP
3138         l_negative_applied := rec.negative_applied;
3139         pnp_debug_pkg.log('l_negative_applied:'||l_negative_applied);
3140      END LOOP;
3141      l_negative_remaining := ABS(l_negative_available - l_negative_applied);
3142      pnp_debug_pkg.log('l_negative_remaining:'||l_negative_remaining);
3143      IF (l_negative_rent_flag = pn_var_rent_calc_pkg.G_NEG_RENT_DEFER) THEN
3144        -- Deffered negative rent can be applied only when consT-rent >0
3145        IF (l_last_invoice_dt <> inv_rec.invoice_date AND inv_rec.constr_actual_rent > 0) THEN
3146          --This invoice is not the last invoice
3147          l_abated_rent := GREATEST(0, inv_rec.constr_actual_rent - l_negative_remaining);
3148          pnp_debug_pkg.log('l_abated_rent1:'||l_abated_rent);
3149          IF (inv_rec.constr_actual_rent > l_abated_rent) THEN
3150            l_negative_rent := inv_rec.constr_actual_rent - l_abated_rent;
3151          ELSE
3152            l_negative_rent := 0;
3153          END IF;
3154 
3155 
3156        ELSIF (l_last_invoice_dt = inv_rec.invoice_date) THEN
3157          --This is the last invoice. All deffered negative rent needs to be added
3158          l_abated_rent := inv_rec.constr_actual_rent - l_negative_remaining;
3159          pnp_debug_pkg.log('l_abated_rent2:'||l_abated_rent);
3160          l_negative_rent := inv_rec.constr_actual_rent - l_abated_rent;
3161        END IF;
3162      END IF;
3163      pnp_debug_pkg.log('l_abated_rent:'||l_abated_rent);
3164      pnp_debug_pkg.log('l_negative_rent:'||l_negative_rent);
3165      pnp_debug_pkg.log('inv_rec.var_rent_inv_id:'||inv_rec.var_rent_inv_id);
3166 
3167      UPDATE pn_var_rent_inv_all
3168      SET negative_rent = ROUND(l_negative_rent, g_precision)
3169      WHERE var_rent_inv_id = inv_rec.var_rent_inv_id;
3170      x_abated_rent := l_abated_rent;
3171   END LOOP;
3172   pnp_debug_pkg.log('apply_def_neg_rent end(-)');
3173 
3174 EXCEPTION
3175   --
3176   WHEN others THEN
3177   pnp_debug_pkg.log('Raised exception');
3178     RAISE;
3179 END;
3180 
3181 --------------------------------------------------------------------------------
3182 --  NAME         : populate_neg_rent
3183 --  DESCRIPTION  : Populates the negative rent which needs to be deffered.
3184 --  PURPOSE      : Populates the negative rent which needs to be deffered.
3185 --  INVOKED FROM : apply_abatements()
3186 --  ARGUMENTS    : p_var_rent_id: Vr to apply abatements for.
3187 --                 p_period_id: Period to calculate for.
3188 --                 p_inv_id: Invoice to calculate for.
3189 --  REFERENCE    :
3190 --  HISTORY      :
3191 --
3192 --  25/Nov/2006      Shabda     o Created
3193 --------------------------------------------------------------------------------
3194 PROCEDURE populate_neg_rent(p_var_rent_id IN NUMBER,
3195                p_period_id IN NUMBER,
3196                p_inv_id IN NUMBER,
3197                x_abated_rent IN OUT NOCOPY NUMBER) IS
3198 
3199   -- Get the details of all invoices
3200   CURSOR invoices_c(ip_var_rent_id NUMBER, ip_period_id NUMBER, ip_inv_id NUMBER
3201             ) IS
3202     SELECT  invoice_date
3203             ,var_rent_inv_id
3204      FROM pn_var_rent_inv_all inv1
3205      WHERE inv1.var_rent_id = ip_var_rent_id
3206      AND inv1.period_id = ip_period_id
3207      AND var_rent_inv_id = ip_inv_id
3208      AND inv1.adjust_num= (
3209       SELECT MAX(adjust_num) from pn_var_rent_inv_all inv2
3210       where inv1.var_rent_id = inv2.var_rent_id
3211       AND inv1.invoice_date = inv2.invoice_date);
3212 
3213   CURSOR csr_last_inv(p_var_rent_id NUMBER)
3214      IS
3215      SELECT MAX(invoice_date) inv_date
3216      FROM pn_var_grp_dates_all
3217      WHERE var_rent_id = p_var_rent_id
3218      AND period_id = (SELECT max(period_id)
3219                       FROM pn_var_periods_all
3220                       WHERE var_rent_id = p_var_rent_id
3221                       AND   NVL(status, pn_var_rent_calc_pkg.G_PERIOD_ACTIVE_STATUS)
3222                             <> pn_var_rent_calc_pkg.G_PERIOD_REVERSED_STATUS);
3223 
3224    CURSOR csr_get_abt(ip_var_rent_id NUMBER)
3225         IS
3226         SELECT negative_rent
3227         FROM pn_var_rents_all
3228         WHERE var_rent_id = ip_var_rent_id;
3229 
3230    l_neg_rent_def         NUMBER;
3231    l_negative_rent        pn_var_rent_inv.negative_rent%TYPE := 0;
3232    l_negative_available   NUMBER := 0;
3233    l_negative_applied     NUMBER := 0;
3234    l_negative_remaining   NUMBER;
3235    l_abated_rent          NUMBER;
3236    l_negative_rent_flag   pn_var_rents.negative_rent%TYPE;
3237    l_last_invoice_dt      pn_var_grp_dates.invoice_date%TYPE;
3238 BEGIN
3239   pnp_debug_pkg.log('populate_neg_rent start(+)');
3240   -- Get the negative rent flag
3241   FOR rec IN csr_get_abt(p_var_rent_id) LOOP
3242       l_negative_rent_flag := rec.negative_rent;
3243       pnp_debug_pkg.log('l_negative_rent_flag:'||l_negative_rent_flag);
3244   END LOOP;
3245   -- Get the last invoice_date
3246   FOR rec IN csr_last_inv(p_var_rent_id) LOOP
3247      l_last_invoice_dt := rec.inv_date;
3248      pnp_debug_pkg.log('l_last_invoice_dt:'||l_last_invoice_dt);
3249   END LOOP;
3250   -- Loop for all invoices.
3251   FOR inv_rec IN invoices_c(p_var_rent_id, p_period_id, p_inv_id) LOOP
3252     IF (l_negative_rent_flag = pn_var_rent_calc_pkg.G_NEG_RENT_IGNORE) THEN
3253       --We are ignoring negative rents. Set abated rent =0, if <0.
3254       l_abated_rent := GREATEST(0, x_abated_rent);
3255 
3256     ELSIF (l_negative_rent_flag = pn_var_rent_calc_pkg.G_NEG_RENT_CREDIT) THEN
3257       l_abated_rent := x_abated_rent;
3258     ELSIF (l_negative_rent_flag = pn_var_rent_calc_pkg.G_NEG_RENT_DEFER
3259            AND inv_rec.invoice_date <> l_last_invoice_dt) THEN
3260       l_abated_rent := GREATEST(0,x_abated_rent);
3261       l_neg_rent_def := ABS(x_abated_rent - l_abated_rent);
3262     ELSIF (l_negative_rent_flag = pn_var_rent_calc_pkg.G_NEG_RENT_DEFER
3263            AND inv_rec.invoice_date = l_last_invoice_dt) THEN
3264       l_abated_rent := x_abated_rent;
3265     END IF;
3266     pnp_debug_pkg.log('l_abated_rent:'||l_abated_rent);
3267     pnp_debug_pkg.log('l_neg_rent_def*:'||l_neg_rent_def);
3268     UPDATE pn_var_rent_inv_all
3269     SET def_neg_rent = ROUND(l_neg_rent_def, g_precision)
3270     WHERE var_rent_inv_id = inv_rec.var_rent_inv_id;
3271     x_abated_rent := l_abated_rent;
3272   END LOOP;
3273   pnp_debug_pkg.log('populate_neg_rent end(-)');
3274 
3275 EXCEPTION
3276   --
3277   WHEN others THEN
3278   pnp_debug_pkg.log('Raised exception');
3279     RAISE;
3280 END;
3281 
3282 --------------------------------------------------------------------------------
3283 --  NAME         : apply_abat
3284 --  DESCRIPTION  : applies the fixed and recurring abatements.
3285 --  PURPOSE      : applies the fixed and recurring abatements.
3286 --  INVOKED FROM : apply_abatements()
3287 --  ARGUMENTS    : p_var_rent_id: Vr to apply abatements for.
3288 --                 p_period_id: Period to calculate for.
3289 --                 p_inv_id: Invoice to calculate for.
3290 --  REFERENCE    :
3291 --  HISTORY      : Shabda BUG 5726758. Modified to set the abatement
3292 --                 to actual abatement applied, not just the rec abatement
3293 --
3294 --  25/Nov/2006      Shabda     o Created
3295 --  6/Jan/2007       Shabda     o Bug 5731479. Use rec_override field.
3296 --------------------------------------------------------------------------------
3297 PROCEDURE apply_abat(p_var_rent_id IN NUMBER,
3298            p_period_id IN NUMBER,
3299            p_inv_id IN NUMBER,
3300            x_abated_rent IN OUT NOCOPY NUMBER) IS
3301 
3302   -- Get the details of all invoices
3303   CURSOR invoices_c(ip_var_rent_id NUMBER, ip_period_id NUMBER,
3304                     ip_inv_id NUMBER
3305             ) IS
3306     SELECT   actual_invoiced_amount
3307             ,invoice_date
3308             ,NVL(rec_abatement,0) rec_abatement
3309             ,rec_abatement_override
3310             ,var_rent_inv_id
3311      FROM pn_var_rent_inv_all inv1
3312      WHERE inv1.var_rent_id = ip_var_rent_id
3313      AND inv1.period_id = ip_period_id
3314      AND inv1.var_rent_inv_id = ip_inv_id
3315      AND inv1.adjust_num= (
3316       SELECT MAX(adjust_num) from pn_var_rent_inv_all inv2
3317       where inv1.var_rent_id = inv2.var_rent_id
3318       AND inv1.invoice_date = inv2.invoice_date);
3319   -- Get the details of fixed abatements
3320   CURSOR fixed_abat_c(ip_var_rent_id NUMBER,
3321             ip_inv_start_date DATE,
3322             ip_inv_end_date DATE) IS
3323     SELECT NVL(SUM(amount),0) fixed_abat
3324     FROM PN_VAR_ABAT_DEFAULTS_ALL
3325     WHERE var_rent_id = ip_var_rent_id
3326     AND start_date <= ip_inv_end_date
3327     AND NVL(end_date, ip_inv_end_date) >= ip_inv_start_date
3328     AND type_code = pn_var_rent_calc_pkg.G_ABAT_TYPE_CODE_ABAT;
3329   -- Get the details of
3330   CURSOR EXCESS_ABAT_C(ip_var_rent_id NUMBER) IS
3331     SELECT EXCESS_ABAT_CODE
3332     FROM PN_VAR_RENTS_ALL ABAT
3333     WHERE abat.var_rent_id = ip_var_rent_id;
3334    -- Get the details of inv_start, end_date
3335   CURSOR invoice_dates_c(ip_var_rent_id NUMBER,
3336                          ip_invoice_date DATE
3337             ) IS
3338     SELECT inv_start_date, inv_end_date
3339     FROM pn_var_grp_dates_all
3340     WHERE var_rent_id = ip_var_rent_id
3341     AND invoice_date = ip_invoice_date;
3342   -- Get the details of actual start and end date for FY/LY/FLY
3343   CURSOR invoice_dates_fyly_c(ip_var_rent_inv_id NUMBER
3344             ) IS
3345     SELECT per.start_date, per.end_date
3346       FROM pn_var_rent_inv_all inv, pn_var_periods_all per
3347      WHERE per.period_id = inv.period_id
3348        AND inv.var_rent_inv_id = ip_var_rent_inv_id;
3349 
3350   -- Get the id of invoice created for first year.
3351   -- This has meaning only if proration is FY/FLY
3352   CURSOR get_fy_inv_c(ip_var_rent_id NUMBER
3353             ) IS
3354     SELECT inv.var_rent_inv_id
3355       FROM pn_var_rent_inv_all inv, pn_var_periods_all per
3356      WHERE per.period_id = inv.period_id
3357        AND inv.var_rent_id = ip_var_rent_id
3358        AND per.start_date = (SELECT MIN(start_date) from pn_var_periods_all
3359                              WHERE var_rent_id = ip_var_rent_id);
3360   -- Get the id of last invoice created.
3361   -- This has meaning only if proration is LY/FLY
3362   CURSOR get_ly_inv_c(ip_var_rent_id NUMBER
3363             ) IS
3364     SELECT inv.var_rent_inv_id
3365       FROM pn_var_rent_inv_all inv, pn_var_periods_all per
3366      WHERE per.period_id = inv.period_id
3367        AND inv.var_rent_id = ip_var_rent_id
3368        AND per.start_date = (SELECT MAX(start_date) from pn_var_periods_all
3369                              WHERE var_rent_id = ip_var_rent_id)
3370         AND inv.invoice_date = (SELECT MAX(invoice_date) FROM pn_var_rent_inv_all
3371                                 WHERE var_rent_id = ip_var_rent_id);
3372 
3373   -- Get the details of negative_rent
3374   CURSOR neg_rent_c(ip_var_rent_id NUMBER
3375             ) IS
3376     SELECT negative_rent
3377     FROM pn_var_rents_all
3378     WHERE var_rent_id = ip_var_rent_id;
3379   -- Get the proration type
3380   CURSOR proration_type_c(ip_var_rent_id NUMBER
3381             ) IS
3382     SELECT proration_rule
3383     FROM pn_var_rents_all
3384     WHERE var_rent_id = ip_var_rent_id;
3385 
3386   -- Get the number of inv which should exist for a period
3387   CURSOR num_inv_c(ip_var_rent_inv_id NUMBER
3388             ) IS
3389     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
3390       FROM pn_var_rent_inv_all inv, pn_var_periods_all per, pn_var_rents_all vr, pn_var_rent_dates_all vrd
3391      WHERE per.period_id = inv.period_id
3392        AND inv.var_rent_inv_id = ip_var_rent_inv_id
3393        AND per.var_rent_id = vr.var_rent_id
3394        AND vrd.var_rent_id = vr.var_rent_id;
3395 
3396   --Get the last invoice of the last year
3397   CURSOR ly_min_inv_c(ip_vr_id NUMBER
3398             ) IS
3399        SELECT inv.invoice_date,
3400               inv.var_rent_inv_id,
3401               inv.period_id
3402        FROM pn_var_rents_all vr,
3403             pn_var_periods_all per,
3404             pn_var_rent_inv_all inv
3405        WHERE per.var_rent_id = vr.var_rent_id
3406        AND   inv.period_id = per.period_id
3407        AND per.start_date = (select max(start_date) from pn_var_periods_all per1
3408                                where per1.var_rent_id = vr.var_rent_id)
3409        AND inv.invoice_date = (select max(invoice_date) from pn_var_rent_inv_all inv1
3410                                 where inv1.period_id = per.period_id)
3411        AND vr.var_rent_id = ip_vr_id;
3412 
3413   l_fixed_abat NUMBER := 0;
3414   l_rec_abat   NUMBER := 0;
3415   l_total_abat NUMBER;
3416   l_excess_abat VARCHAR2(30);
3417   l_abated_rent NUMBER;
3418   l_unabated_rent NUMBER; --Need this to find out how much abatement
3419                          -- has been applied. Bug 5726758.
3420   l_inv_start_date DATE;
3421   l_inv_end_date   DATE;
3422   l_neg_rent   VARCHAR2(30);
3423   l_abat_override NUMBER;
3424   l_proration_type VARCHAR2(30);
3425   l_first_inv_id   NUMBER;--inv_id of the first inv created
3426   l_last_inv_id    NUMBER;--inv_id of the last inv created
3427   l_months_in_inv NUMBER;
3428   l_num_inv       NUMBER := 1;
3429   l_ly_max_inv_id NUMBER;
3430   l_ly_max_prd_id NUMBER;
3431 
3432 BEGIN
3433   --
3434   --The special cases this needs to handle are
3435   -- FY: The FY invoice would have invoice_date of next period.
3436   --
3437   -- Get the proration type
3438   FOR proration_rec IN proration_type_c(p_var_rent_id)  LOOP
3439     l_proration_type := proration_rec.proration_rule;
3440   END LOOP;
3441   pnp_debug_pkg.log('apply_abat start(+)');
3442   -- is this in ly first inv? No abatements should be applied to this invoice
3443   FOR ly_inv_rec IN ly_min_inv_c(p_var_rent_id) LOOP
3444     l_ly_max_inv_id := ly_inv_rec.var_rent_inv_id;
3445     l_ly_max_prd_id := ly_inv_rec.period_id;
3446   END LOOP;
3447   pnp_debug_pkg.log('l_ly_max_inv_id:'||l_ly_max_inv_id);
3448   pnp_debug_pkg.log('l_ly_max_prd_id:'||l_ly_max_prd_id);
3449 
3450   --For LY/FLY, if last period and not last invoice,
3451   -- Invoices are dummy. Return immdiately.
3452   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
3453     pnp_debug_pkg.log('Ly invoice, not last - return immedietly');
3454     RETURN;
3455   END IF;
3456 
3457 
3458   FOR abat_rec IN EXCESS_ABAT_C(p_var_rent_id) LOOP
3459     l_excess_abat := abat_rec.excess_abat_code;
3460     pnp_debug_pkg.log('l_excess_abat:'||l_excess_abat);
3461     EXIT;
3462   END LOOP;
3463 
3464   --
3465   FOR neg_rec IN neg_rent_c(p_var_rent_id) LOOP
3466     l_neg_rent := neg_rec.negative_rent;
3467   END LOOP;
3468 
3469   --
3470   FOR fy_rec IN get_fy_inv_c(p_var_rent_id) LOOP
3471      l_first_inv_id := fy_rec.var_rent_inv_id;
3472   END LOOP;
3473 
3474   --
3475   FOR ly_rec IN get_ly_inv_c(p_var_rent_id) LOOP
3476      l_last_inv_id := ly_rec.var_rent_inv_id;
3477   END LOOP;
3478 
3479   FOR inv_rec IN invoices_c(p_var_rent_id , p_period_id, p_inv_id) LOOP
3480     -- update rec abatements.
3481     FOR inv_dates_rec IN invoice_dates_c(p_var_rent_id, inv_rec.invoice_date) LOOP
3482       l_inv_start_date := inv_dates_rec.inv_start_date;
3483       l_inv_end_date := inv_dates_rec.inv_end_date;
3484     END LOOP;
3485     --If this invoice is FY/FLY and the first year
3486     --Or proration is LY/FLY and the last invoice
3487     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)
3488         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
3489        --
3490        FOR inv_rec IN invoice_dates_fyly_c(p_inv_id) LOOP
3491          l_inv_start_date := inv_rec.start_date;
3492          l_inv_end_date := inv_rec.end_date;
3493        END LOOP;
3494        --
3495        pnp_debug_pkg.log('FY/LY modified dates');
3496        pnp_debug_pkg.log('l_inv_start_date:'||l_inv_start_date);
3497        pnp_debug_pkg.log('l_inv_end_date:'||l_inv_end_date);
3498        FOR num_rec IN num_inv_c(p_inv_id) LOOP
3499           l_num_inv := num_rec.num_inv;
3500        END LOOP;
3501        pnp_debug_pkg.log('l_num_inv:'||l_num_inv);
3502 
3503     END IF;
3504     l_rec_abat := inv_rec.rec_abatement;
3505     l_abat_override := inv_rec.rec_abatement_override;
3506     pnp_debug_pkg.log('l_abat_override:'||l_abat_override);
3507     l_abated_rent := x_abated_rent;
3508     l_unabated_rent := x_abated_rent;
3509     pnp_debug_pkg.log('l_abated_rent:'||l_abated_rent);
3510     pnp_debug_pkg.log('l_rec_abat:'||l_rec_abat);
3511 
3512     IF (l_abat_override IS NOT NULL) THEN
3513       l_total_abat := l_abat_override;
3514     ELSE
3515       FOR rec IN fixed_abat_c(p_var_rent_id, l_inv_start_date, l_inv_end_date) LOOP
3516         l_fixed_abat := rec.fixed_abat * l_num_inv;
3517         pnp_debug_pkg.log('l_fixed_abat:'||l_fixed_abat);
3518       END LOOP;
3519       l_total_abat := l_fixed_abat + l_rec_abat;
3520     END IF;
3521 
3522     pnp_debug_pkg.log('l_total_abat:'||l_total_abat);
3523     IF (l_excess_abat = pn_var_rent_calc_pkg.G_EXC_ABAT_IGNORE
3524         AND x_abated_rent>0 )  THEN
3525       l_abated_rent := GREATEST(0, x_abated_rent - l_total_abat);
3526     ELSIF (l_excess_abat = pn_var_rent_calc_pkg.G_EXC_ABAT_NEG_RENT ) THEN
3527       l_abated_rent := x_abated_rent - l_total_abat;
3528     END IF;
3529 
3530     pnp_debug_pkg.log('l_abated_rent:'||l_abated_rent);
3531     x_abated_rent := l_abated_rent;
3532     l_total_abat := l_unabated_rent - l_abated_rent;
3533     pnp_debug_pkg.log('total_abat_applied:'||l_total_abat);
3534     UPDATE pn_var_rent_inv_all
3535     SET rec_abatement = ROUND(l_total_abat, g_precision)
3536     WHERE var_rent_inv_id = inv_rec.var_rent_inv_id;
3537 
3538   END LOOP;
3539   pnp_debug_pkg.log('apply_abat end(-)');
3540 
3541 EXCEPTION
3542   --
3543   WHEN others THEN
3544   pnp_debug_pkg.log('Exception in apply_abat');
3545   RAISE;
3546 END;
3547 
3548 --------------------------------------------------------------------------------
3549 --  NAME         : apply_allow
3550 --  DESCRIPTION  : Applies the rolling allowance.
3551 --  PURPOSE      : Applies the rolling allowance.
3552 --  INVOKED FROM : apply_abatements()
3553 --  ARGUMENTS    : p_var_rent_id: Vr to apply abatements for.
3554 --                 p_period_id: Period to calculate for.
3555 --                 p_inv_id: Invoice to calculate for.
3556 --  REFERENCE    :
3557 --  HISTORY      :
3558 --
3559 --  25/Nov/2006      Shabda     o Created
3560 --------------------------------------------------------------------------------
3561 PROCEDURE apply_allow(p_var_rent_id IN NUMBER,
3562                       p_period_id   IN NUMBER,
3563                       p_inv_id IN NUMBER,
3564                       x_abated_rent IN OUT NOCOPY NUMBER
3565           ) IS
3566   -- Get the details of
3567 
3568   CURSOR  invoices_c(ip_var_rent_id NUMBER,
3569                      ip_period_id   NUMBER,
3570                      ip_inv_id      NUMBER
3571             ) IS
3572     SELECT inv1.abatement_appl
3573            ,inv1.invoice_date
3574            ,inv1.var_rent_inv_id
3575     FROM pn_var_rent_inv_all inv1
3576     WHERE var_rent_id = ip_var_rent_id
3577     AND period_id = ip_period_id
3578     AND var_rent_inv_id = ip_inv_id
3579     AND inv1.adjust_num= (
3580       SELECT MAX(adjust_num) from pn_var_rent_inv_all inv2
3581       where inv1.var_rent_id = inv2.var_rent_id
3582       AND inv1.invoice_date = inv2.invoice_date);
3583    -- Get the details of rolling allowance
3584   CURSOR rolling_allow_c(ip_var_rent_id NUMBER,
3585             ip_inv_start_date DATE,
3586             ip_inv_end_date DATE) IS
3587     SELECT NVL(amount, 0) rolling_allow
3588            ,allowance_applied allow_applied
3589            ,abatement_id
3590     FROM PN_VAR_ABAT_DEFAULTS_ALL
3591     WHERE var_rent_id = ip_var_rent_id
3592     AND start_date <= ip_inv_end_date
3593     AND NVL(end_date, ip_inv_end_date) >= ip_inv_start_date
3594     AND type_code = pn_var_rent_calc_pkg.G_ABAT_TYPE_CODE_ALLO
3595     ORDER BY start_date;
3596   -- Get the details of inv_start, end_date
3597   CURSOR invoice_dates_c(ip_var_rent_id NUMBER,
3598                          ip_invoice_date DATE
3599             ) IS
3600     SELECT inv_start_date, inv_end_date
3601       FROM pn_var_grp_dates_all
3602      WHERE var_rent_id = ip_var_rent_id
3603        AND invoice_date = ip_invoice_date;
3604   -- Get the details of actual start and end date for FY/LY/FLY
3605   CURSOR invoice_dates_fyly_c(ip_var_rent_inv_id NUMBER
3606             ) IS
3607     SELECT per.start_date, per.end_date
3608       FROM pn_var_rent_inv_all inv, pn_var_periods_all per
3609      WHERE per.period_id = inv.period_id
3610        AND inv.var_rent_inv_id = ip_var_rent_inv_id;
3611   -- Get the id of invoice created for first year.
3612   -- This has meaning only if proration is FY/FLY
3613   CURSOR get_fy_inv_c(ip_var_rent_id NUMBER
3614             ) IS
3615     SELECT inv.var_rent_inv_id
3616       FROM pn_var_rent_inv_all inv, pn_var_periods_all per
3617      WHERE per.period_id = inv.period_id
3618        AND inv.var_rent_id = ip_var_rent_id
3619        AND per.start_date = (SELECT MIN(start_date) from pn_var_periods_all
3620                              WHERE var_rent_id = ip_var_rent_id);
3621   -- Get the id of last invoice created.
3622   -- This has meaning only if proration is LY/FLY
3623   CURSOR get_ly_inv_c(ip_var_rent_id NUMBER
3624             ) IS
3625     SELECT inv.var_rent_inv_id
3626       FROM pn_var_rent_inv_all inv, pn_var_periods_all per
3627      WHERE per.period_id = inv.period_id
3628        AND inv.var_rent_id = ip_var_rent_id
3629        AND per.start_date = (SELECT MAX(start_date) from pn_var_periods_all
3630                              WHERE var_rent_id = ip_var_rent_id)
3631        AND inv.invoice_date = (SELECT MAX(invoice_date) from pn_var_rent_inv_all
3632                                WHERE var_rent_id = ip_var_rent_id);
3633 
3634   -- Get the proration type
3635   CURSOR proration_type_c(ip_var_rent_id NUMBER
3636             ) IS
3637     SELECT proration_rule
3638       FROM pn_var_rents_all
3639       WHERE var_rent_id = ip_var_rent_id;
3640 
3641 
3642 
3643   l_allow_remain        NUMBER;
3644   l_allow_applied       NUMBER;--Allowance applied from a specific allow
3645   l_allow_applied_inv   NUMBER;--Allowance applied for a invoice
3646   l_cur_abt_rent        NUMBER;--Keeps track of abt rent between allowances
3647   l_prev_abt_rent       NUMBER;--Keeps track of abt rent between allowances
3648   l_unabated_rent       NUMBER;
3649   l_inv_start_date      DATE;
3650   l_inv_end_date        DATE;
3651   l_proration_type      VARCHAR2(30);
3652   l_first_inv_id        NUMBER;
3653   l_last_inv_id         NUMBER;
3654 
3655 BEGIN
3656   pnp_debug_pkg.log('apply_allow start(+)');
3657   -- Special cases which need to be handled are
3658   -- FY/FLY first invoice AND LY/FLY last invoice.
3659   -- get first inv
3660   --
3661   FOR first_inv_rec IN get_fy_inv_c(p_var_rent_id) LOOP
3662     l_first_inv_id := first_inv_rec.var_rent_inv_id;
3663   END LOOP;
3664 
3665   FOR last_inv_rec IN get_ly_inv_c(p_var_rent_id) LOOP
3666     l_last_inv_id := last_inv_rec.var_rent_inv_id;
3667   END LOOP;
3668 
3669   --
3670   FOR vr_rec IN proration_type_c(p_var_rent_id) LOOP
3671     l_proration_type := vr_rec.proration_rule;
3672   END LOOP;
3673 
3674 
3675   FOR inv_rec IN invoices_c(p_var_rent_id, p_period_id, p_inv_id)  LOOP
3676     pnp_debug_pkg.log('inv_rec.var_rent_inv_id:'||inv_rec.var_rent_inv_id);
3677     l_allow_applied_inv := inv_rec.abatement_appl;
3678     pnp_debug_pkg.log('l_allow_applied_inv:'||l_allow_applied_inv);
3679     --
3680     FOR inv_dates_rec IN invoice_dates_c(p_var_rent_id, inv_rec.invoice_date) LOOP
3681       l_inv_start_date := inv_dates_rec.inv_start_date;
3682       l_inv_end_date := inv_dates_rec.inv_end_date;
3683     END LOOP;
3684     --Special FY/LY/FLY handling
3685     --If this invoice is FY/FLY and the first year
3686     --Or proration is LY/FLY and the last invoice
3687     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)
3688         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
3689        --
3690        FOR inv_rec IN invoice_dates_fyly_c(p_inv_id) LOOP
3691          l_inv_start_date := inv_rec.start_date;
3692          l_inv_end_date := inv_rec.end_date;
3693        END LOOP;
3694     END IF;
3695     l_cur_abt_rent := x_abated_rent;
3696     l_prev_abt_rent := x_abated_rent;
3697     FOR allow_rec  IN rolling_allow_c(p_var_rent_id, l_inv_start_date, l_inv_end_date) LOOP
3698       --Allowances can olny be applied if rent is >0
3699       IF (l_cur_abt_rent > 0) THEN
3700          pnp_debug_pkg.log('allow_rec.abatement_id'||allow_rec.abatement_id);
3701          l_allow_remain := allow_rec.rolling_allow -NVL(allow_rec.allow_applied,0);
3702          pnp_debug_pkg.log('l_allow_remain:'||l_allow_remain);
3703          l_cur_abt_rent := GREATEST(0,l_prev_abt_rent - l_allow_remain);
3704          pnp_debug_pkg.log('l_cur_abated_rent:'||l_cur_abt_rent);
3705          l_allow_applied := l_prev_abt_rent - l_cur_abt_rent;
3706          pnp_debug_pkg.log('l_allow_applied'||l_allow_applied);
3707          l_prev_abt_rent := l_cur_abt_rent;
3708          pnp_debug_pkg.log('l_prev_abt_rent:'||l_prev_abt_rent);
3709          l_allow_applied_inv := l_allow_applied_inv + l_allow_applied;
3710          pnp_debug_pkg.log('l_allow_applied_inv:'||l_allow_applied_inv);
3711          UPDATE pn_var_abat_defaults_all
3712          SET allowance_applied = NVL(allowance_applied,0)+l_allow_applied
3713          WHERE abatement_id = allow_rec.abatement_id;
3714       END IF;
3715     END LOOP;
3716     pnp_debug_pkg.log('l_cur_abt_rent:'||l_cur_abt_rent);
3717     UPDATE pn_var_rent_inv_all
3718     SET abatement_appl = ROUND(l_allow_applied_inv, g_precision)
3719     WHERE var_rent_inv_id = inv_rec.var_rent_inv_id;
3720     x_abated_rent := l_cur_abt_rent;
3721     pnp_debug_pkg.log('inv_rec.var_rent_inv_id:'||inv_rec.var_rent_inv_id);
3722   END LOOP;
3723   pnp_debug_pkg.log('apply_allow end(-)');
3724 EXCEPTION
3725   WHEN others THEN
3726     RAISE;
3727 END;
3728 
3729 
3730 --------------------------------------------------------------------------------
3731 --  NAME         : populate_abat
3732 --  DESCRIPTION  : Populates the recurring abatements to abte in
3733 --                 pn_var_rent_inv_all.rec_abatement.
3734 --  PURPOSE      :
3735 --  INVOKED FROM : apply_abatements()
3736 --  ARGUMENTS    : p_var_rent_id: Vr to apply abatements for.
3737 --                 p_period_id: Period to calculate for.
3738 --                 p_inv_id: Invoice to calculate for.
3739 --  REFERENCE    :
3740 --  HISTORY      :
3741 --
3742 --  25/Nov/2006      Shabda     o Created
3743 --------------------------------------------------------------------------------
3744 PROCEDURE populate_abat(p_var_rent_id IN NUMBER,
3745            p_period_id IN NUMBER,
3746            p_inv_id IN NUMBER) IS
3747 
3748      -- Get the details of all invoices
3749   CURSOR invoices_c(ip_var_rent_id NUMBER, ip_period_id NUMBER,
3750                      ip_inv_id NUMBER
3751             ) IS
3752     SELECT   invoice_date
3753             ,var_rent_inv_id
3754      FROM pn_var_rent_inv_all inv1
3755      WHERE inv1.var_rent_id = ip_var_rent_id
3756      AND inv1.period_id = ip_period_id
3757      AND var_rent_inv_id = ip_inv_id
3758      AND inv1.adjust_num= (
3759       SELECT MAX(adjust_num) from pn_var_rent_inv_all inv2
3760       where inv1.var_rent_id = inv2.var_rent_id
3761       AND inv1.invoice_date = inv2.invoice_date);
3762   -- Get the details of actual start and end date for FY/LY/FLY
3763   CURSOR invoice_dates_fyly_c(ip_var_rent_inv_id NUMBER
3764             ) IS
3765     SELECT per.start_date, per.end_date
3766       FROM pn_var_rent_inv_all inv, pn_var_periods_all per
3767      WHERE per.period_id = inv.period_id
3768        AND inv.var_rent_inv_id = ip_var_rent_inv_id;
3769   -- Get the id of invoice created for first year.
3770   -- This has meaning only if proration is FY/FLY
3771   CURSOR get_fy_inv_c(ip_var_rent_id NUMBER
3772             ) IS
3773     SELECT inv.var_rent_inv_id
3774       FROM pn_var_rent_inv_all inv, pn_var_periods_all per
3775      WHERE per.period_id = inv.period_id
3776        AND inv.var_rent_id = ip_var_rent_id
3777        AND per.start_date = (SELECT MIN(start_date) from pn_var_periods_all
3778                              WHERE var_rent_id = ip_var_rent_id);
3779   -- Get the id of last invoice created.
3780   -- This has meaning only if proration is LY/FLY
3781   CURSOR get_ly_inv_c(ip_var_rent_id NUMBER
3782             ) IS
3783     SELECT inv.var_rent_inv_id
3784       FROM pn_var_rent_inv_all inv, pn_var_periods_all per
3785      WHERE per.period_id = inv.period_id
3786        AND inv.var_rent_id = ip_var_rent_id
3787        AND per.start_date = (SELECT MAX(start_date) from pn_var_periods_all
3788                              WHERE var_rent_id = ip_var_rent_id);
3789   -- Get the proration type
3790   CURSOR proration_type_c(ip_var_rent_id NUMBER
3791             ) IS
3792     SELECT proration_rule
3793       FROM pn_var_rents_all
3794       WHERE var_rent_id = ip_var_rent_id;
3795 
3796 
3797       l_min_grp_date DATE;
3798       l_max_grp_date DATE;
3799       l_rec_abatement NUMBER;
3800       l_first_inv_id NUMBER;
3801       l_last_inv_id  NUMBER;
3802       l_proration_type VARCHAR2(30);
3803       l_ly_min_inv_id  NUMBER;
3804 
3805 BEGIN
3806   -- Special cases which need to be handled are
3807   -- FY/FLY first invoice AND LY/FLY last invoice.
3808   --get first inv
3809   --
3810   FOR first_inv_rec IN get_fy_inv_c(p_var_rent_id) LOOP
3811     l_first_inv_id := first_inv_rec.var_rent_inv_id;
3812   END LOOP;
3813 
3814   FOR last_inv_rec IN get_ly_inv_c(p_var_rent_id) LOOP
3815     l_last_inv_id := last_inv_rec.var_rent_inv_id;
3816   END LOOP;
3817 
3818   --
3819   FOR vr_rec IN proration_type_c(p_var_rent_id) LOOP
3820     l_proration_type := vr_rec.proration_rule;
3821   END LOOP;
3822 
3823 
3824   FOR inv_rec IN invoices_c(p_var_rent_id , p_period_id, p_inv_id) LOOP
3825     l_min_grp_date := pn_var_abatement_amount_pkg.get_group_dt(
3826                 inv_rec.invoice_date,
3827                 p_period_id,
3828                 'MIN');
3829     l_max_grp_date := pn_var_abatement_amount_pkg.get_group_dt(
3830                 inv_rec.invoice_date,
3831                 p_period_id,
3832                 'MAX');
3833     --Special FY/LY/FLY handling
3834     --If this invoice is FY/FLY and the first year
3835     --Or proration is LY/FLY and the last invoice
3836     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)
3837         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
3838        --
3839        FOR inv_rec IN invoice_dates_fyly_c(p_inv_id) LOOP
3840          l_min_grp_date := inv_rec.start_date;
3841          l_max_grp_date := inv_rec.end_date;
3842        END LOOP;
3843     END IF;
3844     l_rec_abatement := pn_var_abatement_amount_pkg.calc_abatement(
3845                         inv_rec.var_rent_inv_id
3846                        ,l_min_grp_date
3847                        ,l_max_grp_date);
3848     g_precision := nvl(pn_var_rent_calc_pkg.get_currency_precision(g_org_id),4);
3849     UPDATE pn_var_rent_inv_all
3850     SET rec_abatement = ROUND(l_rec_abatement, g_precision)
3851     WHERE var_rent_inv_id = inv_rec.var_rent_inv_id;
3852 
3853   END LOOP;
3854 
3855 
3856 
3857 EXCEPTION
3858   --
3859   WHEN others THEN
3860   RAISE;
3861 END;
3862 --------------------------------------------------------------------------------
3863 --  NAME         : reset_abatements
3864 --  DESCRIPTION  : Resets the allowance applied for each invoice, allowance.
3865 --                 This needs to be called between subsequent calls
3866 --                 to apply_abatements.
3867 --  PURPOSE      : resets the allowances.
3868 --  INVOKED FROM : apply_abatements()
3869 --  ARGUMENTS    : p_var_rent_id: Vr to apply abatements for.
3870 --                 p_period_id: Period to calculate for.
3871 --                 p_inv_id: Invoice to calculate for.
3872 --  REFERENCE    :
3873 --  HISTORY      :
3874 --
3875 --  25/Nov/2006      Shabda     o Created
3876 --------------------------------------------------------------------------------
3877 PROCEDURE reset_abatements(p_var_rent_id IN NUMBER
3878           ) IS
3879 BEGIN
3880   pnp_debug_pkg.log('Reset_abatement start(+)');
3881   UPDATE pn_var_abat_defaults_all
3882   SET allowance_applied =0
3883   WHERE var_rent_id = p_var_rent_id;
3884   UPDATE pn_var_rent_inv_all
3885   SET abatement_appl =0
3886   WHERE var_rent_id = p_var_rent_id;
3887   pnp_debug_pkg.log('Reset_abatement end(-)');
3888 
3889 EXCEPTION
3890   WHEN others THEN
3891   RAISE;
3892 END;
3893 
3894 
3895 
3896 --------------------------------------------------------------------------------
3897 --  NAME         : calculate_rent
3898 --  DESCRIPTION  :
3899 --  PURPOSE      :
3900 --  INVOKED FROM :
3901 --  ARGUMENTS    :
3902 --  REFERENCE    : PN_COMMON.debug()
3903 --  HISTORY      : 20-SEP-06 Shabda o Populate data for actuals or forecasted
3904 --                 depending on g_invoice_on and g_calc_type
3905 --               : 8-Nov-2006 Shabda Modified to update rents each time, trx
3906 --                 records are created. Not doing this cause wrong true_up
3907 --
3908 --  dd-mon-yyyy  name     o Created
3909 --  23/05/07     Lokesh   o Added rounding off for bug # 6031202 in
3910 --                          pn_var_trx_headers_all
3911 --  21-AUG-2008  acprakas o Bug#6849764. Modified cursor periods_c to get details
3912 --                          for only the period id passed as paramater.
3913 --  12-NOV-2010  vkatta   o Bug#10269475. Included PN_VRA_CLIENT_EXTN.client_extension
3914 --                                       to modify the variable rent.
3915 --------------------------------------------------------------------------------
3916 PROCEDURE calculate_rent( p_var_rent_id IN NUMBER
3917                          ,p_period_id   IN NUMBER)
3918 IS
3919 
3920   /* get all periods for VR */
3921   CURSOR periods_vr_c( p_vr_id IN NUMBER) IS
3922     SELECT
3923      period_id
3924     ,start_date
3925     ,end_date
3926     ,partial_period
3927     FROM
3928     pn_var_periods_all
3929     WHERE
3930     var_rent_id = p_vr_id AND
3931     NVL(status, pn_var_rent_calc_pkg.G_PERIOD_ACTIVE_STATUS)
3932       <> pn_var_rent_calc_pkg.G_PERIOD_REVERSED_STATUS
3933     ORDER BY
3934     start_date;
3935 
3936   /* get all periods for VR */
3937   CURSOR periods_c( p_vr_id  IN NUMBER
3938                    ,p_prd_id IN NUMBER) IS
3939     SELECT
3940      period_id
3941     ,start_date
3942     ,end_date
3943     ,partial_period
3944     FROM
3945     pn_var_periods_all
3946     WHERE
3947     var_rent_id = p_vr_id AND
3948     period_id =  p_prd_id
3949 /*Bug#6849764
3950 start_date >= (SELECT start_date
3951                    FROM pn_var_periods_all
3952                    WHERE period_id = p_prd_id)
3953 Bug#6849764*/
3954     ORDER BY
3955     start_date;
3956 
3957     -- Get the periods ouside the current periods
3958     CURSOR periods_out_c(p_vr_id  IN NUMBER
3959                    ,p_prd_id IN NUMBER) IS
3960      SELECT
3961      period_id
3962     ,start_date
3963     ,end_date
3964     ,partial_period
3965     FROM
3966     pn_var_periods_all
3967     WHERE
3968     var_rent_id = p_vr_id AND
3969     NVL(status, pn_var_rent_calc_pkg.G_PERIOD_ACTIVE_STATUS)
3970       <> pn_var_rent_calc_pkg.G_PERIOD_REVERSED_STATUS AND
3971     start_date < (SELECT start_date
3972                    FROM pn_var_periods_all
3973                    WHERE period_id = p_prd_id)
3974     ORDER BY
3975     start_date;
3976 
3977 
3978 
3979   -- Get the details of
3980   CURSOR first_period_cur (p_var_rent_id NUMBER) IS
3981     SELECT pvp.period_id, pvp.partial_period
3982       FROM pn_var_periods_all pvp, pn_var_rents_all pvr
3983      WHERE pvr.var_rent_id = p_var_rent_id
3984      AND   pvp.var_rent_id = pvr.var_rent_id
3985      AND   pvp.start_date = pvr.commencement_date;
3986 
3987   -- Get first partial period id
3988  CURSOR check_fst_partial_prd(p_var_rent_id IN NUMBER) IS
3989   SELECT period_id
3990     FROM pn_var_periods_all
3991    WHERE var_rent_id=p_var_rent_id
3992      AND period_num=1
3993      AND partial_period='Y';
3994 
3995   TYPE PERIOD_TBL IS TABLE OF periods_vr_c%ROWTYPE INDEX BY BINARY_INTEGER;
3996   l_periods_t PERIOD_TBL;
3997   l_periods_out_t PERIOD_TBL;
3998 
3999   l_prev_grp_date_id NUMBER;
4000   l_first_period_id  NUMBER := 0;
4001 
4002   l_trx_hrd_r pn_var_rent_calc_pkg.trx_hdr_c%ROWTYPE;
4003   l_trx_hrd_for_r pn_var_rent_calc_pkg.trx_hdr_for_c%ROWTYPE;
4004   l_trx_hrd_t pn_var_rent_calc_pkg.TRX_HDR_TBL;
4005   l_trx_hrd_for_t pn_var_rent_calc_pkg.TRX_HEADER_TBL;
4006 
4007   l_context VARCHAR2(255);
4008   l_first_inv_dt DATE ;
4009   l_partial_prd_id NUMBER:=NULL;
4010   l_partial_period VARCHAR2(1) := 'N';
4011 
4012   l_actual_amount NUMBER;
4013   l_ce_return_status  VARCHAR2(10);
4014   l_ce_msg_count      NUMBER;
4015   l_ce_msg_data       VARCHAR2(2000);
4016 
4017 BEGIN
4018   pnp_debug_pkg.log('+++++++++ calculate_rent START +++++++++++');
4019   pnp_debug_pkg.log('');
4020   /* -------------------------------------------------------------------------- */
4021   /* ------------------------------- CODE BEGIN ------------------------------- */
4022   /* -------------------------------------------------------------------------- */
4023 
4024   /* cache VR details */
4025   l_context := 'Call pn_var_rent_calc_pkg.cache_vr_details';
4026 
4027   pn_var_rent_calc_pkg.cache_vr_details(p_var_rent_id => p_var_rent_id);
4028 
4029   pnp_debug_pkg.log(l_context||' COMPLETE');
4030 
4031   /* check if trx tables need to be updated for change in bkts */
4032   l_context := 'Call pn_var_trx_pkg.populate_transactions';
4033 
4034   pn_var_trx_pkg.populate_transactions(p_var_rent_id => p_var_rent_id);
4035 
4036   pnp_debug_pkg.log(l_context||' COMPLETE');
4037 
4038   /*Do we need to populate actual sales or forecasted sales?*/
4039 
4040   IF(g_invoice_on=G_INV_ON_ACTUAL) THEN
4041      /* check if trx tables need to be updated for change in sales volume */
4042      l_context := 'Call pn_var_trx_pkg.populate_sales';
4043      pn_var_trx_pkg.populate_sales(p_var_rent_id => p_var_rent_id);
4044      pnp_debug_pkg.log(l_context||' COMPLETE');
4045   ELSIF (g_invoice_on = G_INV_ON_FORECASTED AND g_calc_type = G_CALC_TYPE_CALCULATE) THEN
4046      /* check if trx tables need to be updated for change in forecasted sales volume */
4047      l_context := 'Call pn_var_trx_pkg.populate_sales_for';
4048      pn_var_trx_pkg.populate_sales_for(p_var_rent_id => p_var_rent_id);
4049      pnp_debug_pkg.log(l_context||' COMPLETE');
4050   ELSIF (g_invoice_on = G_INV_ON_FORECASTED AND g_calc_type = G_CALC_TYPE_RECONCILE) THEN
4051      /* check if trx tables need to be updated for change in sales volume */
4052      l_context := 'Call pn_var_trx_pkg.populate_sales';
4053      pn_var_trx_pkg.populate_sales(p_var_rent_id => p_var_rent_id);
4054      pnp_debug_pkg.log(l_context||' COMPLETE');
4055 
4056   END IF;
4057 
4058   /* Populate deductions - Only need to do this when actuals are being calculated */
4059   IF(g_invoice_on=G_INV_ON_ACTUAL)
4060      OR (g_invoice_on = G_INV_ON_FORECASTED AND g_calc_type = G_CALC_TYPE_RECONCILE) THEN
4061      pnp_debug_pkg.log('');
4062      l_context := 'Call pn_var_trx_pkg.populate_deductions';
4063 
4064      pn_var_trx_pkg.populate_deductions(p_var_rent_id => p_var_rent_id);
4065 
4066       pnp_debug_pkg.log(l_context||' COMPLETE');
4067 
4068   END IF;
4069 
4070   pnp_debug_pkg.log('');
4071 
4072   /* populate the trx tables with calculated rents */
4073   l_context := 'Get periods to calculate rent for';
4074 
4075   l_periods_t.DELETE;
4076 
4077 
4078   /* cache the periods to calculate rent for */
4079   IF p_var_rent_id IS NOT NULL AND
4080      p_period_id IS NULL
4081   THEN
4082 
4083     OPEN periods_vr_c( p_vr_id => p_var_rent_id);
4084     FETCH periods_vr_c BULK COLLECT INTO l_periods_t;
4085     CLOSE periods_vr_c;
4086 
4087 
4088   ELSIF p_var_rent_id IS NOT NULL AND
4089         p_period_id   IS NOT NULL
4090   THEN
4091 
4092     OPEN periods_c( p_vr_id  => p_var_rent_id
4093                    ,p_prd_id => p_period_id);
4094     FETCH periods_c BULK COLLECT INTO l_periods_t;
4095     CLOSE periods_c;
4096 
4097   END IF;
4098 
4099   pnp_debug_pkg.log(l_context||' COMPLETE');
4100   pnp_debug_pkg.log('');
4101 
4102   l_context := 'Loop for all cached periods. Number of periods: '||l_periods_t.COUNT;
4103   pnp_debug_pkg.log(l_context);
4104   pnp_debug_pkg.log('');
4105 
4106   /* loop for all periods cached and calculate rent */
4107   IF l_periods_t.COUNT > 0 THEN
4108 
4109     FOR p IN l_periods_t.FIRST..l_periods_t.LAST LOOP
4110 
4111       l_context
4112       := '=== Looping for Period - Start Date: '||l_periods_t(p).start_date||
4113                               ' -- End Date: '||l_periods_t(p).end_date||
4114                               ' === ';
4115 
4116       pnp_debug_pkg.log(l_context);
4117       pnp_debug_pkg.log('');
4118 
4119       l_context := 'Fetch all trx data for period';
4120 
4121       /*Do we need to populate actual or forecasted rents?*/
4122       IF(g_invoice_on=G_INV_ON_ACTUAL)
4123       OR (g_invoice_on = G_INV_ON_FORECASTED AND g_calc_type = G_CALC_TYPE_RECONCILE)
4124       THEN
4125 
4126               l_trx_hrd_t.DELETE;
4127 
4128               /* loop for all trx in the period,
4129                order by line item, calc (sub) period start*/
4130               /*Populate actual rents in trx tables.*/
4131               OPEN pn_var_rent_calc_pkg.trx_hdr_c
4132                     ( p_vr_id  => p_var_rent_id
4133                      ,p_prd_id => l_periods_t(p).period_id);
4134               FETCH pn_var_rent_calc_pkg.trx_hdr_c BULK COLLECT INTO l_trx_hrd_t;
4135               CLOSE pn_var_rent_calc_pkg.trx_hdr_c;
4136 
4137               pnp_debug_pkg.log(l_context||' COMPLETE');
4138               pnp_debug_pkg.log('');
4139 
4140               IF l_trx_hrd_t.COUNT > 0 THEN
4141 
4142                 l_context := 'Loop for all cached transactions. '||
4143                              'Number of trx: '||l_trx_hrd_t.COUNT;
4144                 pnp_debug_pkg.log(l_context);
4145 
4146                 FOR t IN l_trx_hrd_t.FIRST..l_trx_hrd_t.LAST LOOP
4147 
4148                   l_context
4149                   := '=== Looping for TRX - Start Date: '||
4150                        l_trx_hrd_t(t).calc_prd_start_date||
4151                                          ' -- End Date: '||
4152                          l_trx_hrd_t(t).calc_prd_end_date||
4153                                           ' === ';
4154                   pnp_debug_pkg.log(l_context);
4155                   pnp_debug_pkg.log('');
4156 
4157                   /* if we need to create an invoice for this calc (sub) period
4158                      AND if approved sales exist
4159                   */
4160                   IF NVL(l_trx_hrd_t(t).invoice_flag, 'Y') <> 'N' AND
4161                      pn_var_rent_calc_pkg.exists_approved_sales
4162                        ( p_line_item_id => l_trx_hrd_t(t).line_item_id
4163                         ,p_grp_date_id  => l_trx_hrd_t(t).grp_date_id)
4164                   THEN
4165 
4166                     l_trx_hrd_r := l_trx_hrd_t(t);
4167 
4168                     l_context := 'Call pn_var_rent_calc_pkg.get_rent_applicable';
4169                     pn_var_rent_calc_pkg.get_rent_applicable(l_trx_hrd_r);
4170                     pnp_debug_pkg.log(l_context||' COMPLETE');
4171                     pnp_debug_pkg.log('');
4172 
4173                     /* if rent changed */
4174                     IF NVL(l_trx_hrd_t(t).calculated_rent, 0)
4175                        <> NVL(l_trx_hrd_r.calculated_rent, 0) OR
4176                        NVL(l_trx_hrd_t(t).prorated_rent_due, 0)
4177                        <> NVL(l_trx_hrd_r.prorated_rent_due, 0) OR
4178                        NVL(l_trx_hrd_t(t).percent_rent_due, 0)
4179                        <> NVL(l_trx_hrd_r.percent_rent_due, 0) OR
4180                        NVL(l_trx_hrd_t(t).ytd_percent_rent, 0)
4181                        <> NVL(l_trx_hrd_r.ytd_percent_rent, 0)OR
4182                        NVL(l_trx_hrd_t(t).first_yr_rent, 0)
4183                        <> NVL(l_trx_hrd_r.first_yr_rent, 0)
4184                     THEN
4185                     --- Bug#10269475
4186                     PN_VRA_CLIENT_EXTN.calculate_override  (
4187                          p_var_rent_id              => p_var_rent_id
4188                        , p_trx_header_id            => l_trx_hrd_r.trx_header_id
4189                        , p_calculated_rent          => l_trx_hrd_r.calculated_rent
4190                        , p_prorated_rent            => l_trx_hrd_r.prorated_rent_due
4191                        , p_percent_rent             => l_trx_hrd_r.percent_rent_due
4192                        , p_ytd_percent_rent         => l_trx_hrd_r.ytd_percent_rent
4193                        , p_first_yr_rent            => l_trx_hrd_r.first_yr_rent
4194                        , x_return_status            => l_ce_return_status
4195                        , x_msg_count                => l_ce_msg_count
4196                        , x_msg_data                 => l_ce_msg_data
4197                        );
4198 
4199 
4200                       pnp_debug_pkg.log (' After PN_VRA_CLIENT_EXTN.calculate_override procedure');
4201                       pnp_debug_pkg.log (' l_trx_hrd_r.trx_header_id : ' || l_trx_hrd_r.trx_header_id);
4202                       pnp_debug_pkg.log (' l_trx_hrd_r.calculated_rent : ' || l_trx_hrd_r.calculated_rent);
4203                       pnp_debug_pkg.log (' l_trx_hrd_r.prorated_rent_due : ' || l_trx_hrd_r.prorated_rent_due);
4204                       pnp_debug_pkg.log (' l_trx_hrd_r.percent_rent_due : ' || l_trx_hrd_r.percent_rent_due);
4205                       pnp_debug_pkg.log (' l_trx_hrd_r.ytd_percent_rent : ' || l_trx_hrd_r.ytd_percent_rent);
4206                       pnp_debug_pkg.log (' l_trx_hrd_r.first_yr_rent : ' || l_trx_hrd_r.first_yr_rent);
4207 
4208                       --- Bug#10269475
4209 
4210                       UPDATE
4211                       pn_var_trx_headers_all
4212                       SET
4213                        calculated_rent   = round(l_trx_hrd_r.calculated_rent,g_precision)
4214                       ,prorated_rent_due = round(l_trx_hrd_r.prorated_rent_due,g_precision)
4215                       ,percent_rent_due  = round(l_trx_hrd_r.percent_rent_due,g_precision)
4216                       ,ytd_percent_rent  = round(l_trx_hrd_r.ytd_percent_rent,g_precision)
4217                       ,first_yr_rent     = round(l_trx_hrd_r.first_yr_rent,g_precision)
4218                       WHERE
4219                       trx_header_id = l_trx_hrd_r.trx_header_id;
4220 
4221                       --- Bug#10269475
4222 
4223                       pnp_debug_pkg.log (' After Update of pn_var_trx_headers_all - Actual Rents ');
4224                       pnp_debug_pkg.log (' l_trx_hrd_r.calculated_rent : ' || l_trx_hrd_r.calculated_rent);
4225                       pnp_debug_pkg.log (' l_trx_hrd_r.prorated_rent_due : ' || l_trx_hrd_r.prorated_rent_due);
4226                       pnp_debug_pkg.log (' l_trx_hrd_r.percent_rent_due : ' || l_trx_hrd_r.percent_rent_due);
4227                       pnp_debug_pkg.log (' l_trx_hrd_r.ytd_percent_rent : ' || l_trx_hrd_r.ytd_percent_rent);
4228                       pnp_debug_pkg.log (' l_trx_hrd_r.first_yr_rent : ' || l_trx_hrd_r.first_yr_rent);
4229 
4230                       --- Bug#10269475
4231 
4232                       l_trx_hrd_t(t) := l_trx_hrd_r;
4233 
4234                     END IF; /* if rent changed */
4235 
4236                   ELSE
4237 
4238                     l_context := 'No calculation necessary';
4239                     pnp_debug_pkg.log(l_context);
4240                     pnp_debug_pkg.log('');
4241 
4242                   END IF; /* need to create inv 4 this calc (sub) prd AND appr sales exist */
4243 
4244                 END LOOP; /* loop for all trx in the period */
4245 
4246                 l_context := 'Loop for all cached transactions.';
4247                 pnp_debug_pkg.log(l_context||' COMPLETE');
4248                 pnp_debug_pkg.log('');
4249 
4250               END IF;
4251 
4252       ELSIF (g_invoice_on = G_INV_ON_FORECASTED AND g_calc_type = G_CALC_TYPE_CALCULATE) THEN
4253              l_trx_hrd_for_t.DELETE;
4254 
4255               /* loop for all trx in the period,
4256                order by line item, calc (sub) period start*/
4257               /*Populate actual rents in trx tables.*/
4258               /*Populate forecasted rents in the trx tables.*/
4259              OPEN pn_var_rent_calc_pkg.trx_hdr_for_c
4260                     ( p_vr_id  => p_var_rent_id
4261                      ,p_prd_id => l_periods_t(p).period_id);
4262               FETCH pn_var_rent_calc_pkg.trx_hdr_for_c BULK COLLECT INTO l_trx_hrd_for_t;
4263               CLOSE pn_var_rent_calc_pkg.trx_hdr_for_c;
4264 
4265               pnp_debug_pkg.log(l_context||' COMPLETE');
4266               pnp_debug_pkg.log('');
4267 
4268               IF l_trx_hrd_for_t.COUNT > 0 THEN
4269 
4270                 l_context := 'Loop for all cached transactions. '||
4271                              'Number of trx: '||l_trx_hrd_for_t.COUNT;
4272                 pnp_debug_pkg.log(l_context);
4273 
4274                 FOR t IN l_trx_hrd_for_t.FIRST..l_trx_hrd_for_t.LAST LOOP
4275 
4276                   l_context
4277                   := '=== Looping for TRX - Start Date: '||
4278                        l_trx_hrd_for_t(t).calc_prd_start_date||
4279                                          ' -- End Date: '||
4280                          l_trx_hrd_for_t(t).calc_prd_end_date||
4281                                           ' === ';
4282                   pnp_debug_pkg.log(l_context);
4283                   pnp_debug_pkg.log('');
4284 
4285                   /* if we need to create an invoice for this calc (sub) period
4286                   */
4287                   IF NVL(l_trx_hrd_for_t(t).invoice_flag, 'Y') <> 'N'
4288                   /*This will not be needed when invoicing on forecasted
4289                   AND
4290                      pn_var_rent_calc_pkg.exists_approved_sales
4291                        ( p_line_item_id => l_trx_hrd_for_t(t).line_item_id
4292                         ,p_grp_date_id  => l_trx_hrd_for_t(t).grp_date_id)*/
4293                   THEN
4294 
4295                     l_trx_hrd_for_r := l_trx_hrd_for_t(t);
4296 
4297                     l_context := 'Call pn_var_rent_calc_pkg.get_rent_applicable_for';
4298                     pn_var_rent_calc_pkg.get_rent_applicable_for(l_trx_hrd_for_r);
4299                     pnp_debug_pkg.log(l_context||' COMPLETE');
4300                     pnp_debug_pkg.log('');
4301 
4302                     /* if rent changed */
4303                     IF NVL(l_trx_hrd_for_t(t).calculated_rent_for, 0)
4304                        <> NVL(l_trx_hrd_for_r.calculated_rent_for, 0) OR
4305                        NVL(l_trx_hrd_for_t(t).percent_rent_due_for, 0)
4306                        <> NVL(l_trx_hrd_for_r.percent_rent_due_for, 0) OR
4307                        NVL(l_trx_hrd_for_t(t).ytd_percent_rent_for, 0)
4308                        <> NVL(l_trx_hrd_for_r.ytd_percent_rent_for, 0)
4309                     THEN
4310                     pnp_debug_pkg.log('updating the trx');
4311                     pnp_debug_pkg.log('l_trx_hrd_for_t(t).calculated_rent_for'||l_trx_hrd_for_t(t).calculated_rent_for);
4312                     pnp_debug_pkg.log('l_trx_hrd_for_r.calculated_rent_for'||l_trx_hrd_for_r.calculated_rent_for);
4313                     pnp_debug_pkg.log('l_trx_hrd_for_r.trx_header_id'||l_trx_hrd_for_r.trx_header_id);
4314 
4315                     --- Bug#10269475
4316                     PN_VRA_CLIENT_EXTN.calculate_override  (
4317                          p_var_rent_id              => p_var_rent_id
4318                        , p_trx_header_id            => l_trx_hrd_r.trx_header_id
4319                        , p_calculated_rent          => l_trx_hrd_r.calculated_rent
4320                        , p_prorated_rent            => l_trx_hrd_r.prorated_rent_due
4321                        , p_percent_rent             => l_trx_hrd_r.percent_rent_due
4322                        , p_ytd_percent_rent         => l_trx_hrd_r.ytd_percent_rent
4323                        , p_first_yr_rent            => l_trx_hrd_r.first_yr_rent
4324                        , x_return_status            => l_ce_return_status
4325                        , x_msg_count                => l_ce_msg_count
4326                        , x_msg_data                 => l_ce_msg_data
4327                        );
4328 
4329                       pnp_debug_pkg.log (' After PN_VRA_CLIENT_EXTN.calculate_override procedure - g_invoice_on = G_INV_ON_FORECASTED');
4330                       pnp_debug_pkg.log (' l_trx_hrd_for_r.trx_header_id : ' || l_trx_hrd_for_r.trx_header_id);
4331                       pnp_debug_pkg.log (' l_trx_hrd_for_r.calculated_rent_for : ' || l_trx_hrd_for_r.calculated_rent_for);
4332                       --pnp_debug_pkg.log (' lr_prorated_rent_due : ' || lr_prorated_rent_due);
4333                       pnp_debug_pkg.log (' l_trx_hrd_for_r.percent_rent_due_for : ' || l_trx_hrd_for_r.percent_rent_due_for);
4334                       pnp_debug_pkg.log (' l_trx_hrd_for_r.ytd_percent_rent_for : ' || l_trx_hrd_for_r.ytd_percent_rent_for);
4335                       --pnp_debug_pkg.log (' lr_first_yr_rent : ' || lr_first_yr_rent);
4336 
4337                      --- Bug#10269475
4338 
4339                       UPDATE
4340                       pn_var_trx_headers_all
4341                       SET
4342                        calculated_rent_for   = round(l_trx_hrd_for_r.calculated_rent_for,g_precision)
4343                       ,percent_rent_due_for  = round(l_trx_hrd_for_r.percent_rent_due_for,g_precision)
4344                       ,ytd_percent_rent_for  = round(l_trx_hrd_for_r.ytd_percent_rent_for,g_precision)
4345                       WHERE
4346                       trx_header_id = l_trx_hrd_for_r.trx_header_id;
4347 
4348                       --- Bug#10269475
4349 
4350                       pnp_debug_pkg.log (' After update of pn_var_trx_headers_all procedure - g_invoice_on = G_INV_ON_FORECASTED');
4351                       pnp_debug_pkg.log (' l_trx_hrd_for_r.trx_header_id : ' || l_trx_hrd_for_r.trx_header_id);
4352                       pnp_debug_pkg.log (' l_trx_hrd_for_r.calculated_rent_for : ' || l_trx_hrd_for_r.calculated_rent_for);
4353                       pnp_debug_pkg.log (' l_trx_hrd_for_r.percent_rent_due_for : ' || l_trx_hrd_for_r.percent_rent_due_for);
4354                       pnp_debug_pkg.log (' l_trx_hrd_for_r.ytd_percent_rent_for : ' || l_trx_hrd_for_r.ytd_percent_rent_for);
4355 
4356                       --- Bug#10269475
4357 
4358                       l_trx_hrd_t(t) := l_trx_hrd_r;
4359 
4360                     END IF; /* if rent changed */
4361 
4362                   ELSE
4363 
4364                     l_context := 'No calculation necessary';
4365                     pnp_debug_pkg.log(l_context);
4366                     pnp_debug_pkg.log('');
4367 
4368                   END IF; /* need to create inv 4 this calc (sub) prd AND appr sales exist */
4369 
4370                 END LOOP; /* loop for all trx in the period */
4371 
4372                 l_context := 'Loop for all cached transactions.';
4373                 pnp_debug_pkg.log(l_context||' COMPLETE');
4374                 pnp_debug_pkg.log('');
4375 
4376               END IF;
4377 
4378       END IF;/*end g_invoice and g_calc_type*/
4379 
4380     END LOOP; /* loop for all periods cached and calculate rent */
4381   END IF; /* if > 0 periods cached */
4382 
4383   l_periods_t.DELETE;
4384   /*Insert Invoice/post summary*/
4385   /* cache the periods*/
4386   IF p_var_rent_id IS NOT NULL AND
4387      p_period_id IS NULL
4388   THEN
4389 
4390     OPEN periods_vr_c( p_vr_id => p_var_rent_id);
4391     FETCH periods_vr_c BULK COLLECT INTO l_periods_t;
4392     CLOSE periods_vr_c;
4393 
4394 
4395   ELSIF p_var_rent_id IS NOT NULL AND
4396         p_period_id   IS NOT NULL
4397   THEN
4398 
4399     OPEN periods_c( p_vr_id  => p_var_rent_id
4400                    ,p_prd_id => p_period_id);
4401     FETCH periods_c BULK COLLECT INTO l_periods_t;
4402     CLOSE periods_c;
4403 
4404     OPEN periods_out_c( p_vr_id  => p_var_rent_id
4405                    ,p_prd_id => p_period_id);
4406     FETCH periods_out_c BULK COLLECT INTO l_periods_out_t;
4407     CLOSE periods_out_c;
4408 
4409   END IF;
4410 
4411    pnp_debug_pkg.log('set partial flag');
4412   -- Set l_partial_prd_id if 1st partial period exists and proration rule is FY/FLY
4413   IF g_proration_rule IN ( pn_var_rent_calc_pkg.G_PRORUL_FY
4414                           ,pn_var_rent_calc_pkg.G_PRORUL_FLY) THEN
4415      FOR fst_rec IN check_fst_partial_prd(p_var_rent_id) LOOP
4416          l_partial_prd_id:= fst_rec.period_id;
4417      END LOOP;
4418   END IF;
4419 
4420   g_partial_prd_flag := NULL;
4421   pnp_debug_pkg.log('prior to pop inv date tab');
4422   -- call to populate inv_date_tab for roll fwd
4423   -- IF 1st partial period exists then call pop_inv_date_tab_firstyr ,to populate
4424   -- invoice dates from 2nd annual period
4425   -- ELSE call pop_inv_date_tab
4426   IF l_partial_prd_id IS NOT NULL THEN
4427        pn_var_rent_calc_pkg.pop_inv_date_tab_firstyr(p_var_rent_id => p_var_rent_id ,
4428                                                      p_status => 'APPROVED');
4429   ELSE
4430        pn_var_rent_calc_pkg.pop_inv_date_tab(p_var_rent_id => p_var_rent_id ,
4431                                              p_status => 'APPROVED');
4432   END IF;
4433 
4434   /*pnp_debug_pkg.log('data in inv_date_tab');
4435   FOR i IN 1..inv_date_tab.COUNT LOOP
4436     pnp_debug_pkg.log(inv_date_tab(i).inv_date||' '||
4437                       inv_date_tab(i).period_id||' '||
4438                       inv_date_tab(i).inv_flag||'!!');
4439   END LOOP;*/
4440 
4441 
4442   FOR first_period_rec IN first_period_cur (p_var_rent_id)  LOOP
4443      l_first_period_id := first_period_rec.period_id;
4444      l_partial_period  := first_period_rec.partial_period;
4445   END LOOP;
4446 
4447   /* loop for all periods cached and calculate rent */
4448   IF l_periods_t.COUNT > 0 THEN
4449     FOR p IN l_periods_t.FIRST..l_periods_t.LAST --
4450     LOOP
4451        IF(g_invoice_on=G_INV_ON_ACTUAL) OR (g_invoice_on=G_INV_ON_FORECASTED
4452                                          AND g_calc_type= G_CALC_TYPE_RECONCILE)
4453        THEN
4454           l_context := 'Call pn_var_rent_calc_pkg.post_summary';
4455 
4456          /* IF NOT ( g_proration_rule IN ( pn_var_rent_calc_pkg.G_PRORUL_FY
4457                   ,pn_var_rent_calc_pkg.G_PRORUL_FLY)
4458              AND (l_first_period_id = l_periods_t(p).period_id)
4459              AND l_partial_period = 'Y')
4460           THEN*/
4461              pn_var_rent_calc_pkg.post_summary
4462                    ( p_var_rent_id   => p_var_rent_id
4463                    ,p_period_id     => l_periods_t(p).period_id);
4464              pnp_debug_pkg.log(l_context||' COMPLETE');
4465              pnp_debug_pkg.log('');
4466           /*END IF; */
4467 
4468        ELSIF (g_invoice_on=G_INV_ON_FORECASTED AND g_calc_type= G_CALC_TYPE_CALCULATE)
4469        THEN
4470           l_context := 'Call pn_var_rent_calc_pkg.post_summary_for';
4471           pn_var_rent_calc_pkg.post_summary_for
4472                   ( p_var_rent_id   => p_var_rent_id
4473                    ,p_period_id     => l_periods_t(p).period_id);
4474           pnp_debug_pkg.log(l_context||' COMPLETE');
4475           pnp_debug_pkg.log('');
4476 
4477        END IF;/*End invoice type and calc_type*/
4478 
4479        l_context := 'Call pn_var_rent_calc_pkg.insert_invoice';
4480        IF g_invoice_on = G_INV_ON_ACTUAL THEN
4481 
4482           IF NOT ( g_proration_rule IN ( pn_var_rent_calc_pkg.G_PRORUL_FY
4483                   ,pn_var_rent_calc_pkg.G_PRORUL_FLY)
4484              AND (l_first_period_id = l_periods_t(p).period_id)
4485              AND l_partial_period = 'Y')
4486           THEN
4487              pn_var_rent_calc_pkg.insert_invoice
4488                     ( p_var_rent_id   => p_var_rent_id
4489                      ,p_period_id     => l_periods_t(p).period_id);
4490           END IF;
4491 
4492        ELSIF g_invoice_on = G_INV_ON_FORECASTED  THEN
4493           pn_var_rent_calc_pkg.insert_invoice_for
4494                  ( p_var_rent_id   => p_var_rent_id
4495                   ,p_period_id     => l_periods_t(p).period_id);
4496 
4497        END IF;
4498 
4499        pnp_debug_pkg.log(l_context||' COMPLETE');
4500        pnp_debug_pkg.log('');
4501 
4502     END LOOP;/*End loop for all periods*/
4503 
4504     /* Create the invoice for first partial year separately */
4505     IF g_proration_rule IN ( pn_var_rent_calc_pkg.G_PRORUL_FY
4506                         ,pn_var_rent_calc_pkg.G_PRORUL_FLY)
4507        AND g_invoice_on = G_INV_ON_ACTUAL AND l_partial_period = 'Y'
4508     THEN
4509 
4510         /*post_summary_firstyr (p_var_rent_id => p_var_rent_id);*/
4511 
4512         /*pn_var_rent_calc_pkg.*/insert_invoice_firstyr( p_var_rent_id   => p_var_rent_id );
4513     END IF;
4514 
4515   END IF;/*End insert invoice/post summary*/
4516 
4517   --call to roll fwd selections
4518  -- IF partial_prd flag is NOT NULL i.e. there exists a 1st partial period then
4519   -- call ROLL_FWD_PARTIAL_PRD ,INCLUDE_INCREASES_FIRSTYR
4520   -- ELSE call ROLL_FWD_SELECNS
4521 
4522   IF l_partial_prd_id IS NOT NULL THEN
4523     pn_var_rent_calc_pkg.ROLL_FWD_PARTIAL_PRD(p_var_rent_id => p_var_rent_id);
4524     pn_var_rent_calc_pkg.INCLUDE_INCREASES_FIRSTYR(p_var_rent_id => p_var_rent_id);
4525   ELSE
4526     pn_var_rent_calc_pkg.ROLL_FWD_SELECNS(p_var_rent_id => p_var_rent_id);
4527   END IF;
4528 
4529   -- If proration rule = LY,FLY then call separate roll forward for last partial period
4530   IF g_proration_rule IN ( pn_var_rent_calc_pkg.G_PRORUL_LY
4531                           ,pn_var_rent_calc_pkg.G_PRORUL_FLY) THEN
4532     pn_var_rent_calc_pkg.ROLL_FWD_LST_PARTIAL_PRD(p_var_rent_id => p_var_rent_id);
4533   END IF;
4534 
4535   -- Roll forward for including rent increase terms
4536   pn_var_rent_calc_pkg.INCLUDE_INCREASES(p_var_rent_id => p_var_rent_id);
4537   inv_date_tab.delete;
4538   g_partial_prd_flag := NULL; -- clearing the roll fwd flag of 1st partial prd
4539 
4540   --Reset abatements for the periods for which we donot re-calculate
4541   pn_var_rent_calc_pkg.reset_abatements(p_var_rent_id);
4542   pnp_debug_pkg.log('g_calculation_method3:'||g_calculation_method);
4543    IF l_periods_out_t.COUNT > 0 THEN
4544     FOR p IN l_periods_out_t.FIRST..l_periods_out_t.LAST --
4545     --
4546     LOOP
4547       IF (g_calculation_method = 'T') THEN
4548         --Take true up invoices into account
4549         pnp_debug_pkg.log('True up');
4550         pn_var_trueup_pkg.set_trueup_flag('C');
4551         pn_var_trueup_pkg.apply_abatements
4552                     ( p_var_rent_id   => p_var_rent_id
4553                      ,p_period_id     => l_periods_out_t(p).period_id
4554                      ,p_flag => 'RESET');
4555       ELSE
4556         --No need to take trueup invoices into account.
4557         pnp_debug_pkg.log('Not true up');
4558         pn_var_rent_calc_pkg.apply_abatements
4559                     ( p_var_rent_id   => p_var_rent_id
4560                      ,p_period_id     => l_periods_out_t(p).period_id
4561                      ,p_flag => 'RESET');
4562 
4563       END IF;
4564     END LOOP;
4565    END IF;
4566 
4567    --Apply abatements
4568    IF l_periods_t.COUNT > 0 THEN
4569     FOR p IN l_periods_t.FIRST..l_periods_t.LAST --
4570     --
4571     LOOP
4572       IF (g_calculation_method = 'T') THEN
4573         pnp_debug_pkg.log('True up');
4574         NULL;
4575         --Take true up invoices into account
4576         pn_var_trueup_pkg.set_trueup_flag('C');
4577         pn_var_trueup_pkg.apply_abatements
4578                     ( p_var_rent_id   => p_var_rent_id
4579                      ,p_period_id     => l_periods_t(p).period_id
4580                      ,p_flag => 'CALCULATE');
4581       ELSE
4582         pnp_debug_pkg.log('Not true up');
4583         --No need to take trueup invoices into account.
4584         pn_var_rent_calc_pkg.apply_abatements
4585                     ( p_var_rent_id   => p_var_rent_id
4586                      ,p_period_id     => l_periods_t(p).period_id
4587                      ,p_flag => 'CALCULATE');
4588 
4589       END IF;
4590 
4591         select nvl(sum(actual_invoiced_amount),0)
4592             into l_actual_amount
4593             from pn_var_rent_inv_all
4594             where period_id = l_periods_t(p).period_id
4595             and var_rent_id = p_var_rent_id;
4596 
4597             fnd_message.set_name ('PN','PN_VRAM_RENT');
4598             fnd_message.set_token ('TYPE','ACTUAL');
4599             fnd_message.set_token ('AMT',l_actual_amount);
4600             pnp_debug_pkg.put_log_msg(fnd_message.get);
4601 
4602      END LOOP;
4603    END IF;
4604 
4605   /* deletes the draft term for which invoice_date or term template has changed.*/
4606   pn_var_rent_calc_pkg.delete_draft_terms( p_var_rent_id => p_var_rent_id);
4607 
4608   l_context := 'Loop for all cached periods';
4609   pnp_debug_pkg.log(l_context||' COMPLETE');
4610   pnp_debug_pkg.log('');
4611 
4612   /* -------------------------------------------------------------------------- */
4613   /* -------------------------------- CODE END -------------------------------- */
4614   /* -------------------------------------------------------------------------- */
4615 
4616   pnp_debug_pkg.log('+++++++++ calculate_rent END +++++++++++');
4617   pnp_debug_pkg.log('');
4618 
4619 EXCEPTION
4620   WHEN OTHERS THEN
4621     pnp_debug_pkg.log
4622     ('**********************************************************************');
4623     pnp_debug_pkg.log('*** ERROR IN calculate_rent ***');
4624     pnp_debug_pkg.log('*** ERROR WHEN: '||l_context||' ***');
4625     pnp_debug_pkg.log
4626     ('**********************************************************************');
4627     RAISE;
4628 
4629 END calculate_rent;
4630 -------------------------------------------------------------------------------
4631 -----------------------------Procedures for forecasted data--------------------
4632 -------------------------------------------------------------------------------
4633 --------------------------------------------------------------------------------
4634 --  NAME         : insert_invoice_for
4635 --  DESCRIPTION  :
4636 --  PURPOSE      :
4637 --  INVOKED FROM :
4638 --  ARGUMENTS    :
4639 --  REFERENCE    :
4640 --  HISTORY      :
4641 --
4642 --  22.Sep.06  Shabda     o Created
4643 --  5-Mar-07   Shabda     o Bug 5922493. Create invoices only when volumes exist.
4644 --------------------------------------------------------------------------------
4645 /*
4646 This method can only be called when g_invoice_on = Forecasted
4647 There are two options. g_calc_type = CALCULATE/RECONCILE.
4648 If g_calc_type is CALCULATE, we only insert/update the forecasted.
4649 If g_calc_type is RECONCILE, we insert/update both.
4650 */
4651 PROCEDURE insert_invoice_for( p_var_rent_id IN NUMBER
4652                          ,p_period_id   IN NUMBER) IS
4653 
4654   /* get invoice dates for a period */
4655   CURSOR invoice_dates_c( p_vr_id  IN NUMBER
4656                          ,p_prd_id IN NUMBER) IS
4657     SELECT
4658      invoice_date
4659     ,NVL(SUM(tot_act_vol), 0)  AS total_actual_sales
4660     ,NVL(SUM(act_var_rent), 0) AS total_actual_rent
4661     ,NVL(SUM(for_var_rent), 0) AS total_forecasted_rent
4662     FROM
4663     pn_var_rent_summ_all
4664     WHERE
4665     var_rent_id = p_vr_id AND
4666     period_id = p_prd_id
4667     GROUP BY
4668     invoice_date
4669     ORDER BY
4670     invoice_date;
4671 
4672   /* get latest invoice */
4673   CURSOR invoice2upd_c( p_vr_id  IN NUMBER
4674                        ,p_prd_id IN NUMBER
4675                        ,p_inv_dt IN DATE) IS
4676     SELECT
4677      var_rent_inv_id
4678     ,var_rent_id
4679     ,period_id
4680     ,invoice_date
4681     ,forecasted_term_status
4682     ,variance_term_status
4683     ,variance_exp_code
4684     ,forecasted_exp_code
4685     ,adjust_num
4686     ,tot_act_vol
4687     ,act_per_rent
4688     ,for_per_rent
4689     ,actual_invoiced_amount
4690     ,constr_actual_rent
4691     ,rec_abatement_override
4692     FROM
4693     pn_var_rent_inv_all
4694     WHERE
4695     var_rent_id = p_vr_id AND
4696     period_id = p_prd_id AND
4697     invoice_date = p_inv_dt
4698     AND
4699     NVL(true_up_amt, 0) = 0 AND
4700     true_up_status IS NULL AND
4701     true_up_exp_code IS NULL
4702     ORDER BY adjust_num DESC;
4703 
4704   /* get latest invoice */
4705   CURSOR prev_invoiced_c( p_vr_id  IN NUMBER
4706                          ,p_prd_id IN NUMBER
4707                          ,p_inv_dt IN DATE) IS
4708     SELECT
4709     NVL(SUM(actual_invoiced_amount), 0) AS prev_invoiced_amt
4710     FROM
4711     pn_var_rent_inv_all
4712     WHERE
4713     var_rent_id = p_vr_id AND
4714     period_id = p_prd_id AND
4715     invoice_date = p_inv_dt AND
4716     variance_exp_code = 'Y'
4717     AND
4718     NVL(true_up_amt, 0) = 0 AND
4719     true_up_status IS NULL AND
4720     true_up_exp_code IS NULL;
4721 
4722    CURSOR vol_exists_c(ip_var_rent_id NUMBER,
4723                       ip_invoice_date DATE
4724             ) IS
4725       SELECT 1 as vol_exists
4726       FROM DUAL
4727       WHERE exists(
4728       SELECT vol_hist_id
4729       FROM pn_var_vol_hist_all
4730       WHERE grp_date_id in(
4731       SELECT grp_date_id
4732       FROM pn_var_grp_dates_all
4733       WHERE var_rent_id = ip_var_rent_id
4734       AND invoice_date = ip_invoice_date));
4735 
4736   l_invoice_on          VARCHAR2(30);
4737   l_calc_type           VARCHAR2(30);
4738   l_row_id              ROWID;
4739   l_var_rent_inv_id     NUMBER;
4740   l_max_adjust_num      NUMBER;
4741   l_prev_inv_rent       NUMBER;
4742   l_curr_inv_rent       NUMBER;
4743   l_curr_inv_rent_for       NUMBER;
4744   l_actual_invoiced_amount  NUMBER;
4745   l_constr_rent         NUMBER;
4746   l_prev_inv_exp_rent   NUMBER;
4747   l_constr_prev_rent    NUMBER;
4748   l_rec_abatement_override NUMBER;
4749 
4750   /* get ORG ID */
4751   CURSOR org_c(p_vr_id IN NUMBER) IS
4752     SELECT org_id
4753       FROM pn_var_rents_all
4754      WHERE var_rent_id = p_vr_id;
4755 
4756   l_org_id NUMBER;
4757   l_precision NUMBER;
4758   l_exists_invoice BOOLEAN;
4759 
4760 BEGIN
4761 
4762   pnp_debug_pkg.log('+++++++++ insert_invoice_for START +++++++++++');
4763 
4764   FOR vr_rec IN org_c(p_vr_id => p_var_rent_id) LOOP
4765     l_org_id := vr_rec.org_id;
4766   END LOOP;
4767 
4768   l_precision := nvl(pn_var_rent_calc_pkg.get_currency_precision(l_org_id),4);
4769   pnp_debug_pkg.log('l_precision:'||l_precision);
4770 
4771   l_calc_type := g_calc_type;
4772   pnp_debug_pkg.log('calc_type:'|| l_calc_type);
4773 
4774   /* loop for all invoice dates in the period */
4775   FOR inv_rec IN invoice_dates_c( p_vr_id  => p_var_rent_id
4776                                  ,p_prd_id => p_period_id)
4777   LOOP
4778   IF l_calc_type = G_CALC_TYPE_CALCULATE  THEN
4779     /*Three cases exist here.
4780     1. No invoice exist. We insert a invoice with forecasted rents.
4781     2. Invoice exists and has not been exported. Update the forecasted calculated rent.
4782     3. Invoice exists and has been exported. Do not update anything.
4783     */
4784     l_row_id              := NULL;
4785     l_var_rent_inv_id     := NULL;
4786     l_curr_inv_rent_for   := 0;
4787     l_exists_invoice      := FALSE;
4788 
4789     /* check if there exists an invoice for this invoice date */
4790     FOR inv2upd_rec IN invoice2upd_c( p_vr_id  => p_var_rent_id
4791                                      ,p_prd_id => p_period_id
4792                                      ,p_inv_dt => inv_rec.invoice_date)
4793     LOOP
4794 
4795       /* invoice exists - we only look at the last invoice */
4796       l_exists_invoice := TRUE;
4797       l_rec_abatement_override := inv2upd_rec.rec_abatement_override;
4798       /* invoice updateable? */
4799       IF NVL(inv2upd_rec.forecasted_exp_code, 'N') <> 'Y' THEN
4800 
4801         /* updateable */
4802         l_var_rent_inv_id := inv2upd_rec.var_rent_inv_id;
4803         l_curr_inv_rent_for   := inv2upd_rec.for_per_rent;
4804 
4805       ELSIF NVL(inv2upd_rec.forecasted_exp_code, 'N') = 'Y' THEN
4806 
4807         /* NON - updateable */
4808         l_var_rent_inv_id := NULL;
4809 
4810       END IF; /* invoice updateable? */
4811 
4812       /* we only look at the last invoice */
4813       EXIT;
4814 
4815     END LOOP; /* check if there exists an invoice for this invoice date */
4816     pnp_debug_pkg.log('l_var_rent_inv_id:' || l_var_rent_inv_id);
4817 
4818     /* atleast one invoice exists? */
4819     IF NOT l_exists_invoice
4820        /*AND inv_rec.total_actual_rent <> 0*/ THEN
4821 
4822       /* not sure abt this part
4823          uncomment the AND inv_rec.total_actual_rent <> 0
4824          part if we do not want to create $0 invoices
4825       */
4826 
4827       /* first time for this invoice date - create invoice */
4828       /*We are invoicing on forecasted, so when first time invoice is created, all actuals must be null*/
4829 
4830 
4831       /*We only want to create invoices if volumes exist for these invoices.*/
4832       FOR vol_exists_rec IN vol_exists_c( p_var_rent_id,
4833                                           inv_rec.invoice_date
4834                                           )  LOOP
4835 
4836          pnp_debug_pkg.log('inv_rec.total_forecasted_rent'||inv_rec.total_forecasted_rent);
4837          pn_var_rent_inv_pkg.insert_row
4838          ( x_rowid                   => l_row_id,
4839            x_var_rent_inv_id         => l_var_rent_inv_id,
4840            x_adjust_num              => 0,
4841            x_invoice_date            => inv_rec.invoice_date,
4842            x_for_per_rent            => inv_rec.total_forecasted_rent,
4843            x_tot_act_vol             => NULL,
4844            x_act_per_rent            => NULL,
4845            x_constr_actual_rent      => NULL,
4846            x_abatement_appl          => 0,
4847            x_rec_abatement           => NULL,
4848            x_rec_abatement_override  => l_rec_abatement_override,
4849            x_negative_rent           => 0,
4850            x_actual_invoiced_amount  => NULL,
4851            x_period_id               => p_period_id,
4852            x_var_rent_id             => p_var_rent_id,
4853            x_forecasted_term_status  => 'N',
4854            x_variance_term_status    => 'N',
4855            x_actual_term_status      => 'N',
4856            x_forecasted_exp_code     => 'N',
4857            x_variance_exp_code       => 'N',
4858            x_actual_exp_code         => 'N',
4859            x_comments                => 'created invoice',
4860            x_attribute_category      => NULL,
4861            x_attribute1              => NULL,
4862            x_attribute2              => NULL,
4863            x_attribute3              => NULL,
4864            x_attribute4              => NULL,
4865            x_attribute5              => NULL,
4866            x_attribute6              => NULL,
4867            x_attribute7              => NULL,
4868            x_attribute8              => NULL,
4869            x_attribute9              => NULL,
4870            x_attribute10             => NULL,
4871            x_attribute11             => NULL,
4872            x_attribute12             => NULL,
4873            x_attribute13             => NULL,
4874            x_attribute14             => NULL,
4875            x_attribute15             => NULL,
4876            x_creation_date           => SYSDATE,
4877            x_created_by              => NVL(fnd_global.user_id,0),
4878            x_last_update_date        => SYSDATE,
4879            x_last_updated_by         => NVL(fnd_global.user_id,0),
4880            x_last_update_login       => NVL(fnd_global.login_id,0),
4881            x_org_id                  => l_org_id );
4882 
4883       END LOOP;
4884 
4885 
4886     ELSIF l_exists_invoice THEN
4887 
4888       /* invoice has been created here in the past */
4889 
4890       /* no invoice to update - We have already created a forcasted invoice and exported it. */
4891       IF l_var_rent_inv_id IS NULL THEN
4892         NULL;
4893 
4894       ELSIF l_var_rent_inv_id IS NOT NULL THEN
4895 
4896         /* if there a change in rent */
4897         IF (inv_rec.total_forecasted_rent) <> l_curr_inv_rent_for
4898         THEN
4899 
4900           DELETE
4901           pn_payment_terms_all
4902           WHERE
4903           var_rent_inv_id = l_var_rent_inv_id AND
4904           status <> pn_var_rent_calc_pkg.G_TERM_STATUS_APPROVED AND
4905           var_rent_type = pn_var_rent_calc_pkg.G_INV_ON_FORECASTED;
4906 
4907           /* update the invoice */
4908           /*Since forcasted rents are not yet exported, we can update them.*/
4909           UPDATE
4910           pn_var_rent_inv_all
4911           SET
4912            for_per_rent           = ROUND(inv_rec.total_forecasted_rent, g_precision)
4913           ,forecasted_term_status = 'N'
4914           ,credit_flag            = 'N'  -- bug # 5937807
4915           ,last_update_date       = SYSDATE
4916           ,last_updated_by        = NVL(fnd_global.user_id,0)
4917           ,last_update_login      = NVL(fnd_global.login_id,0)
4918           WHERE
4919           var_rent_inv_id = l_var_rent_inv_id;
4920 
4921         END IF; /* if there a change in rent */
4922 
4923       END IF; /* IF l_var_rent_inv_id IS NULL THEN */
4924 
4925     END IF; /* IF NOT l_exists_invoice THEN */
4926 
4927     /*END l_calc_type = G_CALC_TYPE_CALCULATE*/
4928 
4929   ELSIF l_calc_type = G_CALC_TYPE_RECONCILE THEN
4930   /*We can only be reconciling if an invoice already exists*/
4931     l_row_id              := NULL;
4932     l_var_rent_inv_id     := -1;
4933     l_max_adjust_num      := 0;
4934     l_prev_inv_rent       := 0;
4935     l_curr_inv_rent       := 0;
4936     l_curr_inv_rent_for   := 0;
4937 
4938     pnp_debug_pkg.log('inv_rec.invoice_date'||inv_rec.invoice_date);
4939     pnp_debug_pkg.log('inv_rec.total_actual_rent:'||inv_rec.total_actual_rent);
4940     /* check if there exists an invoice for this invoice date */
4941     FOR inv2upd_rec IN invoice2upd_c( p_vr_id  => p_var_rent_id
4942                                      ,p_prd_id => p_period_id
4943                                      ,p_inv_dt => inv_rec.invoice_date)
4944 
4945     LOOP
4946        l_constr_prev_rent := inv2upd_rec.constr_actual_rent;
4947        l_prev_inv_rent := inv2upd_rec.act_per_rent;
4948       /* invoice updateable? */
4949       IF NVL(inv2upd_rec.variance_exp_code, 'N') <> 'Y' THEN
4950 
4951         /* updateable */
4952         l_var_rent_inv_id := inv2upd_rec.var_rent_inv_id;
4953         l_max_adjust_num  := inv2upd_rec.adjust_num;
4954         l_curr_inv_rent   := inv2upd_rec.actual_invoiced_amount;
4955         l_curr_inv_rent_for   := inv2upd_rec.for_per_rent;
4956 
4957       ELSIF NVL(inv2upd_rec.variance_exp_code, 'N') = 'Y' THEN
4958 
4959         /* NON - updateable */
4960         l_var_rent_inv_id := NULL;
4961         l_max_adjust_num  := inv2upd_rec.adjust_num + 1;
4962         l_curr_inv_rent   := 0;
4963         l_curr_inv_rent_for   := inv2upd_rec.for_per_rent;
4964 
4965       END IF; /* invoice updateable? */
4966       pnp_debug_pkg.log('inv2upd_rec.variance_exp_code:'||inv2upd_rec.variance_exp_code);
4967       pnp_debug_pkg.log('l_var_rent_inv_id:'||l_var_rent_inv_id);
4968       /* we only look at the last invoice */
4969       EXIT;
4970 
4971     END LOOP; /* check if there exists an invoice for this invoice date */
4972 
4973       /*Only if we are reconciling, do we need to update the last row or insert an adjustment.*/
4974 
4975       /* invoice has been created here in the past */
4976 
4977 
4978       /* get the previously billed amount from approved invoices */
4979       FOR prev_inv_rec IN prev_invoiced_c( p_vr_id  => p_var_rent_id
4980                                           ,p_prd_id => p_period_id
4981                                           ,p_inv_dt => inv_rec.invoice_date)
4982       LOOP
4983         l_prev_inv_exp_rent := prev_inv_rec.prev_invoiced_amt;
4984       END LOOP;
4985 
4986       l_constr_rent := pn_var_rent_calc_pkg.apply_constraints(
4987                                  p_period_id => p_period_id,
4988                                  p_invoice_date => inv_rec.invoice_date,
4989                                  p_actual_rent => inv_rec.total_actual_rent);
4990                                  --TODO.......
4991 
4992       /* no invoice to update - create a new one */
4993       IF l_var_rent_inv_id IS NULL THEN
4994 
4995         /* if there a change in rent */
4996         IF round(inv_rec.total_actual_rent, l_precision) <> round(l_prev_inv_rent, l_precision)
4997            OR round(l_constr_rent, l_precision) <> round(l_constr_prev_rent, l_precision)
4998         THEN
4999 
5000           /* create new invoice for difference amt */
5001           /* Forecasted rent is not updated in invoices. So always set it to prev invoiced forcasted ammount*/
5002           pn_var_rent_inv_pkg.insert_row
5003           ( x_rowid                   => l_row_id,
5004             x_var_rent_inv_id         => l_var_rent_inv_id,
5005             x_adjust_num              => l_max_adjust_num,
5006             x_invoice_date            => inv_rec.invoice_date,
5007             x_for_per_rent            => l_curr_inv_rent_for,
5008             x_tot_act_vol             => inv_rec.total_actual_sales,
5009             x_act_per_rent            => inv_rec.total_actual_rent,
5010             x_constr_actual_rent      => l_constr_rent,
5011             x_abatement_appl          => 0,
5012             x_rec_abatement           => NULL,
5013             x_rec_abatement_override  => l_rec_abatement_override,
5014             x_negative_rent           => 0,
5015             x_actual_invoiced_amount  => (l_constr_rent - l_prev_inv_exp_rent),
5016             x_period_id               => p_period_id,
5017             x_var_rent_id             => p_var_rent_id,
5018             x_forecasted_term_status  => 'N',
5019             x_variance_term_status    => 'N',
5020             x_actual_term_status      => 'N',
5021             x_forecasted_exp_code     => 'N',
5022             x_variance_exp_code       => 'N',
5023             x_actual_exp_code         => 'N',
5024             x_comments                => 'created invoice',
5025             x_attribute_category      => NULL,
5026             x_attribute1              => NULL,
5027             x_attribute2              => NULL,
5028             x_attribute3              => NULL,
5029             x_attribute4              => NULL,
5030             x_attribute5              => NULL,
5031             x_attribute6              => NULL,
5032             x_attribute7              => NULL,
5033             x_attribute8              => NULL,
5034             x_attribute9              => NULL,
5035             x_attribute10             => NULL,
5036             x_attribute11             => NULL,
5037             x_attribute12             => NULL,
5038             x_attribute13             => NULL,
5039             x_attribute14             => NULL,
5040             x_attribute15             => NULL,
5041             x_creation_date           => SYSDATE,
5042             x_created_by              => NVL(fnd_global.user_id,0),
5043             x_last_update_date        => SYSDATE,
5044             x_last_updated_by         => NVL(fnd_global.user_id,0),
5045             x_last_update_login       => NVL(fnd_global.login_id,0),
5046             x_org_id                  => l_org_id );
5047 
5048         END IF; /* IF inv_rec.total_actual_rent <> l_prev_inv_rent THEN */
5049 
5050       ELSIF l_var_rent_inv_id IS NOT NULL AND l_var_rent_inv_id <> -1 THEN
5051 
5052           DELETE
5053           pn_payment_terms_all
5054           WHERE
5055           var_rent_inv_id = l_var_rent_inv_id AND
5056           status <> pn_var_rent_calc_pkg.G_TERM_STATUS_APPROVED AND
5057           var_rent_type = pn_var_rent_calc_pkg.G_INV_ON_VARIANCE; --bug#12702776
5058  	           --var_rent_type = pn_var_rent_calc_pkg.G_INV_ON_FORECASTED;
5059 
5060           /* update the invoice */
5061           UPDATE
5062           pn_var_rent_inv_all
5063           SET
5064            act_per_rent           = ROUND(inv_rec.total_actual_rent, g_precision)
5065           ,constr_actual_rent     = ROUND(l_constr_rent, g_precision)
5066           ,actual_invoiced_amount = ROUND((l_constr_rent - l_prev_inv_exp_rent), g_precision)
5067           ,tot_act_vol            = ROUND(inv_rec.total_actual_sales, g_precision)  -- bug # 6007571
5068           ,credit_flag            = 'N'     -- bug # 5937807
5069           ,variance_term_status   = 'N'
5070           ,last_update_date       = SYSDATE
5071           ,last_updated_by        = NVL(fnd_global.user_id,0)
5072           ,last_update_login      = NVL(fnd_global.login_id,0)
5073           WHERE
5074           var_rent_inv_id = l_var_rent_inv_id;
5075 
5076 
5077       END IF; /* IF l_var_rent_inv_id IS NULL THEN */
5078     /*END reconcile*/
5079 
5080   END IF;
5081 
5082 
5083 
5084 
5085   END LOOP; /* loop for all invoice dates in the period */
5086 
5087   pnp_debug_pkg.log('+++++++++ insert_invoice_for END +++++++++++');
5088 
5089 EXCEPTION
5090   WHEN OTHERS THEN RAISE;
5091 
5092 END insert_invoice_for;
5093 
5094 
5095 --------------------------------------------------------------------------------
5096 --  NAME         : get_rent_applicable_for
5097 --  DESCRIPTION  :
5098 --  PURPOSE      :
5099 --  INVOKED FROM :
5100 --  ARGUMENTS    :
5101 --  REFERENCE    :
5102 --  HISTORY      :
5103 --
5104 --  18.Sep.06  Shabda     o Created
5105 --------------------------------------------------------------------------------
5106 PROCEDURE get_rent_applicable_for
5107 (p_trx_hdr_rec IN OUT NOCOPY pn_var_rent_calc_pkg.trx_hdr_for_c%ROWTYPE)
5108 IS
5109 
5110   /* cache trx hdr passed */
5111   l_trx_hdr_rec pn_var_rent_calc_pkg.trx_hdr_for_c%ROWTYPE;
5112 
5113   /* get bkpt type */
5114   CURSOR bkpt_type_c(p_bkdt_id IN NUMBER) IS
5115     SELECT
5116      bkhd.bkpt_header_id
5117     ,bkhd.breakpoint_type
5118     FROM
5119      pn_var_bkpts_head_all bkhd
5120     ,pn_var_bkpts_det_all  bkdt
5121      WHERE
5122     bkdt.bkpt_detail_id = p_bkdt_id AND
5123     bkdt.bkpt_header_id = bkhd.bkpt_header_id;
5124 
5125   l_bkpt_type VARCHAR2(30);
5126 
5127   l_bkpts_t TRX_DTL_TBL;
5128 
5129   l_net_volume NUMBER;
5130   l_bkpt_start NUMBER;
5131   l_bkpt_end   NUMBER;
5132   l_calc_rent  NUMBER;
5133 
5134 
5135   /* get calc freq */
5136   CURSOR calc_freq_c(p_vr_id IN NUMBER) IS
5137     SELECT
5138     reptg_freq_code AS report_freq_code
5139     FROM
5140     pn_var_rent_dates_all
5141     WHERE
5142     var_rent_id = p_vr_id;
5143 
5144    /* get the number of periods */
5145   CURSOR period_num_c ( p_vr_id IN NUMBER) IS
5146     SELECT
5147     count(period_id) perion_num
5148     FROM
5149     pn_var_periods_all
5150     WHERE
5151     var_rent_id = p_vr_id AND
5152     NVL(status, 'A') <> pn_var_rent_calc_pkg.G_PERIOD_REVERSED_STATUS;
5153 
5154   /* get the last partial period */
5155   CURSOR last_period_c( p_vr_id     IN NUMBER) IS
5156     SELECT
5157      prd.period_id
5158     ,prd.partial_period
5159     FROM
5160     pn_var_periods_all prd,
5161     pn_var_rents_all   var
5162     WHERE
5163     prd.var_rent_id = p_vr_id AND
5164     prd.var_rent_id = var.var_rent_id AND
5165     prd.end_date = var.termination_date;
5166 
5167   /* get the first partial period */
5168   CURSOR first_period_c( p_vr_id     IN NUMBER) IS
5169     SELECT
5170      prd.period_id
5171     ,prd.partial_period
5172     FROM
5173     pn_var_periods_all prd,
5174     pn_var_rents_all   var
5175     WHERE
5176     prd.var_rent_id = p_vr_id AND
5177     prd.var_rent_id = var.var_rent_id AND
5178     prd.start_date = var.commencement_date;
5179 
5180   l_prorat_factor_sum NUMBER;
5181 
5182   l_prev_billed NUMBER;
5183 
5184   l_context VARCHAR2(255);
5185 
5186   l_first_partial VARCHAR2(1);
5187   l_last_partial  VARCHAR2(1);
5188   l_period_num    NUMBER  := 0;
5189 
5190 BEGIN
5191   pnp_debug_pkg.log('++++++ Start get_rent_applicable ++++++');
5192   pnp_debug_pkg.log('p_trx_hdr_rec.invoice_flag:'||p_trx_hdr_rec.invoice_flag);
5193   IF NVL(p_trx_hdr_rec.invoice_flag, 'Y') = 'N' THEN
5194     RETURN;
5195   END IF;
5196 
5197   /* cache the trx header rec passed in */
5198   l_trx_hdr_rec := p_trx_hdr_rec;
5199 
5200   /* if VR details are not availabe at the package level, cache it */
5201   IF g_proration_rule IS NULL OR
5202      g_calculation_method IS NULL OR
5203      g_negative_rent IS NULL
5204   THEN
5205 
5206     /* cache VR details */
5207     pn_var_rent_calc_pkg.cache_vr_details
5208       (p_var_rent_id => l_trx_hdr_rec.var_rent_id);
5209 
5210   END IF;
5211 
5212   /* cache bkpt details */
5213   l_bkpts_t.DELETE;
5214 
5215   OPEN pn_var_rent_calc_pkg.trx_dtl_c(p_hdr_id => p_trx_hdr_rec.trx_header_id);
5216   FETCH pn_var_rent_calc_pkg.trx_dtl_c BULK COLLECT INTO l_bkpts_t;
5217   CLOSE pn_var_rent_calc_pkg.trx_dtl_c;
5218 
5219   /* get the breakpoint type - flat, sliding, stratified */
5220   FOR rec IN bkpt_type_c(p_bkdt_id => l_bkpts_t(1).bkpt_detail_id)
5221   LOOP
5222     pnp_debug_pkg.log('Breakpoint Type:'||rec.breakpoint_type);
5223     l_bkpt_type := rec.breakpoint_type;
5224   END LOOP;
5225 
5226   IF g_calculation_method IN ( pn_var_rent_calc_pkg.G_CALC_NON_CUMULATIVE
5227                               ,pn_var_rent_calc_pkg.G_CALC_TRUE_UP)
5228   THEN
5229     l_net_volume := l_trx_hdr_rec.prorated_group_sales_for;
5230 
5231   ELSIF g_calculation_method IN ( pn_var_rent_calc_pkg.G_CALC_CUMULATIVE
5232                                  ,pn_var_rent_calc_pkg.G_CALC_YTD)
5233   THEN
5234     l_net_volume := l_trx_hdr_rec.ytd_sales_for;
5235 
5236   END IF;
5237   pnp_debug_pkg.log('l_net_volume'||l_net_volume);
5238   /* handling the case of volume not tripping any bkpts */
5239     /* init the calculated rent to 0 - it will be re-calculated */
5240   l_trx_hdr_rec.calculated_rent_for := 0;
5241   IF g_calculation_method IN ( pn_var_rent_calc_pkg.G_CALC_NON_CUMULATIVE
5242                               ,pn_var_rent_calc_pkg.G_CALC_TRUE_UP)
5243      AND
5244      (l_net_volume < l_bkpts_t(1).prorated_grp_vol_start)
5245 
5246   THEN
5247 
5248     /* this is the functionality that exists today
5249        does not exist in Macerich code
5250        Once no breakpoints are tripped, Macerich consider the rent to be = 0 */
5251     /*
5252     l_trx_hdr_rec.calculated_rent
5253     := (l_net_volume - l_bkpts_t(1).pr_grp_blended_vol_start)
5254        * l_bkpts_t(1).bkpt_rate;
5255     */
5256     pnp_debug_pkg.log('Volume doesnot trip breakpoints');
5257     l_trx_hdr_rec.calculated_rent_for := 0;
5258 
5259   ELSE
5260 
5261     /* --------------------- GET calculated_rent START --------------------- */
5262     /* get l_trx_hdr_rec.calculated_rent - CALCULATED RENT */
5263 
5264     IF l_bkpt_type = pn_var_rent_calc_pkg.G_BKPT_TYP_STRATIFIED
5265     THEN
5266 
5267       l_trx_hdr_rec.calculated_rent_for := 0;
5268 
5269       /* loop for all bkpt details */
5270       FOR i IN l_bkpts_t.FIRST..l_bkpts_t.LAST LOOP
5271 
5272         IF g_calculation_method IN ( pn_var_rent_calc_pkg.G_CALC_NON_CUMULATIVE
5273                                     ,pn_var_rent_calc_pkg.G_CALC_TRUE_UP)
5274         THEN
5275 
5276             l_bkpt_start := l_bkpts_t(i).prorated_grp_vol_start;
5277             l_bkpt_end   := l_bkpts_t(i).prorated_grp_vol_end;
5278 
5279 
5280         ELSIF g_calculation_method = pn_var_rent_calc_pkg.G_CALC_CUMULATIVE
5281         THEN
5282           IF g_proration_rule = pn_var_rent_calc_pkg.G_PRORUL_NP THEN
5283 
5284             l_bkpt_start := l_bkpts_t(i).prorated_grp_vol_start;
5285             l_bkpt_end   := l_bkpts_t(i).prorated_grp_vol_end;
5286 
5287           ELSE
5288 
5289                 l_bkpt_start := l_bkpts_t(i).blended_period_vol_start;
5290                 l_bkpt_end   := l_bkpts_t(i).blended_period_vol_end;
5291 
5292           END IF;
5293 
5294         ELSIF g_calculation_method = pn_var_rent_calc_pkg.G_CALC_YTD
5295         THEN
5296 
5297           l_bkpt_start := l_bkpts_t(i).ytd_group_vol_start;
5298           l_bkpt_end   := l_bkpts_t(i).ytd_group_vol_end;
5299 
5300         END IF; /* g_calculation_method */
5301 
5302         IF l_bkpt_end IS NULL OR l_bkpt_end = 0 THEN
5303           l_bkpt_end := NULL;
5304         END IF;
5305 
5306         IF l_net_volume >= l_bkpt_start THEN
5307 
5308           IF l_net_volume <= NVL(l_bkpt_end, l_net_volume) THEN
5309 
5310             l_trx_hdr_rec.calculated_rent_for
5311             := l_trx_hdr_rec.calculated_rent_for
5312                + (l_net_volume - l_bkpt_start) * l_bkpts_t(i).bkpt_rate;
5313 
5314           ELSIF l_net_volume > l_bkpt_end THEN
5315 
5316             l_trx_hdr_rec.calculated_rent_for
5317             := l_trx_hdr_rec.calculated_rent_for
5318                + (l_bkpt_end - l_bkpt_start) * l_bkpts_t(i).bkpt_rate;
5319              pnp_debug_pkg.log('rent:'||l_trx_hdr_rec.calculated_rent_for);
5320 
5321           END IF;
5322 
5323         ELSE
5324 
5325           EXIT;
5326 
5327         END IF; /* net vol > bkpt start */
5328 
5329       END LOOP; /* loop for all bkpt details */
5330 
5331     ELSIF l_bkpt_type IN ( pn_var_rent_calc_pkg.G_BKPT_TYP_FLAT
5332                           ,pn_var_rent_calc_pkg.G_BKPT_TYP_SLIDING)
5333     THEN
5334 
5335       FOR i IN l_bkpts_t.FIRST..l_bkpts_t.LAST LOOP
5336 
5337         IF g_calculation_method IN ( pn_var_rent_calc_pkg.G_CALC_NON_CUMULATIVE
5338                                     ,pn_var_rent_calc_pkg.G_CALC_TRUE_UP)
5339         THEN
5340 
5341             l_bkpt_start := l_bkpts_t(i).prorated_grp_vol_start;
5342             l_bkpt_end   := l_bkpts_t(i).prorated_grp_vol_end;
5343 
5344 
5345         ELSIF g_calculation_method = pn_var_rent_calc_pkg.G_CALC_CUMULATIVE
5346         THEN
5347 
5348           IF g_proration_rule = pn_var_rent_calc_pkg.G_PRORUL_NP THEN
5349 
5350             l_bkpt_start := l_bkpts_t(i).prorated_grp_vol_start;
5351             l_bkpt_end   := l_bkpts_t(i).prorated_grp_vol_end;
5352 
5353           ELSE
5354 
5355           l_bkpt_start := l_bkpts_t(i).blended_period_vol_start;
5356           l_bkpt_end   := l_bkpts_t(i).blended_period_vol_end;
5357 
5358           END IF;
5359 
5360         ELSIF g_calculation_method = pn_var_rent_calc_pkg.G_CALC_YTD
5361         THEN
5362 
5363           l_bkpt_start := l_bkpts_t(i).ytd_group_vol_start;
5364           l_bkpt_end   := l_bkpts_t(i).ytd_group_vol_end;
5365 
5366         END IF; /* g_calculation_method */
5367 
5368         IF l_bkpt_end IS NULL OR l_bkpt_end = 0 THEN
5369           l_bkpt_end := NULL;
5370         END IF;
5371 
5372         IF l_net_volume >= l_bkpt_start AND
5373            l_net_volume <= NVL(l_bkpt_end, l_net_volume)
5374         THEN
5375 
5376           IF l_bkpt_type = pn_var_rent_calc_pkg.G_BKPT_TYP_SLIDING THEN
5377 
5378             l_trx_hdr_rec.calculated_rent_for
5379             := l_net_volume * l_bkpts_t(i).bkpt_rate;
5380 
5381           ELSIF l_bkpt_type = pn_var_rent_calc_pkg.G_BKPT_TYP_FLAT THEN
5382 
5383             l_trx_hdr_rec.calculated_rent_for
5384             := (l_net_volume - l_bkpt_start) * l_bkpts_t(i).bkpt_rate;
5385           pnp_debug_pkg.log('calculated_rent_for:'||l_trx_hdr_rec.calculated_rent_for);
5386           END IF;
5387           EXIT;
5388 
5389         END IF;
5390 
5391       END LOOP;
5392 
5393     END IF; /* breakpoint type */
5394 
5395     /* ---------------------- GET calculated_rent END ---------------------- */
5396 
5397     /* at this point, we have the calculated rent
5398        need to find
5399        - percent rent due for
5400        - ytd percent rent for */
5401 
5402 
5403     /* ------------ GET percent_rent_due for, ytd_percent_rent_for START ------------ */
5404 
5405 
5406     l_prev_billed
5407           := pn_var_rent_calc_pkg.find_prev_billed_for
5408               ( p_var_rent_id      => l_trx_hdr_rec.var_rent_id
5409                ,p_period_id        => l_trx_hdr_rec.period_id
5410                ,p_line_item_id     => l_trx_hdr_rec.line_item_id
5411                ,p_calc_prd_st_dt   => l_trx_hdr_rec.calc_prd_start_date
5412                ,p_calc_prd_end_dt  => l_trx_hdr_rec.calc_prd_end_date
5413                ,p_reset_grp_id     => l_trx_hdr_rec.reset_group_id);
5414 
5415 
5416     IF g_calculation_method IN ( pn_var_rent_calc_pkg.G_CALC_NON_CUMULATIVE
5417                                 ,pn_var_rent_calc_pkg.G_CALC_TRUE_UP)
5418     THEN
5419 
5420       l_trx_hdr_rec.ytd_percent_rent_for := l_prev_billed + l_trx_hdr_rec.percent_rent_due_for;
5421       l_trx_hdr_rec.percent_rent_due_for := l_trx_hdr_rec.calculated_rent_for;
5422 
5423     ELSIF g_calculation_method IN ( pn_var_rent_calc_pkg.G_CALC_CUMULATIVE
5424                                    ,pn_var_rent_calc_pkg.G_CALC_YTD)
5425     THEN
5426 
5427         l_trx_hdr_rec.percent_rent_due_for
5428           := l_trx_hdr_rec.calculated_rent_for - l_prev_billed;
5429 
5430       /* need to
5431          - apply constraints on l_trx_hdr_rec.percent_rent_due
5432          - update l_trx_hdr_rec.percent_rent_due
5433          - then get the YTD
5434       */
5435       l_trx_hdr_rec.ytd_percent_rent_for
5436         := l_prev_billed + l_trx_hdr_rec.percent_rent_due_for;
5437     END IF;
5438 
5439       FOR period_num_rec IN period_num_c (p_vr_id => l_trx_hdr_rec.var_rent_id)
5440   LOOP
5441 
5442     l_period_num := period_num_rec.perion_num;
5443 
5444   END LOOP;
5445 
5446   FOR last_period_rec IN last_period_c (p_vr_id => l_trx_hdr_rec.var_rent_id)
5447   LOOP
5448 
5449     l_last_partial := last_period_rec.partial_period;
5450 
5451   END LOOP;
5452 
5453   FOR first_period_rec IN first_period_c (p_vr_id => l_trx_hdr_rec.var_rent_id)
5454   LOOP
5455 
5456     l_first_partial := first_period_rec.partial_period;
5457 
5458   END LOOP;
5459 
5460   /* IMP: This condition is to nullify the rents for a special case.
5461      The case is for First-LAst year, when we have just 2 periods and
5462      first year and last year period is partial, in such a case we dont
5463      want to calculate the rent.
5464   IF g_proration_rule IN (pn_var_rent_calc_pkg.G_PRORUL_FLY) AND
5465      l_period_num = 2 AND l_first_partial = 'Y' AND
5466      l_last_partial = 'Y'
5467   THEN
5468     l_trx_hdr_rec.percent_rent_due_for := 0;
5469     l_trx_hdr_rec.ytd_percent_rent_for := 0;
5470     l_trx_hdr_rec.calculated_rent_for  := 0;
5471   END IF;   */
5472 
5473 
5474   pnp_debug_pkg.log(' ');
5475   pnp_debug_pkg.log(' calculation_method: '||g_calculation_method);
5476   pnp_debug_pkg.log(' percent_rent_due: '||l_trx_hdr_rec.percent_rent_due_for);
5477   pnp_debug_pkg.log(' ytd_percent_rent: '||l_trx_hdr_rec.ytd_percent_rent_for);
5478   pnp_debug_pkg.log(' ');
5479 
5480 
5481     /* ------------- GET percent_rent_due, ytd_percent_rent END ------------- */
5482 
5483   END IF; /* volume trips breakpoint?? */
5484   pnp_debug_pkg.log('percent_rent_due_for:'||l_trx_hdr_rec.percent_rent_due_for);
5485   pnp_debug_pkg.log('ytd_rent_for:'||l_trx_hdr_rec.ytd_percent_rent_for);
5486   l_trx_hdr_rec.update_flag := 'Y';
5487   p_trx_hdr_rec := l_trx_hdr_rec;
5488   pnp_debug_pkg.log('------------end get_rent_applicable---------');
5489 
5490 EXCEPTION
5491   WHEN OTHERS THEN RAISE;
5492 
5493 END get_rent_applicable_for;
5494 
5495 --------------------------------------------------------------------------------
5496 --  NAME         : find_prev_billed_for
5497 --  DESCRIPTION  :
5498 --  PURPOSE      :
5499 --  INVOKED FROM :
5500 --  ARGUMENTS    :
5501 --  REFERENCE    :
5502 --  HISTORY      :
5503 --
5504 --  18.Sep.06  Shabda     o Created
5505 --------------------------------------------------------------------------------
5506 FUNCTION find_prev_billed_for( p_var_rent_id      IN NUMBER
5507                               ,p_period_id        IN NUMBER
5508                               ,p_line_item_id     IN NUMBER
5509                               ,p_calc_prd_st_dt   IN DATE
5510                               ,p_calc_prd_end_dt  IN DATE
5511                               ,p_reset_grp_id     IN NUMBER)
5512 RETURN NUMBER IS
5513 
5514   /* get previous billed */
5515   CURSOR prev_billed_for_c( p_vr_id      IN NUMBER
5516                            ,p_prd_id     IN NUMBER
5517                            ,p_line_id    IN NUMBER
5518                            ,p_rst_grp_id IN NUMBER
5519                            ,p_date       IN DATE) IS
5520     SELECT NVL(SUM(percent_rent_due_for), 0) AS prev_billed_amt
5521     FROM
5522     pn_var_trx_headers_all
5523     WHERE
5524     var_rent_id = p_vr_id AND
5525     period_id = p_prd_id AND
5526     line_item_id = p_line_id AND
5527     reset_group_id = p_rst_grp_id AND
5528     calc_prd_start_date < p_date;
5529 
5530   l_prev_billed_rent NUMBER;
5531 
5532 BEGIN
5533 
5534   l_prev_billed_rent := 0;
5535 
5536   FOR rec IN prev_billed_for_c( p_vr_id      => p_var_rent_id
5537                            ,p_prd_id     => p_period_id
5538                            ,p_line_id    => p_line_item_id
5539                            ,p_rst_grp_id => p_reset_grp_id
5540                            ,p_date       => p_calc_prd_st_dt) LOOP
5541 
5542     l_prev_billed_rent := rec.prev_billed_amt;
5543 
5544   END LOOP;
5545 
5546   RETURN l_prev_billed_rent;
5547 
5548 EXCEPTION
5549   WHEN OTHERS THEN RAISE;
5550 
5551 END find_prev_billed_for;
5552 
5553 --------------------------------------------------------------------------------
5554 --  NAME         : overage_cal_for
5555 --  DESCRIPTION  :
5556 --  PURPOSE      :
5557 --  INVOKED FROM :
5558 --  ARGUMENTS    :
5559 --  REFERENCE    :
5560 --  HISTORY      :
5561 --
5562 --  3.Nov.06  Ram Kumar     o Created
5563 --------------------------------------------------------------------------------
5564 FUNCTION overage_cal_for( p_proration_rule     IN VARCHAR2,
5565                           p_calculation_method IN VARCHAR2,
5566                           detail_id            IN NUMBER) RETURN NUMBER IS
5567 
5568 l_bkpt_start                     NUMBER := 0;
5569 l_bkpt_end                       NUMBER := 0;
5570 overage                          NUMBER :=  0;
5571 l_applicable_sales               NUMBER := 0;
5572 
5573 
5574 CURSOR overage_cur IS
5575   SELECT  dtls.prorated_grp_vol_start,
5576           dtls.prorated_grp_vol_end,
5577           dtls.ytd_group_vol_start,
5578           dtls.ytd_group_vol_end,
5579           dtls.blended_period_vol_start,
5580           dtls.blended_period_vol_end,
5581           hdr.prorated_group_sales_for,
5582           hdr.ytd_sales_for
5583   FROM    pn_var_trx_headers_all hdr,
5584           pn_var_trx_details_all dtls
5585   WHERE   hdr.trx_header_id=dtls.trx_header_id
5586   AND dtls.trx_detail_id = detail_id;
5587 
5588 BEGIN
5589 
5590   FOR overage_rec IN overage_cur LOOP
5591 
5592     IF  p_calculation_method IN ('N', 'T')
5593     THEN
5594       l_applicable_sales := (overage_rec.prorated_group_sales_for);
5595 
5596     ELSIF p_calculation_method IN ('Y', 'C')
5597     THEN
5598       l_applicable_sales := (overage_rec.ytd_sales_for);
5599 
5600     END IF;
5601 
5602     IF  p_calculation_method IN ('N', 'T')
5603     THEN
5604 
5605       l_bkpt_start := overage_rec.prorated_grp_vol_start;
5606       l_bkpt_end   := overage_rec.prorated_grp_vol_end;
5607 
5608     ELSIF p_calculation_method IN ('Y')
5609     THEN
5610 
5611       l_bkpt_start  :=   overage_rec.ytd_group_vol_start;
5612       l_bkpt_end    :=   overage_rec.ytd_group_vol_end;
5613 
5614     ELSIF p_calculation_method IN ('C')
5615     THEN
5616 
5617       IF p_proration_rule IN ('NP') THEN
5618 
5619         l_bkpt_start := overage_rec.prorated_grp_vol_start;
5620         l_bkpt_end   := overage_rec.prorated_grp_vol_end;
5621 
5622       ELSE
5623 
5624         l_bkpt_start := overage_rec.blended_period_vol_start;
5625         l_bkpt_end   := overage_rec.blended_period_vol_end;
5626 
5627       END IF;
5628 
5629     END IF;
5630 
5631 
5632     IF(l_bkpt_end = 0) THEN
5633        overage := greatest(l_applicable_sales - l_bkpt_start,0);
5634     ELSE
5635        IF((l_applicable_sales >= l_bkpt_start) AND (l_applicable_sales <= l_bkpt_end)) THEN
5636            overage :=  l_applicable_sales - l_bkpt_start;
5637        ELSIF(l_applicable_sales > l_bkpt_end) THEN
5638            overage := l_bkpt_end - l_bkpt_start;
5639        ELSIF(l_applicable_sales < l_bkpt_start) THEN
5640            overage := 0;
5641        END IF;
5642     END IF;
5643 
5644   END LOOP;
5645 
5646   return overage;
5647 
5648   EXCEPTION
5649   WHEN OTHERS THEN RAISE;
5650 END overage_cal_for;
5651 
5652 --------------------------------------------------------------------------------
5653 --  NAME         : First_Day
5654 --  DESCRIPTION  :
5655 --  PURPOSE      :
5656 --  INVOKED FROM :
5657 --  ARGUMENTS    :
5658 --  REFERENCE    :
5659 --  HISTORY      :
5660 --
5661 --  3.Nov.06  Ram Kumar     o Created
5662 --------------------------------------------------------------------------------
5663 
5664 FUNCTION First_Day ( p_Date DATE ) RETURN DATE IS
5665 BEGIN
5666 
5667   RETURN ADD_MONTHS(LAST_DAY(p_Date) + 1,  -1);
5668 
5669  EXCEPTION
5670   WHEN OTHERS THEN RAISE;
5671 
5672 END First_Day;
5673 
5674 --------------------------------------------------------------------------------
5675 --  NAME         : inv_end_date
5676 --  DESCRIPTION  :
5677 --  PURPOSE      :
5678 --  INVOKED FROM :
5679 --  ARGUMENTS    :
5680 --  REFERENCE    :
5681 --  HISTORY      :
5682 --
5683 --  3.Nov.06  Ram Kumar     o Created
5684 --------------------------------------------------------------------------------
5685 
5686 FUNCTION inv_end_date( inv_start_date IN DATE
5687                      , vr_id IN NUMBER
5688                      , p_period_id NUMBER) RETURN DATE IS
5689 
5690 inv_end_date                  DATE;
5691 l_invg_freq_code              NUMBER;
5692 l_vr_term_date                DATE;
5693 l_proration_rule              VARCHAR2(30);
5694 l_period_end_date             DATE;
5695 l_reversed_status             VARCHAR2(30);
5696 
5697 CURSOR inv_end_date_cur IS
5698    SELECT var.termination_date,
5699           DECODE(dates.invg_freq_code,'MON',1
5700                                      ,'QTR',3
5701                                      ,'SA' ,6
5702                                      ,'YR' ,12
5703                                      ,NULL) invg_freq_code,
5704           var.proration_rule
5705    FROM   PN_VAR_RENTS_ALL var, PN_VAR_RENT_DATES_ALL dates
5706    WHERE  var.var_rent_id  = vr_id
5707    AND    dates.var_rent_id = var.var_rent_id;
5708 
5709 
5710 CURSOR inv_ed_dt_cur (p_inv_start_date DATE) IS
5711   SELECT DISTINCT inv_end_date
5712   FROM pn_var_grp_dates_all
5713   WHERE var_rent_id = vr_id
5714   AND inv_start_date = p_inv_start_date;
5715 
5716 CURSOR period_cur IS
5717   SELECT period_id, end_date
5718   FROM pn_var_periods_all
5719   WHERE var_rent_id = vr_id
5720   AND partial_period = 'Y'
5721   AND period_num = 1;
5722 
5723 CURSOR last_period_cur IS
5724   SELECT period_id,
5725          end_date,
5726          decode(status,'REVERSED','Y','N') status
5727   FROM pn_var_periods_all
5728   WHERE var_rent_id = vr_id
5729   AND period_id = p_period_id;
5730 
5731 BEGIN
5732 
5733 FOR rec IN inv_end_date_cur LOOP
5734    l_vr_term_date := rec.termination_date;
5735    l_invg_freq_code := rec.invg_freq_code;
5736    l_proration_rule := rec.proration_rule;
5737 END LOOP;
5738 
5739 IF l_proration_rule IN ('FY', 'FLY') THEN
5740    FOR rec IN period_cur LOOP
5741       IF(rec.period_id = p_period_id) THEN
5742          RETURN rec.end_date;
5743       END IF;
5744    END LOOP;
5745 END IF;
5746 
5747 inv_end_date := ADD_MONTHS(inv_start_date,l_invg_freq_code)-1;
5748 
5749 FOR rec_period_csr IN last_period_cur LOOP
5750    l_period_end_date  := rec_period_csr.end_date;
5751    l_reversed_status  := rec_period_csr.status;
5752 END LOOP;
5753 
5754 /* Case 1 - When period is active and invoice lies within new termination date */
5755 IF (inv_end_date > l_vr_term_date AND inv_start_date <= l_vr_term_date AND l_reversed_status = 'N') THEN
5756     inv_end_date := l_vr_term_date;
5757 /* Case 2 - When period is reversed */
5758 ELSIF (l_reversed_status = 'Y' AND inv_end_date >  l_period_end_date) THEN
5759     inv_end_date := l_period_end_date;
5760 /* Case 3 - When period is active and invoice lies outside new termination date */
5761 ELSIF (l_reversed_status = 'N' AND inv_start_date > l_vr_term_date) THEN
5762 
5763    FOR rec IN inv_ed_dt_cur(inv_start_date) LOOP
5764       inv_end_date := rec.inv_end_date;
5765    END LOOP;
5766 END IF;
5767 
5768 RETURN inv_end_date;
5769 
5770  EXCEPTION
5771   WHEN OTHERS THEN RAISE;
5772 
5773 END inv_end_date;
5774 
5775 --------------------------------------------------------------------------------
5776 --  NAME         : inv_start_date
5777 --  DESCRIPTION  :
5778 --  PURPOSE      :
5779 --  INVOKED FROM :
5780 --  ARGUMENTS    :
5781 --  REFERENCE    :
5782 --  HISTORY      :
5783 --
5784 --  3.Nov.06  Ram Kumar     o Created
5785 --------------------------------------------------------------------------------
5786 
5787 FUNCTION inv_start_date( inv_start_date IN DATE
5788                        , vr_id IN NUMBER
5789                        , p_period_id NUMBER) RETURN DATE IS
5790 
5791 inv_end_date                  DATE;
5792 l_invg_freq_code              NUMBER;
5793 l_vr_term_date                DATE;
5794 l_proration_rule              VARCHAR2(30);
5795 l_start_date                  DATE;
5796 
5797 CURSOR inv_start_date_cur IS
5798    SELECT var.proration_rule,
5799           var.commencement_date,
5800           var.termination_date
5801    FROM   PN_VAR_RENTS_ALL var
5802    WHERE  var.var_rent_id  = vr_id;
5803 
5804 
5805 CURSOR period_cur IS
5806   SELECT period_id, start_date
5807   FROM pn_var_periods_all
5808   WHERE var_rent_id = vr_id
5809   AND partial_period = 'Y'
5810   AND period_num = 1;
5811 
5812 CURSOR period_last_cur IS
5813   SELECT period_id, start_date
5814   FROM pn_var_periods_all
5815   WHERE var_rent_id = vr_id
5816   AND partial_period = 'Y';
5817 
5818 
5819 BEGIN
5820 
5821 FOR rec IN inv_start_date_cur LOOP
5822    l_proration_rule := rec.proration_rule;
5823    l_vr_term_date   := rec.termination_date;
5824    l_start_date     := rec.commencement_date;
5825 END LOOP;
5826 
5827 
5828 IF l_proration_rule IN ('LY', 'FLY') THEN
5829    FOR rec IN period_last_cur LOOP
5830       IF(rec.period_id = p_period_id) THEN
5831          IF(pn_var_rent_calc_pkg.inv_end_date(inv_start_date,vr_id,p_period_id) = l_vr_term_date) THEN
5832             RETURN rec.start_date;
5833          END IF;
5834       END IF;
5835    END LOOP;
5836 END IF;
5837 
5838 IF l_proration_rule IN ('FY', 'FLY') THEN
5839    FOR rec IN period_cur LOOP
5840       IF(rec.period_id = p_period_id) THEN
5841          RETURN rec.start_date;
5842       END IF;
5843    END LOOP;
5844 END IF;
5845 
5846 IF l_start_date > inv_start_date THEN
5847    RETURN l_start_date;
5848 ELSE
5849    RETURN inv_start_date;
5850 END IF;
5851 
5852  EXCEPTION
5853   WHEN OTHERS THEN RAISE;
5854 
5855 END inv_start_date;
5856 
5857 --------------------------------------------------------------------------------
5858 --  NAME         : INV_SCH_DATE
5859 --  DESCRIPTION  :
5860 --  PURPOSE      :
5861 --  INVOKED FROM :
5862 --  ARGUMENTS    :
5863 --  REFERENCE    :
5864 --  HISTORY      :
5865 --
5866 --  3.Nov.06  Ram Kumar     o Created
5867 -- 02-APR-06  sdmahesh      o Bug # 5962894
5868 --                            Used PN_VAR_RENT_CALC_PKG.INV_END_DATE to find
5869 --                            INV_END_DATE
5870 --------------------------------------------------------------------------------
5871 
5872 FUNCTION inv_sch_date(inv_start_date IN DATE
5873                      ,vr_id IN NUMBER
5874                      ,p_period_id NUMBER) RETURN DATE IS
5875 
5876 
5877 inv_end_date                  DATE := NULL;
5878 inv_schedule_date             DATE := NULL;
5879 l_invg_day_of_month           NUMBER;
5880 l_invg_days_after             NUMBER;
5881 l_invg_freq_code              NUMBER;
5882 l_vr_term_date                DATE;
5883 l_proration_rule              VARCHAR2(30);
5884 
5885  CURSOR inv_sch_date_cur IS
5886    SELECT dates.invg_day_of_month,
5887           dates.invg_days_after,
5888           var.termination_date,
5889           var.proration_rule,
5890           DECODE(dates.invg_freq_code,'MON',1
5891                                      ,'QTR',3
5892                                      ,'SA' ,6
5893                                      ,'YR' ,12
5894                                      ,NULL) invg_freq_code
5895    FROM   PN_VAR_RENTS_ALL var, PN_VAR_RENT_DATES_ALL dates
5896    WHERE  var.var_rent_id  = vr_id
5897    AND    dates.var_rent_id = var.var_rent_id;
5898 
5899 CURSOR last_period_cur IS
5900   SELECT period_id,
5901          decode(status,'REVERSED','Y','N') status
5902   FROM pn_var_periods_all
5903   WHERE var_rent_id = vr_id
5904   AND period_id = p_period_id;
5905 
5906 CURSOR period_cur IS
5907   SELECT period_id, start_date
5908   FROM pn_var_periods_all
5909   WHERE var_rent_id = vr_id
5910   AND partial_period = 'Y'
5911   AND period_num = 1;
5912 
5913 CURSOR first_period_cur IS
5914   SELECT period_id
5915   FROM pn_var_rent_summ_all
5916   WHERE var_rent_id = vr_id
5917   AND nvl(first_yr_rent,0) <> 0
5918   AND rownum < 2;
5919 
5920 BEGIN
5921 
5922 FOR rec IN inv_sch_date_cur LOOP
5923    l_invg_day_of_month := rec.invg_day_of_month;
5924    l_invg_days_after := rec.invg_days_after;
5925    l_vr_term_date := rec.termination_date;
5926    l_invg_freq_code := rec.invg_freq_code;
5927    l_proration_rule := rec.proration_rule;
5928 END LOOP;
5929 
5930 FOR rec_period_csr IN last_period_cur LOOP
5931 
5932    inv_end_date := pn_var_rent_calc_pkg.inv_end_date(inv_start_date,
5933                                                      vr_id,
5934                                                      rec_period_csr.period_id);
5935 
5936 END LOOP;
5937 
5938 IF l_proration_rule IN ('FY', 'FLY') THEN
5939    FOR rec IN period_cur LOOP
5940       IF(rec.period_id = p_period_id) THEN
5941          --
5942          FOR rec_first_prd IN first_period_cur LOOP
5943             inv_end_date := pn_var_rent_calc_pkg.inv_end_date(inv_start_date,
5944                                                      vr_id,
5945                                                      rec_first_prd.period_id);
5946          END LOOP;
5947       END IF;
5948    END LOOP;
5949 END IF;
5950 
5951 
5952   inv_schedule_date :=
5953     NVL( ((ADD_MONTHS(pn_var_rent_calc_pkg.First_Day(inv_end_date),1)-1) + l_invg_day_of_month),
5954             (inv_end_date + nvl(l_invg_days_after,0)) );
5955 
5956   ------------------------------------------------------------
5957   -- takes care of the only 28 days for the schedule day
5958   ------------------------------------------------------------
5959   IF TO_NUMBER(TO_CHAR(inv_schedule_date,'dd')) in (29,30,31) THEN
5960     inv_schedule_date := (pn_var_rent_calc_pkg.First_Day(inv_schedule_date)+27);
5961   END IF;
5962   ------------------------------------------------------------
5963 
5964 RETURN inv_schedule_date;
5965 
5966  EXCEPTION
5967   WHEN OTHERS THEN RAISE;
5968 
5969 END inv_sch_date;
5970 --------------------------------------------------------------------------------
5971 --  NAME         : Post_summary_for
5972 --  DESCRIPTION  :
5973 --  PURPOSE      :
5974 --  INVOKED FROM :
5975 --  ARGUMENTS    :
5976 --  REFERENCE    :
5977 --  HISTORY      :
5978 --
5979 --  18.Sep.06  Shabda     o Created
5980 --  21-MAY-07  Lokesh     o Added rounding off for bug # 6031202 in
5981 --                          pn_var_rent_summ_all
5982 --------------------------------------------------------------------------------
5983 PROCEDURE post_summary_for ( p_var_rent_id  IN NUMBER
5984                         ,p_period_id    IN NUMBER
5985                         ,p_line_item_id IN NUMBER
5986                         ,p_grp_date_id  IN NUMBER)
5987 IS
5988 
5989   /* get grp date */
5990   CURSOR grp_date_c( p_vr_id  IN NUMBER
5991                     ,p_prd_id IN NUMBER
5992                     ,p_grp_id IN NUMBER) IS
5993     SELECT
5994      grp.grp_date_id
5995     ,grp.group_date
5996     ,grp.invoice_date
5997     ,grp.org_id
5998     FROM
5999     pn_var_grp_dates_all grp
6000     WHERE
6001     grp.var_rent_id = p_vr_id  AND
6002     grp.period_id   = p_prd_id AND
6003     grp.grp_date_id = p_grp_id;
6004 
6005   /* Get rent and volume to store in pn_var_rent_summ_all */
6006   CURSOR summ_c( p_vr_id   IN NUMBER
6007                 ,p_prd_id  IN NUMBER
6008                 ,p_line_id IN NUMBER
6009                 ,p_grp_id  IN NUMBER) IS
6010     SELECT
6011      NVL(SUM(hdr.percent_rent_due_for)
6012          , 0) AS rent
6013     ,NVL(SUM(hdr.prorated_group_sales_for)
6014          , 0) AS sales
6015     FROM
6016     pn_var_trx_headers_all hdr
6017     WHERE
6018     hdr.var_rent_id  = p_vr_id AND
6019     hdr.period_id    = p_prd_id AND
6020     hdr.line_item_id = p_line_id AND
6021     hdr.grp_date_id  = p_grp_id;
6022 
6023   /* exists VR summ record */
6024   CURSOR vr_summ_c ( p_vr_id  IN NUMBER
6025                     ,p_prd_id IN NUMBER
6026                     ,p_line_id IN NUMBER
6027                     ,p_grp_id IN NUMBER) IS
6028     SELECT
6029     var_rent_summ_id
6030     FROM
6031     pn_var_rent_summ_all
6032     WHERE
6033     var_rent_id = p_vr_id AND
6034     period_id = p_prd_id AND
6035     line_item_id = p_line_id AND
6036     grp_date_id = p_grp_id;
6037 
6038   l_vr_summ_id NUMBER;
6039 
6040 BEGIN
6041 
6042   /* get the invoice date for the group
6043      loops only once
6044   */
6045   FOR grp_rec IN grp_date_c( p_vr_id  => p_var_rent_id
6046                             ,p_prd_id => p_period_id
6047                             ,p_grp_id => p_grp_date_id)
6048   LOOP
6049 
6050     /* get the sum of rents and sales for
6051        vr -> period -> line item -> group combination
6052        from the trx tables
6053        loops only once
6054     */
6055     FOR summ_rec IN summ_c( p_vr_id   => p_var_rent_id
6056                            ,p_prd_id  => p_period_id
6057                            ,p_line_id => p_line_item_id
6058                            ,p_grp_id  => p_grp_date_id)
6059     LOOP
6060 
6061       l_vr_summ_id := NULL;
6062 
6063       /* chk if VR SUMM record exists for this
6064          vr -> period -> line item -> group combination */
6065       FOR vr_summ_rec IN vr_summ_c( p_vr_id   => p_var_rent_id
6066                                    ,p_prd_id  => p_period_id
6067                                    ,p_line_id => p_line_item_id
6068                                    ,p_grp_id  => p_grp_date_id)
6069       LOOP
6070         l_vr_summ_id := vr_summ_rec.var_rent_summ_id;
6071       END LOOP;
6072 
6073       IF l_vr_summ_id IS NULL THEN
6074 
6075         /* to insert a new summary record */
6076         INSERT INTO
6077         pn_var_rent_summ_all
6078           (var_rent_summ_id
6079           ,var_rent_id
6080           ,period_id
6081           ,line_item_id
6082           ,invoice_date
6083           ,tot_for_vol
6084           ,for_var_rent
6085           ,grp_date_id
6086           ,group_date
6087           ,last_update_date
6088           ,last_updated_by
6089           ,creation_date
6090           ,created_by
6091           ,last_update_login
6092           ,org_id)
6093         VALUES
6094           (pn_var_rent_summ_s.NEXTVAL
6095           ,p_var_rent_id
6096           ,p_period_id
6097           ,p_line_item_id
6098           ,grp_rec.invoice_date
6099           ,summ_rec.sales
6100           ,round(summ_rec.rent,g_precision)
6101           ,grp_rec.grp_date_id
6102           ,grp_rec.group_date
6103           ,SYSDATE
6104           ,NVL(fnd_global.user_id, 0)
6105           ,SYSDATE
6106           ,NVL(fnd_global.user_id, 0)
6107           ,NVL(fnd_global.login_id, 0)
6108           ,NVL(grp_rec.org_id, g_org_id))
6109         RETURNING
6110         var_rent_summ_id
6111         INTO
6112         l_vr_summ_id;
6113 
6114       ELSIF l_vr_summ_id IS NOT NULL THEN
6115         /* update the summary record */
6116 
6117         UPDATE
6118         pn_var_rent_summ_all
6119         SET
6120          tot_for_vol  = summ_rec.sales
6121         ,for_var_rent = round(summ_rec.rent,g_precision)
6122         ,last_update_date  = SYSDATE
6123         ,last_updated_by   = NVL(fnd_global.user_id, 0)
6124         ,last_update_login = NVL(fnd_global.login_id, 0)
6125         WHERE
6126         var_rent_summ_id = l_vr_summ_id;
6127 
6128       END IF;
6129 
6130       UPDATE
6131       pn_var_trx_headers_all hdr
6132       SET
6133       hdr.var_rent_summ_id = l_vr_summ_id
6134       WHERE
6135       hdr.var_rent_id  = p_var_rent_id AND
6136       hdr.period_id    = p_period_id AND
6137       hdr.line_item_id = p_line_item_id AND
6138       hdr.grp_date_id  = p_grp_date_id;
6139 
6140       EXIT;
6141 
6142     END LOOP;
6143 
6144     EXIT;
6145 
6146   END LOOP;
6147 
6148 EXCEPTION
6149   WHEN OTHERS THEN RAISE;
6150 
6151 END post_summary_for;
6152 
6153 
6154 --------------------------------------------------------------------------------
6155 --  NAME         : post_summary_for
6156 --  DESCRIPTION  :
6157 --  PURPOSE      :
6158 --  INVOKED FROM :
6159 --  ARGUMENTS    :
6160 --  REFERENCE    :
6161 --  HISTORY      :
6162 --
6163 --  18.Sep.06  Shabda     o Created
6164 --  21-MAY-07  Lokesh     o Added rounding off for bug # 6031202 in
6165 --                          pn_var_rent_summ_all
6166 --------------------------------------------------------------------------------
6167 PROCEDURE post_summary_for ( p_var_rent_id  IN NUMBER
6168                         ,p_period_id    IN NUMBER)
6169 IS
6170 
6171   /* get all lines */
6172   CURSOR lines_c( p_vr_id  IN NUMBER
6173                  ,p_prd_id IN NUMBER) IS
6174     SELECT
6175     line_item_id
6176     FROM
6177     pn_var_lines_all
6178     WHERE
6179     var_rent_id = p_vr_id AND
6180     period_id = p_prd_id;
6181 
6182   /* get grp date */
6183   CURSOR grp_date_c( p_vr_id  IN NUMBER
6184                     ,p_prd_id IN NUMBER) IS
6185     SELECT
6186      grp.grp_date_id
6187     ,grp.group_date
6188     ,grp.invoice_date
6189     ,grp.org_id
6190     FROM
6191      pn_var_grp_dates_all grp
6192     ,pn_var_periods_all   prd
6193     WHERE
6194     prd.var_rent_id = p_vr_id  AND
6195     prd.period_id   = p_prd_id AND
6196     grp.period_id   = prd.period_id AND
6197     grp.grp_end_date <= prd.end_date;
6198 
6199   TYPE GRP_TBL IS TABLE OF grp_date_c%ROWTYPE INDEX BY BINARY_INTEGER;
6200   l_grp_t GRP_TBL;
6201 
6202   /* Get rent and volume to store in pn_var_rent_summ_all */
6203   CURSOR summ_c( p_vr_id   IN NUMBER
6204                 ,p_prd_id  IN NUMBER
6205                 ,p_line_id IN NUMBER
6206                 ,p_grp_id  IN NUMBER) IS
6207     SELECT
6208      NVL(SUM(hdr.percent_rent_due_for)
6209          , 0) AS rent
6210     ,NVL(SUM(hdr.prorated_group_sales_for)
6211          , 0) AS sales
6212     FROM
6213     pn_var_trx_headers_all hdr
6214     WHERE
6215     hdr.var_rent_id  = p_vr_id AND
6216     hdr.period_id    = p_prd_id AND
6217     hdr.line_item_id = p_line_id AND
6218     hdr.grp_date_id  = p_grp_id;
6219 
6220   /* exists VR summ record */
6221   CURSOR vr_summ_c ( p_vr_id  IN NUMBER
6222                     ,p_prd_id IN NUMBER
6223                     ,p_line_id IN NUMBER
6224                     ,p_grp_id IN NUMBER) IS
6225     SELECT
6226      var_rent_summ_id
6227     ,tot_for_vol
6228     ,for_var_rent
6229     FROM
6230     pn_var_rent_summ_all
6231     WHERE
6232     var_rent_id = p_vr_id AND
6233     period_id = p_prd_id AND
6234     line_item_id = p_line_id AND
6235     grp_date_id = p_grp_id;
6236 
6237   l_vr_summ_id NUMBER;
6238 
6239 BEGIN
6240 
6241   l_grp_t.DELETE;
6242 
6243   OPEN grp_date_c( p_vr_id  => p_var_rent_id
6244                   ,p_prd_id => p_period_id);
6245   FETCH grp_date_c BULK COLLECT INTO l_grp_t;
6246   CLOSE grp_date_c;
6247   pnp_debug_pkg.log('total groups:'||l_grp_t.COUNT);
6248   /* loop for all lines in the annual period */
6249   FOR line_rec IN lines_c( p_vr_id  => p_var_rent_id
6250                           ,p_prd_id => p_period_id)
6251   LOOP
6252     pnp_debug_pkg.log('looping for line:'||line_rec.line_item_id);
6253     /* loop for all calc periods in the annual period */
6254     FOR g IN 1..l_grp_t.COUNT LOOP
6255       pnp_debug_pkg.log('looping for group:'||l_grp_t(g).grp_date_id);
6256       /* get the sum of rents and sales for
6257          vr -> period -> line item -> group combination
6258          from the trx tables
6259          -- loops only once --
6260       */
6261       FOR summ_rec IN summ_c( p_vr_id   => p_var_rent_id
6262                              ,p_prd_id  => p_period_id
6263                              ,p_line_id => line_rec.line_item_id
6264                              ,p_grp_id  => l_grp_t(g).grp_date_id)
6265       LOOP
6266 
6267         l_vr_summ_id := NULL;
6268         pnp_debug_pkg.log('rent'||summ_rec.rent);
6269         /* chk if VR SUMM record exists for this
6270            vr -> period -> line item -> group combination */
6271         FOR vr_summ_rec IN vr_summ_c( p_vr_id   => p_var_rent_id
6272                                      ,p_prd_id  => p_period_id
6273                                      ,p_line_id => line_rec.line_item_id
6274                                      ,p_grp_id  => l_grp_t(g).grp_date_id)
6275         LOOP
6276 
6277           l_vr_summ_id := vr_summ_rec.var_rent_summ_id;
6278 
6279           IF NVL(summ_rec.sales,0) <> NVL(vr_summ_rec.tot_for_vol,0) OR
6280              NVL(summ_rec.rent,0)  <> NVL(vr_summ_rec.for_var_rent,0)
6281           THEN
6282             pnp_debug_pkg.log('sales:'||summ_rec.sales);
6283             pnp_debug_pkg.log('rent: '||summ_rec.rent);
6284             UPDATE
6285             pn_var_rent_summ_all
6286             SET
6287              tot_for_vol  = summ_rec.sales
6288             ,for_var_rent = round(summ_rec.rent,g_precision)
6289             ,last_update_date  = SYSDATE
6290             ,last_updated_by   = NVL(fnd_global.user_id, 0)
6291             ,last_update_login = NVL(fnd_global.login_id, 0)
6292             WHERE
6293             var_rent_summ_id = l_vr_summ_id;
6294 
6295           END IF;
6296 
6297         END LOOP; /* chk if VR SUMM exists vr -> prd -> line -> grp combo */
6298 
6299         IF l_vr_summ_id IS NULL THEN
6300 
6301           /* to insert a new summary record */
6302           pnp_debug_pkg.log('Inserting a new record for var_rent_summ table');
6303           INSERT INTO
6304           pn_var_rent_summ_all
6305             (var_rent_summ_id
6306             ,var_rent_id
6307             ,period_id
6308             ,line_item_id
6309             ,invoice_date
6310             ,tot_for_vol
6311             ,for_var_rent
6312             ,grp_date_id
6313             ,group_date
6314             ,last_update_date
6315             ,last_updated_by
6316             ,creation_date
6317             ,created_by
6318             ,last_update_login
6319             ,org_id)
6320           VALUES
6321             (pn_var_rent_summ_s.NEXTVAL
6322             ,p_var_rent_id
6323             ,p_period_id
6324             ,line_rec.line_item_id
6325             ,l_grp_t(g).invoice_date
6326             ,summ_rec.sales
6327             ,round(summ_rec.rent,g_precision)
6328             ,l_grp_t(g).grp_date_id
6329             ,l_grp_t(g).group_date
6330             ,SYSDATE
6331             ,NVL(fnd_global.user_id, 0)
6332             ,SYSDATE
6333             ,NVL(fnd_global.user_id, 0)
6334             ,NVL(fnd_global.login_id, 0)
6335             ,NVL(l_grp_t(g).org_id, g_org_id))
6336           RETURNING
6337           var_rent_summ_id
6338           INTO
6339           l_vr_summ_id;
6340           pnp_debug_pkg.log('Inserted rent summ with id: '||l_vr_summ_id);
6341         END IF;
6342         UPDATE
6343         pn_var_trx_headers_all hdr
6344         SET
6345         hdr.var_rent_summ_id = l_vr_summ_id
6346         WHERE
6347         hdr.var_rent_id  = p_var_rent_id AND
6348         hdr.period_id    = p_period_id AND
6349         hdr.line_item_id = line_rec.line_item_id AND
6350         hdr.grp_date_id  = l_grp_t(g).grp_date_id;
6351 
6352         EXIT;
6353 
6354       END LOOP; /* get the sum of rents and sales for
6355                    vr -> period -> line item -> group combination */
6356 
6357     END LOOP; /* loop for all calc periods in the annual period */
6358 
6359   END LOOP; /* loop for all lines in the annual period */
6360 
6361 EXCEPTION
6362   WHEN OTHERS THEN RAISE;
6363 
6364 END post_summary_for;
6365 /*end forecasted data procedures*/
6366 
6367 
6368 --------------------------------------------------------------------------------
6369 --
6370 --  NAME         :
6371 --  DESCRIPTION  :
6372 --  PURPOSE      :
6373 --  INVOKED FROM :
6374 --  ARGUMENTS    :
6375 --  REFERENCE    : PN_COMMON.debug()
6376 --  HISTORY      : Shabda. Set global variables g_calc_type and g_invoice_on.
6377 --
6378 --  dd-mon-yyyy  name     o Created
6379 --  21-AUG-2008  acprakas o Bug#6849764. Modified to pass rec_get_per.period_id for period id while calling
6380 --                          pn_var_rent_calc_pkg.calculate_rent.
6381 --  15-JUN-2009  jsundara o Bug#6691869. Modified to skip the calculation of VRs having calculation method "Manual".
6382 --  08-NOV-2010  jsundara o Bug#9765197. Modified cursor csr_get_vrent_wprop
6383 --------------------------------------------------------------------------------
6384 PROCEDURE process_rent_batch ( errbuf                OUT NOCOPY  VARCHAR2,
6385                                retcode               OUT NOCOPY  VARCHAR2,
6386                                p_property_code       IN  VARCHAR2,
6387                                p_property_name       IN  VARCHAR2,
6388                                p_lease_num_from      IN  VARCHAR2,
6389                                p_lease_num_to        IN  VARCHAR2,
6390                                p_location_code_from  IN  VARCHAR2,
6391                                p_location_code_to    IN  VARCHAR2,
6392                                p_vrent_num_from      IN  VARCHAR2,
6393                                p_vrent_num_to        IN  VARCHAR2,
6394                                p_period_num_from     IN  NUMBER,
6395                                p_period_num_to       IN  NUMBER,
6396                                p_responsible_user    IN  NUMBER,
6397                                p_invoice_on          IN  VARCHAR2 ,
6398                                p_var_rent_id         IN  NUMBER,
6399                                p_period_id           IN  NUMBER,
6400                                p_line_item_id        IN  NUMBER,
6401                                p_invoice_date        IN  DATE,
6402                                p_calc_type           IN  VARCHAR2,
6403                                p_period_date         IN  VARCHAR2,
6404                                p_org_id              IN  NUMBER )
6405 IS
6406 
6407 l_prop_code    pn_properties_all.property_code%TYPE := p_property_code; /* 9765197 */
6408 
6409 CURSOR csr_get_vrent_wprop IS
6410 SELECT pvr.var_rent_id,
6411        pvr.invoice_on,
6412        pvr.cumulative_vol,
6413        pvr.rent_num,
6414        pl.org_id
6415 FROM   pn_leases            pl,
6416        pn_lease_details_all  pld,
6417        pn_var_rents_all      pvr,
6418        pn_locations_all      ploc
6419 WHERE  pl.lease_id = pvr.lease_id
6420 AND    pld.lease_id = pvr.lease_id
6421 AND    ploc.location_id = pvr.location_id
6422 AND    ploc.location_id IN (SELECT location_id
6423                              FROM  pn_locations_all
6424                            START WITH location_id
6425                                               IN
6426                                                 (SELECT location_id
6427                                                    FROM pn_locations_all
6428                                                   WHERE property_id IN(SELECT property_id
6429                                                                        FROM pn_properties_all
6430                                                                       WHERE property_code=NVL(l_prop_code,property_code))
6431                                                                          --OR property_name=NVL(p_property_name,property_name)) /* 9765197 */
6432                                                 )
6433                           CONNECT BY PRIOR location_id=parent_location_id)
6434 AND    pl.lease_num >= NVL(p_lease_num_from, pl.lease_num)
6435 AND    pl.lease_num <= NVL(p_lease_num_to, pl.lease_num)
6436 AND    ploc.location_code >= NVL(p_location_code_from, ploc.location_code)
6437 AND    ploc.location_code <= NVL(p_location_code_to, ploc.location_code)
6438 AND    pvr.rent_num >= NVL(p_vrent_num_from,pvr.rent_num)
6439 AND    pvr.rent_num <= NVL(p_vrent_num_to,pvr.rent_num)
6440 AND    pld.responsible_user = NVL(p_responsible_user, pld.responsible_user)
6441 AND    pvr.invoice_on = NVL(p_invoice_on,pvr.invoice_on)
6442 AND    pl.org_id = NVL(p_org_id,pl.org_id)
6443 ORDER BY pl.lease_id, pvr.var_rent_id;
6444 
6445 CURSOR csr_get_vrent_wloc IS
6446 SELECT pvr.var_rent_id,
6447        pvr.invoice_on,
6448        pvr.cumulative_vol,
6449        pvr.rent_num,
6450        pl.org_id
6451 FROM   pn_leases           pl,
6452        pn_lease_details_all  pld,
6453        pn_var_rents_all      pvr,
6454        pn_locations_all      ploc
6455 WHERE  pl.lease_id = pvr.lease_id
6456 AND    pld.lease_id = pvr.lease_id
6457 AND    ploc.location_id = pvr.location_id
6458 AND    pl.lease_num >= NVL(p_lease_num_from, pl.lease_num)
6459 AND    pl.lease_num <= NVL(p_lease_num_to, pl.lease_num)
6460 AND    ploc.location_code >= NVL(p_location_code_from, ploc.location_code)
6461 AND    ploc.location_code <= NVL(p_location_code_to, ploc.location_code)
6462 AND    pvr.rent_num >= NVL(p_vrent_num_from,pvr.rent_num)
6463 AND    pvr.rent_num <= NVL(p_vrent_num_to,pvr.rent_num)
6464 AND    pld.responsible_user = NVL(p_responsible_user, pld.responsible_user)
6465 AND    pvr.invoice_on = NVL(p_invoice_on,pvr.invoice_on)
6466 AND    pl.org_id = NVL(p_org_id,pl.org_id)
6467 ORDER BY pl.lease_id, pvr.var_rent_id;
6468 
6469 CURSOR csr_get_vrent_woloc IS
6470 SELECT pvr.var_rent_id,
6471        pvr.invoice_on,
6472        pvr.cumulative_vol,
6473        pvr.rent_num,
6474        pl.org_id
6475 FROM   pn_var_rents_all      pvr,
6476        pn_leases             pl,
6477        pn_lease_details_all  pld
6478 WHERE  pl.lease_id = pvr.lease_id
6479 AND    pld.lease_id = pvr.lease_id
6480 AND    pl.lease_num >= NVL(p_lease_num_from, pl.lease_num)
6481 AND    pl.lease_num <= NVL(p_lease_num_to, pl.lease_num)
6482 AND    pvr.rent_num >= NVL(p_vrent_num_from,pvr.rent_num)
6483 AND    pvr.rent_num <= NVL(p_vrent_num_to,pvr.rent_num)
6484 AND    pld.responsible_user = NVL(p_responsible_user, pld.responsible_user)
6485 AND    pvr.var_rent_id = NVL(p_var_rent_id,pvr.var_rent_id)
6486 AND    pvr.invoice_on = NVL(p_invoice_on,pvr.invoice_on)
6487 AND    pl.org_id = NVL(p_org_id,pl.org_id)
6488 ORDER BY pl.lease_id, pvr.var_rent_id;
6489 
6490 CURSOR csr_get_per(ip_var_rent_id NUMBER) IS
6491 SELECT period_id,
6492        period_num,
6493        start_date,
6494        end_date
6495 FROM pn_var_periods_all
6496 WHERE var_rent_id = ip_var_rent_id
6497 AND period_id = NVL(p_period_id,period_id)
6498 AND start_date <= NVL(fnd_date.canonical_to_date(p_period_date),TO_DATE('12/31/4712','mm/dd/yyyy'))
6499 AND period_num >= NVL(p_period_num_from,period_num)
6500 AND period_num <= NVL(p_period_num_to,period_num);
6501 
6502 
6503 l_var_rent_id  pn_var_rents.var_rent_id%TYPE;
6504 l_invoice_on   pn_var_rents.invoice_on%TYPE;
6505 l_cumulative   pn_var_rents.cumulative_vol%TYPE;
6506 l_rent_num     pn_var_rents.rent_num%TYPE;
6507 l_errbuf       VARCHAR2(2000);
6508 l_retcode      VARCHAR2(2000);
6509 l_ext_precision NUMBER;
6510 l_min_acct_unit NUMBER;
6511 v_var_id_details_exists NUMBER;
6512 
6513 
6514 BEGIN
6515 
6516   pnp_debug_pkg.log
6517   ('++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++');
6518   pnp_debug_pkg.log('+++++++++ process_rent_batch START +++++++++++');
6519   pnp_debug_pkg.log(' ');
6520   pnp_debug_pkg.log('Setting invoice_on and calc_type');
6521  -- g_invoice_on := p_invoice_on;
6522   g_calc_type  := p_calc_type;
6523   pnp_debug_pkg.log('g_invoice_on:'||g_invoice_on);
6524   pnp_debug_pkg.log('g_calc_type'||g_calc_type);
6525 
6526     pnp_debug_pkg.log('pn_var_rent_calc_pkg.process_rent_batch (+)' );
6527 
6528 
6529     fnd_message.set_name ('PN','PN_VRAM_PRM');
6530     fnd_message.set_token ('PT_NAME', p_property_name);
6531     fnd_message.set_token ('PT_CODE', p_property_code);
6532     fnd_message.set_token ('LSNO_FRM', p_lease_num_from);
6533     fnd_message.set_token ('LSNO_TO', p_lease_num_to);
6534     fnd_message.set_token ('LOC_FRM', p_location_code_from);
6535     fnd_message.set_token ('LOC_TO', p_location_code_to);
6536     fnd_message.set_token ('VR_FRM', p_vrent_num_from);
6537     fnd_message.set_token ('VR_TO', p_vrent_num_to);
6538     fnd_message.set_token ('PRD_FRM', p_period_num_from);
6539     fnd_message.set_token ('PRD_TO', p_period_num_to);
6540     fnd_message.set_token ('USR', p_responsible_user);
6541     fnd_message.set_token ('DATE', p_period_date);
6542     pnp_debug_pkg.put_log_msg(fnd_message.get);
6543 
6544     pnp_debug_pkg.log   ('process_rent_batch - Calculation TYPE : ' || p_calc_TYPE);
6545 
6546          IF p_property_name is not null and p_property_code is null THEN     /* 9765197 */
6547           SELECT PROPERTY_CODE
6548           into l_prop_code
6549           FROM PN_PROPERTIES_ALL
6550           where property_name = p_property_name;
6551        END IF;
6552 
6553 
6554     IF p_property_code IS NOT NULL OR p_property_name IS NOT NULL THEN
6555 
6556         OPEN csr_get_vrent_wprop;
6557 
6558 
6559     ELSIF p_location_code_from IS NOT NULL or p_location_code_to IS NOT NULL THEN
6560         -----------------------------------------------------------------------------
6561         -- Checking Location Code From, Location Code To to open appropriate cursor.
6562         -----------------------------------------------------------------------------
6563         OPEN csr_get_vrent_wloc;
6564 
6565     ELSE
6566 
6567         OPEN csr_get_vrent_woloc;
6568 
6569     END IF;
6570 
6571 
6572     LOOP
6573 
6574          IF csr_get_vrent_wprop%ISOPEN THEN
6575 
6576            FETCH csr_get_vrent_wprop INTO l_var_rent_id,l_invoice_on,l_cumulative,l_rent_num,g_org_id;
6577            EXIT WHEN csr_get_vrent_wprop%NOTFOUND;
6578            pnp_debug_pkg.log   ('process_rent_batch - Inside cur : ' );
6579          ELSIF csr_get_vrent_wloc%ISOPEN THEN
6580 
6581            FETCH csr_get_vrent_wloc INTO l_var_rent_id,l_invoice_on,l_cumulative,l_rent_num,g_org_id;
6582            EXIT WHEN csr_get_vrent_wloc%NOTFOUND;
6583 
6584          ELSIF csr_get_vrent_woloc%ISOPEN THEN
6585 
6586            FETCH csr_get_vrent_woloc INTO l_var_rent_id,l_invoice_on,l_cumulative,l_rent_num,g_org_id;
6587            EXIT WHEN csr_get_vrent_woloc%NOTFOUND;
6588 
6589          END IF;
6590 
6591        IF  l_cumulative = 'M' THEN
6592       fnd_message.set_name ('PN','PN_VAR_MANUAL_NOCALC');
6593           fnd_message.set_token ('VR_NUM',l_rent_num);
6594           pnp_debug_pkg.put_log_msg(fnd_message.get);
6595       ELSE
6596        g_invoice_on := NVL(p_invoice_on,l_invoice_on);
6597        g_precision := nvl(pn_var_rent_calc_pkg.get_currency_precision(g_org_id),4);
6598 
6599        fnd_message.set_name ('PN','PN_VRAM_VRN_PROC');
6600        fnd_message.set_token ('NUM',l_rent_num);
6601        pnp_debug_pkg.put_log_msg(fnd_message.get);
6602 
6603        pnp_debug_pkg.log   ('process_rent_batch - Variable Rent id     :'||l_var_rent_id);
6604        pnp_debug_pkg.log   ('process_rent_batch - org_id               :'||g_org_id);
6605 
6606         v_var_id_details_exists :=PN_VAR_RENT_PKG.find_if_volhist_bkpts_exist
6607                                      ( l_var_rent_id,
6608                                        'VAR_RENT_ID' );
6609 
6610        IF v_var_id_details_exists = 1 THEN
6611 
6612          FOR rec_get_per in csr_get_per(l_var_rent_id)
6613          LOOP
6614 
6615              fnd_message.set_name ('PN','PN_VRAM_PRD_PROC');
6616                   fnd_message.set_token ('NUM',rec_get_per.period_num);
6617                   pnp_debug_pkg.put_log_msg(fnd_message.get);
6618 
6619              pnp_debug_pkg.log   ('process_rent_batch - period st date : '||rec_get_per.start_date);
6620              pnp_debug_pkg.log   ('process_rent_batch - period end date: '||rec_get_per.end_date);
6621 
6622 
6623 
6624             pn_var_rent_calc_pkg.calculate_rent
6625                          (p_var_rent_id => l_var_rent_id
6626                           ,p_period_id  => rec_get_per.period_id);       --Bug#6849764
6627 
6628            END LOOP;
6629 
6630 
6631           END IF;
6632       END IF;
6633        END LOOP;
6634 
6635         IF csr_get_vrent_wloc%ISOPEN THEN
6636            CLOSE csr_get_vrent_wloc;
6637         ELSIF csr_get_vrent_woloc%ISOPEN THEN
6638            CLOSE csr_get_vrent_woloc;
6639         ELSIF csr_get_vrent_wprop%ISOPEN THEN
6640            CLOSE csr_get_vrent_wprop;
6641         END IF;
6642 
6643 
6644 
6645     pnp_debug_pkg.log(' ');
6646     pnp_debug_pkg.log('+++++++++ process_rent_batch END +++++++++++');
6647     pnp_debug_pkg.log('++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++');
6648 
6649 EXCEPTION
6650   WHEN OTHERS THEN
6651    pnp_debug_pkg.log('Error in pn_var_rent_calc_pkg.process_rent_batch :'||TO_CHAR(sqlcode)||' : '||sqlerrm);
6652    Errbuf  := SQLERRM;
6653    Retcode := 2;
6654    rollback;
6655    raise;
6656    pnp_debug_pkg.log('pn_var_rent_calc_pkg.process_rent_batch  (-) ');
6657 
6658 END process_rent_batch;
6659 
6660 FUNCTION END_BREAKPOINT(bkpt_start IN NUMBER, bkpt_end IN  NUMBER) RETURN NUMBER IS
6661 l_num  NUMBER;
6662 BEGIN
6663  IF (bkpt_end = 0) THEN
6664      l_num := NULL;
6665  ELSE
6666      l_num := bkpt_end ;
6667  END IF;
6668 
6669  RETURN l_num;
6670 END;
6671 
6672 --------------------------------------------------------------------------------
6673 --
6674 --  NAME         : prev_invoiced_amt
6675 --  DESCRIPTION  :
6676 --  PURPOSE      :
6677 --  INVOKED FROM :
6678 --  ARGUMENTS    : IN  : p_var_rent_inv_id, p_period_id
6679 --
6680 --  REFERENCE    : PN_COMMON.debug()
6681 --  HISTORY      :
6682 --
6683 --  10-NOV-2006  piagrawa     o Created
6684 --------------------------------------------------------------------------------
6685 FUNCTION prev_invoiced_amt(p_var_rent_inv_id NUMBER, p_period_id NUMBER, p_invoice_date DATE)
6686 RETURN NUMBER IS
6687 
6688 CURSOR inv_cur IS
6689   SELECT true_up_amt, actual_invoiced_amount, act_per_rent, for_per_rent, adjust_num
6690   FROM pn_var_rent_inv_all
6691   WHERE var_rent_inv_id = p_var_rent_inv_id;
6692 
6693 CURSOR inv_actual IS
6694  SELECT SUM(actual_invoiced_amount) actual
6695  FROM pn_var_rent_inv_all
6696  WHERE invoice_date = p_invoice_date
6697  AND period_id = p_period_id
6698  AND var_rent_inv_id <= p_var_rent_inv_id;
6699 
6700 CURSOR prev_inv_amt_cur(p_adjust_num NUMBER) IS
6701   SELECT sum(actual_invoiced_amount) prev_amt
6702   FROM pn_var_rent_inv_all rent_inv
6703   WHERE var_rent_inv_id < p_var_rent_inv_id
6704   AND   (true_up_amt IS NULL
6705      OR (true_up_amt IS NOT NULL))
6706   AND period_id = p_period_id;
6707 
6708 l_prev_invoiced_amt NUMBER := 0;
6709 l_actual_amt        NUMBER := 0;
6710 
6711 BEGIN
6712 
6713   FOR rec_actual IN inv_actual LOOP
6714     l_actual_amt := rec_actual.actual;
6715   END LOOP;
6716 
6717   FOR rec IN inv_cur LOOP
6718     IF rec.true_up_amt IS NULL THEN
6719 
6720        IF rec.adjust_num = 0 THEN
6721          l_prev_invoiced_amt := l_actual_amt - rec.actual_invoiced_amount + nvl(rec.for_per_rent,0);
6722        ELSIF rec.adjust_num = 1 THEN
6723          l_prev_invoiced_amt := l_actual_amt - rec.actual_invoiced_amount - nvl(rec.for_per_rent,0);
6724        ELSE
6725          l_prev_invoiced_amt := l_actual_amt - rec.actual_invoiced_amount;
6726        END IF;
6727     ELSE
6728 
6729        FOR prev_inv_rec IN prev_inv_amt_cur(rec.adjust_num) LOOP
6730          l_prev_invoiced_amt := prev_inv_rec.prev_amt;
6731        END LOOP;
6732 
6733     END IF;
6734 
6735   END LOOP;
6736 
6737   return l_prev_invoiced_amt;
6738 
6739 END prev_invoiced_amt;
6740 
6741 --------------------------------------------------------------------------------
6742 --  NAME         : last_year_bkpt
6743 --  DESCRIPTION  :
6744 --  PURPOSE      :
6745 --  INVOKED FROM :
6746 --  ARGUMENTS    :
6747 --  REFERENCE    :
6748 --  HISTORY      :
6749 --
6750 --  3.Nov.06  piagrawa    o Created
6751 --------------------------------------------------------------------------------
6752 PROCEDURE last_year_bkpt( p_vr_id           IN NUMBER
6753                           ,p_vr_comm_date     IN DATE
6754                           ,p_line_item_grp_id IN NUMBER
6755                           ,p_bkpt_rate        IN NUMBER
6756                           ,p_start_bkpt       OUT NOCOPY NUMBER
6757                           ,p_end_bkpt         OUT NOCOPY NUMBER)
6758 IS
6759 
6760   /* get LY breakpoints */
6761   CURSOR ly_bkpts_c( p_vr_id            IN NUMBER
6762                     ,p_vr_term_date     IN DATE
6763                     ,p_line_item_grp_id IN NUMBER
6764           ,p_bkpt_rate        IN NUMBER) IS
6765     SELECT
6766      NVL(SUM(ly_pr_grp_vol_start),0) AS bkpt_start
6767     ,NVL(SUM(ly_pr_grp_vol_end),0)   AS bkpt_end
6768     ,bkpt_rate
6769     FROM
6770     pn_var_trx_details_all
6771     WHERE
6772     trx_header_id IN
6773      (SELECT
6774       trx_header_id
6775       FROM
6776       pn_var_trx_headers_all
6777       WHERE
6778       var_rent_id = p_vr_id AND
6779       line_item_group_id = p_line_item_grp_id AND
6780       calc_prd_end_date >= (ADD_MONTHS(p_vr_term_date, -12) + 1))
6781     AND bkpt_rate = p_bkpt_rate
6782     GROUP BY
6783     bkpt_rate
6784     ORDER BY
6785     bkpt_start;
6786 
6787 BEGIN
6788    FOR ly_bkpts_rec IN ly_bkpts_c( p_vr_id
6789                                   ,p_vr_comm_date
6790                                   ,p_line_item_grp_id
6791                                   ,p_bkpt_rate)
6792    LOOP
6793       p_start_bkpt := ly_bkpts_rec.bkpt_start ;
6794       p_end_bkpt   := ly_bkpts_rec.bkpt_end ;
6795    END LOOP;
6796 
6797 END last_year_bkpt;
6798 
6799 --------------------------------------------------------------------------------
6800 --  NAME         : first_year_bkpt
6801 --  DESCRIPTION  :
6802 --  PURPOSE      :
6803 --  INVOKED FROM :
6804 --  ARGUMENTS    :
6805 --  REFERENCE    :
6806 --  HISTORY      :
6807 --
6808 --  3.Nov.06  piagrawa    o Created
6809 --------------------------------------------------------------------------------
6810 PROCEDURE first_year_bkpt( p_vr_id           IN NUMBER
6811                           ,p_vr_comm_date     IN DATE
6812                           ,p_line_item_grp_id IN NUMBER
6813                           ,p_bkpt_rate        IN NUMBER
6814                           ,p_start_bkpt       OUT NOCOPY NUMBER
6815                           ,p_end_bkpt         OUT NOCOPY NUMBER)
6816 IS
6817   /* get FY breakpoints */
6818   CURSOR fy_bkpts_c( p_vr_id            IN NUMBER
6819                     ,p_vr_comm_date     IN DATE
6820                     ,p_line_item_grp_id IN NUMBER
6821           ,p_bkpt_rate        IN NUMBER) IS
6822     SELECT
6823      NVL(SUM(fy_pr_grp_vol_start),0) AS bkpt_start
6824     ,NVL(SUM(fy_pr_grp_vol_end),0)   AS bkpt_end
6825     ,bkpt_rate
6826     FROM
6827     pn_var_trx_details_all
6828     WHERE
6829     trx_header_id IN
6830      (SELECT
6831       trx_header_id
6832       FROM
6833       pn_var_trx_headers_all
6834       WHERE
6835       var_rent_id = p_vr_id AND
6836       line_item_group_id = p_line_item_grp_id AND
6837       calc_prd_start_date <= (ADD_MONTHS(p_vr_comm_date, 12) - 1))
6838     AND bkpt_rate = p_bkpt_rate
6839     GROUP BY
6840     bkpt_rate
6841     ORDER BY
6842     bkpt_start;
6843 
6844 BEGIN
6845    FOR fy_bkpts_rec IN fy_bkpts_c( p_vr_id
6846                                   ,p_vr_comm_date
6847                                   ,p_line_item_grp_id
6848                                   ,p_bkpt_rate)
6849    LOOP
6850       p_start_bkpt := fy_bkpts_rec.bkpt_start ;
6851       p_end_bkpt   := fy_bkpts_rec.bkpt_end ;
6852    END LOOP;
6853 END first_year_bkpt;
6854 
6855 --------------------------------------------------------------------------------
6856 --  NAME         : ytd_start_bkpt
6857 --  DESCRIPTION  :
6858 --  PURPOSE      :
6859 --  INVOKED FROM :
6860 --  ARGUMENTS    :
6861 --  REFERENCE    :
6862 --  HISTORY      :
6863 --
6864 --  3.Nov.06  piagrawa    o Created
6865 --------------------------------------------------------------------------------
6866 FUNCTION ytd_start_bkpt( p_proration_rule IN VARCHAR2
6867                         ,p_trx_detail_id  IN NUMBER)
6868 RETURN NUMBER IS
6869 
6870   l_first_period                   VARCHAR2(1) := 'N';
6871   l_last_period                    VARCHAR2(1) := 'N';
6872   l_bkpt_start                     NUMBER := 0;
6873   l_bkpt_end                       NUMBER := 0;
6874   l_termination_date               DATE := NULL;
6875   l_commencement_date              DATE := NULL;
6876 
6877   -- Get the details of
6878   CURSOR first_period_cur (p_var_rent_id NUMBER, p_period_id NUMBER) IS
6879     SELECT pvp.period_id, pvr.commencement_date
6880       FROM pn_var_periods_all pvp, pn_var_rents_all pvr
6881      WHERE pvr.var_rent_id = p_var_rent_id
6882      AND   pvp.period_id = p_period_id
6883      AND   pvp.partial_period = 'Y'
6884      AND   pvp.start_date = pvr.commencement_date;
6885 
6886 
6887   -- Get the details of
6888   CURSOR last_period_cur (p_var_rent_id NUMBER, p_period_id NUMBER) IS
6889     SELECT pvp.period_id, pvr.termination_date
6890       FROM pn_var_periods_all pvp, pn_var_rents_all pvr
6891      WHERE pvr.var_rent_id = p_var_rent_id
6892      AND   pvp.period_id = p_period_id
6893      AND   pvp.partial_period = 'Y'
6894      AND   pvp.end_date   = pvr.termination_date;
6895 
6896    -- Get the details of
6897    CURSOR bkpts_cur IS
6898      SELECT dtls.ytd_group_vol_start,
6899             dtls.pr_grp_blended_vol_start,
6900             dtls.fy_pr_grp_vol_start,
6901             dtls.ly_pr_grp_vol_start,
6902           dtls.bkpt_rate,
6903             hdr.var_rent_id,
6904             hdr.period_id,
6905             hdr.line_item_group_id
6906        FROM pn_var_trx_details_all dtls, pn_var_trx_headers_all hdr
6907       WHERE dtls.trx_detail_id = p_trx_detail_id
6908       AND   hdr.trx_header_id =  dtls.trx_header_id;
6909 
6910 BEGIN
6911 
6912     FOR bkpts_rec IN bkpts_cur LOOP
6913 
6914       FOR first_period_rec IN first_period_cur (bkpts_rec.var_rent_id, bkpts_rec.period_id) LOOP
6915           l_first_period := 'Y';
6916           l_commencement_date := first_period_rec.commencement_date;
6917       END LOOP;
6918 
6919       FOR last_period_rec IN last_period_cur (bkpts_rec.var_rent_id, bkpts_rec.period_id) LOOP
6920           l_last_period := 'Y';
6921           l_termination_date := last_period_rec.termination_date;
6922       END LOOP;
6923 
6924       IF (p_proration_rule IN('CYP','CYNP'))
6925       THEN
6926          l_bkpt_start  :=   nvl(bkpts_rec.ytd_group_vol_start,bkpts_rec.pr_grp_blended_vol_start);
6927 
6928       ELSIF p_proration_rule IN('FY','FLY') AND l_first_period = 'Y'
6929       THEN
6930 
6931          pn_var_rent_calc_pkg.first_year_bkpt(bkpts_rec.var_rent_id,
6932                                               l_commencement_date,
6933                                               bkpts_rec.line_item_group_id,
6934                                               bkpts_rec.bkpt_rate,
6935                                               l_bkpt_start,
6936                                               l_bkpt_end);
6937 
6938       ELSIF p_proration_rule IN('LY','FLY') AND l_last_period = 'Y'
6939       THEN
6940 
6941          pn_var_rent_calc_pkg.last_year_bkpt( bkpts_rec.var_rent_id,
6942                                               l_termination_date,
6943                                               bkpts_rec.line_item_group_id,
6944                                               bkpts_rec.bkpt_rate,
6945                                               l_bkpt_start,
6946                                               l_bkpt_end);
6947 
6948       ELSE
6949          l_bkpt_start  :=   bkpts_rec.ytd_group_vol_start;
6950 
6951       END IF;
6952 
6953     END LOOP;
6954 
6955     RETURN l_bkpt_start;
6956 
6957 END ytd_start_bkpt;
6958 
6959 --------------------------------------------------------------------------------
6960 --  NAME         : ytd_end_bkpt
6961 --  DESCRIPTION  :
6962 --  PURPOSE      :
6963 --  INVOKED FROM :
6964 --  ARGUMENTS    :
6965 --  REFERENCE    :
6966 --  HISTORY      :
6967 --
6968 --  3.Nov.06  piagrawa    o Created
6969 --------------------------------------------------------------------------------
6970 FUNCTION ytd_end_bkpt( p_proration_rule IN VARCHAR2
6971                         ,p_trx_detail_id  IN NUMBER)
6972 RETURN NUMBER IS
6973 
6974   l_first_period                   VARCHAR2(1) := 'N';
6975   l_last_period                    VARCHAR2(1) := 'N';
6976   l_bkpt_start                     NUMBER := 0;
6977   l_bkpt_end                       NUMBER := 0;
6978   l_termination_date               DATE := NULL;
6979   l_commencement_date              DATE := NULL;
6980 
6981   -- Get the details of
6982   CURSOR first_period_cur (p_var_rent_id NUMBER, p_period_id NUMBER) IS
6983     SELECT pvp.period_id, pvr.commencement_date
6984       FROM pn_var_periods_all pvp, pn_var_rents_all pvr
6985      WHERE pvr.var_rent_id = p_var_rent_id
6986      AND   pvp.period_id = p_period_id
6987      AND   pvp.partial_period = 'Y'
6988      AND   pvp.start_date = pvr.commencement_date;
6989 
6990 
6991   -- Get the details of
6992   CURSOR last_period_cur (p_var_rent_id NUMBER, p_period_id NUMBER) IS
6993     SELECT pvp.period_id, pvr.termination_date
6994       FROM pn_var_periods_all pvp, pn_var_rents_all pvr
6995      WHERE pvr.var_rent_id = p_var_rent_id
6996      AND   pvp.period_id = p_period_id
6997      AND   pvp.partial_period = 'Y'
6998      AND   pvp.end_date   = pvr.termination_date;
6999 
7000    -- Get the details of
7001    CURSOR bkpts_cur IS
7002      SELECT dtls.ytd_group_vol_start,
7003             dtls.pr_grp_blended_vol_start,
7004             dtls.fy_pr_grp_vol_start,
7005             dtls.ly_pr_grp_vol_start,
7006             dtls.ytd_group_vol_end,
7007             dtls.pr_grp_blended_vol_end,
7008             dtls.fy_pr_grp_vol_end,
7009             dtls.ly_pr_grp_vol_end,
7010        dtls.bkpt_rate,
7011             hdr.var_rent_id,
7012             hdr.period_id,
7013        hdr.line_item_group_id
7014        FROM pn_var_trx_details_all dtls, pn_var_trx_headers_all hdr
7015       WHERE dtls.trx_detail_id = p_trx_detail_id
7016       AND   hdr.trx_header_id =  dtls.trx_header_id;
7017 
7018 BEGIN
7019 
7020     FOR bkpts_rec IN bkpts_cur LOOP
7021 
7022       FOR first_period_rec IN first_period_cur (bkpts_rec.var_rent_id, bkpts_rec.period_id) LOOP
7023           l_first_period := 'Y';
7024           l_commencement_date := first_period_rec.commencement_date;
7025       END LOOP;
7026 
7027       FOR last_period_rec IN last_period_cur (bkpts_rec.var_rent_id, bkpts_rec.period_id) LOOP
7028           l_last_period := 'Y';
7029           l_termination_date := last_period_rec.termination_date;
7030       END LOOP;
7031 
7032       IF (p_proration_rule IN('CYP','CYNP'))
7033       THEN
7034          l_bkpt_start  :=   nvl(bkpts_rec.ytd_group_vol_start,bkpts_rec.pr_grp_blended_vol_start);
7035          l_bkpt_end    :=   nvl(bkpts_rec.ytd_group_vol_end,bkpts_rec.pr_grp_blended_vol_end);
7036 
7037       ELSIF p_proration_rule IN('FY','FLY') AND l_first_period = 'Y'
7038       THEN
7039 
7040          pn_var_rent_calc_pkg.first_year_bkpt(bkpts_rec.var_rent_id,
7041                                               l_commencement_date,
7042                                               bkpts_rec.line_item_group_id,
7043                                               bkpts_rec.bkpt_rate,
7044                                               l_bkpt_start,
7045                                               l_bkpt_end);
7046 
7047       ELSIF p_proration_rule IN('LY','FLY') AND l_last_period = 'Y'
7048       THEN
7049 
7050          pn_var_rent_calc_pkg.last_year_bkpt( bkpts_rec.var_rent_id,
7051                                               l_termination_date,
7052                                               bkpts_rec.line_item_group_id,
7053                                               bkpts_rec.bkpt_rate,
7054                                               l_bkpt_start,
7055                                               l_bkpt_end);
7056 
7057       ELSE
7058          l_bkpt_start  :=   bkpts_rec.ytd_group_vol_start;
7059          l_bkpt_end    :=   bkpts_rec.ytd_group_vol_end;
7060 
7061       END IF;
7062 
7063       l_bkpt_end := pn_var_rent_calc_pkg.end_breakpoint(l_bkpt_start, l_bkpt_end);
7064 
7065     END LOOP;
7066 
7067     RETURN l_bkpt_end;
7068 
7069 END ytd_end_bkpt;
7070 
7071 --------------------------------------------------------------------------------
7072 --  NAME         : overage_cal
7073 --  DESCRIPTION  :
7074 --  PURPOSE      :
7075 --  INVOKED FROM :
7076 --  ARGUMENTS    :
7077 --  REFERENCE    :
7078 --  HISTORY      :
7079 --
7080 --  3.Nov.06  Ram Kumar     o Created
7081 --------------------------------------------------------------------------------
7082 FUNCTION overage_cal(p_proration_rule IN VARCHAR2,
7083                      p_calculation_method IN VARCHAR2,
7084                      detail_id IN NUMBER) RETURN NUMBER IS
7085 
7086 l_group_sales                    NUMBER := 0;
7087 l_group_deductions               NUMBER := 0;
7088 l_bkpt_start                     NUMBER := 0;
7089 l_bkpt_end                       NUMBER := 0;
7090 overage                          NUMBER :=  0;
7091 l_applicable_sales               NUMBER := 0;
7092 l_first_period                   VARCHAR2(1) := 'N';
7093 l_last_period                    VARCHAR2(1) := 'N';
7094 l_termination_date               DATE := NULL;
7095 l_commencement_date              DATE := NULL;
7096 
7097 /* This cursor fetches applicable sales for cumulative */
7098 CURSOR total_sales_C (p_trx_header_id NUMBER) IS
7099   SELECT (NVL(ytd_sales, 0) - NVL(ytd_deductions, 0)) applicable_sales
7100   FROM  pn_var_trx_headers_all
7101   WHERE trx_header_id = p_trx_header_id;
7102 
7103   -- Get the details of
7104   CURSOR first_period_cur (p_var_rent_id NUMBER, p_period_id NUMBER) IS
7105     SELECT pvp.period_id, pvr.commencement_date
7106       FROM pn_var_periods_all pvp, pn_var_rents_all pvr
7107      WHERE pvr.var_rent_id = p_var_rent_id
7108      AND   pvp.period_id = p_period_id
7109      AND   pvp.partial_period = 'Y'
7110      AND   pvp.start_date = pvr.commencement_date;
7111 
7112 
7113   -- Get the details of
7114   CURSOR last_period_cur (p_var_rent_id NUMBER, p_period_id NUMBER) IS
7115     SELECT pvp.period_id, pvr.termination_date
7116       FROM pn_var_periods_all pvp, pn_var_rents_all pvr
7117      WHERE pvr.var_rent_id = p_var_rent_id
7118      AND   pvp.period_id = p_period_id
7119      AND   pvp.partial_period = 'Y'
7120      AND   pvp.end_date   = pvr.termination_date;
7121 
7122 CURSOR overage_cur IS
7123   SELECT  hdr.trx_header_id,
7124           hdr.calc_prd_start_date,
7125           hdr.period_id,
7126           hdr.var_rent_id,
7127           hdr.line_item_group_id,
7128           dtls.bkpt_rate,
7129           dtls.prorated_grp_vol_start,
7130           dtls.prorated_grp_vol_end,
7131           dtls.ytd_group_vol_start,
7132           dtls.ytd_group_vol_end,
7133           dtls.blended_period_vol_start,
7134           dtls.blended_period_vol_end,
7135           dtls.FY_PR_GRP_VOL_START,
7136           dtls.FY_PR_GRP_VOL_END,
7137           dtls.LY_PR_GRP_VOL_START,
7138           dtls.LY_PR_GRP_VOL_END,
7139           dtls.PR_GRP_BLENDED_VOL_START,
7140           dtls.PR_GRP_BLENDED_VOL_END,
7141           hdr.prorated_group_sales,
7142           hdr.ytd_sales,
7143           hdr.prorated_group_deductions,
7144           hdr.ytd_deductions
7145   FROM    pn_var_trx_headers_all hdr,
7146           pn_var_trx_details_all dtls
7147   WHERE   hdr.trx_header_id=dtls.trx_header_id
7148   AND dtls.trx_detail_id = detail_id;
7149 
7150 BEGIN
7151 
7152   FOR overage_rec IN overage_cur LOOP
7153 
7154     FOR first_period_rec IN first_period_cur (overage_rec.var_rent_id, overage_rec.period_id) LOOP
7155         l_first_period := 'Y';
7156         l_commencement_date := first_period_rec.commencement_date;
7157     END LOOP;
7158 
7159     FOR last_period_rec IN last_period_cur (overage_rec.var_rent_id, overage_rec.period_id) LOOP
7160         l_last_period := 'Y';
7161         l_termination_date := last_period_rec.termination_date;
7162     END LOOP;
7163 
7164     IF p_proration_rule IN('FY','FLY') AND l_first_period = 'Y'
7165     THEN
7166 
7167        pn_var_rent_calc_pkg.first_year_bkpt(overage_rec.var_rent_id, l_commencement_date,
7168                                             overage_rec.line_item_group_id, overage_rec.bkpt_rate,
7169                                             l_bkpt_start, l_bkpt_end);
7170 
7171        l_applicable_sales := pn_var_rent_calc_pkg.first_year_sales( overage_rec.var_rent_id
7172                                                                   ,l_commencement_date
7173                                                                   ,overage_rec.line_item_group_id);
7174 
7175     ELSIF p_proration_rule IN('LY','FLY') AND l_last_period = 'Y'
7176     THEN
7177 
7178        pn_var_rent_calc_pkg.last_year_bkpt( overage_rec.var_rent_id, l_termination_date,
7179                                             overage_rec.line_item_group_id, overage_rec.bkpt_rate,
7180                                             l_bkpt_start, l_bkpt_end);
7181 
7182        l_applicable_sales := pn_var_rent_calc_pkg.last_year_sales( overage_rec.var_rent_id
7183                                                                   ,l_termination_date
7184                                                                   ,overage_rec.line_item_group_id);
7185     ELSE
7186        FOR rec IN total_sales_C(overage_rec.trx_header_id)  LOOP
7187          l_applicable_sales := rec.applicable_sales;
7188        END LOOP;
7189 
7190        IF  p_calculation_method IN ('N', 'T')
7191        THEN
7192           l_applicable_sales := (overage_rec.prorated_group_sales - NVL(overage_rec.prorated_group_deductions,0));
7193 
7194        ELSIF p_calculation_method IN ('Y', 'C')
7195        THEN
7196           l_applicable_sales := (overage_rec.ytd_sales - NVL(overage_rec.ytd_deductions,0));
7197 
7198        END IF;
7199 
7200        IF  p_calculation_method IN ('N', 'T')
7201        THEN
7202           IF p_proration_rule IN ('CYNP') THEN
7203 
7204             l_bkpt_start := NVL(overage_rec.pr_grp_blended_vol_start
7205                                 ,overage_rec.prorated_grp_vol_start);
7206             l_bkpt_end   := NVL(overage_rec.pr_grp_blended_vol_end
7207                                 ,overage_rec.prorated_grp_vol_end);
7208 
7209           ELSE
7210 
7211             l_bkpt_start := overage_rec.prorated_grp_vol_start;
7212             l_bkpt_end   := overage_rec.prorated_grp_vol_end;
7213 
7214           END IF;
7215 
7216        ELSIF p_calculation_method IN ('Y')
7217        THEN
7218 
7219          l_bkpt_start  :=   overage_rec.ytd_group_vol_start;
7220          l_bkpt_end    :=   overage_rec.ytd_group_vol_end;
7221 
7222        ELSIF p_calculation_method IN ('C')
7223        THEN
7224 
7225           IF p_proration_rule IN ('NP') THEN
7226 
7227             l_bkpt_start := overage_rec.prorated_grp_vol_start;
7228             l_bkpt_end   := overage_rec.prorated_grp_vol_end;
7229 
7230           ELSE
7231 
7232             l_bkpt_start := overage_rec.blended_period_vol_start;
7233             l_bkpt_end   := overage_rec.blended_period_vol_end;
7234 
7235           END IF;
7236 
7237        END IF;
7238 
7239     END IF;
7240 
7241     IF(l_bkpt_end = 0) THEN
7242        overage := greatest(l_applicable_sales - l_bkpt_start,0);
7243     ELSE
7244        IF((l_applicable_sales >= l_bkpt_start) AND (l_applicable_sales <= l_bkpt_end)) THEN
7245            overage :=  l_applicable_sales - l_bkpt_start;
7246        ELSIF(l_applicable_sales > l_bkpt_end) THEN
7247            overage := l_bkpt_end - l_bkpt_start;
7248        ELSIF(l_applicable_sales < l_bkpt_start) THEN
7249            overage := 0;
7250        END IF;
7251     END IF;
7252 
7253   END LOOP;
7254 
7255   return overage;
7256 
7257   EXCEPTION
7258   WHEN OTHERS THEN RAISE;
7259 END overage_cal;
7260 
7261 --------------------------------------------------------------------------------
7262 --  NAME         : first_year_sales
7263 --  DESCRIPTION  :
7264 --  PURPOSE      :
7265 --  INVOKED FROM :
7266 --  ARGUMENTS    :
7267 --  REFERENCE    :
7268 --  HISTORY      :
7269 --
7270 --  3.Nov.06  piagrawa    o Created
7271 --------------------------------------------------------------------------------
7272 FUNCTION first_year_sales( p_vr_id            IN NUMBER
7273                            ,p_vr_comm_date     IN DATE
7274                            ,p_line_item_grp_id IN NUMBER)
7275 RETURN NUMBER IS
7276 
7277   /* get FY sales */
7278   CURSOR fy_sales_c( p_vr_id            IN NUMBER
7279                     ,p_vr_comm_date     IN DATE
7280                     ,p_line_item_grp_id IN NUMBER) IS
7281     SELECT
7282     NVL(SUM(fy_proration_sales - NVL(fy_proration_deductions,0) ),0) AS sales
7283     FROM
7284     pn_var_trx_headers_all
7285     WHERE
7286     var_rent_id = p_vr_id AND
7287     line_item_group_id = p_line_item_grp_id AND
7288     calc_prd_start_date <= (ADD_MONTHS(p_vr_comm_date, 12) - 1) ;
7289 
7290   l_sales NUMBER := 0;
7291 
7292 BEGIN
7293    FOR fy_sales_rec IN fy_sales_c( p_vr_id
7294                                   ,p_vr_comm_date
7295                                   ,p_line_item_grp_id)
7296    LOOP
7297       l_sales := fy_sales_rec.sales ;
7298    END LOOP;
7299 
7300    RETURN l_sales;
7301 
7302 END first_year_sales;
7303 
7304 --------------------------------------------------------------------------------
7305 --  NAME         : last_year_sales
7306 --  DESCRIPTION  :
7307 --  PURPOSE      :
7308 --  INVOKED FROM :
7309 --  ARGUMENTS    :
7310 --  REFERENCE    :
7311 --  HISTORY      :
7312 --
7313 --  3.Nov.06  piagrawa    o Created
7314 --------------------------------------------------------------------------------
7315 FUNCTION last_year_sales( p_vr_id            IN NUMBER
7316                            ,p_vr_comm_date     IN DATE
7317                            ,p_line_item_grp_id IN NUMBER)
7318 RETURN NUMBER IS
7319 
7320   /* get LY sales */
7321   CURSOR ly_sales_c( p_vr_id            IN NUMBER
7322                     ,p_vr_term_date     IN DATE
7323                     ,p_line_item_grp_id IN NUMBER) IS
7324     SELECT
7325     NVL(SUM(ly_proration_sales - NVL(ly_proration_deductions,0) ),0) AS sales
7326     FROM
7327     pn_var_trx_headers_all
7328     WHERE
7329     var_rent_id = p_vr_id AND
7330     line_item_group_id = p_line_item_grp_id AND
7331     calc_prd_end_date >= (ADD_MONTHS(p_vr_term_date, -12) + 1);
7332 
7333   l_sales NUMBER := 0;
7334 
7335 BEGIN
7336    FOR ly_sales_rec IN ly_sales_c( p_vr_id
7337                                   ,p_vr_comm_date
7338                                   ,p_line_item_grp_id)
7339    LOOP
7340       l_sales := ly_sales_rec.sales ;
7341    END LOOP;
7342 
7343    RETURN l_sales;
7344 
7345 END last_year_sales;
7346 
7347 
7348 --------------------------------------------------------------------------------
7349 --  NAME         : group_sales
7350 --  DESCRIPTION  :
7351 --  PURPOSE      :
7352 --  INVOKED FROM :
7353 --  ARGUMENTS    :
7354 --  REFERENCE    :
7355 --  HISTORY      :
7356 --
7357 --  3.Nov.06  piagrawa    o Created
7358 --------------------------------------------------------------------------------
7359 FUNCTION group_sales( p_proration_rule   IN VARCHAR2,
7360                                   p_trx_detail_id    IN NUMBER,
7361                                   p_calculation_type IN VARCHAR2)
7362 RETURN NUMBER IS
7363 
7364 -- Get the details of
7365   CURSOR first_period_cur (p_var_rent_id NUMBER, p_period_id NUMBER) IS
7366     SELECT pvp.period_id, pvr.commencement_date
7367       FROM pn_var_periods_all pvp, pn_var_rents_all pvr
7368      WHERE pvr.var_rent_id = p_var_rent_id
7369      AND   pvp.period_id = p_period_id
7370      AND   pvp.partial_period = 'Y'
7371      AND   pvp.start_date = pvr.commencement_date;
7372 
7373 
7374   -- Get the details of
7375   CURSOR last_period_cur (p_var_rent_id NUMBER, p_period_id NUMBER) IS
7376     SELECT pvp.period_id, pvr.termination_date
7377       FROM pn_var_periods_all pvp, pn_var_rents_all pvr
7378      WHERE pvr.var_rent_id = p_var_rent_id
7379      AND   pvp.period_id = p_period_id
7380      AND   pvp.partial_period = 'Y'
7381      AND   pvp.end_date   = pvr.termination_date;
7382 
7383   /* get FY sales */
7384   CURSOR fy_sales_c( p_vr_id            IN NUMBER
7385                     ,p_vr_comm_date     IN DATE
7386                     ,p_line_item_grp_id IN NUMBER) IS
7387     SELECT
7388     NVL(SUM(fy_proration_sales),0) AS sales
7389     FROM
7390     pn_var_trx_headers_all
7391     WHERE
7392     var_rent_id = p_vr_id AND
7393     line_item_group_id = p_line_item_grp_id AND
7394     calc_prd_start_date <= (ADD_MONTHS(p_vr_comm_date, 12) - 1) ;
7395 
7396   /* get LY sales */
7397   CURSOR ly_sales_c( p_vr_id            IN NUMBER
7398                     ,p_vr_term_date     IN DATE
7399                     ,p_line_item_grp_id IN NUMBER) IS
7400     SELECT
7401     NVL(SUM(ly_proration_sales),0) AS sales
7402     FROM
7403     pn_var_trx_headers_all
7404     WHERE
7405     var_rent_id = p_vr_id AND
7406     line_item_group_id = p_line_item_grp_id AND
7407     calc_prd_end_date >= (ADD_MONTHS(p_vr_term_date, -12) + 1);
7408 
7409    -- Get the details of
7410    CURSOR sales_cur IS
7411      SELECT hdr.ytd_sales,
7412             hdr.reporting_group_sales,
7413             hdr.prorated_group_sales,
7414             hdr.line_item_group_id,
7415                   hdr.period_id,
7416                   hdr.var_rent_id
7417       FROM pn_var_trx_headers_all hdr,
7418            pn_var_trx_details_all dtls
7419       WHERE hdr.trx_header_id = dtls.trx_header_id
7420       AND   dtls.trx_detail_id  = p_trx_detail_id;
7421 
7422 l_sales                          NUMBER := 0;
7423 l_first_period                   VARCHAR2(1) := 'N';
7424 l_last_period                    VARCHAR2(1) := 'N';
7425 l_termination_date               DATE := NULL;
7426 l_commencement_date              DATE := NULL;
7427 l_applicable_sales               NUMBER := 0;
7428 
7429 BEGIN
7430 
7431  FOR sales_rec IN sales_cur LOOP
7432 
7433     FOR first_period_rec IN first_period_cur (sales_rec.var_rent_id, sales_rec.period_id) LOOP
7434         l_first_period := 'Y';
7435         l_commencement_date := first_period_rec.commencement_date;
7436     END LOOP;
7437 
7438     FOR last_period_rec IN last_period_cur (sales_rec.var_rent_id, sales_rec.period_id) LOOP
7439         l_last_period := 'Y';
7440         l_termination_date := last_period_rec.termination_date;
7441     END LOOP;
7442 
7443     IF p_proration_rule IN('FY','FLY') AND l_first_period = 'Y'
7444     THEN
7445 
7446       FOR fy_sales_rec IN fy_sales_c(  sales_rec.var_rent_id
7447                                      , l_commencement_date
7448                                      , sales_rec.line_item_group_id)
7449       LOOP
7450         l_applicable_sales := fy_sales_rec.sales ;
7451       END LOOP;
7452 
7453     ELSIF p_proration_rule IN('LY','FLY') AND l_last_period = 'Y'
7454     THEN
7455 
7456       FOR ly_sales_rec IN ly_sales_c( sales_rec.var_rent_id
7457                                      ,l_termination_date
7458                                      ,sales_rec.line_item_group_id)
7459       LOOP
7460         l_applicable_sales := ly_sales_rec.sales ;
7461       END LOOP;
7462 
7463     ELSE
7464 
7465       l_applicable_sales := sales_rec.prorated_group_sales;
7466       /* IF p_calculation_type = 'Y' THEN
7467         l_applicable_sales := sales_rec.ytd_sales;
7468       ELSIF p_calculation_type = 'T' THEN
7469         l_applicable_sales := sales_rec.prorated_group_sales;
7470       ELSIF p_calculation_type = 'C' THEN
7471         l_applicable_sales := sales_rec.reporting_group_sales;
7472       END IF; */
7473 
7474     END IF;
7475 
7476   END LOOP;
7477 
7478   return NVL(l_applicable_sales, 0);
7479 
7480 END group_sales;
7481 
7482 --------------------------------------------------------------------------------
7483 --  NAME         : net_volume
7484 --  DESCRIPTION  :
7485 --  PURPOSE      :
7486 --  INVOKED FROM :
7487 --  ARGUMENTS    :
7488 --  REFERENCE    :
7489 --  HISTORY      :
7490 --
7491 --  3.Nov.06  piagrawa    o Created
7492 --------------------------------------------------------------------------------
7493 FUNCTION net_volume( p_proration_rule   IN VARCHAR2,
7494            p_trx_detail_id    IN NUMBER,
7495            p_calculation_type IN VARCHAR2)
7496 RETURN NUMBER IS
7497 
7498 -- Get the details of
7499   CURSOR first_period_cur (p_var_rent_id NUMBER, p_period_id NUMBER) IS
7500     SELECT pvp.period_id, pvr.commencement_date
7501       FROM pn_var_periods_all pvp, pn_var_rents_all pvr
7502      WHERE pvr.var_rent_id = p_var_rent_id
7503      AND   pvp.period_id = p_period_id
7504      AND   pvp.partial_period = 'Y'
7505      AND   pvp.start_date = pvr.commencement_date;
7506 
7507 
7508   -- Get the details of
7509   CURSOR last_period_cur (p_var_rent_id NUMBER, p_period_id NUMBER) IS
7510     SELECT pvp.period_id, pvr.termination_date
7511       FROM pn_var_periods_all pvp, pn_var_rents_all pvr
7512      WHERE pvr.var_rent_id = p_var_rent_id
7513      AND   pvp.period_id = p_period_id
7514      AND   pvp.partial_period = 'Y'
7515      AND   pvp.end_date   = pvr.termination_date;
7516 
7517    -- Get the details of
7518    CURSOR sales_cur IS
7519      SELECT hdr.ytd_sales,
7520             hdr.reporting_group_sales,
7521             hdr.prorated_group_sales,
7522             hdr.line_item_group_id,
7523             hdr.prorated_group_deductions,
7524             hdr.reporting_group_deductions,
7525             hdr.ytd_deductions,
7526             hdr.period_id,
7527             hdr.var_rent_id
7528       FROM pn_var_trx_headers_all hdr,
7529            pn_var_trx_details_all dtls
7530       WHERE hdr.trx_header_id = dtls.trx_header_id
7531       AND   dtls.trx_detail_id  = p_trx_detail_id;
7532 
7533 l_sales                          NUMBER := 0;
7534 l_first_period                   VARCHAR2(1) := 'N';
7535 l_last_period                    VARCHAR2(1) := 'N';
7536 l_termination_date               DATE := NULL;
7537 l_commencement_date              DATE := NULL;
7538 l_applicable_sales               NUMBER := 0;
7539 
7540 BEGIN
7541 
7542  FOR sales_rec IN sales_cur LOOP
7543 
7544     FOR first_period_rec IN first_period_cur (sales_rec.var_rent_id, sales_rec.period_id) LOOP
7545         l_first_period := 'Y';
7546         l_commencement_date := first_period_rec.commencement_date;
7547     END LOOP;
7548 
7549     FOR last_period_rec IN last_period_cur (sales_rec.var_rent_id, sales_rec.period_id) LOOP
7550         l_last_period := 'Y';
7551         l_termination_date := last_period_rec.termination_date;
7552     END LOOP;
7553 
7554     IF p_proration_rule IN('FY','FLY') AND l_first_period = 'Y'
7555     THEN
7556 
7557         l_applicable_sales := pn_var_rent_calc_pkg.first_year_sales( sales_rec.var_rent_id
7558                                                                     ,l_commencement_date
7559                                                                     ,sales_rec.line_item_group_id);
7560 
7561     ELSIF p_proration_rule IN('LY','FLY') AND l_last_period = 'Y'
7562     THEN
7563 
7564          l_applicable_sales := pn_var_rent_calc_pkg.last_year_sales( sales_rec.var_rent_id
7565                                                                     ,l_termination_date
7566                                                                     ,sales_rec.line_item_group_id);
7567 
7568     ELSE
7569 
7570       l_applicable_sales :=  NVL(sales_rec.prorated_group_sales, 0)
7571                              - NVL(sales_rec.prorated_group_deductions, 0);
7572       /* IF p_calculation_type = 'Y' THEN
7573         l_applicable_sales :=  NVL(sales_rec.ytd_sales, 0)
7574                              - NVL(sales_rec.ytd_deductions, 0);
7575       ELSIF p_calculation_type = 'T' THEN
7576         l_applicable_sales :=  NVL(sales_rec.prorated_group_sales, 0)
7577                              - NVL(sales_rec.prorated_group_deductions, 0);
7578       ELSIF p_calculation_type = 'C' THEN
7579         l_applicable_sales :=  NVL(sales_rec.reporting_group_sales, 0)
7580                              - NVL(sales_rec.reporting_group_deductions, 0);
7581       END IF; */
7582 
7583     END IF;
7584 
7585   END LOOP;
7586 
7587   return l_applicable_sales;
7588 
7589 END net_volume;
7590 
7591 --------------------------------------------------------------------------------
7592 --  NAME         : group_deductions
7593 --  DESCRIPTION  :
7594 --  PURPOSE      :
7595 --  INVOKED FROM :
7596 --  ARGUMENTS    :
7597 --  REFERENCE    :
7598 --  HISTORY      :
7599 --
7600 --  3.Nov.06  piagrawa    o Created
7601 --------------------------------------------------------------------------------
7602 FUNCTION group_deductions( p_proration_rule   IN VARCHAR2,
7603                                   p_trx_detail_id    IN NUMBER,
7604                                   p_calculation_type IN VARCHAR2)
7605 RETURN NUMBER IS
7606 
7607 -- Get the details of
7608   CURSOR first_period_cur (p_var_rent_id NUMBER, p_period_id NUMBER) IS
7609     SELECT pvp.period_id, pvr.commencement_date
7610       FROM pn_var_periods_all pvp, pn_var_rents_all pvr
7611      WHERE pvr.var_rent_id = p_var_rent_id
7612      AND   pvp.period_id = p_period_id
7613      AND   pvp.partial_period = 'Y'
7614      AND   pvp.start_date = pvr.commencement_date;
7615 
7616 
7617   -- Get the details of
7618   CURSOR last_period_cur (p_var_rent_id NUMBER, p_period_id NUMBER) IS
7619     SELECT pvp.period_id, pvr.termination_date
7620       FROM pn_var_periods_all pvp, pn_var_rents_all pvr
7621      WHERE pvr.var_rent_id = p_var_rent_id
7622      AND   pvp.period_id = p_period_id
7623      AND   pvp.partial_period = 'Y'
7624      AND   pvp.end_date   = pvr.termination_date;
7625 
7626   /* get FY sales */
7627   CURSOR fy_deductions_c( p_vr_id            IN NUMBER
7628                     ,p_vr_comm_date     IN DATE
7629                     ,p_line_item_grp_id IN NUMBER) IS
7630     SELECT
7631     NVL(SUM(fy_proration_deductions),0) AS deductions
7632     FROM
7633     pn_var_trx_headers_all
7634     WHERE
7635     var_rent_id = p_vr_id AND
7636     line_item_group_id = p_line_item_grp_id AND
7637     calc_prd_start_date <= (ADD_MONTHS(p_vr_comm_date, 12) - 1) ;
7638 
7639   /* get LY sales */
7640   CURSOR ly_deductions_c( p_vr_id            IN NUMBER
7641                     ,p_vr_term_date     IN DATE
7642                     ,p_line_item_grp_id IN NUMBER) IS
7643     SELECT
7644     NVL(SUM(ly_proration_deductions),0) AS deductions
7645     FROM
7646     pn_var_trx_headers_all
7647     WHERE
7648     var_rent_id = p_vr_id AND
7649     line_item_group_id = p_line_item_grp_id AND
7650     calc_prd_end_date >= (ADD_MONTHS(p_vr_term_date, -12) + 1);
7651 
7652    -- Get the details of
7653    CURSOR deductions_cur IS
7654      SELECT hdr.prorated_group_deductions,
7655             hdr.reporting_group_deductions,
7656             hdr.ytd_deductions,
7657             hdr.line_item_group_id,
7658                   hdr.period_id,
7659                   hdr.var_rent_id
7660       FROM pn_var_trx_headers_all hdr,
7661            pn_var_trx_details_all dtls
7662       WHERE hdr.trx_header_id = dtls.trx_header_id
7663       AND   dtls.trx_detail_id  = p_trx_detail_id;
7664 
7665 l_first_period                   VARCHAR2(1) := 'N';
7666 l_last_period                    VARCHAR2(1) := 'N';
7667 l_termination_date               DATE := NULL;
7668 l_commencement_date              DATE := NULL;
7669 l_applicable_deductions          NUMBER := 0;
7670 
7671 BEGIN
7672 
7673  FOR deductions_rec IN deductions_cur LOOP
7674 
7675     FOR first_period_rec IN first_period_cur (deductions_rec.var_rent_id, deductions_rec.period_id) LOOP
7676         l_first_period := 'Y';
7677         l_commencement_date := first_period_rec.commencement_date;
7678     END LOOP;
7679 
7680     FOR last_period_rec IN last_period_cur (deductions_rec.var_rent_id, deductions_rec.period_id) LOOP
7681         l_last_period := 'Y';
7682         l_termination_date := last_period_rec.termination_date;
7683     END LOOP;
7684 
7685     IF p_proration_rule IN('FY','FLY') AND l_first_period = 'Y'
7686     THEN
7687 
7688       FOR fy_deductions_rec IN fy_deductions_c(  deductions_rec.var_rent_id
7689                                      , l_commencement_date
7690                                      , deductions_rec.line_item_group_id)
7691       LOOP
7692         l_applicable_deductions := fy_deductions_rec.deductions ;
7693       END LOOP;
7694 
7695     ELSIF p_proration_rule IN('LY','FLY') AND l_last_period = 'Y'
7696     THEN
7697 
7698       FOR ly_deductions_rec IN ly_deductions_c( deductions_rec.var_rent_id
7699                                      ,l_termination_date
7700                                      ,deductions_rec.line_item_group_id)
7701       LOOP
7702         l_applicable_deductions := ly_deductions_rec.deductions ;
7703       END LOOP;
7704 
7705     ELSE
7706 
7707       l_applicable_deductions := deductions_rec.prorated_group_deductions;
7708       /* IF p_calculation_type = 'Y' THEN
7709         l_applicable_deductions := deductions_rec.ytd_deductions;
7710       ELSIF p_calculation_type = 'T' THEN
7711         l_applicable_deductions := deductions_rec.prorated_group_deductions;
7712       ELSIF p_calculation_type = 'C' THEN
7713         l_applicable_deductions := deductions_rec.reporting_group_deductions;
7714       END IF; */
7715 
7716     END IF;
7717 
7718   END LOOP;
7719 
7720   return NVL(l_applicable_deductions, 0);
7721 
7722 END group_deductions;
7723 
7724 --------------------------------------------------------------------------------
7725 --  NAME         : net_volume
7726 --  DESCRIPTION  :
7727 --  PURPOSE      :
7728 --  INVOKED FROM :
7729 --  ARGUMENTS    :
7730 --  REFERENCE    :
7731 --  HISTORY      :
7732 --
7733 --  3.Nov.06  piagrawa    o Created
7734 --------------------------------------------------------------------------------
7735 FUNCTION cumulative_volume( p_proration_rule   IN VARCHAR2,
7736            p_trx_detail_id    IN NUMBER,
7737            p_calculation_type IN VARCHAR2)
7738 RETURN NUMBER IS
7739 
7740 -- Get the details of
7741   CURSOR first_period_cur (p_var_rent_id NUMBER, p_period_id NUMBER) IS
7742     SELECT pvp.period_id, pvr.commencement_date
7743       FROM pn_var_periods_all pvp, pn_var_rents_all pvr
7744      WHERE pvr.var_rent_id = p_var_rent_id
7745      AND   pvp.period_id = p_period_id
7746      AND   pvp.partial_period = 'Y'
7747      AND   pvp.start_date = pvr.commencement_date;
7748 
7749 
7750   -- Get the details of
7751   CURSOR last_period_cur (p_var_rent_id NUMBER, p_period_id NUMBER) IS
7752     SELECT pvp.period_id, pvr.termination_date
7753       FROM pn_var_periods_all pvp, pn_var_rents_all pvr
7754      WHERE pvr.var_rent_id = p_var_rent_id
7755      AND   pvp.period_id = p_period_id
7756      AND   pvp.partial_period = 'Y'
7757      AND   pvp.end_date   = pvr.termination_date;
7758 
7759    -- Get the details of
7760    CURSOR sales_cur IS
7761      SELECT hdr.ytd_sales,
7762             hdr.ytd_deductions,
7763             hdr.line_item_group_id,
7764             hdr.period_id,
7765             hdr.var_rent_id,
7766             hdr.trx_header_id,
7767             hdr.calc_prd_start_date,
7768             hdr.line_item_id
7769       FROM pn_var_trx_headers_all hdr,
7770            pn_var_trx_details_all dtls
7771       WHERE hdr.trx_header_id = dtls.trx_header_id
7772       AND   dtls.trx_detail_id  = p_trx_detail_id;
7773 
7774    -- Get the details of
7775    /*CURSOR cum_sales_cur (p_period_id NUMBER,
7776                          p_line_item_id NUMBER,
7777                          p_calc_period_start_date DATE) IS
7778      SELECT NVL(SUM(hdr.prorated_group_sales), 0) - NVL(SUM(hdr.prorated_group_deductions), 0) sales
7779      FROM pn_var_trx_headers_all hdr
7780      WHERE hdr.period_id = p_period_id
7781      AND   hdr.line_item_id = p_line_item_id
7782      AND   hdr.calc_prd_start_date <= p_calc_period_start_date
7783      ORDER BY calc_prd_start_date;*/
7784 
7785 
7786 l_sales                          NUMBER := 0;
7787 l_first_period                   VARCHAR2(1) := 'N';
7788 l_last_period                    VARCHAR2(1) := 'N';
7789 l_termination_date               DATE := NULL;
7790 l_commencement_date              DATE := NULL;
7791 l_applicable_sales               NUMBER := 0;
7792 
7793 BEGIN
7794 
7795  FOR sales_rec IN sales_cur LOOP
7796 
7797     FOR first_period_rec IN first_period_cur (sales_rec.var_rent_id, sales_rec.period_id) LOOP
7798         l_first_period := 'Y';
7799         l_commencement_date := first_period_rec.commencement_date;
7800     END LOOP;
7801 
7802     FOR last_period_rec IN last_period_cur (sales_rec.var_rent_id, sales_rec.period_id) LOOP
7803         l_last_period := 'Y';
7804         l_termination_date := last_period_rec.termination_date;
7805     END LOOP;
7806 
7807     IF p_proration_rule IN('FY','FLY') AND l_first_period = 'Y'
7808     THEN
7809 
7810         l_applicable_sales := pn_var_rent_calc_pkg.first_year_sales( sales_rec.var_rent_id
7811                                                                     ,l_commencement_date
7812                                                                     ,sales_rec.line_item_group_id);
7813 
7814     ELSIF p_proration_rule IN('LY','FLY') AND l_last_period = 'Y'
7815     THEN
7816 
7817          l_applicable_sales := pn_var_rent_calc_pkg.last_year_sales( sales_rec.var_rent_id
7818                                                                     ,l_termination_date
7819                                                                     ,sales_rec.line_item_group_id);
7820 
7821     ELSE
7822        /*FOR cum_sales_rec IN cum_sales_cur(sales_rec.period_id,
7823                                           sales_rec.line_item_id,
7824                                           sales_rec.calc_prd_start_date)
7825        LOOP*/
7826        l_applicable_sales := NVL(sales_rec.ytd_sales, 0) - NVL(sales_rec.ytd_deductions, 0);
7827           /*l_applicable_sales := cum_sales_rec.sales;
7828        END LOOP;*/
7829 
7830     END IF;
7831 
7832   END LOOP;
7833 
7834   return l_applicable_sales;
7835 
7836 END cumulative_volume;
7837 
7838 --------------------------------------------------------------------------------
7839 --  NAME         : ytd_start_bkpt
7840 --  DESCRIPTION  :
7841 --  PURPOSE      :
7842 --  INVOKED FROM :
7843 --  ARGUMENTS    :
7844 --  REFERENCE    :
7845 --  HISTORY      :
7846 --
7847 --  3.Nov.06  piagrawa    o Created
7848 --------------------------------------------------------------------------------
7849 FUNCTION annual_start_bkpt( p_proration_rule IN VARCHAR2
7850                            ,p_cumulative_vol IN VARCHAR2
7851                            ,p_trx_detail_id  IN NUMBER)
7852 RETURN NUMBER IS
7853 
7854   l_first_period                   VARCHAR2(1) := 'N';
7855   l_last_period                    VARCHAR2(1) := 'N';
7856   l_bkpt_start                     NUMBER := 0;
7857   l_bkpt_end                       NUMBER := 0;
7858   l_termination_date               DATE := NULL;
7859   l_commencement_date              DATE := NULL;
7860   l_annual_bkpt_start              NUMBER;
7861   l_bkpt_vol_start                 NUMBER;
7862   l_bkpt_vol_end                   NUMBER;
7863 
7864   -- Get the details of
7865   CURSOR first_period_cur (p_var_rent_id NUMBER, p_period_id NUMBER) IS
7866     SELECT pvp.period_id, pvr.commencement_date
7867       FROM pn_var_periods_all pvp, pn_var_rents_all pvr
7868      WHERE pvr.var_rent_id = p_var_rent_id
7869      AND   pvp.period_id = p_period_id
7870      AND   pvp.partial_period = 'Y'
7871      AND   pvp.start_date = pvr.commencement_date;
7872 
7873 
7874   -- Get the details of
7875   CURSOR last_period_cur (p_var_rent_id NUMBER, p_period_id NUMBER) IS
7876     SELECT pvp.period_id, pvr.termination_date
7877       FROM pn_var_periods_all pvp, pn_var_rents_all pvr
7878      WHERE pvr.var_rent_id = p_var_rent_id
7879      AND   pvp.period_id = p_period_id
7880      AND   pvp.partial_period = 'Y'
7881      AND   pvp.end_date   = pvr.termination_date;
7882 
7883    -- Get the details of
7884    CURSOR bkpts_cur IS
7885      SELECT dtls.prorated_grp_vol_start,
7886             dtls.pr_grp_blended_vol_start,
7887             dtls.blended_period_vol_start,
7888             dtls.bkpt_rate,
7889             hdr.var_rent_id,
7890             hdr.period_id,
7891             hdr.line_item_group_id
7892        FROM pn_var_trx_details_all dtls, pn_var_trx_headers_all hdr
7893       WHERE dtls.trx_detail_id = p_trx_detail_id
7894       AND   hdr.trx_header_id =  dtls.trx_header_id;
7895 
7896     CURSOR blended_prd_csr (p_period_id IN NUMBER, p_bkpt_rate IN NUMBER) IS
7897      SELECT sum(dtls.prorated_grp_vol_start)  bkpt_start
7898      FROM pn_var_trx_details_all dtls,
7899           pn_var_trx_headers_all hdr
7900      WHERE hdr.trx_header_id = dtls.trx_header_id
7901      AND hdr.period_id = p_period_id
7902      AND dtls.bkpt_rate = p_bkpt_rate;
7903 
7904 BEGIN
7905 
7906     FOR bkpts_rec IN bkpts_cur LOOP
7907 
7908       FOR blended_prd_rec IN blended_prd_csr(bkpts_rec.period_id, bkpts_rec.bkpt_rate) LOOP
7909           l_annual_bkpt_start := blended_prd_rec.bkpt_start;
7910       END LOOP;
7911 
7912       FOR first_period_rec IN first_period_cur (bkpts_rec.var_rent_id, bkpts_rec.period_id) LOOP
7913           l_first_period := 'Y';
7914           l_commencement_date := first_period_rec.commencement_date;
7915       END LOOP;
7916 
7917       FOR last_period_rec IN last_period_cur (bkpts_rec.var_rent_id, bkpts_rec.period_id) LOOP
7918           l_last_period := 'Y';
7919           l_termination_date := last_period_rec.termination_date;
7920       END LOOP;
7921 
7922       IF p_proration_rule IN('FY','FLY') AND l_first_period = 'Y'
7923       THEN
7924 
7925          pn_var_rent_calc_pkg.first_year_bkpt(bkpts_rec.var_rent_id,
7926                                               l_commencement_date,
7927                                               bkpts_rec.line_item_group_id,
7928                                               bkpts_rec.bkpt_rate,
7929                                               l_bkpt_start,
7930                                               l_bkpt_end);
7931 
7932       ELSIF p_proration_rule IN('LY','FLY') AND l_last_period = 'Y'
7933       THEN
7934 
7935          pn_var_rent_calc_pkg.last_year_bkpt( bkpts_rec.var_rent_id,
7936                                               l_termination_date,
7937                                               bkpts_rec.line_item_group_id,
7938                                               bkpts_rec.bkpt_rate,
7939                                               l_bkpt_start,
7940                                               l_bkpt_end);
7941 
7942       ELSE
7943 
7944          IF (p_cumulative_vol = 'T')
7945          THEN
7946             IF p_proration_rule IN ('CYP','CYNP')
7947             THEN
7948 
7949                true_up_bkpt ( bkpts_rec.period_id,
7950                               bkpts_rec.bkpt_rate,
7951                               l_bkpt_vol_start,
7952                               l_bkpt_vol_end);
7953                l_bkpt_start := NVL(l_bkpt_vol_start,l_annual_bkpt_start);
7954 
7955             ELSE
7956                l_bkpt_start := l_annual_bkpt_start;
7957             END IF;
7958 
7959          ELSIF (p_cumulative_vol = 'C')
7960          THEN
7961 
7962             IF p_proration_rule = pn_var_rent_calc_pkg.G_PRORUL_NP
7963             THEN
7964                l_bkpt_start := bkpts_rec.prorated_grp_vol_start;
7965             ELSE
7966                l_bkpt_start := bkpts_rec.blended_period_vol_start;
7967             END IF;
7968 
7969          END IF;
7970 
7971       END IF;
7972 
7973     END LOOP;
7974 
7975     RETURN NVL(l_bkpt_start, 0);
7976 
7977 END annual_start_bkpt;
7978 
7979 --------------------------------------------------------------------------------
7980 --  NAME         : annual_end_bkpt
7981 --  DESCRIPTION  :
7982 --  PURPOSE      :
7983 --  INVOKED FROM :
7984 --  ARGUMENTS    :
7985 --  REFERENCE    :
7986 --  HISTORY      :
7987 --
7988 --  3.Nov.06  piagrawa    o Created
7989 --------------------------------------------------------------------------------
7990 FUNCTION annual_end_bkpt( p_proration_rule IN VARCHAR2
7991                          ,p_cumulative_vol IN VARCHAR2
7992                          ,p_trx_detail_id  IN NUMBER)
7993 RETURN NUMBER IS
7994 
7995   l_first_period                   VARCHAR2(1) := 'N';
7996   l_last_period                    VARCHAR2(1) := 'N';
7997   l_bkpt_start                     NUMBER := 0;
7998   l_bkpt_end                       NUMBER := 0;
7999   l_termination_date               DATE := NULL;
8000   l_commencement_date              DATE := NULL;
8001   l_annual_bkpt_start              NUMBER;
8002   l_annual_bkpt_end                NUMBER;
8003   l_bkpt_vol_start                 NUMBER;
8004   l_bkpt_vol_end                   NUMBER;
8005 
8006 
8007   -- Get the details of
8008   CURSOR first_period_cur (p_var_rent_id NUMBER, p_period_id NUMBER) IS
8009     SELECT pvp.period_id, pvr.commencement_date
8010       FROM pn_var_periods_all pvp, pn_var_rents_all pvr
8011      WHERE pvr.var_rent_id = p_var_rent_id
8012      AND   pvp.period_id = p_period_id
8013      AND   pvp.partial_period = 'Y'
8014      AND   pvp.start_date = pvr.commencement_date;
8015 
8016 
8017   -- Get the details of
8018   CURSOR last_period_cur (p_var_rent_id NUMBER, p_period_id NUMBER) IS
8019     SELECT pvp.period_id, pvr.termination_date
8020       FROM pn_var_periods_all pvp, pn_var_rents_all pvr
8021      WHERE pvr.var_rent_id = p_var_rent_id
8022      AND   pvp.period_id = p_period_id
8023      AND   pvp.partial_period = 'Y'
8024      AND   pvp.end_date   = pvr.termination_date;
8025 
8026    -- Get the details of
8027    CURSOR bkpts_cur IS
8028      SELECT dtls.prorated_grp_vol_start,
8029             dtls.pr_grp_blended_vol_start,
8030             dtls.blended_period_vol_start,
8031             dtls.prorated_grp_vol_end,
8032             dtls.pr_grp_blended_vol_end,
8033             dtls.blended_period_vol_end,
8034             dtls.bkpt_rate,
8035             hdr.var_rent_id,
8036             hdr.period_id,
8037             hdr.line_item_group_id
8038        FROM pn_var_trx_details_all dtls, pn_var_trx_headers_all hdr
8039        WHERE dtls.trx_detail_id = p_trx_detail_id
8040        AND   hdr.trx_header_id =  dtls.trx_header_id;
8041 
8042     CURSOR blended_prd_csr (p_period_id IN NUMBER, p_bkpt_rate IN NUMBER) IS
8043      SELECT sum(prorated_grp_vol_start)  bkpt_start,
8044             sum(prorated_grp_vol_end)  bkpt_end
8045      FROM pn_var_trx_details_all dtls,
8046           pn_var_trx_headers_all hdr
8047      WHERE hdr.trx_header_id = dtls.trx_header_id
8048      AND hdr.period_id = p_period_id
8049      AND dtls.bkpt_rate = p_bkpt_rate;
8050 
8051 BEGIN
8052 
8053     FOR bkpts_rec IN bkpts_cur LOOP
8054       FOR blended_prd_rec IN blended_prd_csr(bkpts_rec.period_id,bkpts_rec.bkpt_rate) LOOP
8055           l_annual_bkpt_start := blended_prd_rec.bkpt_start;
8056           l_annual_bkpt_end := blended_prd_rec.bkpt_end;
8057       END LOOP;
8058 
8059       FOR first_period_rec IN first_period_cur (bkpts_rec.var_rent_id, bkpts_rec.period_id) LOOP
8060           l_first_period := 'Y';
8061           l_commencement_date := first_period_rec.commencement_date;
8062       END LOOP;
8063 
8064       FOR last_period_rec IN last_period_cur (bkpts_rec.var_rent_id, bkpts_rec.period_id) LOOP
8065           l_last_period := 'Y';
8066           l_termination_date := last_period_rec.termination_date;
8067       END LOOP;
8068 
8069       IF p_proration_rule IN('FY','FLY') AND l_first_period = 'Y'
8070       THEN
8071 
8072          pn_var_rent_calc_pkg.first_year_bkpt(bkpts_rec.var_rent_id,
8073                                               l_commencement_date,
8074                                               bkpts_rec.line_item_group_id,
8075                                               bkpts_rec.bkpt_rate,
8076                                               l_bkpt_start,
8077                                               l_bkpt_end);
8078 
8079       ELSIF p_proration_rule IN('LY','FLY') AND l_last_period = 'Y'
8080       THEN
8081 
8082          pn_var_rent_calc_pkg.last_year_bkpt( bkpts_rec.var_rent_id,
8083                                               l_termination_date,
8084                                               bkpts_rec.line_item_group_id,
8085                                               bkpts_rec.bkpt_rate,
8086                                               l_bkpt_start,
8087                                               l_bkpt_end);
8088 
8089       ELSE
8090          IF (p_cumulative_vol = 'T')
8091          THEN
8092             IF p_proration_rule IN ('CYP','CYNP')
8093             THEN
8094 
8095                true_up_bkpt ( bkpts_rec.period_id,
8096                               bkpts_rec.bkpt_rate,
8097                               l_bkpt_vol_start,
8098                               l_bkpt_vol_end);
8099 
8100                l_bkpt_start := NVL(l_bkpt_vol_start,l_annual_bkpt_start);
8101                l_bkpt_end   := NVL(l_bkpt_vol_end,l_annual_bkpt_end);
8102 
8103             ELSE
8104                l_bkpt_start := l_annual_bkpt_start;
8105                l_bkpt_end := l_annual_bkpt_end;
8106             END IF;
8107 
8108          ELSIF (p_cumulative_vol = 'C')
8109          THEN
8110 
8111             IF p_proration_rule = pn_var_rent_calc_pkg.G_PRORUL_NP
8112             THEN
8113                l_bkpt_start := bkpts_rec.prorated_grp_vol_start;
8114                l_bkpt_end := bkpts_rec.prorated_grp_vol_end;
8115             ELSE
8116                l_bkpt_start := bkpts_rec.blended_period_vol_start;
8117                l_bkpt_end   := bkpts_rec.blended_period_vol_end;
8118             END IF;
8119 
8120          END IF;
8121       END IF;
8122 
8123       l_bkpt_end := pn_var_rent_calc_pkg.end_breakpoint(l_bkpt_start, l_bkpt_end);
8124 
8125     END LOOP;
8126 
8127     RETURN l_bkpt_end;
8128 
8129 END annual_end_bkpt;
8130 
8131 --------------------------------------------------------------------------------
8132 --  NAME         : prorated_start_bkpt
8133 --  DESCRIPTION  :
8134 --  PURPOSE      :
8135 --  INVOKED FROM :
8136 --  ARGUMENTS    :
8137 --  REFERENCE    :
8138 --  HISTORY      :
8139 --
8140 --  3.Nov.06  piagrawa    o Created
8141 --------------------------------------------------------------------------------
8142 FUNCTION prorated_start_bkpt( p_proration_rule IN VARCHAR2
8143                              ,p_trx_detail_id  IN NUMBER)
8144 RETURN NUMBER IS
8145 
8146   l_first_period                   VARCHAR2(1) := 'N';
8147   l_last_period                    VARCHAR2(1) := 'N';
8148   l_bkpt_start                     NUMBER := 0;
8149   l_bkpt_end                       NUMBER := 0;
8150   l_termination_date               DATE := NULL;
8151   l_commencement_date              DATE := NULL;
8152 
8153   -- Get the details of
8154   CURSOR first_period_cur (p_var_rent_id NUMBER, p_period_id NUMBER) IS
8155     SELECT pvp.period_id, pvr.commencement_date
8156       FROM pn_var_periods_all pvp, pn_var_rents_all pvr
8157      WHERE pvr.var_rent_id = p_var_rent_id
8158      AND   pvp.period_id = p_period_id
8159      AND   pvp.partial_period = 'Y'
8160      AND   pvp.start_date = pvr.commencement_date;
8161 
8162 
8163   -- Get the details of
8164   CURSOR last_period_cur (p_var_rent_id NUMBER, p_period_id NUMBER) IS
8165     SELECT pvp.period_id, pvr.termination_date
8166       FROM pn_var_periods_all pvp, pn_var_rents_all pvr
8167      WHERE pvr.var_rent_id = p_var_rent_id
8168      AND   pvp.period_id = p_period_id
8169      AND   pvp.partial_period = 'Y'
8170      AND   pvp.end_date   = pvr.termination_date;
8171 
8172    -- Get the details of
8173    CURSOR bkpts_cur IS
8174      SELECT dtls.prorated_grp_vol_start,
8175             dtls.pr_grp_blended_vol_start,
8176             dtls.bkpt_rate,
8177             bkpts.group_bkpt_vol_start,
8178             hdr.var_rent_id,
8179             hdr.period_id,
8180             hdr.line_item_group_id
8181        FROM pn_var_trx_details_all dtls, pn_var_trx_headers_all hdr,
8182             pn_var_bkpts_det_all bkpts
8183       WHERE dtls.trx_detail_id = p_trx_detail_id
8184       AND   hdr.trx_header_id =  dtls.trx_header_id
8185       AND   bkpts.bkpt_detail_id = dtls.bkpt_detail_id;
8186 
8187 BEGIN
8188 
8189     FOR bkpts_rec IN bkpts_cur LOOP
8190 
8191       FOR first_period_rec IN first_period_cur (bkpts_rec.var_rent_id, bkpts_rec.period_id) LOOP
8192           l_first_period := 'Y';
8193           l_commencement_date := first_period_rec.commencement_date;
8194       END LOOP;
8195 
8196       FOR last_period_rec IN last_period_cur (bkpts_rec.var_rent_id, bkpts_rec.period_id) LOOP
8197           l_last_period := 'Y';
8198           l_termination_date := last_period_rec.termination_date;
8199       END LOOP;
8200 
8201       IF p_proration_rule IN('FY','FLY') AND l_first_period = 'Y'
8202       THEN
8203 
8204          pn_var_rent_calc_pkg.first_year_bkpt(bkpts_rec.var_rent_id,
8205                                               l_commencement_date,
8206                                               bkpts_rec.line_item_group_id,
8207                                               bkpts_rec.bkpt_rate,
8208                                               l_bkpt_start,
8209                                               l_bkpt_end);
8210 
8211       ELSIF p_proration_rule IN('LY','FLY') AND l_last_period = 'Y'
8212       THEN
8213 
8214          pn_var_rent_calc_pkg.last_year_bkpt( bkpts_rec.var_rent_id,
8215                                               l_termination_date,
8216                                               bkpts_rec.line_item_group_id,
8217                                               bkpts_rec.bkpt_rate,
8218                                               l_bkpt_start,
8219                                               l_bkpt_end);
8220 
8221       ELSIF p_proration_rule IN('CYNP', 'CYP')
8222       THEN
8223          l_bkpt_start := NVL(bkpts_rec.pr_grp_blended_vol_start, bkpts_rec.prorated_grp_vol_start);
8224 
8225       ELSIF p_proration_rule IN('NP')
8226       THEN
8227          l_bkpt_start := bkpts_rec.group_bkpt_vol_start;
8228       ELSE
8229          l_bkpt_start := bkpts_rec.prorated_grp_vol_start;
8230 
8231       END IF;
8232 
8233     END LOOP;
8234 
8235     RETURN NVL(l_bkpt_start, 0);
8236 
8237 END prorated_start_bkpt;
8238 
8239 --------------------------------------------------------------------------------
8240 --  NAME         : prorated_end_bkpt
8241 --  DESCRIPTION  :
8242 --  PURPOSE      :
8243 --  INVOKED FROM :
8244 --  ARGUMENTS    :
8245 --  REFERENCE    :
8246 --  HISTORY      :
8247 --
8248 --  3.Nov.06  piagrawa    o Created
8249 --------------------------------------------------------------------------------
8250 FUNCTION prorated_end_bkpt( p_proration_rule IN VARCHAR2
8251                            ,p_trx_detail_id  IN NUMBER)
8252 RETURN NUMBER IS
8253 
8254   l_first_period                   VARCHAR2(1) := 'N';
8255   l_last_period                    VARCHAR2(1) := 'N';
8256   l_bkpt_start                     NUMBER := 0;
8257   l_bkpt_end                       NUMBER := 0;
8258   l_termination_date               DATE := NULL;
8259   l_commencement_date              DATE := NULL;
8260 
8261   -- Get the details of
8262   CURSOR first_period_cur (p_var_rent_id NUMBER, p_period_id NUMBER) IS
8263     SELECT pvp.period_id, pvr.commencement_date
8264       FROM pn_var_periods_all pvp, pn_var_rents_all pvr
8265      WHERE pvr.var_rent_id = p_var_rent_id
8266      AND   pvp.period_id = p_period_id
8267      AND   pvp.partial_period = 'Y'
8268      AND   pvp.start_date = pvr.commencement_date;
8269 
8270 
8271   -- Get the details of
8272   CURSOR last_period_cur (p_var_rent_id NUMBER, p_period_id NUMBER) IS
8273     SELECT pvp.period_id, pvr.termination_date
8274       FROM pn_var_periods_all pvp, pn_var_rents_all pvr
8275      WHERE pvr.var_rent_id = p_var_rent_id
8276      AND   pvp.period_id = p_period_id
8277      AND   pvp.partial_period = 'Y'
8278      AND   pvp.end_date   = pvr.termination_date;
8279 
8280    -- Get the details of
8281    CURSOR bkpts_cur IS
8282      SELECT dtls.prorated_grp_vol_start,
8283             dtls.prorated_grp_vol_end,
8284             dtls.pr_grp_blended_vol_start,
8285             dtls.pr_grp_blended_vol_end,
8286             dtls.bkpt_rate,
8287             bkpts.group_bkpt_vol_start,
8288             bkpts.group_bkpt_vol_end,
8289             hdr.var_rent_id,
8290             hdr.period_id,
8291             hdr.line_item_group_id
8292        FROM pn_var_trx_details_all dtls, pn_var_trx_headers_all hdr,
8293             pn_var_bkpts_det_all bkpts
8294        WHERE dtls.trx_detail_id = p_trx_detail_id
8295        AND   hdr.trx_header_id =  dtls.trx_header_id
8296        AND   bkpts.bkpt_detail_id = dtls.bkpt_detail_id;
8297 
8298 BEGIN
8299 
8300     FOR bkpts_rec IN bkpts_cur LOOP
8301 
8302       FOR first_period_rec IN first_period_cur (bkpts_rec.var_rent_id, bkpts_rec.period_id) LOOP
8303           l_first_period := 'Y';
8304           l_commencement_date := first_period_rec.commencement_date;
8305       END LOOP;
8306 
8307       FOR last_period_rec IN last_period_cur (bkpts_rec.var_rent_id, bkpts_rec.period_id) LOOP
8308           l_last_period := 'Y';
8309           l_termination_date := last_period_rec.termination_date;
8310       END LOOP;
8311 
8312       IF p_proration_rule IN('FY','FLY') AND l_first_period = 'Y'
8313       THEN
8314 
8315          pn_var_rent_calc_pkg.first_year_bkpt(bkpts_rec.var_rent_id,
8316                                               l_commencement_date,
8317                                               bkpts_rec.line_item_group_id,
8318                                               bkpts_rec.bkpt_rate,
8319                                               l_bkpt_start,
8320                                               l_bkpt_end);
8321 
8322       ELSIF p_proration_rule IN('LY','FLY') AND l_last_period = 'Y'
8323       THEN
8324 
8325          pn_var_rent_calc_pkg.last_year_bkpt( bkpts_rec.var_rent_id,
8326                                               l_termination_date,
8327                                               bkpts_rec.line_item_group_id,
8328                                               bkpts_rec.bkpt_rate,
8329                                               l_bkpt_start,
8330                                               l_bkpt_end);
8331 
8332       ELSIF p_proration_rule IN('CYNP', 'CYP')
8333       THEN
8334          l_bkpt_start := NVL(bkpts_rec.pr_grp_blended_vol_start, bkpts_rec.prorated_grp_vol_start);
8335          l_bkpt_end   := NVL(bkpts_rec.pr_grp_blended_vol_end, bkpts_rec.prorated_grp_vol_end);
8336 
8337       ELSIF p_proration_rule IN('NP')
8338       THEN
8339          l_bkpt_start := bkpts_rec.group_bkpt_vol_start;
8340          l_bkpt_end := bkpts_rec.group_bkpt_vol_end;
8341       ELSE
8342          l_bkpt_start := bkpts_rec.prorated_grp_vol_start;
8343          l_bkpt_end := bkpts_rec.prorated_grp_vol_end;
8344       END IF;
8345 
8346       l_bkpt_end := pn_var_rent_calc_pkg.end_breakpoint(l_bkpt_start, l_bkpt_end);
8347 
8348     END LOOP;
8349 
8350     RETURN l_bkpt_end;
8351 
8352 END prorated_end_bkpt;
8353 
8354 --------------------------------------------------------------------------------
8355 --  NAME         : current_gross_vr
8356 --  DESCRIPTION  :
8357 --  PURPOSE      :
8358 --  INVOKED FROM :
8359 --  ARGUMENTS    :
8360 --  REFERENCE    :
8361 --  HISTORY      :
8362 --
8363 --  3.Nov.06  piagrawa    o Created
8364 --------------------------------------------------------------------------------
8365 FUNCTION current_gross_vr( p_proration_rule   IN VARCHAR2,
8366                            p_trx_detail_id    IN NUMBER)
8367 RETURN NUMBER IS
8368 
8369 -- Get the details of
8370   CURSOR first_period_cur (p_var_rent_id NUMBER, p_period_id NUMBER) IS
8371     SELECT pvp.period_id, pvr.commencement_date
8372       FROM pn_var_periods_all pvp, pn_var_rents_all pvr
8373      WHERE pvr.var_rent_id = p_var_rent_id
8374      AND   pvp.period_id = p_period_id
8375      AND   pvp.partial_period = 'Y'
8376      AND   pvp.start_date = pvr.commencement_date;
8377 
8378   -- Get the details of
8379   CURSOR last_period_cur (p_var_rent_id NUMBER, p_period_id NUMBER) IS
8380     SELECT pvp.period_id, pvr.termination_date
8381       FROM pn_var_periods_all pvp, pn_var_rents_all pvr
8382      WHERE pvr.var_rent_id = p_var_rent_id
8383      AND   pvp.period_id = p_period_id
8384      AND   pvp.partial_period = 'Y'
8385      AND   pvp.end_date   = pvr.termination_date;
8386 
8387    -- Get the details of
8388    CURSOR rent_cur IS
8389      SELECT hdr.percent_rent_due,
8390             hdr.first_yr_rent,
8391             hdr.period_id,
8392             hdr.var_rent_id
8393       FROM pn_var_trx_headers_all hdr,
8394            pn_var_trx_details_all dtls
8395       WHERE hdr.trx_header_id = dtls.trx_header_id
8396       AND   dtls.trx_detail_id  = p_trx_detail_id;
8397 
8398    -- Get the details of
8399    CURSOR first_yr_rent (p_var_rent_id NUMBER) IS
8400      SELECT SUM(first_yr_rent) first_yr_rent
8401      FROM pn_var_trx_headers_all
8402      WHERE var_rent_id = p_var_rent_id;
8403 
8404    -- Get the details of
8405    CURSOR last_yr_rent (p_period_id NUMBER) IS
8406      SELECT (SUM(NVL(prorated_rent_due, 0)) - SUM(NVL(first_yr_rent, 0))) last_yr_rent
8407      FROM pn_var_trx_headers_all
8408      WHERE period_id = p_period_id;
8409 
8410 
8411 
8412 l_rent                           NUMBER := 0;
8413 l_first_period                   VARCHAR2(1) := 'N';
8414 l_last_period                    VARCHAR2(1) := 'N';
8415 
8416 BEGIN
8417 
8418  FOR rent_rec IN rent_cur LOOP
8419 
8420     FOR first_period_rec IN first_period_cur (rent_rec.var_rent_id, rent_rec.period_id) LOOP
8421         l_first_period := 'Y';
8422     END LOOP;
8423 
8424     FOR last_period_rec IN last_period_cur (rent_rec.var_rent_id, rent_rec.period_id) LOOP
8425         l_last_period := 'Y';
8426     END LOOP;
8427 
8428     IF p_proration_rule IN('FY','FLY') AND l_first_period = 'Y'
8429     THEN
8430 
8431       FOR first_yr_rec IN first_yr_rent(rent_rec.var_rent_id) LOOP
8432               l_rent := NVL(first_yr_rec.first_yr_rent, 0);
8433       END LOOP;
8434 
8435     ELSIF p_proration_rule IN('LY','FLY') AND l_last_period = 'Y'
8436     THEN
8437 
8438       FOR last_yr_rec IN last_yr_rent(rent_rec.period_id) LOOP
8439               l_rent := NVL(last_yr_rec.last_yr_rent, 0);
8440       END LOOP;
8441 
8442     ELSE
8443 
8444         l_rent := NVL(rent_rec.percent_rent_due, 0);
8445 
8446     END IF;
8447 
8448   END LOOP;
8449 
8450   return l_rent;
8451 
8452 END current_gross_vr;
8453 
8454 --------------------------------------------------------------------------------
8455 --  NAME         : cumulative_gross_vr
8456 --  DESCRIPTION  :
8457 --  PURPOSE      :
8458 --  INVOKED FROM :
8459 --  ARGUMENTS    :
8460 --  REFERENCE    :
8461 --  HISTORY      :
8462 --
8463 --  3.Nov.06  piagrawa    o Created
8464 --------------------------------------------------------------------------------
8465 FUNCTION cumulative_gross_vr( p_proration_rule   IN VARCHAR2,
8466                               p_trx_detail_id    IN NUMBER)
8467 RETURN NUMBER IS
8468 
8469 -- Get the details of
8470   CURSOR first_period_cur (p_var_rent_id NUMBER, p_period_id NUMBER) IS
8471     SELECT pvp.period_id, pvr.commencement_date
8472       FROM pn_var_periods_all pvp, pn_var_rents_all pvr
8473      WHERE pvr.var_rent_id = p_var_rent_id
8474      AND   pvp.period_id = p_period_id
8475      AND   pvp.partial_period = 'Y'
8476      AND   pvp.start_date = pvr.commencement_date;
8477 
8478   -- Get the details of
8479   CURSOR last_period_cur (p_var_rent_id NUMBER, p_period_id NUMBER) IS
8480     SELECT pvp.period_id, pvr.termination_date
8481       FROM pn_var_periods_all pvp, pn_var_rents_all pvr
8482      WHERE pvr.var_rent_id = p_var_rent_id
8483      AND   pvp.period_id = p_period_id
8484      AND   pvp.partial_period = 'Y'
8485      AND   pvp.end_date   = pvr.termination_date;
8486 
8487    -- Get the details of
8488    CURSOR rent_cur IS
8489      SELECT hdr.ytd_percent_rent,
8490             hdr.first_yr_rent,
8491             hdr.period_id,
8492             hdr.var_rent_id
8493       FROM pn_var_trx_headers_all hdr,
8494            pn_var_trx_details_all dtls
8495       WHERE hdr.trx_header_id = dtls.trx_header_id
8496       AND   dtls.trx_detail_id  = p_trx_detail_id;
8497 
8498    -- Get the details of
8499    CURSOR first_yr_rent (p_var_rent_id NUMBER) IS
8500      SELECT SUM(first_yr_rent) first_yr_rent
8501      FROM pn_var_trx_headers_all
8502      WHERE var_rent_id = p_var_rent_id;
8503 
8504    -- Get the details of
8505    CURSOR last_yr_rent (p_period_id NUMBER) IS
8506      SELECT (SUM(NVL(prorated_rent_due, 0)) - SUM(NVL(first_yr_rent, 0))) last_yr_rent
8507      FROM pn_var_trx_headers_all
8508      WHERE period_id = p_period_id;
8509 
8510 l_rent                           NUMBER := 0;
8511 l_first_period                   VARCHAR2(1) := 'N';
8512 l_last_period                    VARCHAR2(1) := 'N';
8513 
8514 BEGIN
8515 
8516  FOR rent_rec IN rent_cur LOOP
8517 
8518     FOR first_period_rec IN first_period_cur (rent_rec.var_rent_id, rent_rec.period_id) LOOP
8519         l_first_period := 'Y';
8520     END LOOP;
8521 
8522     FOR last_period_rec IN last_period_cur (rent_rec.var_rent_id, rent_rec.period_id) LOOP
8523         l_last_period := 'Y';
8524     END LOOP;
8525 
8526     IF p_proration_rule IN('FY','FLY') AND l_first_period = 'Y'
8527     THEN
8528 
8529       FOR first_yr_rec IN first_yr_rent(rent_rec.var_rent_id) LOOP
8530               l_rent := NVL(first_yr_rec.first_yr_rent, 0);
8531       END LOOP;
8532 
8533     ELSIF p_proration_rule IN('LY','FLY') AND l_last_period = 'Y'
8534     THEN
8535 
8536       FOR last_yr_rec IN last_yr_rent(rent_rec.period_id) LOOP
8537               l_rent := NVL(last_yr_rec.last_yr_rent, 0);
8538       END LOOP;
8539 
8540     ELSE
8541 
8542         l_rent := NVL(rent_rec.ytd_percent_rent, 0);
8543 
8544     END IF;
8545 
8546   END LOOP;
8547 
8548   return l_rent;
8549 
8550 END cumulative_gross_vr;
8551 
8552 --------------------------------------------------------------------------------
8553 --  NAME         : fy_net_sales
8554 --  DESCRIPTION  :
8555 --  PURPOSE      :
8556 --  INVOKED FROM :
8557 --  ARGUMENTS    :
8558 --  REFERENCE    :
8559 --  HISTORY      :
8560 --
8561 --  3.Nov.06  piagrawa    o Created
8562 --------------------------------------------------------------------------------
8563 FUNCTION fy_net_sales(  p_var_rent_id       IN NUMBER
8564                        ,p_line_item_id      IN NUMBER)
8565 RETURN NUMBER IS
8566 
8567   /* get FY sales */
8568   CURSOR fy_sales_c( p_vr_id            IN NUMBER
8569                     ,p_vr_comm_date     IN DATE
8570                     ,p_line_item_grp_id IN NUMBER) IS
8571     SELECT
8572     NVL(SUM(fy_proration_sales - NVL(fy_proration_deductions,0) ),0) AS sales
8573     FROM
8574     pn_var_trx_headers_all
8575     WHERE
8576     var_rent_id = p_vr_id AND
8577     line_item_group_id = p_line_item_grp_id AND
8578     calc_prd_start_date <= (ADD_MONTHS(p_vr_comm_date, 12) - 1) ;
8579 
8580   CURSOR line_item_cur IS
8581     SELECT trx.line_item_group_id, pvr.commencement_date
8582      FROM  pn_var_trx_headers_all trx,
8583            pn_var_rents_all pvr
8584      WHERE trx.var_rent_id = p_var_rent_id
8585      AND   trx.var_rent_id = pvr.var_rent_id
8586      AND   trx.line_item_id = p_line_item_id;
8587 
8588   l_sales NUMBER := 0;
8589 
8590 BEGIN
8591 
8592    FOR rec IN line_item_cur LOOP
8593 
8594       FOR fy_sales_rec IN fy_sales_c( p_var_rent_id
8595                                      ,rec.commencement_date
8596                                      ,rec.line_item_group_id)
8597       LOOP
8598          l_sales := fy_sales_rec.sales ;
8599       END LOOP;
8600 
8601    END LOOP;
8602 
8603    RETURN l_sales;
8604 
8605 END fy_net_sales;
8606 
8607 --------------------------------------------------------------------------------
8608 --  NAME         : first_yr_sales
8609 --  DESCRIPTION  :
8610 --  PURPOSE      :
8611 --  INVOKED FROM :
8612 --  ARGUMENTS    :
8613 --  REFERENCE    :
8614 --  HISTORY      :
8615 --
8616 --  3.Nov.06  piagrawa    o Created
8617 --------------------------------------------------------------------------------
8618 FUNCTION first_yr_sales(  p_var_rent_id       IN NUMBER
8619                        ,p_line_item_id      IN NUMBER)
8620 RETURN NUMBER IS
8621 
8622   /* get FY sales */
8623   CURSOR fy_sales_c( p_vr_id            IN NUMBER
8624                     ,p_vr_comm_date     IN DATE
8625                     ,p_line_item_grp_id IN NUMBER) IS
8626     SELECT
8627     NVL(SUM(fy_proration_sales),0) AS sales
8628     FROM
8629     pn_var_trx_headers_all
8630     WHERE
8631     var_rent_id = p_vr_id AND
8632     line_item_group_id = p_line_item_grp_id AND
8633     calc_prd_start_date <= (ADD_MONTHS(p_vr_comm_date, 12) - 1) ;
8634 
8635   CURSOR line_item_cur IS
8636     SELECT trx.line_item_group_id, pvr.commencement_date
8637      FROM  pn_var_trx_headers_all trx,
8638            pn_var_rents_all pvr
8639      WHERE trx.var_rent_id = p_var_rent_id
8640      AND   trx.var_rent_id = pvr.var_rent_id
8641      AND   trx.line_item_id = p_line_item_id;
8642 
8643   l_sales NUMBER := 0;
8644 
8645 BEGIN
8646 
8647    FOR rec IN line_item_cur LOOP
8648 
8649       FOR fy_sales_rec IN fy_sales_c( p_var_rent_id
8650                                      ,rec.commencement_date
8651                                      ,rec.line_item_group_id)
8652       LOOP
8653          l_sales := fy_sales_rec.sales ;
8654       END LOOP;
8655 
8656    END LOOP;
8657 
8658    RETURN l_sales;
8659 
8660 END first_yr_sales;
8661 
8662 --------------------------------------------------------------------------------
8663 --  NAME         : first_yr_deductions
8664 --  DESCRIPTION  :
8665 --  PURPOSE      :
8666 --  INVOKED FROM :
8667 --  ARGUMENTS    :
8668 --  REFERENCE    :
8669 --  HISTORY      :
8670 --
8671 --  3.Nov.06  piagrawa    o Created
8672 --------------------------------------------------------------------------------
8673 FUNCTION first_yr_deductions(  p_var_rent_id       IN NUMBER
8674                               ,p_line_item_id      IN NUMBER)
8675 RETURN NUMBER IS
8676 
8677   /* get FY sales */
8678   CURSOR fy_deduction_c( p_vr_id            IN NUMBER
8679                         ,p_vr_comm_date     IN DATE
8680                         ,p_line_item_grp_id IN NUMBER) IS
8681     SELECT
8682     NVL(SUM(fy_proration_deductions),0) AS deductions
8683     FROM
8684     pn_var_trx_headers_all
8685     WHERE
8686     var_rent_id = p_vr_id AND
8687     line_item_group_id = p_line_item_grp_id AND
8688     calc_prd_start_date <= (ADD_MONTHS(p_vr_comm_date, 12) - 1) ;
8689 
8690   CURSOR line_item_cur IS
8691     SELECT trx.line_item_group_id, pvr.commencement_date
8692      FROM  pn_var_trx_headers_all trx,
8693            pn_var_rents_all pvr
8694      WHERE trx.var_rent_id = p_var_rent_id
8695      AND   trx.var_rent_id = pvr.var_rent_id
8696      AND   trx.line_item_id = p_line_item_id;
8697 
8698   l_deductions NUMBER := 0;
8699 
8700 BEGIN
8701 
8702    FOR rec IN line_item_cur LOOP
8703 
8704       FOR fy_deduction_rec IN fy_deduction_c( p_var_rent_id
8705                                              ,rec.commencement_date
8706                                              ,rec.line_item_group_id)
8707       LOOP
8708          l_deductions := fy_deduction_rec.deductions ;
8709       END LOOP;
8710 
8711    END LOOP;
8712 
8713    RETURN l_deductions;
8714 
8715 END first_yr_deductions;
8716 
8717 --------------------------------------------------------------------------------
8718 --  NAME         : true_up_details
8719 --  DESCRIPTION  :
8720 --  PURPOSE      :
8721 --  INVOKED FROM :
8722 --  ARGUMENTS    :
8723 --  REFERENCE    :
8724 --  HISTORY      :
8725 --
8726 --  3.Nov.06  piagrawa    o Created
8727 --------------------------------------------------------------------------------
8728 PROCEDURE true_up_details ( p_var_rent_id        IN NUMBER
8729                            ,p_trx_detail_id      IN NUMBER
8730                            ,p_rate               IN NUMBER
8731                            ,p_trueup_bkpt_vol_start OUT NOCOPY  NUMBER
8732                            ,p_trueup_bkpt_vol_end   OUT NOCOPY  NUMBER
8733                            ,p_trueup_volume         OUT NOCOPY  NUMBER
8734                            ,p_deductions            OUT NOCOPY  NUMBER
8735                            ,p_overage               OUT NOCOPY  NUMBER)
8736 IS
8737 
8738   /* get FY sales */
8739 CURSOR true_up_cur IS
8740   SELECT  dtls.ytd_group_vol_start AS trueup_bkpt_vol_start
8741          ,dtls.ytd_group_vol_end   AS trueup_bkpt_vol_end
8742          ,hdr.ytd_sales            AS trueup_volume
8743          ,hdr.ytd_deductions       AS deductions
8744   FROM   pn_var_trx_headers_all hdr,
8745          pn_var_trx_details_all dtls
8746   WHERE  dtls.trx_detail_id = p_trx_detail_id
8747   AND    dtls.bkpt_rate = p_rate
8748   AND    dtls.trx_header_id = hdr.trx_header_id;
8749 
8750   l_applicable_sales NUMBER := 0;
8751 
8752 BEGIN
8753 
8754    FOR true_up_rec IN true_up_cur LOOP
8755       p_trueup_bkpt_vol_start := NVL(true_up_rec.trueup_bkpt_vol_start, 0);
8756       p_trueup_bkpt_vol_end   := NVL(true_up_rec.trueup_bkpt_vol_end, 0);
8757       p_trueup_volume         := NVL(true_up_rec.trueup_volume, 0);
8758       p_deductions            := NVL(true_up_rec.deductions, 0);
8759 
8760       l_applicable_sales := NVl(p_trueup_volume, 0) - NVL(p_deductions, 0);
8761 
8762       IF(p_trueup_bkpt_vol_end = 0) THEN
8763          p_overage := greatest(l_applicable_sales - p_trueup_bkpt_vol_start,0);
8764       ELSE
8765          IF((l_applicable_sales >= p_trueup_bkpt_vol_start) AND (l_applicable_sales <= p_trueup_bkpt_vol_end)) THEN
8766            p_overage :=  l_applicable_sales - p_trueup_bkpt_vol_start;
8767          ELSIF(l_applicable_sales > p_trueup_bkpt_vol_end) THEN
8768            p_overage := p_trueup_bkpt_vol_end - p_trueup_bkpt_vol_start;
8769          ELSIF(l_applicable_sales < p_trueup_bkpt_vol_start) THEN
8770            p_overage := 0;
8771          END IF;
8772       END IF;
8773 
8774       p_trueup_bkpt_vol_end := pn_var_rent_calc_pkg.end_breakpoint(p_trueup_bkpt_vol_start, p_trueup_bkpt_vol_end);
8775 
8776       p_trueup_bkpt_vol_start  := round(p_trueup_bkpt_vol_start,2);
8777       p_trueup_bkpt_vol_end    := round(p_trueup_bkpt_vol_end,2);
8778       p_trueup_volume          := round(p_trueup_volume,2);
8779       p_deductions             := round(p_deductions,2);
8780       p_overage                := round(p_overage,2);
8781 
8782    END LOOP;
8783 
8784 END true_up_details;
8785 
8786 
8787 --------------------------------------------------------------------------------
8788 --  NAME         : true_up_summary
8789 --  DESCRIPTION  :
8790 --  PURPOSE      :
8791 --  INVOKED FROM :
8792 --  ARGUMENTS    :
8793 --  REFERENCE    :
8794 --  HISTORY      :
8795 --
8796 --  3.Nov.06  piagrawa    o Created
8797 --------------------------------------------------------------------------------
8798 PROCEDURE true_up_summary ( p_period_id        IN NUMBER
8799                            ,p_true_up_rent     OUT NOCOPY  NUMBER
8800                            ,p_trueup_volume    OUT NOCOPY  NUMBER
8801                            ,p_deductions       OUT NOCOPY  NUMBER)
8802 IS
8803 
8804   /* get FY sales */
8805 CURSOR true_up_cur IS
8806   SELECT  sum(NVL(act_var_rent, 0)) + sum(NVL(trueup_var_rent, 0)) - sum(NVL(first_yr_rent,0)) true_up_rent,
8807           sum(NVL(tot_act_vol, 0)) true_up_vol,
8808           sum(NVL(tot_ded, 0)) true_up_deductions
8809   FROM   pn_var_rent_summ_all
8810   WHERE  period_id = p_period_id;
8811 
8812 BEGIN
8813 
8814    FOR true_up_rec IN true_up_cur LOOP
8815       p_true_up_rent          := true_up_rec.true_up_rent;
8816       p_trueup_volume         := true_up_rec.true_up_vol;
8817       p_deductions            := true_up_rec.true_up_deductions;
8818 
8819    END LOOP;
8820 
8821 END true_up_summary;
8822 
8823 --------------------------------------------------------------------------------
8824 --  NAME         : pop_inv_date_tab
8825 --  DESCRIPTION  :
8826 --  PURPOSE      :
8827 --  INVOKED FROM :
8828 --  ARGUMENTS    :
8829 --  REFERENCE    :
8830 --  HISTORY      :
8831 --
8832 --  3.Dec.06  lbala    o Created
8833 --------------------------------------------------------------------------------
8834 
8835 PROCEDURE pop_inv_date_tab(p_var_rent_id IN NUMBER,
8836                            p_status IN VARCHAR2 )
8837 IS
8838 -- Get the all invoice_dates
8839 CURSOR get_inv_dates_cur(p_vrent_id IN NUMBER,p_status IN VARCHAR2)
8840    IS
8841 SELECT distinct gd1.invoice_date,gd1.period_id,decode(temp.inv_dt,NULL,'N','Y')
8842 FROM pn_var_grp_dates_all gd1,
8843 (SELECT gd.invoice_date inv_dt
8844  FROM pn_var_grp_dates_all gd
8845  WHERE EXISTS (SELECT NULL from pn_var_vol_hist_all vol
8846                 WHERE vol_hist_status_code = p_status
8847                   AND vol.period_id = gd.period_id
8848                   AND vol.invoicing_date= gd.invoice_date
8849                )
8850 AND
8851 NOT EXISTS   (SELECT NULL from pn_var_rent_inv_all vinv
8852                WHERE vinv.invoice_date=gd.invoice_date
8853                  AND vinv.period_id=gd.period_id
8854              )
8855 AND gd.var_rent_id=p_vrent_id
8856 )temp
8857 WHERE gd1.var_rent_id=p_vrent_id
8858 AND gd1.invoice_date=temp.inv_dt(+)
8859 ORDER BY gd1.invoice_date;
8860 
8861 BEGIN
8862 pnp_debug_pkg.log('+++++++++ POP_INV_DATE_TAB START +++++++++++');
8863 
8864 OPEN get_inv_dates_cur(p_var_rent_id,p_status) ;
8865 FETCH get_inv_dates_cur BULK COLLECT INTO inv_date_tab;
8866 CLOSE get_inv_dates_cur;
8867 
8868 pnp_debug_pkg.log('+++++++++ POP_INV_DATE_TAB END +++++++++++');
8869 END pop_inv_date_tab;
8870 --------------------------------------------------------------------------------
8871 --  NAME         : POP_INV_DATE_TAB_FIRSTYR
8872 --  DESCRIPTION  :
8873 --  PURPOSE      :
8874 --  INVOKED FROM :
8875 --  ARGUMENTS    :
8876 --  REFERENCE    :
8877 --  HISTORY      :
8878 --
8879 --  3.Dec.06  lbala    o Created
8880 --------------------------------------------------------------------------------
8881 
8882 PROCEDURE POP_INV_DATE_TAB_FIRSTYR(p_var_rent_id IN NUMBER,
8883                                    p_status IN VARCHAR2)
8884 IS
8885 -- Get roll fwd flag for 1st partial period
8886 CURSOR get_fst_prd_flag(p_vrent_id IN NUMBER,p_status IN VARCHAR2) IS
8887   SELECT 'Y' fst_prd_flag
8888     FROM dual
8889    WHERE EXISTS
8890          (SELECT period_id FROM pn_var_periods_all vp
8891           WHERE period_num=1
8892           AND var_rent_id=p_vrent_id
8893           AND partial_period='Y'
8894           AND EXISTS (select NULL from pn_var_vol_hist_all vol
8895                       where vol_hist_status_code = p_status
8896                       and vol.period_id = vp.period_id
8897                       and var_rent_id=p_vrent_id
8898                       )
8899           AND NOT EXISTS (select NULL from pn_var_rent_inv_all vinv
8900                           where vinv.var_rent_id = p_vrent_id
8901                           and vinv.period_id = vp.period_id
8902                           )
8903          );
8904 
8905 -- Get invoice dates from 2nd annual period for FY/FLY proration rules
8906 CURSOR get_partial_prd_inv_dates(p_vrent_id IN NUMBER,p_status IN VARCHAR2)
8907 IS
8908 SELECT distinct gd1.invoice_date ,gd1.period_id, decode(temp.inv_dt,NULL,'N','Y')
8909 FROM pn_var_grp_dates_all gd1,
8910      pn_var_periods_all vp,
8911 (SELECT gd.invoice_date inv_dt
8912  FROM pn_var_grp_dates_all gd
8913  WHERE EXISTS(select NULL from pn_var_vol_hist_all vol
8914                where vol_hist_status_code = p_status
8915                  and vol.period_id = gd.period_id
8916                  and vol.invoicing_date= gd.invoice_date
8917              )
8918  AND NOT EXISTS (select NULL from pn_var_rent_inv_all vinv
8919                   where vinv.invoice_date=gd.invoice_date
8920                     and vinv.period_id=gd.period_id
8921                 )
8922  AND gd.var_rent_id=p_vrent_id
8923 )temp
8924 where gd1.var_rent_id=p_vrent_id
8925 and gd1.period_id=vp.period_id
8926 and vp.period_num>1
8927 and gd1.invoice_date=temp.inv_dt(+)
8928 order by gd1.invoice_date;
8929 
8930 BEGIN
8931 pnp_debug_pkg.log('+++++++++ POP_INV_DATE_TAB_FIRSTYR START +++++++++++');
8932 
8933 FOR fst_prd_cur IN get_fst_prd_flag(p_var_rent_id ,p_status) LOOP
8934   g_partial_prd_flag := fst_prd_cur.fst_prd_flag;
8935 END LOOP;
8936 
8937 --pnp_debug_pkg.log('g_partial_prd_flag='||g_partial_prd_flag);
8938 
8939 OPEN get_partial_prd_inv_dates(p_var_rent_id,p_status) ;
8940 FETCH get_partial_prd_inv_dates BULK COLLECT INTO inv_date_tab;
8941 CLOSE get_partial_prd_inv_dates;
8942 
8943 pnp_debug_pkg.log('+++++++++ POP_INV_DATE_TAB_FIRSTYR END +++++++++++');
8944 END POP_INV_DATE_TAB_FIRSTYR;
8945 
8946 --------------------------------------------------------------------------------
8947 --  NAME         : ROLL_FWD_PARTIAL_PRD
8948 --  DESCRIPTION  : Rolls forward the abatement selections when an invoice is
8949 --                 calculated the 1st time for FY/FLY prorationmethod
8950 --  PURPOSE      :
8951 --  INVOKED FROM :
8952 --  ARGUMENTS    :
8953 --  REFERENCE    :
8954 --  HISTORY      :
8955 --
8956 --  3.Dec.06  lbala    o Created
8957 --------------------------------------------------------------------------------
8958 PROCEDURE ROLL_FWD_PARTIAL_PRD(p_var_rent_id IN NUMBER)
8959 IS
8960 
8961 l_pmt_term_id       NUMBER :=NULL;
8962 l_abtmt_term_id     NUMBER :=NULL;
8963 l_min_pmt_term_id   NUMBER :=NULL;
8964 l_row_id            VARCHAR2(18):=NULL;
8965 l_var_abmt_id       NUMBER :=NULL;
8966 l_min_var_abt_id    NUMBER :=NULL;
8967 l_fst_inv_dt        DATE := NULL;
8968 l_inv_id            NUMBER :=NULL;
8969 l_prev_inv_id       NUMBER := NULL;
8970 l_prev_dt           DATE := NULL;
8971 l_org_id            NUMBER;
8972 l_fst_inv_id        NUMBER := NULL;
8973 
8974 CURSOR org_cur(p_var_rent_id IN NUMBER) IS
8975   SELECT org_id
8976   FROM   pn_var_rents_all
8977   WHERE  var_rent_id =p_var_rent_id;
8978 
8979 /*Cursor to get all pmt terms for a particular invoice*/
8980 CURSOR get_all_pmt_terms(p_inv_id IN NUMBER) IS
8981   SELECT  distinct pterm.payment_term_id payment_term_id
8982   FROM pn_payment_terms_all pterm,
8983      pn_var_rents_all vrent,
8984      pn_var_rent_inv_all vinv
8985   WHERE vrent.lease_id = pterm.lease_id
8986   AND vrent.var_rent_id = vinv.var_rent_id
8987   AND pterm.start_date <=
8988   (SELECT MAX(gd.grp_end_date)
8989    FROM pn_var_grp_dates_all gd
8990    WHERE gd.period_id = vinv.period_id
8991    AND gd.invoice_date = vinv.invoice_date
8992   )
8993   AND pterm.end_date >=
8994   (SELECT MIN(gd1.grp_start_date)
8995    FROM pn_var_grp_dates_all gd1
8996    WHERE gd1.period_id = vinv.period_id
8997    AND gd1.invoice_date = vinv.invoice_date
8998   )
8999   AND pterm.var_rent_inv_id IS NULL
9000   AND pterm.index_period_id IS NULL
9001   AND vinv.adjust_num = 0
9002   AND vinv.var_rent_inv_id=p_inv_id;
9003 
9004 /*Cursor to get all abtmt terms for a particular invoice*/
9005 CURSOR get_abtmt_terms_inv(p_inv_id IN NUMBER) IS
9006   select * from pn_var_abatements_all
9007   where var_rent_inv_id=p_inv_id;
9008 
9009 /*Cursor to get abtmt terms for 1st invoice from setup*/
9010 CURSOR get_var_abtmt_id(p_vrent_id IN NUMBER) IS
9011   SELECT var_abatement_id,payment_term_id
9012   FROM pn_var_abatements_all
9013   WHERE var_rent_inv_id = -1
9014   AND var_rent_id=p_vrent_id;
9015 
9016 
9017 -- Get the invoice id for a given period_id and invoice_date
9018 CURSOR check_inv_exists(p_var_rent_id IN NUMBER,p_inv_dt IN DATE,p_prd_id IN NUMBER) IS
9019   SELECT var_rent_inv_id inv_id
9020   FROM pn_var_rent_inv_all
9021   WHERE invoice_date= p_inv_dt
9022   AND   var_rent_id = p_var_rent_id
9023   AND   period_id   = p_prd_id
9024   AND   adjust_num  = 0;
9025 
9026 -- Get the details of invoice for 1st partial period
9027 CURSOR get_fst_inv_id(p_var_rent_id IN NUMBER) IS
9028   SELECT var_rent_inv_id
9029     FROM pn_var_rent_inv_all
9030    WHERE var_rent_id=p_var_rent_id
9031      AND period_id IN (SELECT period_id
9032                        FROM pn_var_periods_all
9033                        WHERE period_num=1
9034                        AND var_rent_id=p_var_rent_id
9035                        AND partial_period='Y'
9036                        )
9037      AND adjust_num=0;
9038 
9039 
9040 BEGIN
9041 pnp_debug_pkg.log('+++++++++ ROLL_FWD_PARTIAL_PRD START +++++++++++');
9042 
9043 FOR rec IN org_cur(p_var_rent_id) LOOP
9044         l_org_id := rec.org_id;
9045 END LOOP;
9046 -- Get invoice id of 1st partial period
9047 FOR fst_inv IN get_fst_inv_id(p_var_rent_id) LOOP
9048    l_fst_inv_id := fst_inv.var_rent_inv_id;
9049 END LOOP;
9050 
9051 IF g_partial_prd_flag='Y' AND l_fst_inv_id IS NOT NULL THEN
9052    /* updation for 1st invoice */
9053    l_min_var_abt_id:=NULL;
9054    l_min_pmt_term_id:=NULL;
9055 
9056    FOR abtmt_exists_rec IN  get_var_abtmt_id(p_var_rent_id) LOOP
9057     l_min_var_abt_id  := abtmt_exists_rec.var_abatement_id;
9058     l_min_pmt_term_id := abtmt_exists_rec.payment_term_id;
9059 
9060     --pnp_debug_pkg.log('prior to update');
9061     PN_VAR_ABATEMENTS_PKG.LOCK_ROW(p_var_rent_id,-1,l_min_pmt_term_id);
9062     update pn_var_abatements_all
9063     set var_rent_inv_id = l_fst_inv_id
9064     where var_abatement_id = l_min_var_abt_id;
9065 
9066    END LOOP;
9067   /* updation for 1st invoice over*/
9068 
9069 END IF;
9070 
9071 FOR i IN 1..inv_date_tab.COUNT LOOP
9072 
9073  l_inv_id:=NULL;
9074  l_prev_inv_id :=NULL;
9075  IF  (inv_date_tab(i).inv_flag ='Y') THEN
9076    pnp_debug_pkg.log('invoice '||inv_date_tab(i).inv_flag||inv_date_tab(i).inv_date||inv_date_tab(i).period_id);
9077 
9078    FOR rec IN check_inv_exists(p_var_rent_id ,inv_date_tab(i).inv_date,inv_date_tab(i).period_id) LOOP
9079       l_inv_id:= rec.inv_id;
9080    END LOOP;
9081    pnp_debug_pkg.log('invoice id= '||l_inv_id);
9082 
9083    IF i=1 THEN
9084       l_prev_inv_id:=l_fst_inv_id;
9085    ELSE
9086      FOR rec1 IN check_inv_exists(p_var_rent_id ,inv_date_tab(i-1).inv_date,inv_date_tab(i-1).period_id) LOOP
9087       l_prev_inv_id:= rec1.inv_id;
9088      END LOOP;
9089    END IF;
9090 
9091    IF l_prev_inv_id IS NOT NULL THEN
9092 
9093         FOR pmt_term_rec IN get_all_pmt_terms(l_inv_id) LOOP
9094           l_pmt_term_id:= pmt_term_rec.payment_term_id;
9095 
9096           FOR abtmt_inv_rec IN get_abtmt_terms_inv(l_prev_inv_id) LOOP
9097            l_abtmt_term_id := abtmt_inv_rec.payment_term_id;
9098 
9099            IF (l_pmt_term_id = l_abtmt_term_id) THEN
9100 
9101             l_row_id := NULL;
9102             l_var_abmt_id :=NULL;
9103 
9104             PN_VAR_ABATEMENTS_PKG.INSERT_ROW(
9105                    X_ROWID             => l_row_id,
9106                    X_VAR_ABATEMENT_ID  => l_var_abmt_id,
9107                    X_VAR_RENT_ID       => p_var_rent_id,
9108                    X_VAR_RENT_INV_ID   => l_inv_id,
9109                    X_PAYMENT_TERM_ID   => l_pmt_term_id,
9110                    X_INCLUDE_TERM      => abtmt_inv_rec.include_term,
9111                    X_INCLUDE_INCREASES => abtmt_inv_rec.include_increases,
9112                    X_UPDATE_FLAG       => NULL,
9113                    X_CREATION_DATE     => sysdate,
9114                    X_CREATED_BY        => NVL(fnd_profile.value('USER_ID'),-1),
9115                    X_LAST_UPDATE_DATE  => sysdate,
9116                    X_LAST_UPDATED_BY   => NVL(fnd_profile.value('USER_ID'),-1),
9117                    X_LAST_UPDATE_LOGIN => NVL(fnd_profile.value('USER_ID'),-1),
9118                    X_ORG_ID            => l_org_id  );
9119            END IF;
9120 
9121          END LOOP;
9122 
9123        END LOOP;
9124 
9125    ELSE
9126         EXIT ;
9127 
9128    END IF;
9129  END IF;
9130 END LOOP;
9131 pnp_debug_pkg.log('+++++++++ ROLL_FWD_PARTIAL_PRD END +++++++++++');
9132 END ROLL_FWD_PARTIAL_PRD;
9133 --------------------------------------------------------------------------------
9134 --  NAME         : ROLL_FWD_LST_PARTIAL_PRD
9135 --  DESCRIPTION  : Rolls forward the abatement selections when the last partial
9136 --                 period invoice is calculated the 1st time
9137 --  PURPOSE      :
9138 --  INVOKED FROM :
9139 --  ARGUMENTS    :
9140 --  REFERENCE    :
9141 --  HISTORY      :
9142 --
9143 --  3.Dec.06  lbala    o Created
9144 --------------------------------------------------------------------------------
9145 PROCEDURE ROLL_FWD_LST_PARTIAL_PRD(p_var_rent_id IN NUMBER)
9146 IS
9147 --- Get org_id
9148 CURSOR org_cur(p_var_rent_id IN NUMBER) IS
9149   SELECT org_id
9150   FROM   pn_var_rents_all
9151   WHERE  var_rent_id =p_var_rent_id;
9152 
9153 -- Get the last partial period id
9154 CURSOR get_last_partial_prd(p_var_rent_id IN NUMBER) IS
9155  SELECT prd.period_id
9156    FROM pn_var_periods_all prd ,pn_var_rents_all vrent
9157   WHERE prd.var_rent_id=p_var_rent_id
9158     AND vrent.var_rent_id = prd.var_rent_id
9159     AND prd.end_date = vrent.termination_date
9160     AND partial_period='Y';
9161 
9162 -- Get the invoice id
9163 CURSOR get_last_invoice_id(p_var_rent_id IN NUMBER
9164                           ,p_prd_id IN NUMBER
9165                           ,p_inv_dt IN DATE
9166                           )
9167   IS
9168   SELECT var_rent_inv_id
9169     FROM pn_var_rent_inv_all
9170    WHERE var_rent_id=p_var_rent_id
9171      AND period_id=p_prd_id
9172      AND invoice_date=p_inv_dt
9173      AND adjust_num=0;
9174 
9175 -- Get all invoices for a given period
9176 CURSOR get_last_prd_inv(p_var_rent_id IN NUMBER
9177                        ,p_prd_id IN NUMBER
9178                        ,p_inv_id IN NUMBER)
9179   IS
9180   SELECT var_rent_inv_id
9181     FROM pn_var_rent_inv_all
9182    WHERE var_rent_id=p_var_rent_id
9183      AND period_id=p_prd_id
9184      AND var_rent_inv_id <> p_inv_id
9185      AND adjust_num=0;
9186 
9187 /*Cursor to get all abtmt terms for a particular invoice*/
9188 CURSOR get_abtmt_terms_inv(p_inv_id IN NUMBER) IS
9189   SELECT * FROM pn_var_abatements_all
9190   WHERE var_rent_inv_id=p_inv_id;
9191 
9192 -- Check whether a given combination of (payment_term_id,var_rent_inv_id)
9193 --       exists in pn_var_abatements_all
9194 CURSOR check_abtmt_exists(p_inv_id IN NUMBER,p_pmt_id IN NUMBER)
9195 IS
9196   SELECT 'Y' abt_exists
9197     FROM dual
9198    WHERE EXISTS ( SELECT NULL
9199                   FROM pn_var_abatements_all
9200                   WHERE var_rent_inv_id=p_inv_id
9201                   AND payment_term_id = p_pmt_id );
9202 -- Get the invoice_date for an invoice with a given grp_end_dt
9203 CURSOR get_inv_date(p_var_rent_id IN NUMBER,p_prd_id IN NUMBER,p_end_dt IN DATE)
9204 IS
9205 SELECT invoice_date
9206 FROM pn_var_grp_dates_all
9207 WHERE var_rent_id = p_var_rent_id
9208 AND period_id = p_prd_id
9209 AND grp_end_date = p_end_dt;
9210 
9211 l_org_id      NUMBER :=NULL;
9212 l_last_prd_id NUMBER :=NULL;
9213 l_last_inv_id NUMBER :=NULL;
9214 l_inv_id      NUMBER :=NULL;
9215 l_pmt_term_id NUMBER :=NULL;
9216 l_abt_exists  VARCHAR2(1):=NULL;
9217 l_row_id      ROWID ;
9218 l_var_abmt_id NUMBER :=NULL;
9219 l_last_inv_dt DATE   :=NULL;
9220 j             NUMBER :=NULL;
9221 BEGIN
9222 pnp_debug_pkg.log('+++++++++ ROLL_FWD_LST_PARTIAL_PRD START +++++++++++');
9223 
9224 --1. Get last partial period id
9225 --2. Get invoice date for the last invoice of this partial period whose grp end date is
9226 --   Variable Rent Agreement's termination date
9227 --3. Get the index of the corresponding record from inv_date_tab for combination of the above
9228 --   invoice date and last partial period id and determine the corresponding invoice id
9229 --4. If roll fwd flag='Y' , then roll forward the UNION of selecns from other invoices of the
9230 --   last partial period to this invoice id
9231 
9232 FOR rec IN org_cur(p_var_rent_id) LOOP
9233   l_org_id := rec.org_id;
9234 END LOOP;
9235 
9236 -- Get last partial period id
9237 FOR last_prd_rec IN get_last_partial_prd(p_var_rent_id) LOOP
9238    l_last_prd_id := last_prd_rec.period_id;
9239 END LOOP;
9240 
9241 --pnp_debug_pkg.log('last period id= '||l_last_prd_id);
9242 
9243 IF l_last_prd_id IS NOT NULL THEN
9244 
9245  FOR rec IN get_inv_date(p_var_rent_id,l_last_prd_id,g_vr_termination_date) LOOP
9246   l_last_inv_dt := rec.invoice_date;
9247  END LOOP;
9248 
9249  FOR i IN 1..inv_date_tab.COUNT LOOP
9250      IF inv_date_tab(i).period_id=l_last_prd_id AND
9251         inv_date_tab(i).inv_date= l_last_inv_dt THEN
9252         j:=i;
9253         EXIT;
9254      END IF;
9255  END LOOP;
9256 
9257  IF ((j IS NOT NULL) AND inv_date_tab(j).inv_flag ='Y') THEN
9258 
9259   FOR last_inv_rec IN get_last_invoice_id(p_var_rent_id,l_last_prd_id,inv_date_tab(j).inv_date) LOOP
9260    l_last_inv_id := last_inv_rec.var_rent_inv_id;
9261   END LOOP;
9262   --pnp_debug_pkg.log('last invoice id= '||l_last_inv_id);
9263 
9264   FOR inv_rec IN get_last_prd_inv(p_var_rent_id,l_last_prd_id,l_last_inv_id) LOOP
9265    l_inv_id := inv_rec.var_rent_inv_id;
9266    --pnp_debug_pkg.log('invoice id = '||l_inv_id);
9267 
9268    FOR abtmt_inv_rec IN get_abtmt_terms_inv(l_inv_id) LOOP
9269      l_pmt_term_id := abtmt_inv_rec.payment_term_id;
9270 
9271      FOR rec1 IN check_abtmt_exists(l_last_inv_id,l_pmt_term_id) LOOP
9272        l_abt_exists := rec1.abt_exists;
9273      END LOOP;
9274 
9275      IF l_abt_exists <> 'Y' THEN
9276        l_row_id := NULL;
9277        l_var_abmt_id :=NULL;
9278 
9279        PN_VAR_ABATEMENTS_PKG.INSERT_ROW(
9280                    X_ROWID             => l_row_id,
9281                    X_VAR_ABATEMENT_ID  => l_var_abmt_id,
9282                    X_VAR_RENT_ID       => p_var_rent_id,
9283                    X_VAR_RENT_INV_ID   => l_last_inv_id,
9284                    X_PAYMENT_TERM_ID   => l_pmt_term_id,
9285                    X_INCLUDE_TERM      => abtmt_inv_rec.include_term,
9286                    X_INCLUDE_INCREASES => abtmt_inv_rec.include_increases,
9287                    X_UPDATE_FLAG       => NULL,
9288                    X_CREATION_DATE     => sysdate,
9289                    X_CREATED_BY        => NVL(fnd_profile.value('USER_ID'),-1),
9290                    X_LAST_UPDATE_DATE  => sysdate,
9291                    X_LAST_UPDATED_BY   => NVL(fnd_profile.value('USER_ID'),-1),
9292                    X_LAST_UPDATE_LOGIN => NVL(fnd_profile.value('USER_ID'),-1),
9293                    X_ORG_ID            => l_org_id  );
9294 
9295      END IF;
9296 
9297    END LOOP;
9298 
9299   END LOOP;
9300 
9301  END IF;
9302 
9303 END IF;
9304 pnp_debug_pkg.log('+++++++++ ROLL_FWD_LST_PARTIAL_PRD END +++++++++++');
9305 END ROLL_FWD_LST_PARTIAL_PRD;
9306 
9307 --------------------------------------------------------------------------------
9308 --  NAME         : ROLL_FWD_SELECNS
9309 --  DESCRIPTION  : Rolls forward the abatement selections when an invoice is
9310 --                 calculated the 1st time
9311 --  PURPOSE      :
9312 --  INVOKED FROM :
9313 --  ARGUMENTS    :
9314 --  REFERENCE    :
9315 --  HISTORY      :
9316 --
9317 --  3.Dec.06  lbala    o Created
9318 --------------------------------------------------------------------------------
9319 
9320 PROCEDURE ROLL_FWD_SELECNS(p_var_rent_id IN NUMBER)
9321 IS
9322 
9323 l_pmt_term_id       NUMBER :=NULL;
9324 l_abtmt_term_id     NUMBER :=NULL;
9325 l_min_pmt_term_id   NUMBER :=NULL;
9326 l_row_id            VARCHAR2(18):=NULL;
9327 l_var_abmt_id       NUMBER :=NULL;
9328 l_min_var_abt_id    NUMBER :=NULL;
9329 l_fst_inv_dt        DATE := NULL;
9330 l_inv_id            NUMBER :=NULL;
9331 l_prev_inv_id       NUMBER := NULL;
9332 l_prev_dt           DATE := NULL;
9333 l_org_id            NUMBER;
9334 
9335 
9336 /* Cursor to get 1st invoice date*/
9337 CURSOR get_min_inv(p_var_rent_id IN NUMBER) IS
9338    SELECT min(invoice_date) fst_inv_dt
9339    FROM pn_var_grp_dates_all
9340    WHERE var_rent_id= p_var_rent_id ;
9341 
9342 
9343 /*Cursor to get all pmt terms for a particular invoice*/
9344 CURSOR get_all_pmt_terms(p_inv_id IN NUMBER) IS
9345   SELECT distinct pterm.payment_term_id payment_term_id
9346   FROM pn_payment_terms_all pterm,
9347        pn_var_rents_all     vrent,
9348        pn_var_rent_inv_all  vinv
9349   WHERE vrent.lease_id = pterm.lease_id
9350   AND vrent.var_rent_id = vinv.var_rent_id
9351   AND pterm.start_date <=
9352   (SELECT MAX(gd.grp_end_date)
9353    FROM pn_var_grp_dates_all gd
9354    WHERE gd.period_id = vinv.period_id
9355    AND gd.invoice_date = vinv.invoice_date
9356   )
9357   AND pterm.end_date >=
9358   (SELECT MIN(gd1.grp_start_date)
9359    FROM pn_var_grp_dates_all gd1
9360    WHERE gd1.period_id = vinv.period_id
9361    AND gd1.invoice_date = vinv.invoice_date
9362   )
9363   AND pterm.var_rent_inv_id IS NULL
9364   AND pterm.index_period_id IS NULL
9365   AND vinv.adjust_num = 0
9366   AND vinv.var_rent_inv_id=p_inv_id;
9367 
9368 /*Cursor to get all abtmt terms for a particular invoice*/
9369 CURSOR get_abtmt_terms_inv(p_inv_id IN NUMBER) IS
9370   select * from pn_var_abatements_all
9371   where var_rent_inv_id=p_inv_id;
9372 
9373 /*Cursor to get abtmt terms for 1st invoice from setup*/
9374 CURSOR get_var_abtmt_id(p_var_rent_id IN NUMBER) IS
9375   SELECT var_abatement_id , payment_term_id
9376   FROM pn_var_abatements_all
9377   WHERE var_rent_inv_id = -1
9378   AND var_rent_id=p_var_rent_id;
9379 
9380 -- Get the invoice id for combination of a given invoice_date and period_id
9381 CURSOR check_inv_exists(p_var_rent_id IN NUMBER,p_inv_dt IN DATE,p_prd_id IN NUMBER) IS
9382   SELECT var_rent_inv_id inv_id
9383   FROM pn_var_rent_inv_all
9384   WHERE invoice_date=p_inv_dt
9385   AND   var_rent_id =p_var_rent_id
9386   AND   period_id  =p_prd_id
9387   AND   adjust_num=0;
9388 
9389 CURSOR org_cur(p_var_rent_id IN NUMBER) IS
9390   SELECT org_id
9391   FROM   pn_var_rents_all
9392   WHERE  var_rent_id =p_var_rent_id;
9393 
9394 BEGIN
9395 /* Get 1st invoice */
9396 pnp_debug_pkg.log('+++++++++ ROLL_FWD_SELECNS START +++++++++++');
9397 
9398 FOR rec IN org_cur(p_var_rent_id) LOOP
9399   l_org_id := rec.org_id;
9400 END LOOP;
9401 
9402 FOR min_inv_rec IN get_min_inv(p_var_rent_id) LOOP
9403   l_fst_inv_dt := min_inv_rec.fst_inv_dt;
9404 END LOOP;
9405 --pnp_debug_pkg.log('1st invoice date= '||l_fst_inv_dt);
9406 
9407 FOR i IN 1..inv_date_tab.COUNT LOOP
9408 
9409  l_inv_id:=NULL;
9410  l_prev_inv_id :=NULL;
9411 
9412  IF  (inv_date_tab(i).inv_flag ='Y') THEN
9413    --pnp_debug_pkg.log('invoice '||inv_date_tab(i).inv_flag||inv_date_tab(i).inv_date||p_var_rent_id);
9414 
9415    FOR rec IN check_inv_exists(p_var_rent_id ,inv_date_tab(i).inv_date,inv_date_tab(i).period_id) LOOP
9416        l_inv_id:= rec.inv_id;
9417    END LOOP;
9418        --pnp_debug_pkg.log('invoice id= '||l_inv_id);
9419 
9420        IF  (inv_date_tab(i).inv_date=l_fst_inv_dt) THEN
9421           /* updation for 1st invoice */
9422 
9423            IF l_inv_id IS NOT NULL THEN
9424                 l_min_pmt_term_id:=NULL;
9425                 l_min_var_abt_id:=NULL;
9426                 FOR abtmt_exists_rec IN get_var_abtmt_id(p_var_rent_id) LOOP
9427 
9428                   l_min_var_abt_id:= abtmt_exists_rec.var_abatement_id;
9429                   l_min_pmt_term_id:= abtmt_exists_rec.payment_term_id;
9430                   --pnp_debug_pkg.log('prior to update');
9431 
9432                   PN_VAR_ABATEMENTS_PKG.LOCK_ROW(p_var_rent_id,-1,l_min_pmt_term_id);
9433                   UPDATE pn_var_abatements_all
9434                   SET var_rent_inv_id=l_inv_id
9435                   WHERE var_abatement_id = l_min_var_abt_id;
9436 
9437                 END LOOP;
9438            END IF;
9439            /* updation for 1st invoice over*/
9440        ELSE
9441 
9442           l_prev_dt:= inv_date_tab(i-1).inv_date;
9443           FOR rec1 IN check_inv_exists(p_var_rent_id ,l_prev_dt,inv_date_tab(i-1).period_id) LOOP
9444             l_prev_inv_id:= rec1.inv_id;
9445           END LOOP;
9446 
9447           IF l_prev_inv_id IS NOT NULL THEN
9448 
9449               FOR pmt_term_rec IN get_all_pmt_terms(l_inv_id) LOOP
9450                l_pmt_term_id:= pmt_term_rec.payment_term_id;
9451 
9452                FOR abtmt_inv_rec IN get_abtmt_terms_inv(l_prev_inv_id) LOOP
9453                 l_abtmt_term_id := abtmt_inv_rec.payment_term_id;
9454 
9455                 IF (l_pmt_term_id = l_abtmt_term_id) THEN
9456                  l_row_id := NULL;
9457                  l_var_abmt_id :=NULL;
9458 
9459                  PN_VAR_ABATEMENTS_PKG.INSERT_ROW(
9460                         X_ROWID             => l_row_id,
9461                         X_VAR_ABATEMENT_ID  => l_var_abmt_id,
9462                         X_VAR_RENT_ID       => p_var_rent_id,
9463                         X_VAR_RENT_INV_ID   => l_inv_id,
9464                         X_PAYMENT_TERM_ID   => l_pmt_term_id,
9465                         X_INCLUDE_TERM      => abtmt_inv_rec.include_term,
9466                         X_INCLUDE_INCREASES => abtmt_inv_rec.include_increases,
9467                         X_UPDATE_FLAG       => NULL,
9468                         X_CREATION_DATE     => sysdate,
9469                         X_CREATED_BY        => NVL(fnd_profile.value('USER_ID'),-1),
9470                         X_LAST_UPDATE_DATE  => sysdate,
9471                         X_LAST_UPDATED_BY   => NVL(fnd_profile.value('USER_ID'),-1),
9472                         X_LAST_UPDATE_LOGIN => NVL(fnd_profile.value('USER_ID'),-1),
9473                         X_ORG_ID            => l_org_id  );
9474                 END IF;
9475 
9476               END LOOP;
9477 
9478             END LOOP;
9479 
9480           ELSE
9481              EXIT ;
9482 
9483           END IF;
9484 
9485       END IF;
9486 END IF;
9487 
9488 END LOOP;
9489 pnp_debug_pkg.log('+++++++++ ROLL_FWD_SELECNS END +++++++++++');
9490 END ROLL_FWD_SELECNS;
9491 --------------------------------------------------------------------------------
9492 --  NAME         : include_increases_firstyr
9493 --  DESCRIPTION  : Includes Rent Increase terms to be abated for 1st partial period
9494 --  PURPOSE      :
9495 --  INVOKED FROM :
9496 --  ARGUMENTS    :
9497 --  REFERENCE    :
9498 --  HISTORY      :
9499 --
9500 --  3.Dec.06  lbala    o Created
9501 --------------------------------------------------------------------------------
9502 PROCEDURE include_increases_firstyr(p_var_rent_id IN NUMBER) IS
9503 
9504 /*Cursor to get all abtmt terms with include_incr='Y' for a particular invoice*/
9505 CURSOR get_abtmt_terms_inv(p_inv_id IN NUMBER,p_var_rent_id IN NUMBER) IS
9506   SELECT * from pn_var_abatements_all
9507    WHERE var_rent_inv_id = p_inv_id
9508     AND  var_rent_id = p_var_rent_id
9509     AND  include_increases = 'Y';
9510 
9511 -- Get the rent increase terms for a payment term of a particular invoice
9512 CURSOR get_rent_incr_cur(p_term_id IN NUMBER,p_inv_id IN NUMBER) IS
9513 
9514 SELECT ppt.payment_term_id rent_incr_term_id
9515  FROM  pn_index_lease_terms_all pilt,
9516        pn_payment_terms_all ppt ,
9517        pn_index_leases_all pil,
9518        pn_var_rent_inv_all vinv
9519 WHERE pilt.index_lease_id = pil.index_lease_id
9520 AND pil.lease_id = ppt.lease_id
9521 AND pilt.index_period_id = ppt.index_period_id
9522 AND pilt.rent_increase_term_id = ppt.payment_term_id
9523 AND ppt.start_date <= (SELECT MAX(gd.grp_end_date)
9524                        FROM pn_var_grp_dates_all gd
9525                        WHERE gd.period_id = vinv.period_id
9526                       )
9527 AND ppt.end_date >=  (SELECT MIN(gd1.grp_start_date)
9528                       FROM pn_var_grp_dates_all gd1
9529                       WHERE gd1.period_id = vinv.period_id
9530                      )
9531 AND pilt.lease_term_id = p_term_id
9532 AND ppt.status='APPROVED'
9533 AND vinv.adjust_num = 0
9534 AND vinv.var_rent_inv_id=p_inv_id;
9535 
9536 -- Check if abatement exists for this pmt term and invoice id combination
9537 CURSOR check_abtmt_exists(pmt_term_id IN NUMBER,invoice_id IN NUMBER) IS
9538   SELECT 'N'
9539     FROM dual
9540    WHERE NOT EXISTS ( SELECT NULL FROM pn_var_abatements_all
9541                        WHERE payment_term_id=pmt_term_id
9542                         AND  var_rent_inv_id=invoice_id);
9543 
9544 CURSOR org_cur(p_var_rent_id IN NUMBER) IS
9545   SELECT org_id
9546   FROM   pn_var_rents_all
9547   WHERE  var_rent_id =p_var_rent_id;
9548 --Get invoice id of the 1st partial period
9549 CURSOR get_fst_inv_id(p_var_rent_id IN NUMBER) IS
9550   SELECT var_rent_inv_id
9551     FROM pn_var_rent_inv_all
9552    WHERE var_rent_id=p_var_rent_id
9553      AND period_id IN (SELECT period_id
9554                        FROM pn_var_periods_all
9555                        WHERE period_num=1
9556                        AND var_rent_id=p_var_rent_id
9557                        AND partial_period='Y')
9558      AND adjust_num=0;
9559 
9560 l_abtmt_exists VARCHAR2(1) := NULL;
9561 l_inv_id       NUMBER      := NULL;
9562 l_row_id       VARCHAR2(18):= NULL;
9563 l_var_abmt_id  NUMBER      := NULL;
9564 l_org_id       NUMBER;
9565 
9566 BEGIN
9567 pnp_debug_pkg.log('+++++++++ include_increases_firstyr START +++++++++++');
9568 FOR rec IN org_cur(p_var_rent_id) LOOP
9569     l_org_id := rec.org_id;
9570 END LOOP;
9571 IF g_partial_prd_flag='Y' THEN
9572 
9573    FOR fst_inv_rec IN get_fst_inv_id(p_var_rent_id) LOOP
9574      l_inv_id := fst_inv_rec.var_rent_inv_id;
9575    END LOOP;
9576 
9577    --pnp_debug_pkg.log('invoice_id =  '||l_inv_id);
9578    FOR parent_rec IN get_abtmt_terms_inv(l_inv_id ,p_var_rent_id ) LOOP
9579 
9580         --pnp_debug_pkg.log('parent term = '||parent_rec.payment_term_id);
9581         FOR rent_incr IN  get_rent_incr_cur(parent_rec.payment_term_id ,l_inv_id ) LOOP
9582 
9583              --pnp_debug_pkg.log('child_term = '||rent_incr.rent_incr_term_id);
9584              l_abtmt_exists := NULL;
9585 
9586              OPEN check_abtmt_exists(rent_incr.rent_incr_term_id,l_inv_id);
9587              FETCH check_abtmt_exists INTO l_abtmt_exists ;
9588              CLOSE check_abtmt_exists;
9589 
9590              IF  l_abtmt_exists  = 'N' THEN
9591 
9592                  l_row_id := NULL;
9593                  l_var_abmt_id :=NULL;
9594                  PN_VAR_ABATEMENTS_PKG.INSERT_ROW(
9595                         X_ROWID             => l_row_id,
9596                         X_VAR_ABATEMENT_ID  => l_var_abmt_id,
9597                         X_VAR_RENT_ID       => p_var_rent_id,
9598                         X_VAR_RENT_INV_ID   => l_inv_id,
9599                         X_PAYMENT_TERM_ID   => rent_incr.rent_incr_term_id,
9600                         X_INCLUDE_TERM      => 'Y',
9601                         X_INCLUDE_INCREASES => 'Y',
9602                         X_UPDATE_FLAG       => NULL,
9603                         X_CREATION_DATE     => sysdate,
9604                         X_CREATED_BY        => NVL(fnd_profile.value('USER_ID'),-1),
9605                         X_LAST_UPDATE_DATE  => sysdate,
9606                         X_LAST_UPDATED_BY   => NVL(fnd_profile.value('USER_ID'),-1),
9607                         X_LAST_UPDATE_LOGIN => NVL(fnd_profile.value('USER_ID'),-1),
9608                         X_ORG_ID            => l_org_id  );
9609              END IF;
9610 
9611         END LOOP;
9612 
9613    END LOOP;
9614 END IF;
9615 pnp_debug_pkg.log('+++++++++ include_increases_firstyr END +++++++++++');
9616 END include_increases_firstyr;
9617 --------------------------------------------------------------------------------
9618 --  NAME         : include_increases
9619 --  DESCRIPTION  : Includes Rent Increase terms to be abated
9620 --  PURPOSE      :
9621 --  INVOKED FROM :
9622 --  ARGUMENTS    :
9623 --  REFERENCE    :
9624 --  HISTORY      :
9625 --
9626 --  3.Dec.06  lbala    o Created
9627 --------------------------------------------------------------------------------
9628 PROCEDURE include_increases(p_var_rent_id IN NUMBER) IS
9629 
9630 /*Cursor to get all abtmt terms with include_incr='Y' for a particular invoice*/
9631 CURSOR get_abtmt_terms_inv(p_inv_id IN NUMBER,p_var_rent_id IN NUMBER) IS
9632   SELECT * from pn_var_abatements_all
9633    WHERE var_rent_inv_id = p_inv_id AND
9634          var_rent_id = p_var_rent_id AND
9635          include_increases = 'Y';
9636 
9637 
9638 -- Get the rent increase terms for a payment term of a particular invoice
9639 CURSOR get_rent_incr_cur(p_term_id IN NUMBER,p_inv_id IN NUMBER) IS
9640 
9641 SELECT ppt.payment_term_id rent_incr_term_id
9642  FROM  pn_index_lease_terms_all pilt,
9643        pn_payment_terms_all ppt ,
9644        pn_index_leases_all pil,
9645        pn_var_rent_inv_all vinv
9646 WHERE pilt.index_lease_id = pil.index_lease_id
9647 AND pil.lease_id = ppt.lease_id
9648 AND pilt.index_period_id = ppt.index_period_id
9649 AND pilt.rent_increase_term_id = ppt.payment_term_id
9650 AND ppt.start_date <= (SELECT MAX(gd.grp_end_date)
9651                        FROM pn_var_grp_dates_all gd
9652                        WHERE gd.period_id = vinv.period_id
9653                        AND gd.invoice_date = vinv.invoice_date
9654                        )
9655 AND ppt.end_date >=  (SELECT MIN(gd1.grp_start_date)
9656                         FROM pn_var_grp_dates_all gd1
9657                         WHERE gd1.period_id = vinv.period_id
9658                         AND gd1.invoice_date = vinv.invoice_date
9659                      )
9660 AND pilt.lease_term_id = p_term_id
9661 AND ppt.status='APPROVED'
9662 AND vinv.adjust_num = 0
9663 AND vinv.var_rent_inv_id=p_inv_id;
9664 
9665 -- Get the details of
9666 CURSOR check_abtmt_exists(pmt_term_id IN NUMBER,invoice_id IN NUMBER) IS
9667   SELECT 'N'
9668     FROM dual
9669    WHERE NOT EXISTS ( SELECT NULL FROM pn_var_abatements_all
9670                       WHERE payment_term_id=pmt_term_id
9671                       AND var_rent_inv_id=invoice_id);
9672 
9673 CURSOR check_inv_exists(p_var_rent_id IN NUMBER,p_inv_dt IN DATE,p_prd_id IN NUMBER) IS
9674   SELECT var_rent_inv_id inv_id
9675   FROM pn_var_rent_inv_all
9676   WHERE invoice_date=p_inv_dt
9677   AND   period_id= p_prd_id
9678   AND  var_rent_id= p_var_rent_id
9679   AND  adjust_num=0;
9680 
9681 CURSOR org_cur(p_var_rent_id IN NUMBER) IS
9682   SELECT org_id
9683   FROM   pn_var_rents_all
9684   WHERE  var_rent_id =p_var_rent_id;
9685 
9686 l_abtmt_exists VARCHAR2(1) := NULL;
9687 l_inv_id       NUMBER      := NULL;
9688 l_row_id       VARCHAR2(18):= NULL;
9689 l_var_abmt_id  NUMBER      := NULL;
9690 l_org_id       NUMBER;
9691 BEGIN
9692 
9693 pnp_debug_pkg.log('+++++++++ include_increases START +++++++++++');
9694 FOR rec IN org_cur(p_var_rent_id) LOOP
9695         l_org_id := rec.org_id;
9696 END LOOP;
9697 
9698 FOR i IN 1..inv_date_tab.COUNT LOOP
9699 
9700   IF  (inv_date_tab(i).inv_flag ='Y') THEN
9701      FOR rec IN check_inv_exists(p_var_rent_id ,inv_date_tab(i).inv_date,inv_date_tab(i).period_id) LOOP
9702                 l_inv_id:= rec.inv_id;
9703      END LOOP;
9704      --pnp_debug_pkg.log('invoice_id =  '||l_inv_id);
9705 
9706      FOR parent_rec IN get_abtmt_terms_inv(l_inv_id ,p_var_rent_id ) LOOP
9707 
9708           --pnp_debug_pkg.log('parent term = '||parent_rec.payment_term_id);
9709 
9710           FOR rent_incr IN  get_rent_incr_cur(parent_rec.payment_term_id ,l_inv_id ) LOOP
9711 
9712              --pnp_debug_pkg.log('child_term = '||rent_incr.rent_incr_term_id);
9713 
9714              l_abtmt_exists := NULL;
9715              OPEN check_abtmt_exists(rent_incr.rent_incr_term_id,l_inv_id);
9716              FETCH check_abtmt_exists INTO l_abtmt_exists ;
9717              CLOSE check_abtmt_exists;
9718 
9719              IF  l_abtmt_exists  = 'N' THEN
9720 
9721                  l_row_id := NULL;
9722                  l_var_abmt_id :=NULL;
9723 
9724                  PN_VAR_ABATEMENTS_PKG.INSERT_ROW(
9725                         X_ROWID             => l_row_id,
9726                         X_VAR_ABATEMENT_ID  => l_var_abmt_id,
9727                         X_VAR_RENT_ID       => p_var_rent_id,
9728                         X_VAR_RENT_INV_ID   => l_inv_id,
9729                         X_PAYMENT_TERM_ID   => rent_incr.rent_incr_term_id,
9730                         X_INCLUDE_TERM      => 'Y',
9731                         X_INCLUDE_INCREASES => 'Y',
9732                         X_UPDATE_FLAG       => NULL,
9733                         X_CREATION_DATE     => sysdate,
9734                         X_CREATED_BY        => NVL(fnd_profile.value('USER_ID'),-1),
9735                         X_LAST_UPDATE_DATE  => sysdate,
9736                         X_LAST_UPDATED_BY   => NVL(fnd_profile.value('USER_ID'),-1),
9737                         X_LAST_UPDATE_LOGIN => NVL(fnd_profile.value('USER_ID'),-1),
9738                         X_ORG_ID            => l_org_id  );
9739 
9740              END IF;
9741 
9742           END LOOP;
9743 
9744      END LOOP;
9745   END IF;
9746 END LOOP;
9747 pnp_debug_pkg.log('+++++++++ include_increases END +++++++++++');
9748 END include_increases;
9749 
9750 --------------------------------------------------------------------------------
9751 --  NAME         : post_summary - global procedure
9752 --  DESCRIPTION  :
9753 --  PURPOSE      :
9754 --  INVOKED FROM :
9755 --  ARGUMENTS    :
9756 --  REFERENCE    : PN_COMMON.debug()
9757 --  HISTORY      : 5/Dec/2006 Shabda Populate deductions in var_rent_summ_all
9758 --                 fix for bug 5679847
9759 --
9760 --  dd-mon-yyyy  name     o Created
9761 --  21-MAY-07    Lokesh   o Added rounding off for bug # 6031202 in
9762 --                          pn_var_rent_summ_all
9763 --------------------------------------------------------------------------------
9764 PROCEDURE post_summary ( p_var_rent_id  IN NUMBER
9765                         ,p_period_id    IN NUMBER)
9766 IS
9767 
9768   /* get all lines */
9769   CURSOR lines_c( p_vr_id  IN NUMBER
9770                  ,p_prd_id IN NUMBER) IS
9771     SELECT
9772     line_item_id
9773     FROM
9774     pn_var_lines_all
9775     WHERE
9776     var_rent_id = p_vr_id AND
9777     period_id = p_prd_id;
9778 
9779   /* get grp date */
9780   CURSOR grp_date_c( p_vr_id  IN NUMBER
9781                     ,p_prd_id IN NUMBER) IS
9782     SELECT
9783      grp.grp_date_id
9784     ,grp.group_date
9785     ,grp.invoice_date
9786     ,grp.org_id
9787     FROM
9788      pn_var_grp_dates_all grp
9789     ,pn_var_periods_all   prd
9790     WHERE
9791     prd.var_rent_id = p_vr_id  AND
9792     prd.period_id   = p_prd_id AND
9793     grp.period_id   = prd.period_id AND
9794     grp.grp_end_date <= prd.end_date;
9795 
9796   TYPE GRP_TBL IS TABLE OF grp_date_c%ROWTYPE INDEX BY BINARY_INTEGER;
9797   l_grp_t GRP_TBL;
9798 
9799   /* Get rent and volume to store in pn_var_rent_summ_all */
9800   CURSOR summ_c( p_vr_id   IN NUMBER
9801                 ,p_prd_id  IN NUMBER
9802                 ,p_line_id IN NUMBER
9803                 ,p_grp_id  IN NUMBER) IS
9804     SELECT
9805      NVL(SUM(hdr.percent_rent_due),0)
9806      + NVL(SUM(DECODE(hdr.invoice_flag
9807                       ,'I',hdr.prorated_rent_due
9808                           ,0
9809                      )
9810               ), 0) AS rent
9811     ,NVL(SUM(hdr.prorated_group_sales)
9812          , 0) AS sales
9813     ,NVL(SUM(hdr.prorated_group_deductions)
9814          , 0) AS ded
9815     ,NVL(SUM(hdr.first_yr_rent), 0) AS first_yr_rent
9816     FROM
9817     pn_var_trx_headers_all hdr
9818     WHERE
9819     hdr.var_rent_id  = p_vr_id AND
9820     hdr.period_id    = p_prd_id AND
9821     hdr.line_item_id = p_line_id AND
9822     hdr.grp_date_id  = p_grp_id;
9823 
9824   /* exists VR summ record */
9825   CURSOR vr_summ_c ( p_vr_id  IN NUMBER
9826                     ,p_prd_id IN NUMBER
9827                     ,p_line_id IN NUMBER
9828                     ,p_grp_id IN NUMBER) IS
9829     SELECT
9830      var_rent_summ_id
9831     ,tot_act_vol
9832     ,tot_ded
9833     ,act_var_rent
9834     ,first_yr_rent
9835     FROM
9836     pn_var_rent_summ_all
9837     WHERE
9838     var_rent_id = p_vr_id AND
9839     period_id = p_prd_id AND
9840     line_item_id = p_line_id AND
9841     grp_date_id = p_grp_id;
9842 
9843   l_vr_summ_id NUMBER;
9844 
9845 BEGIN
9846 
9847   pnp_debug_pkg.log('+++++++++ post_summary START +++++++++++');
9848 
9849   l_grp_t.DELETE;
9850 
9851   OPEN grp_date_c( p_vr_id  => p_var_rent_id
9852                   ,p_prd_id => p_period_id);
9853   FETCH grp_date_c BULK COLLECT INTO l_grp_t;
9854   CLOSE grp_date_c;
9855 
9856   /* loop for all lines in the annual period */
9857   FOR line_rec IN lines_c( p_vr_id  => p_var_rent_id
9858                           ,p_prd_id => p_period_id)
9859   LOOP
9860 
9861     pnp_debug_pkg.log('line_rec.line_item_id...'||line_rec.line_item_id);
9862     /* loop for all calc periods in the annual period */
9863     FOR g IN 1..l_grp_t.COUNT LOOP
9864 
9865       /* get the sum of rents and sales for
9866          vr -> period -> line item -> group combination
9867          from the trx tables
9868          -- loops only once --
9869       */
9870       pnp_debug_pkg.log('g..'||g);
9871       FOR summ_rec IN summ_c( p_vr_id   => p_var_rent_id
9872                              ,p_prd_id  => p_period_id
9873                              ,p_line_id => line_rec.line_item_id
9874                              ,p_grp_id  => l_grp_t(g).grp_date_id)
9875       LOOP
9876 
9877         pnp_debug_pkg.log('summ_rec.sales..'||summ_rec.sales);
9878         pnp_debug_pkg.log('summ_rec.rent..'||summ_rec.rent);
9879         pnp_debug_pkg.log('summ_rec.first_yr_rent..'||summ_rec.first_yr_rent);
9880         l_vr_summ_id := NULL;
9881 
9882         /* chk if VR SUMM record exists for this
9883            vr -> period -> line item -> group combination */
9884         FOR vr_summ_rec IN vr_summ_c( p_vr_id   => p_var_rent_id
9885                                      ,p_prd_id  => p_period_id
9886                                      ,p_line_id => line_rec.line_item_id
9887                                      ,p_grp_id  => l_grp_t(g).grp_date_id)
9888         LOOP
9889 
9890           l_vr_summ_id := vr_summ_rec.var_rent_summ_id;
9891 
9892         pnp_debug_pkg.log('l_vr_summ_id..'||l_vr_summ_id);
9893 
9894           IF summ_rec.sales <> NVL(vr_summ_rec.tot_act_vol, 0) OR
9895              summ_rec.rent  <> NVL(vr_summ_rec.act_var_rent, 0) OR
9896              summ_rec.first_yr_rent  <> NVL(vr_summ_rec.first_yr_rent, 0) OR
9897              NVL(summ_rec.ded, 0)  <> NVL(vr_summ_rec.tot_ded, 0)
9898           THEN
9899 
9900            pnp_debug_pkg.log('before updation ...');
9901             UPDATE
9902             pn_var_rent_summ_all
9903             SET
9904              tot_act_vol  = summ_rec.sales
9905             ,tot_ded      = summ_rec.ded
9906             ,act_var_rent = round(summ_rec.rent,g_precision)
9907             ,first_yr_rent = round(summ_rec.first_yr_rent,g_precision)
9908             ,last_update_date  = SYSDATE
9909             ,last_updated_by   = NVL(fnd_global.user_id, 0)
9910             ,last_update_login = NVL(fnd_global.login_id, 0)
9911             WHERE
9912             var_rent_summ_id = l_vr_summ_id;
9913 
9914           END IF;
9915 
9916         END LOOP; /* chk if VR SUMM exists vr -> prd -> line -> grp combo */
9917 
9918         IF l_vr_summ_id IS NULL THEN
9919 
9920        pnp_debug_pkg.log('before insertion ...');
9921 
9922           /* to insert a new summary record */
9923           INSERT INTO
9924           pn_var_rent_summ_all
9925             (var_rent_summ_id
9926             ,var_rent_id
9927             ,period_id
9928             ,line_item_id
9929             ,invoice_date
9930             ,tot_act_vol
9931             ,tot_ded
9932             ,act_var_rent
9933             ,grp_date_id
9934             ,group_date
9935             ,last_update_date
9936             ,last_updated_by
9937             ,creation_date
9938             ,created_by
9939             ,last_update_login
9940             ,org_id
9941             ,first_yr_rent)
9942           VALUES
9943             (pn_var_rent_summ_s.NEXTVAL
9944             ,p_var_rent_id
9945             ,p_period_id
9946             ,line_rec.line_item_id
9947             ,l_grp_t(g).invoice_date
9948             ,summ_rec.sales
9949             ,summ_rec.ded
9950             ,round(summ_rec.rent,g_precision)
9951             ,l_grp_t(g).grp_date_id
9952             ,l_grp_t(g).group_date
9953             ,SYSDATE
9954             ,NVL(fnd_global.user_id, 0)
9955             ,SYSDATE
9956             ,NVL(fnd_global.user_id, 0)
9957             ,NVL(fnd_global.login_id, 0)
9958             ,NVL(l_grp_t(g).org_id, g_org_id)
9959             ,round(summ_rec.first_yr_rent,g_precision))
9960           RETURNING
9961           var_rent_summ_id
9962           INTO
9963           l_vr_summ_id;
9964 
9965         END IF;
9966 
9967         UPDATE
9968         pn_var_trx_headers_all hdr
9969         SET
9970         hdr.var_rent_summ_id = l_vr_summ_id
9971         WHERE
9972         hdr.var_rent_id  = p_var_rent_id AND
9973         hdr.period_id    = p_period_id AND
9974         hdr.line_item_id = line_rec.line_item_id AND
9975         hdr.grp_date_id  = l_grp_t(g).grp_date_id;
9976 
9977         EXIT;
9978 
9979       END LOOP; /* get the sum of rents and sales for
9980                    vr -> period -> line item -> group combination */
9981 
9982     END LOOP; /* loop for all calc periods in the annual period */
9983 
9984   END LOOP; /* loop for all lines in the annual period */
9985 
9986   pnp_debug_pkg.log('+++++++++ post_summary END +++++++++++');
9987 
9988 EXCEPTION
9989   WHEN OTHERS THEN RAISE;
9990 
9991 END post_summary;
9992 
9993 --------------------------------------------------------------------------------
9994 --  NAME         : forecasted_var_rent
9995 --  DESCRIPTION  : Returns the Forecasted rent for a particular period
9996 --  PURPOSE      :
9997 --  INVOKED FROM : Form view of Annual periods  Tab
9998 --  ARGUMENTS    :
9999 --  REFERENCE    :
10000 --  HISTORY      :
10001 --
10002 --  3.Dec.06  rdonthul    o Created
10003 --------------------------------------------------------------------------------
10004 FUNCTION forecasted_var_rent ( p_var_rent_id IN NUMBER
10005                             , p_period_id  IN NUMBER )
10006 RETURN NUMBER IS
10007 
10008   CURSOR var_rent_type ( l_var_rent_id  IN NUMBER ) IS
10009     SELECT invoice_on
10010     FROM pn_var_rents_all
10011     WHERE var_rent_id = l_var_rent_id
10012     AND invoice_on = 'FORECASTED';
10013 
10014 
10015   CURSOR var_for_rent ( l_period_id IN NUMBER ) IS
10016     SELECT sum(decode(adjust_num,0,
10017                       FOR_PER_RENT,0)) for_var_rent
10018       FROM pn_var_rent_inv_all
10019       WHERE period_id = l_period_id;
10020 
10021   l_for_rent       NUMBER := NULL;
10022 
10023 BEGIN
10024    FOR rec_var_rent_type IN var_rent_type( p_var_rent_id )
10025    LOOP
10026 
10027      FOR rec_var_for_rent IN var_for_rent( p_period_id )
10028      LOOP
10029          l_for_rent := rec_var_for_rent.for_var_rent;
10030      END LOOP;
10031 
10032    END LOOP;
10033 
10034    RETURN l_for_rent;
10035 
10036 END forecasted_var_rent;
10037 
10038 --------------------------------------------------------------------------------
10039 --  NAME         : get_currency_precision
10040 --  DESCRIPTION  : Returns the Currency precision to be followed bsed on the
10041 --                 org_id
10042 --  PURPOSE      :
10043 --  INVOKED FROM :
10044 --  ARGUMENTS    :
10045 --  REFERENCE    :
10046 --  HISTORY      :
10047 --
10048 --  1.Mar.07  rdonthul    o Created
10049 --------------------------------------------------------------------------------
10050 FUNCTION get_currency_precision (p_org_id NUMBER)
10051 RETURN NUMBER IS
10052 
10053 CURSOR csr_currency_code(p_org_id IN NUMBER) is
10054   SELECT currency_code
10055   FROM  gl_sets_of_books
10056   WHERE set_of_books_id = pn_mo_cache_utils.get_profile_value('PN_SET_OF_BOOKS_ID',p_org_ID);
10057 
10058 l_org_id               NUMBER := pn_mo_cache_utils.get_current_org_id;
10059 l_currency_code        gl_sets_of_books.currency_code%TYPE;
10060 l_precision            NUMBER := NULL;
10061 l_ext_precision        NUMBER;
10062 l_min_acct_unit        NUMBER;
10063 
10064 
10065 BEGIN
10066    IF p_org_id IS NOT NULL THEN
10067        l_org_id := p_org_id;
10068    END IF;
10069 
10070    FOR rec_currency_code IN csr_currency_code( l_org_id )
10071    LOOP
10072         l_currency_code    := rec_currency_code.currency_code;
10073    END LOOP;
10074 
10075    fnd_currency.get_info(l_currency_code, l_precision,l_ext_precision, l_min_acct_unit);
10076 
10077    RETURN l_precision;
10078 
10079 END get_currency_precision;
10080 --------------------------------------------------------------------------------
10081 --  NAME         : check_last_calc_prd
10082 --  DESCRIPTION  : Determines the last calculation period for an invoice
10083 --  PURPOSE      :
10084 --  INVOKED FROM : VR summary and detail report
10085 --  ARGUMENTS    :
10086 --  REFERENCE    :
10087 --  HISTORY      :
10088 --
10089 --  7-MAR-07  lbala    o Created
10090 --------------------------------------------------------------------------------
10091 FUNCTION check_last_calc_prd(p_trx_hdr_id IN NUMBER,
10092                              p_prorul     IN VARCHAR2
10093                              )
10094 RETURN NUMBER
10095 IS
10096 -- Get the details of
10097 CURSOR trx_cur
10098 IS
10099 SELECT var_rent_id,period_id,grp_date_id,calc_prd_start_date
10100 FROM pn_var_trx_headers_All
10101 WHERE trx_header_id=p_trx_hdr_id;
10102 
10103 -- Get the details of
10104 CURSOR grp_date_cur(p_prd_id IN NUMBER,
10105                     p_grp_dt_id IN NUMBER
10106                    ) IS
10107 SELECT inv_start_date
10108   FROM pn_var_grp_dates_all gd
10109  WHERE gd.period_id = p_prd_id
10110    AND gd.grp_date_id = p_grp_dt_id;
10111 
10112 -- Get the details of
10113 CURSOR calc_prd_cur(p_prd_id IN NUMBER,
10114                     p_inv_end_dt IN DATE
10115                    ) IS
10116   SELECT max(calc_prd_start_date) calc_prd_st_dt
10117     FROM pn_var_trx_headers_all trx
10118    WHERE trx.calc_prd_end_date <= p_inv_end_dt
10119      AND trx.period_id = p_prd_id;
10120 
10121 l_vr_id  NUMBER :=NULL;
10122 l_prd_id NUMBER :=NULL;
10123 l_gd_id  NUMBER :=NULL;
10124 l_st_dt  DATE   :=NULL;
10125 l_inv_end_dt DATE :=NULL;
10126 l_inv_st_dt DATE :=NULL;
10127 l_max_calc_prd_dt DATE :=NULL;
10128 
10129 BEGIN
10130 
10131  FOR trx_rec IN trx_cur LOOP
10132   l_vr_id  := trx_rec.var_rent_id;
10133   l_prd_id := trx_rec.period_id;
10134   l_gd_id  := trx_rec.grp_date_id;
10135   l_st_dt  := trx_rec.calc_prd_start_date;
10136  END LOOP;
10137 
10138  FOR gd_rec IN grp_date_cur(l_prd_id,l_gd_id)LOOP
10139     l_inv_st_dt  := gd_rec.inv_start_date;
10140  END LOOP;
10141 
10142  l_inv_end_dt := pn_var_rent_calc_pkg.inv_end_date(l_inv_st_dt
10143                                                   ,l_vr_id
10144                                                   ,l_prd_id
10145                                                   );
10146 
10147  FOR calc_prd_rec IN calc_prd_cur(l_prd_id,l_inv_end_dt) LOOP
10148   l_max_calc_prd_dt := calc_prd_rec.calc_prd_st_dt;
10149  END LOOP;
10150 
10151  IF l_st_dt = l_max_calc_prd_dt THEN
10152     RETURN 1;
10153  ELSE RETURN 0;
10154  END IF;
10155 
10156 END check_last_calc_prd;
10157 
10158 --------------------------------------------------------------------------------
10159 --  NAME         : get_cum_rent_due
10160 --  DESCRIPTION  : Gets the rent due for each transaction detail record
10161 --  PURPOSE      :
10162 --  INVOKED FROM : VR detail and summary report
10163 --  ARGUMENTS    :
10164 --  REFERENCE    :
10165 --  HISTORY      :
10166 --
10167 --  7-MAR-07  lbala    o Created
10168 --------------------------------------------------------------------------------
10169 FUNCTION get_rent_due(p_trx_hdr_id IN NUMBER,
10170                       p_prorul     IN VARCHAR2
10171                       )
10172 RETURN NUMBER
10173 IS
10174 -- Get the details of
10175 CURSOR trx_cur
10176 IS
10177 SELECT var_rent_id,period_id,grp_date_id,calc_prd_start_date
10178 FROM pn_var_trx_headers_All
10179 WHERE trx_header_id=p_trx_hdr_id;
10180 
10181 -- Get the details of
10182 CURSOR grp_date_cur(p_prd_id IN NUMBER,
10183                     p_grp_dt_id IN NUMBER
10184                    )
10185 IS
10186 SELECT invoice_date
10187   FROM pn_var_grp_dates_all gd
10188  WHERE gd.period_id = p_prd_id
10189    AND gd.grp_date_id = p_grp_dt_id;
10190 
10191 CURSOR period_cur(vr_id IN NUMBER) IS
10192   SELECT period_id, start_date
10193   FROM pn_var_periods_all
10194   WHERE var_rent_id = vr_id
10195   AND partial_period = 'Y'
10196   AND period_num = 1;
10197 
10198 CURSOR get_act_inv_amt(p_prd_id IN NUMBER,
10199                        p_inv_dt IN DATE
10200                        )
10201 IS
10202 SELECT SUM(rent_inv.ACTUAL_INVOICED_AMOUNT) act_inv_amt
10203 FROM pn_var_rent_inv_all rent_inv
10204 WHERE rent_inv.period_id = p_prd_id
10205 AND (rent_inv.invoice_date = p_inv_dt OR p_inv_dt IS NULL);
10206 
10207 l_vr_id  NUMBER :=NULL;
10208 l_prd_id NUMBER :=NULL;
10209 l_gd_id  NUMBER :=NULL;
10210 l_st_dt  DATE   :=NULL;
10211 l_inv_dt DATE :=NULL;
10212 l_max_calc_prd_dt DATE :=NULL;
10213 l_rent_due NUMBER:=NULL;
10214 
10215 BEGIN
10216 
10217  FOR trx_rec IN trx_cur LOOP
10218   l_vr_id  := trx_rec.var_rent_id;
10219   l_prd_id := trx_rec.period_id;
10220   l_gd_id  := trx_rec.grp_date_id;
10221  END LOOP;
10222 
10223  FOR gd_rec IN grp_date_cur(l_prd_id,l_gd_id)LOOP
10224   l_inv_dt  := gd_rec.invoice_date;
10225  END LOOP;
10226 
10227  IF p_prorul IN ('FY','FLY') THEN
10228    FOR rec IN period_cur(l_vr_id) LOOP
10229       IF(rec.period_id = l_prd_id) THEN
10230 
10231         FOR rec1 IN get_act_inv_amt(l_prd_id,NULL) LOOP
10232           l_rent_due := rec1.act_inv_amt;
10233         END LOOP;
10234         RETURN l_rent_due;
10235 
10236       END IF;
10237    END LOOP;
10238 
10239  END IF;
10240 
10241  FOR rec1 IN get_act_inv_amt(l_prd_id,l_inv_dt) LOOP
10242      l_rent_due := rec1.act_inv_amt;
10243  END LOOP;
10244  RETURN l_rent_due;
10245 
10246 END get_rent_due;
10247 
10248 --------------------------------------------------------------------------------
10249 --  NAME         : get_cum_rent_due
10250 --  DESCRIPTION  : Gets the cumulative rent for each transaction detail record
10251 --  PURPOSE      :
10252 --  INVOKED FROM : VR detail and summary report
10253 --  ARGUMENTS    :
10254 --  REFERENCE    :
10255 --  HISTORY      :
10256 --
10257 --  7-MAR-07  lbala    o Created
10258 --------------------------------------------------------------------------------
10259 FUNCTION get_cum_rent_due(p_trx_hdr_id IN NUMBER,
10260                           p_prorul     IN VARCHAR2
10261                          )
10262 RETURN NUMBER
10263 IS
10264 -- Get the details of
10265 CURSOR trx_cur
10266 IS
10267 SELECT var_rent_id,period_id,grp_date_id,calc_prd_start_date
10268 FROM pn_var_trx_headers_All
10269 WHERE trx_header_id=p_trx_hdr_id;
10270 
10271 -- Get the details of
10272 CURSOR grp_date_cur(p_prd_id IN NUMBER,
10273                     p_grp_dt_id IN NUMBER
10274                    )
10275 IS
10276 SELECT invoice_date
10277 FROM pn_var_grp_dates_all gd
10278 WHERE gd.period_id = p_prd_id
10279 AND gd.grp_date_id = p_grp_dt_id;
10280 
10281 CURSOR period_cur(vr_id IN NUMBER)
10282 IS
10283 SELECT period_id, start_date
10284 FROM pn_var_periods_all
10285 WHERE var_rent_id = vr_id
10286 AND partial_period = 'Y'
10287 AND period_num = 1;
10288 
10289 CURSOR get_act_inv_amt(p_prd_id IN NUMBER,
10290                        p_inv_dt IN DATE
10291                        )
10292 IS
10293 SELECT SUM(rent_inv.ACTUAL_INVOICED_AMOUNT) act_inv_amt
10294 FROM pn_var_rent_inv_all rent_inv
10295 WHERE rent_inv.period_id = p_prd_id
10296 AND (rent_inv.invoice_date <= p_inv_dt OR p_inv_dt IS NULL);
10297 
10298 l_vr_id  NUMBER :=NULL;
10299 l_prd_id NUMBER :=NULL;
10300 l_gd_id  NUMBER :=NULL;
10301 l_st_dt  DATE   :=NULL;
10302 l_inv_dt DATE :=NULL;
10303 l_max_calc_prd_dt DATE :=NULL;
10304 l_cum_rent_due NUMBER:=NULL;
10305 
10306 BEGIN
10307 
10308  FOR trx_rec IN trx_cur LOOP
10309   l_vr_id  := trx_rec.var_rent_id;
10310   l_prd_id := trx_rec.period_id;
10311   l_gd_id  := trx_rec.grp_date_id;
10312  END LOOP;
10313 
10314  FOR gd_rec IN grp_date_cur(l_prd_id,l_gd_id)LOOP
10315   l_inv_dt  := gd_rec.invoice_date;
10316  END LOOP;
10317 
10318  IF p_prorul IN ('FY','FLY') THEN
10319    FOR rec IN period_cur(l_vr_id) LOOP
10320       IF(rec.period_id = l_prd_id) THEN
10321 
10322         FOR rec1 IN get_act_inv_amt(l_prd_id,NULL) LOOP
10323           l_cum_rent_due := rec1.act_inv_amt;
10324         END LOOP;
10325         RETURN l_cum_rent_due;
10326 
10327       END IF;
10328    END LOOP;
10329 
10330  END IF;
10331 
10332  FOR rec1 IN get_act_inv_amt(l_prd_id,l_inv_dt) LOOP
10333      l_cum_rent_due := rec1.act_inv_amt;
10334  END LOOP;
10335  RETURN l_cum_rent_due;
10336 
10337 END get_cum_rent_due;
10338 
10339 --------------------------------------------------------------------------------
10340 --  NAME         : INCLUDE_PRD_NO_TERM
10341 --  DESCRIPTION  : Determines whether the period has all 0 rent invoices
10342 --  PURPOSE      :
10343 --  INVOKED FROM : VR detail and summary report
10344 --  ARGUMENTS    :
10345 --  REFERENCE    :
10346 --  HISTORY      :
10347 --
10348 --  7-MAR-07  lbala    o Created
10349 --------------------------------------------------------------------------------
10350 FUNCTION include_prd_no_term(p_prd_id IN NUMBER
10351                            )
10352 RETURN VARCHAR2 IS
10353 -- Get the details of
10354 CURSOR incl_prd(p_prd_id IN NUMBER)
10355 IS
10356 SELECT 'y' AS include_flag
10357 FROM DUAL
10358 WHERE NOT EXISTS (SELECT NULL
10359                   FROM pn_var_rent_inv_all vinv
10360                   WHERE vinv.ACTUAL_INVOICED_AMOUNT <> 0
10361                   AND vinv.period_id = p_prd_id
10362                  );
10363 l_include VARCHAR2(1):= 'n';
10364 BEGIN
10365 
10366 FOR rec IN incl_prd(p_prd_id) LOOP
10367  l_include := rec.include_flag;
10368 END LOOP;
10369 
10370 RETURN l_include;
10371 END include_prd_no_term;
10372 
10373 
10374 --------------------------------------------------------------------------------
10375 --  NAME         : delete_draft_terms
10376 --  DESCRIPTION  : deletes the draft term for which invoice_date or term
10377 --                 template has changed.
10378 --  PURPOSE      :
10379 --  INVOKED FROM :
10380 --  ARGUMENTS    :
10381 --  REFERENCE    :
10382 --  HISTORY      :
10383 --
10384 --  8.Mar.07  piagrawa    o Created
10385 --------------------------------------------------------------------------------
10386 PROCEDURE delete_draft_terms( p_var_rent_id IN NUMBER) IS
10387 
10388    /* get term template id for variable rent */
10389    CURSOR template_cur IS
10390       SELECT term_template_id
10391       FROM pn_var_rents_all
10392       WHERE var_rent_id = p_var_rent_id;
10393 
10394    /* get invoice dates for variable rent */
10395    CURSOR invoice_cur( p_vr_id  IN NUMBER) IS
10396       SELECT
10397       invoice_date, period_id
10398       FROM
10399       pn_var_rent_summ_all
10400       WHERE
10401       var_rent_id = p_vr_id
10402       GROUP BY
10403       invoice_date, period_id
10404       ORDER BY
10405       invoice_date;
10406 
10407   /* get latest invoice */
10408   CURSOR invoice2upd_c( p_vr_id  IN NUMBER
10409                        ,p_prd_id IN NUMBER
10410                        ,p_inv_dt IN DATE
10411                        ,p_inv_sch_date DATE
10412                        ,p_term_template_id NUMBER) IS
10413     SELECT inv.var_rent_inv_id
10414     FROM
10415     pn_var_rent_inv_all inv
10416     WHERE
10417     var_rent_id = p_vr_id AND
10418     period_id = p_prd_id AND
10419     invoice_date = p_inv_dt AND
10420     EXISTS (SELECT term.payment_term_id
10421             FROM pn_payment_terms_all term
10422             WHERE term.var_rent_inv_id = inv.var_rent_inv_id
10423             AND status = 'DRAFT'
10424             AND (start_date <> p_inv_sch_date OR
10425                  term_template_id <> p_term_template_id));
10426 
10427   /* get invoice dates for a period */
10428    /*CURSOR payment_cur (p_inv_sch_date DATE,
10429                        p_term_template_id NUMBER) IS
10430       SELECT payment_term_id, var_rent_inv_id
10431       FROM pn_payment_terms_all
10432       WHERE var_rent_inv_id IN (SELECT var_rent_inv_id
10433                                 FROM pn_var_rent_inv_all
10434                                 WHERE var_rent_id = p_var_rent_id)
10435       AND status = 'DRAFT'
10436       AND (start_date <> p_inv_sch_date OR
10437            term_template_id <> p_term_template_id);*/
10438 
10439    l_inv_start_date           DATE;
10440    l_payment_start_date       DATE;
10441    l_term_template_id         NUMBER;
10442 
10443 BEGIN
10444 
10445    FOR term_temp_rec IN template_cur LOOP
10446       l_term_template_id := term_temp_rec.term_template_id;
10447    END LOOP;
10448 
10449    FOR inv_rec IN invoice_cur (p_var_rent_id)
10450    LOOP
10451 
10452       /*l_inv_start_date := pn_var_rent_calc_pkg.inv_start_date(inv_start_date => inv_rec.invoice_date
10453                                                                ,vr_id => p_var_rent_id
10454                                                                ,approved_status => 'N'); */
10455 
10456       l_payment_start_date := pn_var_rent_calc_pkg.inv_sch_date(inv_start_date => inv_rec.invoice_date
10457                                                                ,vr_id => p_var_rent_id
10458                                                                ,p_period_id => inv_rec.period_id);
10459 
10460       FOR rec IN invoice2upd_c ( p_var_rent_id
10461                                , inv_rec.period_id
10462                                , inv_rec.invoice_date
10463                                , l_payment_start_date
10464                                , l_term_template_id) LOOP
10465 
10466          DELETE
10467          pn_payment_terms_all
10468          WHERE
10469          var_rent_inv_id = rec.var_rent_inv_id
10470          AND status = 'DRAFT'
10471          AND (start_date <> l_payment_start_date OR
10472              term_template_id <> l_term_template_id);
10473 
10474          IF(g_invoice_on=G_INV_ON_ACTUAL) THEN
10475 
10476             /* update the invoice */
10477             /*Since forcasted rents are not yet exported, we can update them.*/
10478             UPDATE
10479             pn_var_rent_inv_all
10480             SET
10481             actual_term_status      = 'N'
10482             ,last_update_date       = SYSDATE
10483             ,last_updated_by        = NVL(fnd_global.user_id,0)
10484             ,last_update_login      = NVL(fnd_global.login_id,0)
10485             WHERE
10486             var_rent_inv_id = rec.var_rent_inv_id;
10487 
10488          ELSIF (g_invoice_on = G_INV_ON_FORECASTED AND g_calc_type = G_CALC_TYPE_CALCULATE) THEN
10489 
10490             /* update the invoice */
10491             /*Since forcasted rents are not yet exported, we can update them.*/
10492             UPDATE
10493             pn_var_rent_inv_all
10494             SET
10495             forecasted_term_status  = 'N'
10496             ,last_update_date       = SYSDATE
10497             ,last_updated_by        = NVL(fnd_global.user_id,0)
10498             ,last_update_login      = NVL(fnd_global.login_id,0)
10499             WHERE
10500             var_rent_inv_id = rec.var_rent_inv_id;
10501 
10502          ELSIF (g_invoice_on = G_INV_ON_FORECASTED AND g_calc_type = G_CALC_TYPE_RECONCILE) THEN
10503 
10504             /* update the invoice */
10505             /*Since forcasted rents are not yet exported, we can update them.*/
10506             UPDATE
10507             pn_var_rent_inv_all
10508             SET
10509             actual_term_status      = 'N'
10510             ,last_update_date       = SYSDATE
10511             ,last_updated_by        = NVL(fnd_global.user_id,0)
10512             ,last_update_login      = NVL(fnd_global.login_id,0)
10513             WHERE
10514             var_rent_inv_id = rec.var_rent_inv_id;
10515 
10516          END IF;
10517 
10518       END LOOP;
10519    END LOOP;
10520 
10521 END delete_draft_terms;
10522 
10523 --------------------------------------------------------------------------------
10524 --  NAME         : actual_rent
10525 --  DESCRIPTION  : returns the actual rent for the given invoice period.
10526 --  PURPOSE      :
10527 --  INVOKED FROM :
10528 --  ARGUMENTS    :
10529 --  REFERENCE    :
10530 --  HISTORY      :
10531 --
10532 -- 21.Mar.07  Ram kumar    o Created
10533 --------------------------------------------------------------------------------
10534 FUNCTION actual_rent ( p_period_id IN NUMBER, p_invoice_date IN DATE, p_true_up_amt IN NUMBER, p_var_rent_inv_id IN NUMBER)
10535 RETURN NUMBER IS
10536 
10537 CURSOR csr_get_inv IS
10538  SELECT sum(actual_invoiced_amount) AS actual_rent
10539  FROM pn_var_rent_inv_all
10540  WHERE period_id = p_period_id
10541  AND invoice_date = p_invoice_date
10542  AND var_rent_inv_id <= p_var_rent_inv_id
10543  AND true_up_amt IS NULL;
10544 
10545 CURSOR csr_get_true IS
10546  SELECT constr_actual_rent
10547  FROM pn_var_rent_inv_all
10548  WHERE invoice_date = p_invoice_date
10549  AND true_up_amt IS NOT NULL
10550  AND var_rent_inv_id = p_var_rent_inv_id;
10551 
10552 l_actual_rent  NUMBER;
10553 
10554 BEGIN
10555 
10556    IF p_true_up_amt IS NULL THEN
10557      FOR rec_get_inv IN csr_get_inv LOOP
10558        l_actual_rent := rec_get_inv.actual_rent;
10559      END LOOP;
10560    ELSE
10561      FOR rec_get_true IN csr_get_true LOOP
10562        l_actual_rent := rec_get_true.constr_actual_rent;
10563      END LOOP;
10564    END IF;
10565 
10566    RETURN l_actual_rent;
10567 
10568 END actual_rent;
10569 
10570 --------------------------------------------------------------------------------
10571 --
10572 --  NAME         : VALIDATE_LY_CALC()
10573 --  DESCRIPTION  : Validates if a period is last period for an an agreement
10574 --                 which is less than 24 months long, has a proration rule of
10575 --                 FLY, has 2 periods both of which are partial
10576 --
10577 --  PURPOSE      :
10578 --  INVOKED FROM :
10579 --  ARGUMENTS    : NONE
10580 --  REFERENCE    : PN_COMMON.debug()
10581 --  HISTORY      :
10582 --
10583 --   27-FEB-07 piagrawa   o Created
10584 --------------------------------------------------------------------------------
10585 FUNCTION VALIDATE_LY_CALC (p_varRentId NUMBER, p_periodId  IN NUMBER)
10586 RETURN NUMBER
10587 IS
10588 
10589   /* verifying if agreement's length is less than 24 */
10590   CURSOR vr_length IS
10591       SELECT var_rent_id, proration_rule, termination_date
10592       FROM pn_var_rents_all
10593       WHERE var_rent_id = p_varRentId
10594       AND proration_rule = 'FLY'
10595       AND MONTHS_BETWEEN(commencement_date, termination_date) < 24;
10596 
10597   /* get the number of periods */
10598   CURSOR period_num_c ( p_vr_id IN NUMBER, term_date DATE) IS
10599       SELECT count(*) period_num
10600       FROM pn_var_periods_all
10601       WHERE var_rent_id = p_vr_id
10602       AND term_date > start_date;
10603 
10604   /* verify if last period for variable rent agreement is partial */
10605   CURSOR last_period_c (p_vr_id NUMBER, p_new_term_date DATE) IS
10606     SELECT period_id
10607     FROM pn_var_periods_all
10608     WHERE var_rent_id = p_vr_id
10609     AND p_new_term_date BETWEEN start_date AND end_date
10610     AND partial_period = 'Y';
10611 
10612   /* get the first partial period */
10613   CURSOR first_period_c( p_vr_id     IN NUMBER) IS
10614     SELECT
10615      prd.period_id
10616     ,prd.partial_period
10617     FROM
10618     pn_var_periods_all prd,
10619     pn_var_rents_all   var
10620     WHERE
10621     prd.var_rent_id = p_vr_id AND
10622     prd.var_rent_id = var.var_rent_id AND
10623     prd.start_date = var.commencement_date AND
10624     prd.partial_period = 'Y';
10625 
10626    l_first_partial VARCHAR2(1);
10627    l_last_partial  VARCHAR2(1);
10628    l_last_periodId NUMBER;
10629    l_period_num    NUMBER  := 0;
10630    l_ly_calc       NUMBER := NULL;
10631    l_new_term_date DATE;
10632 
10633 BEGIN
10634    pnp_debug_pkg.log('+++++++++ VALIDATE_LY_CALC START +++++++++++');
10635 
10636    FOR vr_length_rec IN vr_length
10637    LOOP
10638 
10639       FOR period_num_rec IN period_num_c (p_varRentId, vr_length_rec.termination_date)
10640       LOOP
10641          l_period_num := period_num_rec.period_num;
10642       END LOOP;
10643 
10644       FOR first_period_rec IN first_period_c (p_varRentId)
10645       LOOP
10646          l_first_partial := first_period_rec.partial_period;
10647       END LOOP;
10648 
10649       FOR last_period_rec IN last_period_c (p_varRentId, vr_length_rec.termination_date )
10650       LOOP
10651          l_last_partial := 'Y';
10652          l_last_periodId := last_period_rec.period_id;
10653       END LOOP;
10654 
10655      /* IMP: when we have just 2 periods and first year and last year period is
10656         partial, in such a case we would not be calculating last year rent. */
10657       IF l_period_num = 2 AND l_first_partial = 'Y' AND
10658         l_last_partial = 'Y' AND l_last_periodId = p_periodId
10659       THEN
10660          l_ly_calc := p_periodId;
10661       END IF;
10662 
10663 
10664    END LOOP;
10665 
10666    return l_ly_calc;
10667 
10668    pnp_debug_pkg.log('+++++++++ VALIDATE_LY_CALC END +++++++++++');
10669 
10670 END VALIDATE_LY_CALC;
10671 --------------------------------------------------------------------------------
10672 --  NAME         : full_yr_summary
10673 --  DESCRIPTION  :
10674 --  PURPOSE      :
10675 --  INVOKED FROM :
10676 --  ARGUMENTS    :
10677 --  REFERENCE    :
10678 --  HISTORY      :
10679 --
10680 -- 16.Apr.07  Ram kumar    o Created
10681 --------------------------------------------------------------------------------
10682 PROCEDURE full_yr_summary ( p_line_item_id      IN NUMBER
10683                            ,p_yr_volume         OUT NOCOPY  NUMBER
10684                            ,p_deductions        OUT NOCOPY  NUMBER)
10685 IS
10686 
10687 CURSOR full_yr_cur IS
10688   SELECT  sum(NVL(tot_act_vol, 0)) yr_vol,
10689           sum(NVL(tot_ded, 0)) yr_deductions
10690   FROM   pn_var_rent_summ_all
10691   WHERE  line_item_id = p_line_item_id;
10692 
10693 BEGIN
10694 
10695    FOR yr_rec IN full_yr_cur LOOP
10696       p_yr_volume     := yr_rec.yr_vol;
10697       p_deductions    := yr_rec.yr_deductions;
10698    END LOOP;
10699 
10700 END full_yr_summary;
10701 
10702 --------------------------------------------------------------------------------
10703 --  NAME         : trueup_rent
10704 --  DESCRIPTION  :
10705 --  PURPOSE      :
10706 --  INVOKED FROM :
10707 --  ARGUMENTS    :
10708 --  REFERENCE    :
10709 --  HISTORY      :
10710 --
10711 -- 19.Apr.07  Ram kumar    o Created
10712 --------------------------------------------------------------------------------
10713 FUNCTION trueup_rent ( p_var_rent_id IN NUMBER
10714                       ,p_period_id   IN NUMBER
10715                       ,p_grp_date_id IN NUMBER)
10716 RETURN NUMBER
10717 IS
10718 
10719   CURSOR trueup_rent_c IS
10720     SELECT
10721      SUM(trueup_rent_due)         AS trueup_rent
10722     ,MAX(calc_prd_end_date)       AS trueup_date
10723     ,line_item_id
10724     FROM
10725     pn_var_trx_headers_all
10726     WHERE
10727     var_rent_id = p_var_rent_id AND
10728     period_id = p_period_id
10729     GROUP BY
10730     line_item_id
10731     ORDER BY
10732     line_item_id;
10733 
10734   -- Get the details of
10735   CURSOR trueup_end_date_c  IS
10736     SELECT grp_end_date
10737       FROM pn_var_grp_dates_all
10738      WHERE grp_date_id = p_grp_date_id;
10739 
10740   l_trueup_rent        NUMBER := 0;
10741   l_trueup_date        DATE;
10742   l_grp_end_date       DATE;
10743 
10744 BEGIN
10745 
10746   FOR trueup_rec IN trueup_rent_c  LOOP
10747     l_trueup_rent := trueup_rec.trueup_rent;
10748     l_trueup_date := trueup_rec.trueup_date;
10749   END LOOP;
10750 
10751   FOR trueup_date_rec IN trueup_end_date_c  LOOP
10752     l_grp_end_date := trueup_date_rec.grp_end_date;
10753   END LOOP;
10754 
10755 
10756   IF l_grp_end_date = l_trueup_date THEN
10757     RETURN l_trueup_rent;
10758   ELSE
10759     RETURN NULL;
10760   END IF;
10761 
10762 END trueup_rent;
10763 --------------------------------------------------------------------------------
10764 --  NAME         : true_up_bkpt
10765 --  DESCRIPTION  :
10766 --  PURPOSE      :
10767 --  INVOKED FROM :
10768 --  ARGUMENTS    :
10769 --  REFERENCE    :
10770 --  HISTORY      :
10771 --
10772 -- 25.Apr.07  Ram kumar    o Created
10773 --------------------------------------------------------------------------------
10774 PROCEDURE true_up_bkpt ( p_period_id      IN NUMBER
10775                         ,p_bkpt_rate      IN NUMBER
10776                         ,p_bkpt_vol_start OUT NOCOPY  NUMBER
10777                         ,p_bkpt_vol_end   OUT NOCOPY  NUMBER)
10778 IS
10779 
10780 CURSOR get_period_dtls_csr IS
10781   SELECT  period_num,var_rent_id
10782   FROM pn_var_periods_all
10783   WHERE period_id = p_period_id;
10784 
10785 CURSOR get_blended_bkpt_csr(p_var_rent_id IN NUMBER) IS
10786   SELECT sum(pr_grp_blended_vol_start) bkpt_start,
10787          sum(pr_grp_blended_vol_end) bkpt_end
10788   FROM pn_var_trx_details_all dtls,
10789        pn_var_trx_headers_all hdr
10790   WHERE var_rent_id = p_var_rent_id
10791   AND hdr.trx_header_id = dtls.trx_header_id
10792   AND dtls.bkpt_rate = p_bkpt_rate
10793   GROUP BY dtls.bkpt_rate;
10794 
10795 l_var_rent_id  NUMBER;
10796 l_period_num   NUMBER;
10797 l_bkpt_start   NUMBER;
10798 l_bkpt_end     NUMBER;
10799 
10800 BEGIN
10801 
10802 --
10803 FOR rec_prd_details IN get_period_dtls_csr LOOP
10804   l_period_num := rec_prd_details.period_num;
10805   l_var_rent_id := rec_prd_details.var_rent_id;
10806 END LOOP;
10807 
10808 FOR rec_blended_bkpt IN get_blended_bkpt_csr(l_var_rent_id) LOOP
10809   p_bkpt_vol_start  := rec_blended_bkpt.bkpt_start;
10810   p_bkpt_vol_end    := rec_blended_bkpt.bkpt_end;
10811 END LOOP;
10812 
10813 IF l_period_num NOT IN (1,2) THEN
10814   p_bkpt_vol_start := NULL;
10815   p_bkpt_vol_end := NULL;
10816 END IF;
10817 
10818 END true_up_bkpt;
10819 
10820 --------------------------------------------------------------------------------
10821 --  NAME         : new_term_amount
10822 --  DESCRIPTION  :
10823 --  PURPOSE      :
10824 --  INVOKED FROM :
10825 --  ARGUMENTS    :
10826 --  REFERENCE    :
10827 --  HISTORY      :
10828 --
10829 -- 30.May.07  Ram kumar    o Created
10830 --------------------------------------------------------------------------------
10831 FUNCTION new_term_amount ( p_invoice_date IN DATE
10832                           ,p_period_id   IN NUMBER
10833                           ,p_var_rent_inv_id IN NUMBER)
10834 RETURN NUMBER
10835 IS
10836 
10837 CURSOR inv_details_cur IS
10838   SELECT variance_exp_code, actual_exp_code, adjust_num, actual_invoiced_amount, for_per_rent
10839     FROM pn_var_rent_inv_all
10840    WHERE period_id = p_period_id
10841      AND var_rent_inv_id = p_var_rent_inv_id;
10842 
10843 BEGIN
10844 
10845 FOR rec IN inv_details_cur LOOP
10846 
10847   IF rec.variance_exp_code = 'Y' THEN
10848     RETURN 0;
10849   ELSIF rec.actual_exp_code = 'Y' THEN
10850     RETURN 0;
10851   ELSIF rec.adjust_num = 0 THEN
10852     RETURN (rec.actual_invoiced_amount -nvl(rec.for_per_rent,0));
10853   ELSE
10854     RETURN rec.actual_invoiced_amount;
10855   END IF;
10856 
10857 END LOOP;
10858 
10859 END new_term_amount;
10860 
10861 --------------------------------------------------------------------------------
10862 --  NAME         : true_up_header
10863 --  DESCRIPTION  :
10864 --  PURPOSE      :
10865 --  INVOKED FROM :
10866 --  ARGUMENTS    :
10867 --  REFERENCE    :
10868 --  HISTORY      :
10869 --
10870 -- 10.July.07  Ram kumar    o Created
10871 --------------------------------------------------------------------------------
10872 FUNCTION true_up_header ( p_period_id           IN NUMBER
10873                          ,p_trx_hdr_id          IN NUMBER
10874                                  ,p_calc_prd_end_date   IN DATE)
10875 RETURN VARCHAR2
10876 IS
10877 
10878 CURSOR trx_header_cur IS
10879   SELECT max(calc_prd_end_date) end_date
10880     FROM pn_var_trx_headers_all
10881    WHERE period_id = p_period_id
10882    GROUP BY reset_group_id;
10883 
10884 CURSOR true_up_cur IS
10885   SELECT trueup_rent_due
10886     FROM pn_var_trx_headers_all
10887    WHERE trx_header_id = p_trx_hdr_id;
10888 
10889 l_true_up   VARCHAR2(30)   :=  'N';
10890 
10891 BEGIN
10892 
10893 FOR rec_true_up IN true_up_cur LOOP
10894     FOR rec IN trx_header_cur LOOP
10895        IF rec.end_date = p_calc_prd_end_date AND rec_true_up.trueup_rent_due IS NOT NULL THEN
10896             l_true_up := 'Y';
10897         END IF;
10898     END LOOP;
10899 END LOOP;
10900 
10901 RETURN l_true_up;
10902 
10903 END true_up_header;
10904 
10905 END pn_var_rent_calc_pkg;
10906