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.0.12010000.2 2008/08/21 10:30:12 acprakas 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 
446                     ,p_line_item_grp_id IN NUMBER) IS
443   /* get FY breakpoints */
444   CURSOR fy_bkpts_c( p_vr_id            IN NUMBER
445                     ,p_vr_comm_date     IN DATE
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 
603 
600 BEGIN
601 
602   pnp_debug_pkg.log('++++ get_rent_applicable - START ++++');
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 
732           IF g_proration_rule = pn_var_rent_calc_pkg.G_PRORUL_NP THEN
729         ELSIF g_calculation_method = pn_var_rent_calc_pkg.G_CALC_CUMULATIVE
730         THEN
731 
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 +++');
880                             ,pn_var_rent_calc_pkg.G_PRORUL_FLY) AND
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
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 */
948                          ,p_line_item_grp_id => l_trx_hdr_rec.line_item_group_id)
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
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;
1086         pnp_debug_pkg.log('    VR End Date: '|| g_vr_termination_date);
1083 
1084         pnp_debug_pkg.log('Get bkpt trips for');
1085         pnp_debug_pkg.log('    VR ID: '||l_trx_hdr_rec.var_rent_id);
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
1222           l_trx_hdr_rec.prorated_rent_due
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
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 
1356 
1353   pnp_debug_pkg.log(l_context||' COMPLETE ');
1354 
1355   /* ------------- GET percent_rent_due, ytd_percent_rent END ------------- */
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 
1496         pn_var_rent_summ_all
1493         pnp_debug_pkg.log('inserting ...');
1494         /* to insert a new summary record */
1495         INSERT INTO
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
1656       /* Check if for first period a sumamry record already exists */
1653          l_line_item_id := line_item_rec.line_item_id;
1654       END LOOP;
1655 
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
1812     actual_exp_code = 'Y' AND
1809     var_rent_id = p_vr_id AND
1810     period_id = p_prd_id AND
1811     invoice_date = p_inv_dt 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,
1947         x_negative_rent           => 0,
1944         x_abatement_appl          => 0,
1945         x_rec_abatement           => NULL,
1946         x_rec_abatement_override  => l_rec_abatement_override,
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,
2051 
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 );
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)
2193   l_row_id          ROWID;
2190       AND vol_hist_status_code = pn_var_rent_calc_pkg.G_SALESVOL_STATUS_APPROVED);
2191 
2192   l_invoice_on      VARCHAR2(30);
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,
2329 
2326                                           inv_rec.invoice_date
2327                                           ) --
2328                                           LOOP
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',
2435             x_attribute_category      => NULL,
2432             x_variance_exp_code       => 'N',
2433             x_actual_exp_code         => 'N',
2434             x_comments                => 'created invoice',
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 
2562         l_constr_act_rent := l_upper_bound;
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
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. */
2693     SELECT
2690   CURSOR prev_invoiced_c( p_vr_id  IN NUMBER
2691                          ,p_prd_id IN NUMBER
2692                          ,p_inv_dt IN DATE) IS
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;
2819             x_var_rent_inv_id         => l_var_rent_inv_id,
2816       l_var_rent_inv_id := NULL;
2817        pn_var_rent_inv_pkg.insert_row
2818           ( x_rowid                   => l_row_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
2934                              where inv1.var_rent_id = inv.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
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
3058      WHERE inv1.var_rent_id = ip_var_rent_id
3055             ,invoice_date
3056             ,var_rent_inv_id
3057      FROM pn_var_rent_inv_all inv1
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);
3168      SET negative_rent = ROUND(l_negative_rent, g_precision)
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
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.
3291 --  HISTORY      : Shabda BUG 5726758. Modified to set the abatement
3288 --                 p_period_id: Period to calculate for.
3289 --                 p_inv_id: Invoice to calculate for.
3290 --  REFERENCE    :
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
3409        AND inv.invoice_date = (select max(invoice_date) from pn_var_rent_inv_all inv1
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)
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;
3531     x_abated_rent := l_abated_rent;
3528     END IF;
3529 
3530     pnp_debug_pkg.log('l_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;
3656   pnp_debug_pkg.log('apply_allow start(+)');
3653   l_last_inv_id         NUMBER;
3654 
3655 BEGIN
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
3774       FROM pn_var_rent_inv_all inv, pn_var_periods_all per
3771   CURSOR get_fy_inv_c(ip_var_rent_id NUMBER
3772             ) IS
3773     SELECT inv.var_rent_inv_id
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
3908 --  dd-mon-yyyy  name     o Created
3905 --               : 8-Nov-2006 Shabda Modified to update rents each time, trx
3906 --                 records are created. Not doing this cause wrong true_up
3907 --
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 --------------------------------------------------------------------------------
3914 PROCEDURE calculate_rent( p_var_rent_id IN NUMBER
3915                          ,p_period_id   IN NUMBER)
3916 IS
3917 
3918   /* get all periods for VR */
3919   CURSOR periods_vr_c( p_vr_id IN NUMBER) IS
3920     SELECT
3921      period_id
3922     ,start_date
3923     ,end_date
3924     ,partial_period
3925     FROM
3926     pn_var_periods_all
3927     WHERE
3928     var_rent_id = p_vr_id AND
3929     NVL(status, pn_var_rent_calc_pkg.G_PERIOD_ACTIVE_STATUS)
3930       <> pn_var_rent_calc_pkg.G_PERIOD_REVERSED_STATUS
3931     ORDER BY
3932     start_date;
3933 
3934   /* get all periods for VR */
3935   CURSOR periods_c( p_vr_id  IN NUMBER
3936                    ,p_prd_id IN NUMBER) IS
3937     SELECT
3938      period_id
3939     ,start_date
3940     ,end_date
3941     ,partial_period
3942     FROM
3943     pn_var_periods_all
3944     WHERE
3945     var_rent_id = p_vr_id AND
3946     period_id =  p_prd_id
3947 /*Bug#6849764
3948 start_date >= (SELECT start_date
3949                    FROM pn_var_periods_all
3950                    WHERE period_id = p_prd_id)
3951 Bug#6849764*/
3952     ORDER BY
3953     start_date;
3954 
3955     -- Get the periods ouside the current periods
3956     CURSOR periods_out_c(p_vr_id  IN NUMBER
3957                    ,p_prd_id IN NUMBER) IS
3958      SELECT
3959      period_id
3960     ,start_date
3961     ,end_date
3962     ,partial_period
3963     FROM
3964     pn_var_periods_all
3965     WHERE
3966     var_rent_id = p_vr_id AND
3967     NVL(status, pn_var_rent_calc_pkg.G_PERIOD_ACTIVE_STATUS)
3968       <> pn_var_rent_calc_pkg.G_PERIOD_REVERSED_STATUS AND
3969     start_date < (SELECT start_date
3970                    FROM pn_var_periods_all
3971                    WHERE period_id = p_prd_id)
3972     ORDER BY
3973     start_date;
3974 
3975 
3976 
3977   -- Get the details of
3978   CURSOR first_period_cur (p_var_rent_id NUMBER) IS
3979     SELECT pvp.period_id, pvp.partial_period
3980       FROM pn_var_periods_all pvp, pn_var_rents_all pvr
3981      WHERE pvr.var_rent_id = p_var_rent_id
3982      AND   pvp.var_rent_id = pvr.var_rent_id
3983      AND   pvp.start_date = pvr.commencement_date;
3984 
3985   -- Get first partial period id
3986  CURSOR check_fst_partial_prd(p_var_rent_id IN NUMBER) IS
3987   SELECT period_id
3988     FROM pn_var_periods_all
3989    WHERE var_rent_id=p_var_rent_id
3990      AND period_num=1
3991      AND partial_period='Y';
3992 
3993   TYPE PERIOD_TBL IS TABLE OF periods_vr_c%ROWTYPE INDEX BY BINARY_INTEGER;
3994   l_periods_t PERIOD_TBL;
3995   l_periods_out_t PERIOD_TBL;
3996 
3997   l_prev_grp_date_id NUMBER;
3998   l_first_period_id  NUMBER := 0;
3999 
4000   l_trx_hrd_r pn_var_rent_calc_pkg.trx_hdr_c%ROWTYPE;
4001   l_trx_hrd_for_r pn_var_rent_calc_pkg.trx_hdr_for_c%ROWTYPE;
4002   l_trx_hrd_t pn_var_rent_calc_pkg.TRX_HDR_TBL;
4003   l_trx_hrd_for_t pn_var_rent_calc_pkg.TRX_HEADER_TBL;
4004 
4005   l_context VARCHAR2(255);
4006   l_first_inv_dt DATE ;
4007   l_partial_prd_id NUMBER:=NULL;
4008   l_partial_period VARCHAR2(1) := 'N';
4009 
4010 BEGIN
4011   pnp_debug_pkg.log('+++++++++ calculate_rent START +++++++++++');
4012   pnp_debug_pkg.log('');
4013   /* -------------------------------------------------------------------------- */
4014   /* ------------------------------- CODE BEGIN ------------------------------- */
4015   /* -------------------------------------------------------------------------- */
4016 
4017   /* cache VR details */
4018   l_context := 'Call pn_var_rent_calc_pkg.cache_vr_details';
4019 
4020   pn_var_rent_calc_pkg.cache_vr_details(p_var_rent_id => p_var_rent_id);
4021 
4022   pnp_debug_pkg.log(l_context||' COMPLETE');
4023 
4024   /* check if trx tables need to be updated for change in bkts */
4025   l_context := 'Call pn_var_trx_pkg.populate_transactions';
4026 
4027   pn_var_trx_pkg.populate_transactions(p_var_rent_id => p_var_rent_id);
4028 
4029   pnp_debug_pkg.log(l_context||' COMPLETE');
4030 
4031   /*Do we need to populate actual sales or forecasted sales?*/
4032 
4033   IF(g_invoice_on=G_INV_ON_ACTUAL) THEN
4034      /* check if trx tables need to be updated for change in sales volume */
4035      l_context := 'Call pn_var_trx_pkg.populate_sales';
4036      pn_var_trx_pkg.populate_sales(p_var_rent_id => p_var_rent_id);
4037      pnp_debug_pkg.log(l_context||' COMPLETE');
4038   ELSIF (g_invoice_on = G_INV_ON_FORECASTED AND g_calc_type = G_CALC_TYPE_CALCULATE) THEN
4039      /* check if trx tables need to be updated for change in forecasted sales volume */
4040      l_context := 'Call pn_var_trx_pkg.populate_sales_for';
4041      pn_var_trx_pkg.populate_sales_for(p_var_rent_id => p_var_rent_id);
4045      l_context := 'Call pn_var_trx_pkg.populate_sales';
4042      pnp_debug_pkg.log(l_context||' COMPLETE');
4043   ELSIF (g_invoice_on = G_INV_ON_FORECASTED AND g_calc_type = G_CALC_TYPE_RECONCILE) THEN
4044      /* check if trx tables need to be updated for change in sales volume */
4046      pn_var_trx_pkg.populate_sales(p_var_rent_id => p_var_rent_id);
4047      pnp_debug_pkg.log(l_context||' COMPLETE');
4048 
4049   END IF;
4050 
4051   /* Populate deductions - Only need to do this when actuals are being calculated */
4052   IF(g_invoice_on=G_INV_ON_ACTUAL)
4053      OR (g_invoice_on = G_INV_ON_FORECASTED AND g_calc_type = G_CALC_TYPE_RECONCILE) THEN
4054      pnp_debug_pkg.log('');
4055      l_context := 'Call pn_var_trx_pkg.populate_deductions';
4056 
4057      pn_var_trx_pkg.populate_deductions(p_var_rent_id => p_var_rent_id);
4058 
4059       pnp_debug_pkg.log(l_context||' COMPLETE');
4060 
4061   END IF;
4062 
4063   pnp_debug_pkg.log('');
4064 
4065   /* populate the trx tables with calculated rents */
4066   l_context := 'Get periods to calculate rent for';
4067 
4068   l_periods_t.DELETE;
4069 
4070 
4071   /* cache the periods to calculate rent for */
4072   IF p_var_rent_id IS NOT NULL AND
4073      p_period_id IS NULL
4074   THEN
4075 
4076     OPEN periods_vr_c( p_vr_id => p_var_rent_id);
4077     FETCH periods_vr_c BULK COLLECT INTO l_periods_t;
4078     CLOSE periods_vr_c;
4079 
4080 
4081   ELSIF p_var_rent_id IS NOT NULL AND
4082         p_period_id   IS NOT NULL
4083   THEN
4084 
4085     OPEN periods_c( p_vr_id  => p_var_rent_id
4086                    ,p_prd_id => p_period_id);
4087     FETCH periods_c BULK COLLECT INTO l_periods_t;
4088     CLOSE periods_c;
4089 
4090   END IF;
4091 
4092   pnp_debug_pkg.log(l_context||' COMPLETE');
4093   pnp_debug_pkg.log('');
4094 
4095   l_context := 'Loop for all cached periods. Number of periods: '||l_periods_t.COUNT;
4096   pnp_debug_pkg.log(l_context);
4097   pnp_debug_pkg.log('');
4098 
4099   /* loop for all periods cached and calculate rent */
4100   IF l_periods_t.COUNT > 0 THEN
4101 
4102     FOR p IN l_periods_t.FIRST..l_periods_t.LAST LOOP
4103 
4104       l_context
4105       := '=== Looping for Period - Start Date: '||l_periods_t(p).start_date||
4106                               ' -- End Date: '||l_periods_t(p).end_date||
4107                               ' === ';
4108 
4109       pnp_debug_pkg.log(l_context);
4110       pnp_debug_pkg.log('');
4111 
4112       l_context := 'Fetch all trx data for period';
4113 
4114       /*Do we need to populate actual or forecasted rents?*/
4115       IF(g_invoice_on=G_INV_ON_ACTUAL)
4116       OR (g_invoice_on = G_INV_ON_FORECASTED AND g_calc_type = G_CALC_TYPE_RECONCILE)
4117       THEN
4118 
4119               l_trx_hrd_t.DELETE;
4120 
4121               /* loop for all trx in the period,
4122                order by line item, calc (sub) period start*/
4123               /*Populate actual rents in trx tables.*/
4124               OPEN pn_var_rent_calc_pkg.trx_hdr_c
4125                     ( p_vr_id  => p_var_rent_id
4126                      ,p_prd_id => l_periods_t(p).period_id);
4127               FETCH pn_var_rent_calc_pkg.trx_hdr_c BULK COLLECT INTO l_trx_hrd_t;
4128               CLOSE pn_var_rent_calc_pkg.trx_hdr_c;
4129 
4130               pnp_debug_pkg.log(l_context||' COMPLETE');
4131               pnp_debug_pkg.log('');
4132 
4133               IF l_trx_hrd_t.COUNT > 0 THEN
4134 
4135                 l_context := 'Loop for all cached transactions. '||
4136                              'Number of trx: '||l_trx_hrd_t.COUNT;
4137                 pnp_debug_pkg.log(l_context);
4138 
4139                 FOR t IN l_trx_hrd_t.FIRST..l_trx_hrd_t.LAST LOOP
4140 
4141                   l_context
4142                   := '=== Looping for TRX - Start Date: '||
4143                        l_trx_hrd_t(t).calc_prd_start_date||
4144                                          ' -- End Date: '||
4145                          l_trx_hrd_t(t).calc_prd_end_date||
4146                                           ' === ';
4147                   pnp_debug_pkg.log(l_context);
4148                   pnp_debug_pkg.log('');
4149 
4150                   /* if we need to create an invoice for this calc (sub) period
4151                      AND if approved sales exist
4152                   */
4153                   IF NVL(l_trx_hrd_t(t).invoice_flag, 'Y') <> 'N' AND
4154                      pn_var_rent_calc_pkg.exists_approved_sales
4155                        ( p_line_item_id => l_trx_hrd_t(t).line_item_id
4156                         ,p_grp_date_id  => l_trx_hrd_t(t).grp_date_id)
4157                   THEN
4158 
4159                     l_trx_hrd_r := l_trx_hrd_t(t);
4160 
4161                     l_context := 'Call pn_var_rent_calc_pkg.get_rent_applicable';
4162                     pn_var_rent_calc_pkg.get_rent_applicable(l_trx_hrd_r);
4163                     pnp_debug_pkg.log(l_context||' COMPLETE');
4164                     pnp_debug_pkg.log('');
4165 
4166                     /* if rent changed */
4167                     IF NVL(l_trx_hrd_t(t).calculated_rent, 0)
4168                        <> NVL(l_trx_hrd_r.calculated_rent, 0) OR
4169                        NVL(l_trx_hrd_t(t).prorated_rent_due, 0)
4170                        <> NVL(l_trx_hrd_r.prorated_rent_due, 0) OR
4171                        NVL(l_trx_hrd_t(t).percent_rent_due, 0)
4175                        NVL(l_trx_hrd_t(t).first_yr_rent, 0)
4172                        <> NVL(l_trx_hrd_r.percent_rent_due, 0) OR
4173                        NVL(l_trx_hrd_t(t).ytd_percent_rent, 0)
4174                        <> NVL(l_trx_hrd_r.ytd_percent_rent, 0)OR
4176                        <> NVL(l_trx_hrd_r.first_yr_rent, 0)
4177                     THEN
4178 
4179                       UPDATE
4180                       pn_var_trx_headers_all
4181                       SET
4182                        calculated_rent   = round(l_trx_hrd_r.calculated_rent,g_precision)
4183                       ,prorated_rent_due = round(l_trx_hrd_r.prorated_rent_due,g_precision)
4184                       ,percent_rent_due  = round(l_trx_hrd_r.percent_rent_due,g_precision)
4185                       ,ytd_percent_rent  = round(l_trx_hrd_r.ytd_percent_rent,g_precision)
4186                       ,first_yr_rent     = round(l_trx_hrd_r.first_yr_rent,g_precision)
4187                       WHERE
4188                       trx_header_id = l_trx_hrd_r.trx_header_id;
4189 
4190                       l_trx_hrd_t(t) := l_trx_hrd_r;
4191 
4192                     END IF; /* if rent changed */
4193 
4194                   ELSE
4195 
4196                     l_context := 'No calculation necessary';
4197                     pnp_debug_pkg.log(l_context);
4198                     pnp_debug_pkg.log('');
4199 
4200                   END IF; /* need to create inv 4 this calc (sub) prd AND appr sales exist */
4201 
4202                 END LOOP; /* loop for all trx in the period */
4203 
4204                 l_context := 'Loop for all cached transactions.';
4205                 pnp_debug_pkg.log(l_context||' COMPLETE');
4206                 pnp_debug_pkg.log('');
4207 
4208               END IF;
4209 
4210       ELSIF (g_invoice_on = G_INV_ON_FORECASTED AND g_calc_type = G_CALC_TYPE_CALCULATE) THEN
4211              l_trx_hrd_for_t.DELETE;
4212 
4213               /* loop for all trx in the period,
4214                order by line item, calc (sub) period start*/
4215               /*Populate actual rents in trx tables.*/
4216               /*Populate forecasted rents in the trx tables.*/
4217              OPEN pn_var_rent_calc_pkg.trx_hdr_for_c
4218                     ( p_vr_id  => p_var_rent_id
4219                      ,p_prd_id => l_periods_t(p).period_id);
4220               FETCH pn_var_rent_calc_pkg.trx_hdr_for_c BULK COLLECT INTO l_trx_hrd_for_t;
4221               CLOSE pn_var_rent_calc_pkg.trx_hdr_for_c;
4222 
4223               pnp_debug_pkg.log(l_context||' COMPLETE');
4224               pnp_debug_pkg.log('');
4225 
4226               IF l_trx_hrd_for_t.COUNT > 0 THEN
4227 
4228                 l_context := 'Loop for all cached transactions. '||
4229                              'Number of trx: '||l_trx_hrd_for_t.COUNT;
4230                 pnp_debug_pkg.log(l_context);
4231 
4232                 FOR t IN l_trx_hrd_for_t.FIRST..l_trx_hrd_for_t.LAST LOOP
4233 
4234                   l_context
4235                   := '=== Looping for TRX - Start Date: '||
4236                        l_trx_hrd_for_t(t).calc_prd_start_date||
4237                                          ' -- End Date: '||
4238                          l_trx_hrd_for_t(t).calc_prd_end_date||
4239                                           ' === ';
4240                   pnp_debug_pkg.log(l_context);
4241                   pnp_debug_pkg.log('');
4242 
4243                   /* if we need to create an invoice for this calc (sub) period
4244                   */
4245                   IF NVL(l_trx_hrd_for_t(t).invoice_flag, 'Y') <> 'N'
4246                   /*This will not be needed when invoicing on forecasted
4247                   AND
4248                      pn_var_rent_calc_pkg.exists_approved_sales
4249                        ( p_line_item_id => l_trx_hrd_for_t(t).line_item_id
4250                         ,p_grp_date_id  => l_trx_hrd_for_t(t).grp_date_id)*/
4251                   THEN
4252 
4253                     l_trx_hrd_for_r := l_trx_hrd_for_t(t);
4254 
4255                     l_context := 'Call pn_var_rent_calc_pkg.get_rent_applicable_for';
4256                     pn_var_rent_calc_pkg.get_rent_applicable_for(l_trx_hrd_for_r);
4257                     pnp_debug_pkg.log(l_context||' COMPLETE');
4258                     pnp_debug_pkg.log('');
4259 
4260                     /* if rent changed */
4261                     IF NVL(l_trx_hrd_for_t(t).calculated_rent_for, 0)
4262                        <> NVL(l_trx_hrd_for_r.calculated_rent_for, 0) OR
4263                        NVL(l_trx_hrd_for_t(t).percent_rent_due_for, 0)
4264                        <> NVL(l_trx_hrd_for_r.percent_rent_due_for, 0) OR
4265                        NVL(l_trx_hrd_for_t(t).ytd_percent_rent_for, 0)
4266                        <> NVL(l_trx_hrd_for_r.ytd_percent_rent_for, 0)
4267                     THEN
4268                     pnp_debug_pkg.log('updating the trx');
4269                     pnp_debug_pkg.log('l_trx_hrd_for_t(t).calculated_rent_for'||l_trx_hrd_for_t(t).calculated_rent_for);
4270                     pnp_debug_pkg.log('l_trx_hrd_for_r.calculated_rent_for'||l_trx_hrd_for_r.calculated_rent_for);
4271                     pnp_debug_pkg.log('l_trx_hrd_for_r.trx_header_id'||l_trx_hrd_for_r.trx_header_id);
4272 
4273                       UPDATE
4274                       pn_var_trx_headers_all
4275                       SET
4276                        calculated_rent_for   = round(l_trx_hrd_for_r.calculated_rent_for,g_precision)
4277                       ,percent_rent_due_for  = round(l_trx_hrd_for_r.percent_rent_due_for,g_precision)
4281 
4278                       ,ytd_percent_rent_for  = round(l_trx_hrd_for_r.ytd_percent_rent_for,g_precision)
4279                       WHERE
4280                       trx_header_id = l_trx_hrd_for_r.trx_header_id;
4282                       l_trx_hrd_t(t) := l_trx_hrd_r;
4283 
4284                     END IF; /* if rent changed */
4285 
4286                   ELSE
4287 
4288                     l_context := 'No calculation necessary';
4289                     pnp_debug_pkg.log(l_context);
4290                     pnp_debug_pkg.log('');
4291 
4292                   END IF; /* need to create inv 4 this calc (sub) prd AND appr sales exist */
4293 
4294                 END LOOP; /* loop for all trx in the period */
4295 
4296                 l_context := 'Loop for all cached transactions.';
4297                 pnp_debug_pkg.log(l_context||' COMPLETE');
4298                 pnp_debug_pkg.log('');
4299 
4300               END IF;
4301 
4302       END IF;/*end g_invoice and g_calc_type*/
4303 
4304     END LOOP; /* loop for all periods cached and calculate rent */
4305   END IF; /* if > 0 periods cached */
4306 
4307   l_periods_t.DELETE;
4308   /*Insert Invoice/post summary*/
4309   /* cache the periods*/
4310   IF p_var_rent_id IS NOT NULL AND
4311      p_period_id IS NULL
4312   THEN
4313 
4314     OPEN periods_vr_c( p_vr_id => p_var_rent_id);
4315     FETCH periods_vr_c BULK COLLECT INTO l_periods_t;
4316     CLOSE periods_vr_c;
4317 
4318 
4319   ELSIF p_var_rent_id IS NOT NULL AND
4320         p_period_id   IS NOT NULL
4321   THEN
4322 
4323     OPEN periods_c( p_vr_id  => p_var_rent_id
4324                    ,p_prd_id => p_period_id);
4325     FETCH periods_c BULK COLLECT INTO l_periods_t;
4326     CLOSE periods_c;
4327 
4328     OPEN periods_out_c( p_vr_id  => p_var_rent_id
4329                    ,p_prd_id => p_period_id);
4330     FETCH periods_out_c BULK COLLECT INTO l_periods_out_t;
4331     CLOSE periods_out_c;
4332 
4333   END IF;
4334 
4335    pnp_debug_pkg.log('set partial flag');
4336   -- Set l_partial_prd_id if 1st partial period exists and proration rule is FY/FLY
4337   IF g_proration_rule IN ( pn_var_rent_calc_pkg.G_PRORUL_FY
4338                           ,pn_var_rent_calc_pkg.G_PRORUL_FLY) THEN
4339      FOR fst_rec IN check_fst_partial_prd(p_var_rent_id) LOOP
4340          l_partial_prd_id:= fst_rec.period_id;
4341      END LOOP;
4342   END IF;
4343 
4344   g_partial_prd_flag := NULL;
4345   pnp_debug_pkg.log('prior to pop inv date tab');
4346   -- call to populate inv_date_tab for roll fwd
4347   -- IF 1st partial period exists then call pop_inv_date_tab_firstyr ,to populate
4348   -- invoice dates from 2nd annual period
4349   -- ELSE call pop_inv_date_tab
4350   IF l_partial_prd_id IS NOT NULL THEN
4351        pn_var_rent_calc_pkg.pop_inv_date_tab_firstyr(p_var_rent_id => p_var_rent_id ,
4352                                                      p_status => 'APPROVED');
4353   ELSE
4354        pn_var_rent_calc_pkg.pop_inv_date_tab(p_var_rent_id => p_var_rent_id ,
4355                                              p_status => 'APPROVED');
4356   END IF;
4357 
4358   /*pnp_debug_pkg.log('data in inv_date_tab');
4359   FOR i IN 1..inv_date_tab.COUNT LOOP
4360     pnp_debug_pkg.log(inv_date_tab(i).inv_date||' '||
4361                       inv_date_tab(i).period_id||' '||
4362                       inv_date_tab(i).inv_flag||'!!');
4363   END LOOP;*/
4364 
4365 
4366   FOR first_period_rec IN first_period_cur (p_var_rent_id)  LOOP
4367      l_first_period_id := first_period_rec.period_id;
4368      l_partial_period  := first_period_rec.partial_period;
4369   END LOOP;
4370 
4371   /* loop for all periods cached and calculate rent */
4372   IF l_periods_t.COUNT > 0 THEN
4373     FOR p IN l_periods_t.FIRST..l_periods_t.LAST --
4374     LOOP
4375        IF(g_invoice_on=G_INV_ON_ACTUAL) OR (g_invoice_on=G_INV_ON_FORECASTED
4376                                          AND g_calc_type= G_CALC_TYPE_RECONCILE)
4377        THEN
4378           l_context := 'Call pn_var_rent_calc_pkg.post_summary';
4379 
4380          /* IF NOT ( g_proration_rule IN ( pn_var_rent_calc_pkg.G_PRORUL_FY
4381                   ,pn_var_rent_calc_pkg.G_PRORUL_FLY)
4382              AND (l_first_period_id = l_periods_t(p).period_id)
4383              AND l_partial_period = 'Y')
4384           THEN*/
4385              pn_var_rent_calc_pkg.post_summary
4386                    ( p_var_rent_id   => p_var_rent_id
4387                    ,p_period_id     => l_periods_t(p).period_id);
4388              pnp_debug_pkg.log(l_context||' COMPLETE');
4389              pnp_debug_pkg.log('');
4390           /*END IF; */
4391 
4392        ELSIF (g_invoice_on=G_INV_ON_FORECASTED AND g_calc_type= G_CALC_TYPE_CALCULATE)
4393        THEN
4394           l_context := 'Call pn_var_rent_calc_pkg.post_summary_for';
4395           pn_var_rent_calc_pkg.post_summary_for
4396                   ( p_var_rent_id   => p_var_rent_id
4397                    ,p_period_id     => l_periods_t(p).period_id);
4398           pnp_debug_pkg.log(l_context||' COMPLETE');
4399           pnp_debug_pkg.log('');
4400 
4401        END IF;/*End invoice type and calc_type*/
4402 
4403        l_context := 'Call pn_var_rent_calc_pkg.insert_invoice';
4404        IF g_invoice_on = G_INV_ON_ACTUAL THEN
4405 
4409              AND l_partial_period = 'Y')
4406           IF NOT ( g_proration_rule IN ( pn_var_rent_calc_pkg.G_PRORUL_FY
4407                   ,pn_var_rent_calc_pkg.G_PRORUL_FLY)
4408              AND (l_first_period_id = l_periods_t(p).period_id)
4410           THEN
4411              pn_var_rent_calc_pkg.insert_invoice
4412                     ( p_var_rent_id   => p_var_rent_id
4413                      ,p_period_id     => l_periods_t(p).period_id);
4414           END IF;
4415 
4416        ELSIF g_invoice_on = G_INV_ON_FORECASTED  THEN
4417           pn_var_rent_calc_pkg.insert_invoice_for
4418                  ( p_var_rent_id   => p_var_rent_id
4419                   ,p_period_id     => l_periods_t(p).period_id);
4420 
4421        END IF;
4422 
4423        pnp_debug_pkg.log(l_context||' COMPLETE');
4424        pnp_debug_pkg.log('');
4425 
4426     END LOOP;/*End loop for all periods*/
4427 
4428     /* Create the invoice for first partial year separately */
4429     IF g_proration_rule IN ( pn_var_rent_calc_pkg.G_PRORUL_FY
4430                         ,pn_var_rent_calc_pkg.G_PRORUL_FLY)
4431        AND g_invoice_on = G_INV_ON_ACTUAL AND l_partial_period = 'Y'
4432     THEN
4433 
4434         /*post_summary_firstyr (p_var_rent_id => p_var_rent_id);*/
4435 
4436         /*pn_var_rent_calc_pkg.*/insert_invoice_firstyr( p_var_rent_id   => p_var_rent_id );
4437     END IF;
4438 
4439   END IF;/*End insert invoice/post summary*/
4440 
4441   --call to roll fwd selections
4442  -- IF partial_prd flag is NOT NULL i.e. there exists a 1st partial period then
4443   -- call ROLL_FWD_PARTIAL_PRD ,INCLUDE_INCREASES_FIRSTYR
4444   -- ELSE call ROLL_FWD_SELECNS
4445 
4446   IF l_partial_prd_id IS NOT NULL THEN
4447     pn_var_rent_calc_pkg.ROLL_FWD_PARTIAL_PRD(p_var_rent_id => p_var_rent_id);
4448     pn_var_rent_calc_pkg.INCLUDE_INCREASES_FIRSTYR(p_var_rent_id => p_var_rent_id);
4449   ELSE
4450     pn_var_rent_calc_pkg.ROLL_FWD_SELECNS(p_var_rent_id => p_var_rent_id);
4451   END IF;
4452 
4453   -- If proration rule = LY,FLY then call separate roll forward for last partial period
4454   IF g_proration_rule IN ( pn_var_rent_calc_pkg.G_PRORUL_LY
4455                           ,pn_var_rent_calc_pkg.G_PRORUL_FLY) THEN
4456     pn_var_rent_calc_pkg.ROLL_FWD_LST_PARTIAL_PRD(p_var_rent_id => p_var_rent_id);
4457   END IF;
4458 
4459   -- Roll forward for including rent increase terms
4460   pn_var_rent_calc_pkg.INCLUDE_INCREASES(p_var_rent_id => p_var_rent_id);
4461   inv_date_tab.delete;
4462   g_partial_prd_flag := NULL; -- clearing the roll fwd flag of 1st partial prd
4463 
4464   --Reset abatements for the periods for which we donot re-calculate
4465   pn_var_rent_calc_pkg.reset_abatements(p_var_rent_id);
4466   pnp_debug_pkg.log('g_calculation_method3:'||g_calculation_method);
4467    IF l_periods_out_t.COUNT > 0 THEN
4468     FOR p IN l_periods_out_t.FIRST..l_periods_out_t.LAST --
4469     --
4470     LOOP
4471       IF (g_calculation_method = 'T') THEN
4472         --Take true up invoices into account
4473         pnp_debug_pkg.log('True up');
4474         pn_var_trueup_pkg.set_trueup_flag('C');
4475         pn_var_trueup_pkg.apply_abatements
4476                     ( p_var_rent_id   => p_var_rent_id
4477                      ,p_period_id     => l_periods_out_t(p).period_id
4478                      ,p_flag => 'RESET');
4479       ELSE
4480         --No need to take trueup invoices into account.
4481         pnp_debug_pkg.log('Not true up');
4482         pn_var_rent_calc_pkg.apply_abatements
4483                     ( p_var_rent_id   => p_var_rent_id
4484                      ,p_period_id     => l_periods_out_t(p).period_id
4485                      ,p_flag => 'RESET');
4486 
4487       END IF;
4488     END LOOP;
4489    END IF;
4490 
4491    --Apply abatements
4492    IF l_periods_t.COUNT > 0 THEN
4493     FOR p IN l_periods_t.FIRST..l_periods_t.LAST --
4494     --
4495     LOOP
4496       IF (g_calculation_method = 'T') THEN
4497         pnp_debug_pkg.log('True up');
4498         NULL;
4499         --Take true up invoices into account
4500         pn_var_trueup_pkg.set_trueup_flag('C');
4501         pn_var_trueup_pkg.apply_abatements
4502                     ( p_var_rent_id   => p_var_rent_id
4503                      ,p_period_id     => l_periods_t(p).period_id
4504                      ,p_flag => 'CALCULATE');
4505       ELSE
4506         pnp_debug_pkg.log('Not true up');
4507         --No need to take trueup invoices into account.
4508         pn_var_rent_calc_pkg.apply_abatements
4509                     ( p_var_rent_id   => p_var_rent_id
4510                      ,p_period_id     => l_periods_t(p).period_id
4511                      ,p_flag => 'CALCULATE');
4512 
4513       END IF;
4514     END LOOP;
4515    END IF;
4516 
4517   /* deletes the draft term for which invoice_date or term template has changed.*/
4518   pn_var_rent_calc_pkg.delete_draft_terms( p_var_rent_id => p_var_rent_id);
4519 
4520   l_context := 'Loop for all cached periods';
4521   pnp_debug_pkg.log(l_context||' COMPLETE');
4522   pnp_debug_pkg.log('');
4523 
4524   /* -------------------------------------------------------------------------- */
4525   /* -------------------------------- CODE END -------------------------------- */
4526   /* -------------------------------------------------------------------------- */
4527 
4531 EXCEPTION
4528   pnp_debug_pkg.log('+++++++++ calculate_rent END +++++++++++');
4529   pnp_debug_pkg.log('');
4530 
4532   WHEN OTHERS THEN
4533     pnp_debug_pkg.log
4534     ('**********************************************************************');
4535     pnp_debug_pkg.log('*** ERROR IN calculate_rent ***');
4536     pnp_debug_pkg.log('*** ERROR WHEN: '||l_context||' ***');
4537     pnp_debug_pkg.log
4538     ('**********************************************************************');
4539     RAISE;
4540 
4541 END calculate_rent;
4542 -------------------------------------------------------------------------------
4543 -----------------------------Procedures for forecasted data--------------------
4544 -------------------------------------------------------------------------------
4545 --------------------------------------------------------------------------------
4546 --  NAME         : insert_invoice_for
4547 --  DESCRIPTION  :
4548 --  PURPOSE      :
4549 --  INVOKED FROM :
4550 --  ARGUMENTS    :
4551 --  REFERENCE    :
4552 --  HISTORY      :
4553 --
4554 --  22.Sep.06  Shabda     o Created
4555 --  5-Mar-07   Shabda     o Bug 5922493. Create invoices only when volumes exist.
4556 --------------------------------------------------------------------------------
4557 /*
4558 This method can only be called when g_invoice_on = Forecasted
4559 There are two options. g_calc_type = CALCULATE/RECONCILE.
4560 If g_calc_type is CALCULATE, we only insert/update the forecasted.
4561 If g_calc_type is RECONCILE, we insert/update both.
4562 */
4563 PROCEDURE insert_invoice_for( p_var_rent_id IN NUMBER
4564                          ,p_period_id   IN NUMBER) IS
4565 
4566   /* get invoice dates for a period */
4567   CURSOR invoice_dates_c( p_vr_id  IN NUMBER
4568                          ,p_prd_id IN NUMBER) IS
4569     SELECT
4570      invoice_date
4571     ,NVL(SUM(tot_act_vol), 0)  AS total_actual_sales
4572     ,NVL(SUM(act_var_rent), 0) AS total_actual_rent
4573     ,NVL(SUM(for_var_rent), 0) AS total_forecasted_rent
4574     FROM
4575     pn_var_rent_summ_all
4576     WHERE
4577     var_rent_id = p_vr_id AND
4578     period_id = p_prd_id
4579     GROUP BY
4580     invoice_date
4581     ORDER BY
4582     invoice_date;
4583 
4584   /* get latest invoice */
4585   CURSOR invoice2upd_c( p_vr_id  IN NUMBER
4586                        ,p_prd_id IN NUMBER
4587                        ,p_inv_dt IN DATE) IS
4588     SELECT
4589      var_rent_inv_id
4590     ,var_rent_id
4591     ,period_id
4592     ,invoice_date
4593     ,forecasted_term_status
4594     ,variance_term_status
4595     ,variance_exp_code
4596     ,forecasted_exp_code
4597     ,adjust_num
4598     ,tot_act_vol
4599     ,act_per_rent
4600     ,for_per_rent
4601     ,actual_invoiced_amount
4602     ,constr_actual_rent
4603     ,rec_abatement_override
4604     FROM
4605     pn_var_rent_inv_all
4606     WHERE
4607     var_rent_id = p_vr_id AND
4608     period_id = p_prd_id AND
4609     invoice_date = p_inv_dt
4610     AND
4611     NVL(true_up_amt, 0) = 0 AND
4612     true_up_status IS NULL AND
4613     true_up_exp_code IS NULL
4614     ORDER BY adjust_num DESC;
4615 
4616   /* get latest invoice */
4617   CURSOR prev_invoiced_c( p_vr_id  IN NUMBER
4618                          ,p_prd_id IN NUMBER
4619                          ,p_inv_dt IN DATE) IS
4620     SELECT
4621     NVL(SUM(actual_invoiced_amount), 0) AS prev_invoiced_amt
4622     FROM
4623     pn_var_rent_inv_all
4624     WHERE
4625     var_rent_id = p_vr_id AND
4626     period_id = p_prd_id AND
4627     invoice_date = p_inv_dt AND
4628     variance_exp_code = 'Y'
4629     AND
4630     NVL(true_up_amt, 0) = 0 AND
4631     true_up_status IS NULL AND
4632     true_up_exp_code IS NULL;
4633 
4634    CURSOR vol_exists_c(ip_var_rent_id NUMBER,
4635                       ip_invoice_date DATE
4636             ) IS
4637       SELECT 1 as vol_exists
4638       FROM DUAL
4639       WHERE exists(
4640       SELECT vol_hist_id
4641       FROM pn_var_vol_hist_all
4642       WHERE grp_date_id in(
4643       SELECT grp_date_id
4644       FROM pn_var_grp_dates_all
4645       WHERE var_rent_id = ip_var_rent_id
4646       AND invoice_date = ip_invoice_date));
4647 
4648   l_invoice_on          VARCHAR2(30);
4649   l_calc_type           VARCHAR2(30);
4650   l_row_id              ROWID;
4651   l_var_rent_inv_id     NUMBER;
4652   l_max_adjust_num      NUMBER;
4653   l_prev_inv_rent       NUMBER;
4654   l_curr_inv_rent       NUMBER;
4655   l_curr_inv_rent_for       NUMBER;
4656   l_actual_invoiced_amount  NUMBER;
4657   l_constr_rent         NUMBER;
4658   l_prev_inv_exp_rent   NUMBER;
4659   l_constr_prev_rent    NUMBER;
4660   l_rec_abatement_override NUMBER;
4661 
4662   /* get ORG ID */
4663   CURSOR org_c(p_vr_id IN NUMBER) IS
4664     SELECT org_id
4665       FROM pn_var_rents_all
4666      WHERE var_rent_id = p_vr_id;
4667 
4668   l_org_id NUMBER;
4669   l_precision NUMBER;
4670   l_exists_invoice BOOLEAN;
4671 
4672 BEGIN
4673 
4674   pnp_debug_pkg.log('+++++++++ insert_invoice_for START +++++++++++');
4675 
4676   FOR vr_rec IN org_c(p_vr_id => p_var_rent_id) LOOP
4680   l_precision := nvl(pn_var_rent_calc_pkg.get_currency_precision(l_org_id),4);
4677     l_org_id := vr_rec.org_id;
4678   END LOOP;
4679 
4681   pnp_debug_pkg.log('l_precision:'||l_precision);
4682 
4683   l_calc_type := g_calc_type;
4684   pnp_debug_pkg.log('calc_type:'|| l_calc_type);
4685 
4686   /* loop for all invoice dates in the period */
4687   FOR inv_rec IN invoice_dates_c( p_vr_id  => p_var_rent_id
4688                                  ,p_prd_id => p_period_id)
4689   LOOP
4690   IF l_calc_type = G_CALC_TYPE_CALCULATE  THEN
4691     /*Three cases exist here.
4692     1. No invoice exist. We insert a invoice with forecasted rents.
4693     2. Invoice exists and has not been exported. Update the forecasted calculated rent.
4694     3. Invoice exists and has been exported. Do not update anything.
4695     */
4696     l_row_id              := NULL;
4697     l_var_rent_inv_id     := NULL;
4698     l_curr_inv_rent_for   := 0;
4699     l_exists_invoice      := FALSE;
4700 
4701     /* check if there exists an invoice for this invoice date */
4702     FOR inv2upd_rec IN invoice2upd_c( p_vr_id  => p_var_rent_id
4703                                      ,p_prd_id => p_period_id
4704                                      ,p_inv_dt => inv_rec.invoice_date)
4705     LOOP
4706 
4707       /* invoice exists - we only look at the last invoice */
4708       l_exists_invoice := TRUE;
4709       l_rec_abatement_override := inv2upd_rec.rec_abatement_override;
4710       /* invoice updateable? */
4711       IF NVL(inv2upd_rec.forecasted_exp_code, 'N') <> 'Y' THEN
4712 
4713         /* updateable */
4714         l_var_rent_inv_id := inv2upd_rec.var_rent_inv_id;
4715         l_curr_inv_rent_for   := inv2upd_rec.for_per_rent;
4716 
4717       ELSIF NVL(inv2upd_rec.forecasted_exp_code, 'N') = 'Y' THEN
4718 
4719         /* NON - updateable */
4720         l_var_rent_inv_id := NULL;
4721 
4722       END IF; /* invoice updateable? */
4723 
4724       /* we only look at the last invoice */
4725       EXIT;
4726 
4727     END LOOP; /* check if there exists an invoice for this invoice date */
4728     pnp_debug_pkg.log('l_var_rent_inv_id:' || l_var_rent_inv_id);
4729 
4730     /* atleast one invoice exists? */
4731     IF NOT l_exists_invoice
4732        /*AND inv_rec.total_actual_rent <> 0*/ THEN
4733 
4734       /* not sure abt this part
4735          uncomment the AND inv_rec.total_actual_rent <> 0
4736          part if we do not want to create $0 invoices
4737       */
4738 
4739       /* first time for this invoice date - create invoice */
4740       /*We are invoicing on forecasted, so when first time invoice is created, all actuals must be null*/
4741 
4742 
4743       /*We only want to create invoices if volumes exist for these invoices.*/
4744       FOR vol_exists_rec IN vol_exists_c( p_var_rent_id,
4745                                           inv_rec.invoice_date
4746                                           )  LOOP
4747 
4748          pnp_debug_pkg.log('inv_rec.total_forecasted_rent'||inv_rec.total_forecasted_rent);
4749          pn_var_rent_inv_pkg.insert_row
4750          ( x_rowid                   => l_row_id,
4751            x_var_rent_inv_id         => l_var_rent_inv_id,
4752            x_adjust_num              => 0,
4753            x_invoice_date            => inv_rec.invoice_date,
4754            x_for_per_rent            => inv_rec.total_forecasted_rent,
4755            x_tot_act_vol             => NULL,
4756            x_act_per_rent            => NULL,
4757            x_constr_actual_rent      => NULL,
4758            x_abatement_appl          => 0,
4759            x_rec_abatement           => NULL,
4760            x_rec_abatement_override  => l_rec_abatement_override,
4761            x_negative_rent           => 0,
4762            x_actual_invoiced_amount  => NULL,
4763            x_period_id               => p_period_id,
4764            x_var_rent_id             => p_var_rent_id,
4765            x_forecasted_term_status  => 'N',
4766            x_variance_term_status    => 'N',
4767            x_actual_term_status      => 'N',
4768            x_forecasted_exp_code     => 'N',
4769            x_variance_exp_code       => 'N',
4770            x_actual_exp_code         => 'N',
4771            x_comments                => 'created invoice',
4772            x_attribute_category      => NULL,
4773            x_attribute1              => NULL,
4774            x_attribute2              => NULL,
4775            x_attribute3              => NULL,
4776            x_attribute4              => NULL,
4777            x_attribute5              => NULL,
4778            x_attribute6              => NULL,
4779            x_attribute7              => NULL,
4780            x_attribute8              => NULL,
4781            x_attribute9              => NULL,
4782            x_attribute10             => NULL,
4783            x_attribute11             => NULL,
4784            x_attribute12             => NULL,
4785            x_attribute13             => NULL,
4786            x_attribute14             => NULL,
4787            x_attribute15             => NULL,
4788            x_creation_date           => SYSDATE,
4789            x_created_by              => NVL(fnd_global.user_id,0),
4790            x_last_update_date        => SYSDATE,
4791            x_last_updated_by         => NVL(fnd_global.user_id,0),
4792            x_last_update_login       => NVL(fnd_global.login_id,0),
4796 
4793            x_org_id                  => l_org_id );
4794 
4795       END LOOP;
4797 
4798     ELSIF l_exists_invoice THEN
4799 
4800       /* invoice has been created here in the past */
4801 
4802       /* no invoice to update - We have already created a forcasted invoice and exported it. */
4803       IF l_var_rent_inv_id IS NULL THEN
4804         NULL;
4805 
4806       ELSIF l_var_rent_inv_id IS NOT NULL THEN
4807 
4808         /* if there a change in rent */
4809         IF (inv_rec.total_forecasted_rent) <> l_curr_inv_rent_for
4810         THEN
4811 
4812           DELETE
4813           pn_payment_terms_all
4814           WHERE
4815           var_rent_inv_id = l_var_rent_inv_id AND
4816           status <> pn_var_rent_calc_pkg.G_TERM_STATUS_APPROVED AND
4817           var_rent_type = pn_var_rent_calc_pkg.G_INV_ON_FORECASTED;
4818 
4819           /* update the invoice */
4820           /*Since forcasted rents are not yet exported, we can update them.*/
4821           UPDATE
4822           pn_var_rent_inv_all
4823           SET
4824            for_per_rent           = ROUND(inv_rec.total_forecasted_rent, g_precision)
4825           ,forecasted_term_status = 'N'
4826           ,credit_flag            = 'N'  -- bug # 5937807
4827           ,last_update_date       = SYSDATE
4828           ,last_updated_by        = NVL(fnd_global.user_id,0)
4829           ,last_update_login      = NVL(fnd_global.login_id,0)
4830           WHERE
4831           var_rent_inv_id = l_var_rent_inv_id;
4832 
4833         END IF; /* if there a change in rent */
4834 
4835       END IF; /* IF l_var_rent_inv_id IS NULL THEN */
4836 
4837     END IF; /* IF NOT l_exists_invoice THEN */
4838 
4839     /*END l_calc_type = G_CALC_TYPE_CALCULATE*/
4840 
4841   ELSIF l_calc_type = G_CALC_TYPE_RECONCILE THEN
4842   /*We can only be reconciling if an invoice already exists*/
4843     l_row_id              := NULL;
4844     l_var_rent_inv_id     := -1;
4845     l_max_adjust_num      := 0;
4846     l_prev_inv_rent       := 0;
4847     l_curr_inv_rent       := 0;
4848     l_curr_inv_rent_for   := 0;
4849 
4850     pnp_debug_pkg.log('inv_rec.invoice_date'||inv_rec.invoice_date);
4851     pnp_debug_pkg.log('inv_rec.total_actual_rent:'||inv_rec.total_actual_rent);
4852     /* check if there exists an invoice for this invoice date */
4853     FOR inv2upd_rec IN invoice2upd_c( p_vr_id  => p_var_rent_id
4854                                      ,p_prd_id => p_period_id
4855                                      ,p_inv_dt => inv_rec.invoice_date)
4856 
4857     LOOP
4858        l_constr_prev_rent := inv2upd_rec.constr_actual_rent;
4859        l_prev_inv_rent := inv2upd_rec.act_per_rent;
4860       /* invoice updateable? */
4861       IF NVL(inv2upd_rec.variance_exp_code, 'N') <> 'Y' THEN
4862 
4863         /* updateable */
4864         l_var_rent_inv_id := inv2upd_rec.var_rent_inv_id;
4865         l_max_adjust_num  := inv2upd_rec.adjust_num;
4866         l_curr_inv_rent   := inv2upd_rec.actual_invoiced_amount;
4867         l_curr_inv_rent_for   := inv2upd_rec.for_per_rent;
4868 
4869       ELSIF NVL(inv2upd_rec.variance_exp_code, 'N') = 'Y' THEN
4870 
4871         /* NON - updateable */
4872         l_var_rent_inv_id := NULL;
4873         l_max_adjust_num  := inv2upd_rec.adjust_num + 1;
4874         l_curr_inv_rent   := 0;
4875         l_curr_inv_rent_for   := inv2upd_rec.for_per_rent;
4876 
4877       END IF; /* invoice updateable? */
4878       pnp_debug_pkg.log('inv2upd_rec.variance_exp_code:'||inv2upd_rec.variance_exp_code);
4879       pnp_debug_pkg.log('l_var_rent_inv_id:'||l_var_rent_inv_id);
4880       /* we only look at the last invoice */
4881       EXIT;
4882 
4883     END LOOP; /* check if there exists an invoice for this invoice date */
4884 
4885       /*Only if we are reconciling, do we need to update the last row or insert an adjustment.*/
4886 
4887       /* invoice has been created here in the past */
4888 
4889 
4890       /* get the previously billed amount from approved invoices */
4891       FOR prev_inv_rec IN prev_invoiced_c( p_vr_id  => p_var_rent_id
4892                                           ,p_prd_id => p_period_id
4893                                           ,p_inv_dt => inv_rec.invoice_date)
4894       LOOP
4895         l_prev_inv_exp_rent := prev_inv_rec.prev_invoiced_amt;
4896       END LOOP;
4897 
4898       l_constr_rent := pn_var_rent_calc_pkg.apply_constraints(
4899                                  p_period_id => p_period_id,
4900                                  p_invoice_date => inv_rec.invoice_date,
4901                                  p_actual_rent => inv_rec.total_actual_rent);
4902                                  --TODO.......
4903 
4904       /* no invoice to update - create a new one */
4905       IF l_var_rent_inv_id IS NULL THEN
4906 
4907         /* if there a change in rent */
4908         IF round(inv_rec.total_actual_rent, l_precision) <> round(l_prev_inv_rent, l_precision)
4909            OR round(l_constr_rent, l_precision) <> round(l_constr_prev_rent, l_precision)
4910         THEN
4911 
4912           /* create new invoice for difference amt */
4913           /* Forecasted rent is not updated in invoices. So always set it to prev invoiced forcasted ammount*/
4914           pn_var_rent_inv_pkg.insert_row
4915           ( x_rowid                   => l_row_id,
4919             x_for_per_rent            => l_curr_inv_rent_for,
4916             x_var_rent_inv_id         => l_var_rent_inv_id,
4917             x_adjust_num              => l_max_adjust_num,
4918             x_invoice_date            => inv_rec.invoice_date,
4920             x_tot_act_vol             => inv_rec.total_actual_sales,
4921             x_act_per_rent            => inv_rec.total_actual_rent,
4922             x_constr_actual_rent      => l_constr_rent,
4923             x_abatement_appl          => 0,
4924             x_rec_abatement           => NULL,
4925             x_rec_abatement_override  => l_rec_abatement_override,
4926             x_negative_rent           => 0,
4927             x_actual_invoiced_amount  => (l_constr_rent - l_prev_inv_exp_rent),
4928             x_period_id               => p_period_id,
4929             x_var_rent_id             => p_var_rent_id,
4930             x_forecasted_term_status  => 'N',
4931             x_variance_term_status    => 'N',
4932             x_actual_term_status      => 'N',
4933             x_forecasted_exp_code     => 'N',
4934             x_variance_exp_code       => 'N',
4935             x_actual_exp_code         => 'N',
4936             x_comments                => 'created invoice',
4937             x_attribute_category      => NULL,
4938             x_attribute1              => NULL,
4939             x_attribute2              => NULL,
4940             x_attribute3              => NULL,
4941             x_attribute4              => NULL,
4942             x_attribute5              => NULL,
4943             x_attribute6              => NULL,
4944             x_attribute7              => NULL,
4945             x_attribute8              => NULL,
4946             x_attribute9              => NULL,
4947             x_attribute10             => NULL,
4948             x_attribute11             => NULL,
4949             x_attribute12             => NULL,
4950             x_attribute13             => NULL,
4951             x_attribute14             => NULL,
4952             x_attribute15             => NULL,
4953             x_creation_date           => SYSDATE,
4954             x_created_by              => NVL(fnd_global.user_id,0),
4955             x_last_update_date        => SYSDATE,
4956             x_last_updated_by         => NVL(fnd_global.user_id,0),
4957             x_last_update_login       => NVL(fnd_global.login_id,0),
4958             x_org_id                  => l_org_id );
4959 
4960         END IF; /* IF inv_rec.total_actual_rent <> l_prev_inv_rent THEN */
4961 
4962       ELSIF l_var_rent_inv_id IS NOT NULL AND l_var_rent_inv_id <> -1 THEN
4963 
4964           DELETE
4965           pn_payment_terms_all
4966           WHERE
4967           var_rent_inv_id = l_var_rent_inv_id AND
4968           status <> pn_var_rent_calc_pkg.G_TERM_STATUS_APPROVED AND
4969           var_rent_type = pn_var_rent_calc_pkg.G_INV_ON_FORECASTED;
4970 
4971           /* update the invoice */
4972           UPDATE
4973           pn_var_rent_inv_all
4974           SET
4975            act_per_rent           = ROUND(inv_rec.total_actual_rent, g_precision)
4976           ,constr_actual_rent     = ROUND(l_constr_rent, g_precision)
4977           ,actual_invoiced_amount = ROUND((l_constr_rent - l_prev_inv_exp_rent), g_precision)
4978           ,tot_act_vol            = ROUND(inv_rec.total_actual_sales, g_precision)  -- bug # 6007571
4979           ,credit_flag            = 'N'     -- bug # 5937807
4980           ,variance_term_status   = 'N'
4981           ,last_update_date       = SYSDATE
4982           ,last_updated_by        = NVL(fnd_global.user_id,0)
4983           ,last_update_login      = NVL(fnd_global.login_id,0)
4984           WHERE
4985           var_rent_inv_id = l_var_rent_inv_id;
4986 
4987 
4988       END IF; /* IF l_var_rent_inv_id IS NULL THEN */
4989     /*END reconcile*/
4990 
4991   END IF;
4992 
4993 
4994 
4995 
4996   END LOOP; /* loop for all invoice dates in the period */
4997 
4998   pnp_debug_pkg.log('+++++++++ insert_invoice_for END +++++++++++');
4999 
5000 EXCEPTION
5001   WHEN OTHERS THEN RAISE;
5002 
5003 END insert_invoice_for;
5004 
5005 
5006 --------------------------------------------------------------------------------
5007 --  NAME         : get_rent_applicable_for
5008 --  DESCRIPTION  :
5009 --  PURPOSE      :
5010 --  INVOKED FROM :
5011 --  ARGUMENTS    :
5012 --  REFERENCE    :
5013 --  HISTORY      :
5014 --
5015 --  18.Sep.06  Shabda     o Created
5016 --------------------------------------------------------------------------------
5017 PROCEDURE get_rent_applicable_for
5018 (p_trx_hdr_rec IN OUT NOCOPY pn_var_rent_calc_pkg.trx_hdr_for_c%ROWTYPE)
5019 IS
5020 
5021   /* cache trx hdr passed */
5022   l_trx_hdr_rec pn_var_rent_calc_pkg.trx_hdr_for_c%ROWTYPE;
5023 
5024   /* get bkpt type */
5025   CURSOR bkpt_type_c(p_bkdt_id IN NUMBER) IS
5026     SELECT
5027      bkhd.bkpt_header_id
5028     ,bkhd.breakpoint_type
5029     FROM
5030      pn_var_bkpts_head_all bkhd
5031     ,pn_var_bkpts_det_all  bkdt
5032      WHERE
5033     bkdt.bkpt_detail_id = p_bkdt_id AND
5034     bkdt.bkpt_header_id = bkhd.bkpt_header_id;
5035 
5036   l_bkpt_type VARCHAR2(30);
5037 
5038   l_bkpts_t TRX_DTL_TBL;
5039 
5040   l_net_volume NUMBER;
5041   l_bkpt_start NUMBER;
5045 
5042   l_bkpt_end   NUMBER;
5043   l_calc_rent  NUMBER;
5044 
5046   /* get calc freq */
5047   CURSOR calc_freq_c(p_vr_id IN NUMBER) IS
5048     SELECT
5049     reptg_freq_code AS report_freq_code
5050     FROM
5051     pn_var_rent_dates_all
5052     WHERE
5053     var_rent_id = p_vr_id;
5054 
5055    /* get the number of periods */
5056   CURSOR period_num_c ( p_vr_id IN NUMBER) IS
5057     SELECT
5058     count(period_id) perion_num
5059     FROM
5060     pn_var_periods_all
5061     WHERE
5062     var_rent_id = p_vr_id AND
5063     NVL(status, 'A') <> pn_var_rent_calc_pkg.G_PERIOD_REVERSED_STATUS;
5064 
5065   /* get the last partial period */
5066   CURSOR last_period_c( p_vr_id     IN NUMBER) IS
5067     SELECT
5068      prd.period_id
5069     ,prd.partial_period
5070     FROM
5071     pn_var_periods_all prd,
5072     pn_var_rents_all   var
5073     WHERE
5074     prd.var_rent_id = p_vr_id AND
5075     prd.var_rent_id = var.var_rent_id AND
5076     prd.end_date = var.termination_date;
5077 
5078   /* get the first partial period */
5079   CURSOR first_period_c( p_vr_id     IN NUMBER) IS
5080     SELECT
5081      prd.period_id
5082     ,prd.partial_period
5083     FROM
5084     pn_var_periods_all prd,
5085     pn_var_rents_all   var
5086     WHERE
5087     prd.var_rent_id = p_vr_id AND
5088     prd.var_rent_id = var.var_rent_id AND
5089     prd.start_date = var.commencement_date;
5090 
5091   l_prorat_factor_sum NUMBER;
5092 
5093   l_prev_billed NUMBER;
5094 
5095   l_context VARCHAR2(255);
5096 
5097   l_first_partial VARCHAR2(1);
5098   l_last_partial  VARCHAR2(1);
5099   l_period_num    NUMBER  := 0;
5100 
5101 BEGIN
5102   pnp_debug_pkg.log('++++++ Start get_rent_applicable ++++++');
5103   pnp_debug_pkg.log('p_trx_hdr_rec.invoice_flag:'||p_trx_hdr_rec.invoice_flag);
5104   IF NVL(p_trx_hdr_rec.invoice_flag, 'Y') = 'N' THEN
5105     RETURN;
5106   END IF;
5107 
5108   /* cache the trx header rec passed in */
5109   l_trx_hdr_rec := p_trx_hdr_rec;
5110 
5111   /* if VR details are not availabe at the package level, cache it */
5112   IF g_proration_rule IS NULL OR
5113      g_calculation_method IS NULL OR
5114      g_negative_rent IS NULL
5115   THEN
5116 
5117     /* cache VR details */
5118     pn_var_rent_calc_pkg.cache_vr_details
5119       (p_var_rent_id => l_trx_hdr_rec.var_rent_id);
5120 
5121   END IF;
5122 
5123   /* cache bkpt details */
5124   l_bkpts_t.DELETE;
5125 
5126   OPEN pn_var_rent_calc_pkg.trx_dtl_c(p_hdr_id => p_trx_hdr_rec.trx_header_id);
5127   FETCH pn_var_rent_calc_pkg.trx_dtl_c BULK COLLECT INTO l_bkpts_t;
5128   CLOSE pn_var_rent_calc_pkg.trx_dtl_c;
5129 
5130   /* get the breakpoint type - flat, sliding, stratified */
5131   FOR rec IN bkpt_type_c(p_bkdt_id => l_bkpts_t(1).bkpt_detail_id)
5132   LOOP
5133     pnp_debug_pkg.log('Breakpoint Type:'||rec.breakpoint_type);
5134     l_bkpt_type := rec.breakpoint_type;
5135   END LOOP;
5136 
5137   IF g_calculation_method IN ( pn_var_rent_calc_pkg.G_CALC_NON_CUMULATIVE
5138                               ,pn_var_rent_calc_pkg.G_CALC_TRUE_UP)
5139   THEN
5140     l_net_volume := l_trx_hdr_rec.prorated_group_sales_for;
5141 
5142   ELSIF g_calculation_method IN ( pn_var_rent_calc_pkg.G_CALC_CUMULATIVE
5143                                  ,pn_var_rent_calc_pkg.G_CALC_YTD)
5144   THEN
5145     l_net_volume := l_trx_hdr_rec.ytd_sales_for;
5146 
5147   END IF;
5148   pnp_debug_pkg.log('l_net_volume'||l_net_volume);
5149   /* handling the case of volume not tripping any bkpts */
5150     /* init the calculated rent to 0 - it will be re-calculated */
5151   l_trx_hdr_rec.calculated_rent_for := 0;
5152   IF g_calculation_method IN ( pn_var_rent_calc_pkg.G_CALC_NON_CUMULATIVE
5153                               ,pn_var_rent_calc_pkg.G_CALC_TRUE_UP)
5154      AND
5155      (l_net_volume < l_bkpts_t(1).prorated_grp_vol_start)
5156 
5157   THEN
5158 
5159     /* this is the functionality that exists today
5160        does not exist in Macerich code
5161        Once no breakpoints are tripped, Macerich consider the rent to be = 0 */
5162     /*
5163     l_trx_hdr_rec.calculated_rent
5164     := (l_net_volume - l_bkpts_t(1).pr_grp_blended_vol_start)
5165        * l_bkpts_t(1).bkpt_rate;
5166     */
5167     pnp_debug_pkg.log('Volume doesnot trip breakpoints');
5168     l_trx_hdr_rec.calculated_rent_for := 0;
5169 
5170   ELSE
5171 
5172     /* --------------------- GET calculated_rent START --------------------- */
5173     /* get l_trx_hdr_rec.calculated_rent - CALCULATED RENT */
5174 
5175     IF l_bkpt_type = pn_var_rent_calc_pkg.G_BKPT_TYP_STRATIFIED
5176     THEN
5177 
5178       l_trx_hdr_rec.calculated_rent_for := 0;
5179 
5180       /* loop for all bkpt details */
5181       FOR i IN l_bkpts_t.FIRST..l_bkpts_t.LAST LOOP
5182 
5183         IF g_calculation_method IN ( pn_var_rent_calc_pkg.G_CALC_NON_CUMULATIVE
5184                                     ,pn_var_rent_calc_pkg.G_CALC_TRUE_UP)
5185         THEN
5186 
5187             l_bkpt_start := l_bkpts_t(i).prorated_grp_vol_start;
5188             l_bkpt_end   := l_bkpts_t(i).prorated_grp_vol_end;
5189 
5190 
5191         ELSIF g_calculation_method = pn_var_rent_calc_pkg.G_CALC_CUMULATIVE
5192         THEN
5196             l_bkpt_end   := l_bkpts_t(i).prorated_grp_vol_end;
5193           IF g_proration_rule = pn_var_rent_calc_pkg.G_PRORUL_NP THEN
5194 
5195             l_bkpt_start := l_bkpts_t(i).prorated_grp_vol_start;
5197 
5198           ELSE
5199 
5200                 l_bkpt_start := l_bkpts_t(i).blended_period_vol_start;
5201                 l_bkpt_end   := l_bkpts_t(i).blended_period_vol_end;
5202 
5203           END IF;
5204 
5205         ELSIF g_calculation_method = pn_var_rent_calc_pkg.G_CALC_YTD
5206         THEN
5207 
5208           l_bkpt_start := l_bkpts_t(i).ytd_group_vol_start;
5209           l_bkpt_end   := l_bkpts_t(i).ytd_group_vol_end;
5210 
5211         END IF; /* g_calculation_method */
5212 
5213         IF l_bkpt_end IS NULL OR l_bkpt_end = 0 THEN
5214           l_bkpt_end := NULL;
5215         END IF;
5216 
5217         IF l_net_volume >= l_bkpt_start THEN
5218 
5219           IF l_net_volume <= NVL(l_bkpt_end, l_net_volume) THEN
5220 
5221             l_trx_hdr_rec.calculated_rent_for
5222             := l_trx_hdr_rec.calculated_rent_for
5223                + (l_net_volume - l_bkpt_start) * l_bkpts_t(i).bkpt_rate;
5224 
5225           ELSIF l_net_volume > l_bkpt_end THEN
5226 
5227             l_trx_hdr_rec.calculated_rent_for
5228             := l_trx_hdr_rec.calculated_rent_for
5229                + (l_bkpt_end - l_bkpt_start) * l_bkpts_t(i).bkpt_rate;
5230              pnp_debug_pkg.log('rent:'||l_trx_hdr_rec.calculated_rent_for);
5231 
5232           END IF;
5233 
5234         ELSE
5235 
5236           EXIT;
5237 
5238         END IF; /* net vol > bkpt start */
5239 
5240       END LOOP; /* loop for all bkpt details */
5241 
5242     ELSIF l_bkpt_type IN ( pn_var_rent_calc_pkg.G_BKPT_TYP_FLAT
5243                           ,pn_var_rent_calc_pkg.G_BKPT_TYP_SLIDING)
5244     THEN
5245 
5246       FOR i IN l_bkpts_t.FIRST..l_bkpts_t.LAST LOOP
5247 
5248         IF g_calculation_method IN ( pn_var_rent_calc_pkg.G_CALC_NON_CUMULATIVE
5249                                     ,pn_var_rent_calc_pkg.G_CALC_TRUE_UP)
5250         THEN
5251 
5252             l_bkpt_start := l_bkpts_t(i).prorated_grp_vol_start;
5253             l_bkpt_end   := l_bkpts_t(i).prorated_grp_vol_end;
5254 
5255 
5256         ELSIF g_calculation_method = pn_var_rent_calc_pkg.G_CALC_CUMULATIVE
5257         THEN
5258 
5259           IF g_proration_rule = pn_var_rent_calc_pkg.G_PRORUL_NP THEN
5260 
5261             l_bkpt_start := l_bkpts_t(i).prorated_grp_vol_start;
5262             l_bkpt_end   := l_bkpts_t(i).prorated_grp_vol_end;
5263 
5264           ELSE
5265 
5266           l_bkpt_start := l_bkpts_t(i).blended_period_vol_start;
5267           l_bkpt_end   := l_bkpts_t(i).blended_period_vol_end;
5268 
5269           END IF;
5270 
5271         ELSIF g_calculation_method = pn_var_rent_calc_pkg.G_CALC_YTD
5272         THEN
5273 
5274           l_bkpt_start := l_bkpts_t(i).ytd_group_vol_start;
5275           l_bkpt_end   := l_bkpts_t(i).ytd_group_vol_end;
5276 
5277         END IF; /* g_calculation_method */
5278 
5279         IF l_bkpt_end IS NULL OR l_bkpt_end = 0 THEN
5280           l_bkpt_end := NULL;
5281         END IF;
5282 
5283         IF l_net_volume >= l_bkpt_start AND
5284            l_net_volume <= NVL(l_bkpt_end, l_net_volume)
5285         THEN
5286 
5287           IF l_bkpt_type = pn_var_rent_calc_pkg.G_BKPT_TYP_SLIDING THEN
5288 
5289             l_trx_hdr_rec.calculated_rent_for
5290             := l_net_volume * l_bkpts_t(i).bkpt_rate;
5291 
5292           ELSIF l_bkpt_type = pn_var_rent_calc_pkg.G_BKPT_TYP_FLAT THEN
5293 
5294             l_trx_hdr_rec.calculated_rent_for
5295             := (l_net_volume - l_bkpt_start) * l_bkpts_t(i).bkpt_rate;
5296           pnp_debug_pkg.log('calculated_rent_for:'||l_trx_hdr_rec.calculated_rent_for);
5297           END IF;
5298           EXIT;
5299 
5300         END IF;
5301 
5302       END LOOP;
5303 
5304     END IF; /* breakpoint type */
5305 
5306     /* ---------------------- GET calculated_rent END ---------------------- */
5307 
5308     /* at this point, we have the calculated rent
5309        need to find
5310        - percent rent due for
5311        - ytd percent rent for */
5312 
5313 
5314     /* ------------ GET percent_rent_due for, ytd_percent_rent_for START ------------ */
5315 
5316 
5317     l_prev_billed
5318           := pn_var_rent_calc_pkg.find_prev_billed_for
5319               ( p_var_rent_id      => l_trx_hdr_rec.var_rent_id
5320                ,p_period_id        => l_trx_hdr_rec.period_id
5321                ,p_line_item_id     => l_trx_hdr_rec.line_item_id
5322                ,p_calc_prd_st_dt   => l_trx_hdr_rec.calc_prd_start_date
5323                ,p_calc_prd_end_dt  => l_trx_hdr_rec.calc_prd_end_date
5324                ,p_reset_grp_id     => l_trx_hdr_rec.reset_group_id);
5325 
5326 
5327     IF g_calculation_method IN ( pn_var_rent_calc_pkg.G_CALC_NON_CUMULATIVE
5328                                 ,pn_var_rent_calc_pkg.G_CALC_TRUE_UP)
5329     THEN
5330 
5331       l_trx_hdr_rec.ytd_percent_rent_for := l_prev_billed + l_trx_hdr_rec.percent_rent_due_for;
5332       l_trx_hdr_rec.percent_rent_due_for := l_trx_hdr_rec.calculated_rent_for;
5333 
5334     ELSIF g_calculation_method IN ( pn_var_rent_calc_pkg.G_CALC_CUMULATIVE
5338         l_trx_hdr_rec.percent_rent_due_for
5335                                    ,pn_var_rent_calc_pkg.G_CALC_YTD)
5336     THEN
5337 
5339           := l_trx_hdr_rec.calculated_rent_for - l_prev_billed;
5340 
5341       /* need to
5342          - apply constraints on l_trx_hdr_rec.percent_rent_due
5343          - update l_trx_hdr_rec.percent_rent_due
5344          - then get the YTD
5345       */
5346       l_trx_hdr_rec.ytd_percent_rent_for
5347         := l_prev_billed + l_trx_hdr_rec.percent_rent_due_for;
5348     END IF;
5349 
5350       FOR period_num_rec IN period_num_c (p_vr_id => l_trx_hdr_rec.var_rent_id)
5351   LOOP
5352 
5353     l_period_num := period_num_rec.perion_num;
5354 
5355   END LOOP;
5356 
5357   FOR last_period_rec IN last_period_c (p_vr_id => l_trx_hdr_rec.var_rent_id)
5358   LOOP
5359 
5360     l_last_partial := last_period_rec.partial_period;
5361 
5362   END LOOP;
5363 
5364   FOR first_period_rec IN first_period_c (p_vr_id => l_trx_hdr_rec.var_rent_id)
5365   LOOP
5366 
5367     l_first_partial := first_period_rec.partial_period;
5368 
5369   END LOOP;
5370 
5371   /* IMP: This condition is to nullify the rents for a special case.
5372      The case is for First-LAst year, when we have just 2 periods and
5373      first year and last year period is partial, in such a case we dont
5374      want to calculate the rent.
5375   IF g_proration_rule IN (pn_var_rent_calc_pkg.G_PRORUL_FLY) AND
5376      l_period_num = 2 AND l_first_partial = 'Y' AND
5377      l_last_partial = 'Y'
5378   THEN
5379     l_trx_hdr_rec.percent_rent_due_for := 0;
5380     l_trx_hdr_rec.ytd_percent_rent_for := 0;
5381     l_trx_hdr_rec.calculated_rent_for  := 0;
5382   END IF;   */
5383 
5384 
5385   pnp_debug_pkg.log(' ');
5386   pnp_debug_pkg.log(' calculation_method: '||g_calculation_method);
5387   pnp_debug_pkg.log(' percent_rent_due: '||l_trx_hdr_rec.percent_rent_due_for);
5388   pnp_debug_pkg.log(' ytd_percent_rent: '||l_trx_hdr_rec.ytd_percent_rent_for);
5389   pnp_debug_pkg.log(' ');
5390 
5391 
5392     /* ------------- GET percent_rent_due, ytd_percent_rent END ------------- */
5393 
5394   END IF; /* volume trips breakpoint?? */
5395   pnp_debug_pkg.log('percent_rent_due_for:'||l_trx_hdr_rec.percent_rent_due_for);
5396   pnp_debug_pkg.log('ytd_rent_for:'||l_trx_hdr_rec.ytd_percent_rent_for);
5397   l_trx_hdr_rec.update_flag := 'Y';
5398   p_trx_hdr_rec := l_trx_hdr_rec;
5399   pnp_debug_pkg.log('------------end get_rent_applicable---------');
5400 
5401 EXCEPTION
5402   WHEN OTHERS THEN RAISE;
5403 
5404 END get_rent_applicable_for;
5405 
5406 --------------------------------------------------------------------------------
5407 --  NAME         : find_prev_billed_for
5408 --  DESCRIPTION  :
5409 --  PURPOSE      :
5410 --  INVOKED FROM :
5411 --  ARGUMENTS    :
5412 --  REFERENCE    :
5413 --  HISTORY      :
5414 --
5415 --  18.Sep.06  Shabda     o Created
5416 --------------------------------------------------------------------------------
5417 FUNCTION find_prev_billed_for( p_var_rent_id      IN NUMBER
5418                               ,p_period_id        IN NUMBER
5419                               ,p_line_item_id     IN NUMBER
5420                               ,p_calc_prd_st_dt   IN DATE
5421                               ,p_calc_prd_end_dt  IN DATE
5422                               ,p_reset_grp_id     IN NUMBER)
5423 RETURN NUMBER IS
5424 
5425   /* get previous billed */
5426   CURSOR prev_billed_for_c( p_vr_id      IN NUMBER
5427                            ,p_prd_id     IN NUMBER
5428                            ,p_line_id    IN NUMBER
5429                            ,p_rst_grp_id IN NUMBER
5430                            ,p_date       IN DATE) IS
5431     SELECT NVL(SUM(percent_rent_due_for), 0) AS prev_billed_amt
5432     FROM
5433     pn_var_trx_headers_all
5434     WHERE
5435     var_rent_id = p_vr_id AND
5436     period_id = p_prd_id AND
5437     line_item_id = p_line_id AND
5438     reset_group_id = p_rst_grp_id AND
5439     calc_prd_start_date < p_date;
5440 
5441   l_prev_billed_rent NUMBER;
5442 
5443 BEGIN
5444 
5445   l_prev_billed_rent := 0;
5446 
5447   FOR rec IN prev_billed_for_c( p_vr_id      => p_var_rent_id
5448                            ,p_prd_id     => p_period_id
5449                            ,p_line_id    => p_line_item_id
5450                            ,p_rst_grp_id => p_reset_grp_id
5451                            ,p_date       => p_calc_prd_st_dt) LOOP
5452 
5453     l_prev_billed_rent := rec.prev_billed_amt;
5454 
5455   END LOOP;
5456 
5457   RETURN l_prev_billed_rent;
5458 
5459 EXCEPTION
5460   WHEN OTHERS THEN RAISE;
5461 
5462 END find_prev_billed_for;
5463 
5464 --------------------------------------------------------------------------------
5465 --  NAME         : overage_cal_for
5466 --  DESCRIPTION  :
5467 --  PURPOSE      :
5468 --  INVOKED FROM :
5469 --  ARGUMENTS    :
5470 --  REFERENCE    :
5471 --  HISTORY      :
5472 --
5473 --  3.Nov.06  Ram Kumar     o Created
5474 --------------------------------------------------------------------------------
5475 FUNCTION overage_cal_for( p_proration_rule     IN VARCHAR2,
5479 l_bkpt_start                     NUMBER := 0;
5476                           p_calculation_method IN VARCHAR2,
5477                           detail_id            IN NUMBER) RETURN NUMBER IS
5478 
5480 l_bkpt_end                       NUMBER := 0;
5481 overage                          NUMBER :=  0;
5482 l_applicable_sales               NUMBER := 0;
5483 
5484 
5485 CURSOR overage_cur IS
5486   SELECT  dtls.prorated_grp_vol_start,
5487           dtls.prorated_grp_vol_end,
5488           dtls.ytd_group_vol_start,
5489           dtls.ytd_group_vol_end,
5490           dtls.blended_period_vol_start,
5491           dtls.blended_period_vol_end,
5492           hdr.prorated_group_sales_for,
5493           hdr.ytd_sales_for
5494   FROM    pn_var_trx_headers_all hdr,
5495           pn_var_trx_details_all dtls
5496   WHERE   hdr.trx_header_id=dtls.trx_header_id
5497   AND dtls.trx_detail_id = detail_id;
5498 
5499 BEGIN
5500 
5501   FOR overage_rec IN overage_cur LOOP
5502 
5503     IF  p_calculation_method IN ('N', 'T')
5504     THEN
5505       l_applicable_sales := (overage_rec.prorated_group_sales_for);
5506 
5507     ELSIF p_calculation_method IN ('Y', 'C')
5508     THEN
5509       l_applicable_sales := (overage_rec.ytd_sales_for);
5510 
5511     END IF;
5512 
5513     IF  p_calculation_method IN ('N', 'T')
5514     THEN
5515 
5516       l_bkpt_start := overage_rec.prorated_grp_vol_start;
5517       l_bkpt_end   := overage_rec.prorated_grp_vol_end;
5518 
5519     ELSIF p_calculation_method IN ('Y')
5520     THEN
5521 
5522       l_bkpt_start  :=   overage_rec.ytd_group_vol_start;
5523       l_bkpt_end    :=   overage_rec.ytd_group_vol_end;
5524 
5525     ELSIF p_calculation_method IN ('C')
5526     THEN
5527 
5528       IF p_proration_rule IN ('NP') THEN
5529 
5530         l_bkpt_start := overage_rec.prorated_grp_vol_start;
5531         l_bkpt_end   := overage_rec.prorated_grp_vol_end;
5532 
5533       ELSE
5534 
5535         l_bkpt_start := overage_rec.blended_period_vol_start;
5536         l_bkpt_end   := overage_rec.blended_period_vol_end;
5537 
5538       END IF;
5539 
5540     END IF;
5541 
5542 
5543     IF(l_bkpt_end = 0) THEN
5544        overage := greatest(l_applicable_sales - l_bkpt_start,0);
5545     ELSE
5546        IF((l_applicable_sales >= l_bkpt_start) AND (l_applicable_sales <= l_bkpt_end)) THEN
5547            overage :=  l_applicable_sales - l_bkpt_start;
5548        ELSIF(l_applicable_sales > l_bkpt_end) THEN
5549            overage := l_bkpt_end - l_bkpt_start;
5550        ELSIF(l_applicable_sales < l_bkpt_start) THEN
5551            overage := 0;
5552        END IF;
5553     END IF;
5554 
5555   END LOOP;
5556 
5557   return overage;
5558 
5559   EXCEPTION
5560   WHEN OTHERS THEN RAISE;
5561 END overage_cal_for;
5562 
5563 --------------------------------------------------------------------------------
5564 --  NAME         : First_Day
5565 --  DESCRIPTION  :
5566 --  PURPOSE      :
5567 --  INVOKED FROM :
5568 --  ARGUMENTS    :
5569 --  REFERENCE    :
5570 --  HISTORY      :
5571 --
5572 --  3.Nov.06  Ram Kumar     o Created
5573 --------------------------------------------------------------------------------
5574 
5575 FUNCTION First_Day ( p_Date DATE ) RETURN DATE IS
5576 BEGIN
5577 
5578   RETURN ADD_MONTHS(LAST_DAY(p_Date) + 1,  -1);
5579 
5580  EXCEPTION
5581   WHEN OTHERS THEN RAISE;
5582 
5583 END First_Day;
5584 
5585 --------------------------------------------------------------------------------
5586 --  NAME         : inv_end_date
5587 --  DESCRIPTION  :
5588 --  PURPOSE      :
5589 --  INVOKED FROM :
5590 --  ARGUMENTS    :
5591 --  REFERENCE    :
5592 --  HISTORY      :
5593 --
5594 --  3.Nov.06  Ram Kumar     o Created
5595 --------------------------------------------------------------------------------
5596 
5597 FUNCTION inv_end_date( inv_start_date IN DATE
5598                      , vr_id IN NUMBER
5599                      , p_period_id NUMBER) RETURN DATE IS
5600 
5601 inv_end_date                  DATE;
5602 l_invg_freq_code              NUMBER;
5603 l_vr_term_date                DATE;
5604 l_proration_rule              VARCHAR2(30);
5605 l_period_end_date             DATE;
5606 l_reversed_status             VARCHAR2(30);
5607 
5608 CURSOR inv_end_date_cur IS
5609    SELECT var.termination_date,
5610           DECODE(dates.invg_freq_code,'MON',1
5611                                      ,'QTR',3
5612                                      ,'SA' ,6
5613                                      ,'YR' ,12
5614                                      ,NULL) invg_freq_code,
5615           var.proration_rule
5616    FROM   PN_VAR_RENTS_ALL var, PN_VAR_RENT_DATES_ALL dates
5617    WHERE  var.var_rent_id  = vr_id
5618    AND    dates.var_rent_id = var.var_rent_id;
5619 
5620 
5621 CURSOR inv_ed_dt_cur (p_inv_start_date DATE) IS
5622   SELECT DISTINCT inv_end_date
5623   FROM pn_var_grp_dates_all
5624   WHERE var_rent_id = vr_id
5625   AND inv_start_date = p_inv_start_date;
5626 
5627 CURSOR period_cur IS
5628   SELECT period_id, end_date
5629   FROM pn_var_periods_all
5630   WHERE var_rent_id = vr_id
5631   AND partial_period = 'Y'
5632   AND period_num = 1;
5633 
5634 CURSOR last_period_cur IS
5635   SELECT period_id,
5639   WHERE var_rent_id = vr_id
5636          end_date,
5637          decode(status,'REVERSED','Y','N') status
5638   FROM pn_var_periods_all
5640   AND period_id = p_period_id;
5641 
5642 BEGIN
5643 
5644 FOR rec IN inv_end_date_cur LOOP
5645    l_vr_term_date := rec.termination_date;
5646    l_invg_freq_code := rec.invg_freq_code;
5647    l_proration_rule := rec.proration_rule;
5648 END LOOP;
5649 
5650 IF l_proration_rule IN ('FY', 'FLY') THEN
5651    FOR rec IN period_cur LOOP
5652       IF(rec.period_id = p_period_id) THEN
5653          RETURN rec.end_date;
5654       END IF;
5655    END LOOP;
5656 END IF;
5657 
5658 inv_end_date := ADD_MONTHS(inv_start_date,l_invg_freq_code)-1;
5659 
5660 FOR rec_period_csr IN last_period_cur LOOP
5661    l_period_end_date  := rec_period_csr.end_date;
5662    l_reversed_status  := rec_period_csr.status;
5663 END LOOP;
5664 
5665 /* Case 1 - When period is active and invoice lies within new termination date */
5666 IF (inv_end_date > l_vr_term_date AND inv_start_date <= l_vr_term_date AND l_reversed_status = 'N') THEN
5667     inv_end_date := l_vr_term_date;
5668 /* Case 2 - When period is reversed */
5669 ELSIF (l_reversed_status = 'Y' AND inv_end_date >  l_period_end_date) THEN
5670     inv_end_date := l_period_end_date;
5671 /* Case 3 - When period is active and invoice lies outside new termination date */
5672 ELSIF (l_reversed_status = 'N' AND inv_start_date > l_vr_term_date) THEN
5673 
5674    FOR rec IN inv_ed_dt_cur(inv_start_date) LOOP
5675       inv_end_date := rec.inv_end_date;
5676    END LOOP;
5677 END IF;
5678 
5679 RETURN inv_end_date;
5680 
5681  EXCEPTION
5682   WHEN OTHERS THEN RAISE;
5683 
5684 END inv_end_date;
5685 
5686 --------------------------------------------------------------------------------
5687 --  NAME         : inv_start_date
5688 --  DESCRIPTION  :
5689 --  PURPOSE      :
5690 --  INVOKED FROM :
5691 --  ARGUMENTS    :
5692 --  REFERENCE    :
5693 --  HISTORY      :
5694 --
5695 --  3.Nov.06  Ram Kumar     o Created
5696 --------------------------------------------------------------------------------
5697 
5698 FUNCTION inv_start_date( inv_start_date IN DATE
5699                        , vr_id IN NUMBER
5700                        , p_period_id NUMBER) RETURN DATE IS
5701 
5702 inv_end_date                  DATE;
5703 l_invg_freq_code              NUMBER;
5704 l_vr_term_date                DATE;
5705 l_proration_rule              VARCHAR2(30);
5706 l_start_date                  DATE;
5707 
5708 CURSOR inv_start_date_cur IS
5709    SELECT var.proration_rule,
5710           var.commencement_date,
5711           var.termination_date
5712    FROM   PN_VAR_RENTS_ALL var
5713    WHERE  var.var_rent_id  = vr_id;
5714 
5715 
5716 CURSOR period_cur IS
5717   SELECT period_id, start_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 period_last_cur IS
5724   SELECT period_id, start_date
5725   FROM pn_var_periods_all
5726   WHERE var_rent_id = vr_id
5727   AND partial_period = 'Y';
5728 
5729 
5730 BEGIN
5731 
5732 FOR rec IN inv_start_date_cur LOOP
5733    l_proration_rule := rec.proration_rule;
5734    l_vr_term_date   := rec.termination_date;
5735    l_start_date     := rec.commencement_date;
5736 END LOOP;
5737 
5738 
5739 IF l_proration_rule IN ('LY', 'FLY') THEN
5740    FOR rec IN period_last_cur LOOP
5741       IF(rec.period_id = p_period_id) THEN
5742          IF(pn_var_rent_calc_pkg.inv_end_date(inv_start_date,vr_id,p_period_id) = l_vr_term_date) THEN
5743             RETURN rec.start_date;
5744          END IF;
5745       END IF;
5746    END LOOP;
5747 END IF;
5748 
5749 IF l_proration_rule IN ('FY', 'FLY') THEN
5750    FOR rec IN period_cur LOOP
5751       IF(rec.period_id = p_period_id) THEN
5752          RETURN rec.start_date;
5753       END IF;
5754    END LOOP;
5755 END IF;
5756 
5757 IF l_start_date > inv_start_date THEN
5758    RETURN l_start_date;
5759 ELSE
5760    RETURN inv_start_date;
5761 END IF;
5762 
5763  EXCEPTION
5764   WHEN OTHERS THEN RAISE;
5765 
5766 END inv_start_date;
5767 
5768 --------------------------------------------------------------------------------
5769 --  NAME         : INV_SCH_DATE
5770 --  DESCRIPTION  :
5771 --  PURPOSE      :
5772 --  INVOKED FROM :
5773 --  ARGUMENTS    :
5774 --  REFERENCE    :
5775 --  HISTORY      :
5776 --
5777 --  3.Nov.06  Ram Kumar     o Created
5778 -- 02-APR-06  sdmahesh      o Bug # 5962894
5779 --                            Used PN_VAR_RENT_CALC_PKG.INV_END_DATE to find
5780 --                            INV_END_DATE
5781 --------------------------------------------------------------------------------
5782 
5783 FUNCTION inv_sch_date(inv_start_date IN DATE
5784                      ,vr_id IN NUMBER
5785                      ,p_period_id NUMBER) RETURN DATE IS
5786 
5787 
5788 inv_end_date                  DATE := NULL;
5789 inv_schedule_date             DATE := NULL;
5790 l_invg_day_of_month           NUMBER;
5791 l_invg_days_after             NUMBER;
5792 l_invg_freq_code              NUMBER;
5793 l_vr_term_date                DATE;
5794 l_proration_rule              VARCHAR2(30);
5798           dates.invg_days_after,
5795 
5796  CURSOR inv_sch_date_cur IS
5797    SELECT dates.invg_day_of_month,
5799           var.termination_date,
5800           var.proration_rule,
5801           DECODE(dates.invg_freq_code,'MON',1
5802                                      ,'QTR',3
5803                                      ,'SA' ,6
5804                                      ,'YR' ,12
5805                                      ,NULL) invg_freq_code
5806    FROM   PN_VAR_RENTS_ALL var, PN_VAR_RENT_DATES_ALL dates
5807    WHERE  var.var_rent_id  = vr_id
5808    AND    dates.var_rent_id = var.var_rent_id;
5809 
5810 CURSOR last_period_cur IS
5811   SELECT period_id,
5812          decode(status,'REVERSED','Y','N') status
5813   FROM pn_var_periods_all
5814   WHERE var_rent_id = vr_id
5815   AND period_id = p_period_id;
5816 
5817 CURSOR period_cur IS
5818   SELECT period_id, start_date
5819   FROM pn_var_periods_all
5820   WHERE var_rent_id = vr_id
5821   AND partial_period = 'Y'
5822   AND period_num = 1;
5823 
5824 CURSOR first_period_cur IS
5825   SELECT period_id
5826   FROM pn_var_rent_summ_all
5827   WHERE var_rent_id = vr_id
5828   AND nvl(first_yr_rent,0) <> 0
5829   AND rownum < 2;
5830 
5831 BEGIN
5832 
5833 FOR rec IN inv_sch_date_cur LOOP
5834    l_invg_day_of_month := rec.invg_day_of_month;
5835    l_invg_days_after := rec.invg_days_after;
5836    l_vr_term_date := rec.termination_date;
5837    l_invg_freq_code := rec.invg_freq_code;
5838    l_proration_rule := rec.proration_rule;
5839 END LOOP;
5840 
5841 FOR rec_period_csr IN last_period_cur LOOP
5842 
5843    inv_end_date := pn_var_rent_calc_pkg.inv_end_date(inv_start_date,
5844                                                      vr_id,
5845                                                      rec_period_csr.period_id);
5846 
5847 END LOOP;
5848 
5849 IF l_proration_rule IN ('FY', 'FLY') THEN
5850    FOR rec IN period_cur LOOP
5851       IF(rec.period_id = p_period_id) THEN
5852          --
5853          FOR rec_first_prd IN first_period_cur LOOP
5854             inv_end_date := pn_var_rent_calc_pkg.inv_end_date(inv_start_date,
5855                                                      vr_id,
5856                                                      rec_first_prd.period_id);
5857          END LOOP;
5858       END IF;
5859    END LOOP;
5860 END IF;
5861 
5862 
5863   inv_schedule_date :=
5864     NVL( ((ADD_MONTHS(pn_var_rent_calc_pkg.First_Day(inv_end_date),1)-1) + l_invg_day_of_month),
5865             (inv_end_date + nvl(l_invg_days_after,0)) );
5866 
5867   ------------------------------------------------------------
5868   -- takes care of the only 28 days for the schedule day
5869   ------------------------------------------------------------
5870   IF TO_NUMBER(TO_CHAR(inv_schedule_date,'dd')) in (29,30,31) THEN
5871     inv_schedule_date := (pn_var_rent_calc_pkg.First_Day(inv_schedule_date)+27);
5872   END IF;
5873   ------------------------------------------------------------
5874 
5875 RETURN inv_schedule_date;
5876 
5877  EXCEPTION
5878   WHEN OTHERS THEN RAISE;
5879 
5880 END inv_sch_date;
5881 --------------------------------------------------------------------------------
5882 --  NAME         : Post_summary_for
5883 --  DESCRIPTION  :
5884 --  PURPOSE      :
5885 --  INVOKED FROM :
5886 --  ARGUMENTS    :
5887 --  REFERENCE    :
5888 --  HISTORY      :
5889 --
5890 --  18.Sep.06  Shabda     o Created
5891 --  21-MAY-07  Lokesh     o Added rounding off for bug # 6031202 in
5892 --                          pn_var_rent_summ_all
5893 --------------------------------------------------------------------------------
5894 PROCEDURE post_summary_for ( p_var_rent_id  IN NUMBER
5895                         ,p_period_id    IN NUMBER
5896                         ,p_line_item_id IN NUMBER
5897                         ,p_grp_date_id  IN NUMBER)
5898 IS
5899 
5900   /* get grp date */
5901   CURSOR grp_date_c( p_vr_id  IN NUMBER
5902                     ,p_prd_id IN NUMBER
5903                     ,p_grp_id IN NUMBER) IS
5904     SELECT
5905      grp.grp_date_id
5906     ,grp.group_date
5907     ,grp.invoice_date
5908     ,grp.org_id
5909     FROM
5910     pn_var_grp_dates_all grp
5911     WHERE
5912     grp.var_rent_id = p_vr_id  AND
5913     grp.period_id   = p_prd_id AND
5914     grp.grp_date_id = p_grp_id;
5915 
5916   /* Get rent and volume to store in pn_var_rent_summ_all */
5917   CURSOR summ_c( p_vr_id   IN NUMBER
5918                 ,p_prd_id  IN NUMBER
5919                 ,p_line_id IN NUMBER
5920                 ,p_grp_id  IN NUMBER) IS
5921     SELECT
5922      NVL(SUM(hdr.percent_rent_due_for)
5923          , 0) AS rent
5924     ,NVL(SUM(hdr.prorated_group_sales_for)
5925          , 0) AS sales
5926     FROM
5927     pn_var_trx_headers_all hdr
5928     WHERE
5929     hdr.var_rent_id  = p_vr_id AND
5930     hdr.period_id    = p_prd_id AND
5931     hdr.line_item_id = p_line_id AND
5932     hdr.grp_date_id  = p_grp_id;
5933 
5934   /* exists VR summ record */
5935   CURSOR vr_summ_c ( p_vr_id  IN NUMBER
5936                     ,p_prd_id IN NUMBER
5937                     ,p_line_id IN NUMBER
5938                     ,p_grp_id IN NUMBER) IS
5939     SELECT
5940     var_rent_summ_id
5944     var_rent_id = p_vr_id AND
5941     FROM
5942     pn_var_rent_summ_all
5943     WHERE
5945     period_id = p_prd_id AND
5946     line_item_id = p_line_id AND
5947     grp_date_id = p_grp_id;
5948 
5949   l_vr_summ_id NUMBER;
5950 
5951 BEGIN
5952 
5953   /* get the invoice date for the group
5954      loops only once
5955   */
5956   FOR grp_rec IN grp_date_c( p_vr_id  => p_var_rent_id
5957                             ,p_prd_id => p_period_id
5958                             ,p_grp_id => p_grp_date_id)
5959   LOOP
5960 
5961     /* get the sum of rents and sales for
5962        vr -> period -> line item -> group combination
5963        from the trx tables
5964        loops only once
5965     */
5966     FOR summ_rec IN summ_c( p_vr_id   => p_var_rent_id
5967                            ,p_prd_id  => p_period_id
5968                            ,p_line_id => p_line_item_id
5969                            ,p_grp_id  => p_grp_date_id)
5970     LOOP
5971 
5972       l_vr_summ_id := NULL;
5973 
5974       /* chk if VR SUMM record exists for this
5975          vr -> period -> line item -> group combination */
5976       FOR vr_summ_rec IN vr_summ_c( p_vr_id   => p_var_rent_id
5977                                    ,p_prd_id  => p_period_id
5978                                    ,p_line_id => p_line_item_id
5979                                    ,p_grp_id  => p_grp_date_id)
5980       LOOP
5981         l_vr_summ_id := vr_summ_rec.var_rent_summ_id;
5982       END LOOP;
5983 
5984       IF l_vr_summ_id IS NULL THEN
5985 
5986         /* to insert a new summary record */
5987         INSERT INTO
5988         pn_var_rent_summ_all
5989           (var_rent_summ_id
5990           ,var_rent_id
5991           ,period_id
5992           ,line_item_id
5993           ,invoice_date
5994           ,tot_for_vol
5995           ,for_var_rent
5996           ,grp_date_id
5997           ,group_date
5998           ,last_update_date
5999           ,last_updated_by
6000           ,creation_date
6001           ,created_by
6002           ,last_update_login
6003           ,org_id)
6004         VALUES
6005           (pn_var_rent_summ_s.NEXTVAL
6006           ,p_var_rent_id
6007           ,p_period_id
6008           ,p_line_item_id
6009           ,grp_rec.invoice_date
6010           ,summ_rec.sales
6011           ,round(summ_rec.rent,g_precision)
6012           ,grp_rec.grp_date_id
6013           ,grp_rec.group_date
6014           ,SYSDATE
6015           ,NVL(fnd_global.user_id, 0)
6016           ,SYSDATE
6017           ,NVL(fnd_global.user_id, 0)
6018           ,NVL(fnd_global.login_id, 0)
6019           ,NVL(grp_rec.org_id, g_org_id))
6020         RETURNING
6021         var_rent_summ_id
6022         INTO
6023         l_vr_summ_id;
6024 
6025       ELSIF l_vr_summ_id IS NOT NULL THEN
6026         /* update the summary record */
6027 
6028         UPDATE
6029         pn_var_rent_summ_all
6030         SET
6031          tot_for_vol  = summ_rec.sales
6032         ,for_var_rent = round(summ_rec.rent,g_precision)
6033         ,last_update_date  = SYSDATE
6034         ,last_updated_by   = NVL(fnd_global.user_id, 0)
6035         ,last_update_login = NVL(fnd_global.login_id, 0)
6036         WHERE
6037         var_rent_summ_id = l_vr_summ_id;
6038 
6039       END IF;
6040 
6041       UPDATE
6042       pn_var_trx_headers_all hdr
6043       SET
6044       hdr.var_rent_summ_id = l_vr_summ_id
6045       WHERE
6046       hdr.var_rent_id  = p_var_rent_id AND
6047       hdr.period_id    = p_period_id AND
6048       hdr.line_item_id = p_line_item_id AND
6049       hdr.grp_date_id  = p_grp_date_id;
6050 
6051       EXIT;
6052 
6053     END LOOP;
6054 
6055     EXIT;
6056 
6057   END LOOP;
6058 
6059 EXCEPTION
6060   WHEN OTHERS THEN RAISE;
6061 
6062 END post_summary_for;
6063 
6064 
6065 --------------------------------------------------------------------------------
6066 --  NAME         : post_summary_for
6067 --  DESCRIPTION  :
6068 --  PURPOSE      :
6069 --  INVOKED FROM :
6070 --  ARGUMENTS    :
6071 --  REFERENCE    :
6072 --  HISTORY      :
6073 --
6074 --  18.Sep.06  Shabda     o Created
6075 --  21-MAY-07  Lokesh     o Added rounding off for bug # 6031202 in
6076 --                          pn_var_rent_summ_all
6077 --------------------------------------------------------------------------------
6078 PROCEDURE post_summary_for ( p_var_rent_id  IN NUMBER
6079                         ,p_period_id    IN NUMBER)
6080 IS
6081 
6082   /* get all lines */
6083   CURSOR lines_c( p_vr_id  IN NUMBER
6084                  ,p_prd_id IN NUMBER) IS
6085     SELECT
6086     line_item_id
6087     FROM
6088     pn_var_lines_all
6089     WHERE
6090     var_rent_id = p_vr_id AND
6091     period_id = p_prd_id;
6092 
6093   /* get grp date */
6094   CURSOR grp_date_c( p_vr_id  IN NUMBER
6095                     ,p_prd_id IN NUMBER) IS
6096     SELECT
6097      grp.grp_date_id
6098     ,grp.group_date
6099     ,grp.invoice_date
6100     ,grp.org_id
6101     FROM
6102      pn_var_grp_dates_all grp
6103     ,pn_var_periods_all   prd
6107     grp.period_id   = prd.period_id AND
6104     WHERE
6105     prd.var_rent_id = p_vr_id  AND
6106     prd.period_id   = p_prd_id AND
6108     grp.grp_end_date <= prd.end_date;
6109 
6110   TYPE GRP_TBL IS TABLE OF grp_date_c%ROWTYPE INDEX BY BINARY_INTEGER;
6111   l_grp_t GRP_TBL;
6112 
6113   /* Get rent and volume to store in pn_var_rent_summ_all */
6114   CURSOR summ_c( p_vr_id   IN NUMBER
6115                 ,p_prd_id  IN NUMBER
6116                 ,p_line_id IN NUMBER
6117                 ,p_grp_id  IN NUMBER) IS
6118     SELECT
6119      NVL(SUM(hdr.percent_rent_due_for)
6120          , 0) AS rent
6121     ,NVL(SUM(hdr.prorated_group_sales_for)
6122          , 0) AS sales
6123     FROM
6124     pn_var_trx_headers_all hdr
6125     WHERE
6126     hdr.var_rent_id  = p_vr_id AND
6127     hdr.period_id    = p_prd_id AND
6128     hdr.line_item_id = p_line_id AND
6129     hdr.grp_date_id  = p_grp_id;
6130 
6131   /* exists VR summ record */
6132   CURSOR vr_summ_c ( p_vr_id  IN NUMBER
6133                     ,p_prd_id IN NUMBER
6134                     ,p_line_id IN NUMBER
6135                     ,p_grp_id IN NUMBER) IS
6136     SELECT
6137      var_rent_summ_id
6138     ,tot_for_vol
6139     ,for_var_rent
6140     FROM
6141     pn_var_rent_summ_all
6142     WHERE
6143     var_rent_id = p_vr_id AND
6144     period_id = p_prd_id AND
6145     line_item_id = p_line_id AND
6146     grp_date_id = p_grp_id;
6147 
6148   l_vr_summ_id NUMBER;
6149 
6150 BEGIN
6151 
6152   l_grp_t.DELETE;
6153 
6154   OPEN grp_date_c( p_vr_id  => p_var_rent_id
6155                   ,p_prd_id => p_period_id);
6156   FETCH grp_date_c BULK COLLECT INTO l_grp_t;
6157   CLOSE grp_date_c;
6158   pnp_debug_pkg.log('total groups:'||l_grp_t.COUNT);
6159   /* loop for all lines in the annual period */
6160   FOR line_rec IN lines_c( p_vr_id  => p_var_rent_id
6161                           ,p_prd_id => p_period_id)
6162   LOOP
6163     pnp_debug_pkg.log('looping for line:'||line_rec.line_item_id);
6164     /* loop for all calc periods in the annual period */
6165     FOR g IN 1..l_grp_t.COUNT LOOP
6166       pnp_debug_pkg.log('looping for group:'||l_grp_t(g).grp_date_id);
6167       /* get the sum of rents and sales for
6168          vr -> period -> line item -> group combination
6169          from the trx tables
6170          -- loops only once --
6171       */
6172       FOR summ_rec IN summ_c( p_vr_id   => p_var_rent_id
6173                              ,p_prd_id  => p_period_id
6174                              ,p_line_id => line_rec.line_item_id
6175                              ,p_grp_id  => l_grp_t(g).grp_date_id)
6176       LOOP
6177 
6178         l_vr_summ_id := NULL;
6179         pnp_debug_pkg.log('rent'||summ_rec.rent);
6180         /* chk if VR SUMM record exists for this
6181            vr -> period -> line item -> group combination */
6182         FOR vr_summ_rec IN vr_summ_c( p_vr_id   => p_var_rent_id
6183                                      ,p_prd_id  => p_period_id
6184                                      ,p_line_id => line_rec.line_item_id
6185                                      ,p_grp_id  => l_grp_t(g).grp_date_id)
6186         LOOP
6187 
6188           l_vr_summ_id := vr_summ_rec.var_rent_summ_id;
6189 
6190           IF NVL(summ_rec.sales,0) <> NVL(vr_summ_rec.tot_for_vol,0) OR
6191              NVL(summ_rec.rent,0)  <> NVL(vr_summ_rec.for_var_rent,0)
6192           THEN
6193             pnp_debug_pkg.log('sales:'||summ_rec.sales);
6194             pnp_debug_pkg.log('rent: '||summ_rec.rent);
6195             UPDATE
6196             pn_var_rent_summ_all
6197             SET
6198              tot_for_vol  = summ_rec.sales
6199             ,for_var_rent = round(summ_rec.rent,g_precision)
6200             ,last_update_date  = SYSDATE
6201             ,last_updated_by   = NVL(fnd_global.user_id, 0)
6202             ,last_update_login = NVL(fnd_global.login_id, 0)
6203             WHERE
6204             var_rent_summ_id = l_vr_summ_id;
6205 
6206           END IF;
6207 
6208         END LOOP; /* chk if VR SUMM exists vr -> prd -> line -> grp combo */
6209 
6210         IF l_vr_summ_id IS NULL THEN
6211 
6212           /* to insert a new summary record */
6213           pnp_debug_pkg.log('Inserting a new record for var_rent_summ table');
6214           INSERT INTO
6215           pn_var_rent_summ_all
6216             (var_rent_summ_id
6217             ,var_rent_id
6218             ,period_id
6219             ,line_item_id
6220             ,invoice_date
6221             ,tot_for_vol
6222             ,for_var_rent
6223             ,grp_date_id
6224             ,group_date
6225             ,last_update_date
6226             ,last_updated_by
6227             ,creation_date
6228             ,created_by
6229             ,last_update_login
6230             ,org_id)
6231           VALUES
6232             (pn_var_rent_summ_s.NEXTVAL
6233             ,p_var_rent_id
6234             ,p_period_id
6235             ,line_rec.line_item_id
6236             ,l_grp_t(g).invoice_date
6237             ,summ_rec.sales
6238             ,round(summ_rec.rent,g_precision)
6239             ,l_grp_t(g).grp_date_id
6240             ,l_grp_t(g).group_date
6241             ,SYSDATE
6242             ,NVL(fnd_global.user_id, 0)
6243             ,SYSDATE
6244             ,NVL(fnd_global.user_id, 0)
6248           var_rent_summ_id
6245             ,NVL(fnd_global.login_id, 0)
6246             ,NVL(l_grp_t(g).org_id, g_org_id))
6247           RETURNING
6249           INTO
6250           l_vr_summ_id;
6251           pnp_debug_pkg.log('Inserted rent summ with id: '||l_vr_summ_id);
6252         END IF;
6253         UPDATE
6254         pn_var_trx_headers_all hdr
6255         SET
6256         hdr.var_rent_summ_id = l_vr_summ_id
6257         WHERE
6258         hdr.var_rent_id  = p_var_rent_id AND
6259         hdr.period_id    = p_period_id AND
6260         hdr.line_item_id = line_rec.line_item_id AND
6261         hdr.grp_date_id  = l_grp_t(g).grp_date_id;
6262 
6263         EXIT;
6264 
6265       END LOOP; /* get the sum of rents and sales for
6266                    vr -> period -> line item -> group combination */
6267 
6268     END LOOP; /* loop for all calc periods in the annual period */
6269 
6270   END LOOP; /* loop for all lines in the annual period */
6271 
6272 EXCEPTION
6273   WHEN OTHERS THEN RAISE;
6274 
6275 END post_summary_for;
6276 /*end forecasted data procedures*/
6277 
6278 
6279 --------------------------------------------------------------------------------
6280 --  NAME         : update_summ_id
6281 --  DESCRIPTION  :
6282 --  PURPOSE      :
6283 --  INVOKED FROM :
6284 --  ARGUMENTS    :
6285 --  REFERENCE    :
6286 --  HISTORY      :
6287 --
6288 -- 25.Apr.07  Ram kumar    o Created
6289 --------------------------------------------------------------------------------
6290 PROCEDURE update_summ_id ( p_var_rent_id IN NUMBER)
6291 IS
6292 
6293  /* Fetch the summary id and transaction id from respective tables */
6294 CURSOR summ_id_cur (p_var_rent_id NUMBER) IS
6295    SELECT /*+ leading(trx) */
6296    summ.var_rent_summ_id, trx.trx_header_id
6297    FROM pn_var_trx_headers_all trx, pn_var_rent_summ_all summ
6298    WHERE trx.grp_date_id = summ.grp_date_id
6299    AND trx.var_rent_id = p_var_rent_id
6300    AND trx.var_rent_summ_id IS NULL;
6301 
6302 TYPE summ_id_tab_type IS TABLE OF pn_var_trx_headers_all.var_rent_summ_id%TYPE
6303 INDEX BY BINARY_INTEGER;
6304 
6305 TYPE trx_id_tab_type IS TABLE OF pn_var_trx_headers_all.trx_header_id%TYPE
6306 INDEX BY BINARY_INTEGER;
6307 
6308 l_summ_id_tab        summ_id_tab_type;
6309 l_trx_id_tab         trx_id_tab_type;
6310 
6311 BEGIN
6312 
6313   l_summ_id_tab.DELETE;
6314   l_trx_id_tab.DELETE;
6315 
6316   /* Fetch the mapping of trx headers and summary records */
6317 
6318   OPEN summ_id_cur(p_var_rent_id => p_var_rent_id);
6319   FETCH summ_id_cur BULK COLLECT INTO l_summ_id_tab,l_trx_id_tab;
6320   CLOSE summ_id_cur;
6321 
6322   FORALL i IN 1.. l_trx_id_tab.COUNT
6323     UPDATE pn_var_trx_headers_all
6324     SET   var_rent_summ_id = l_summ_id_tab(i)
6325     WHERE trx_header_id    = l_trx_id_tab(i);
6326 
6327 END update_summ_id;
6328 
6329 
6330 --------------------------------------------------------------------------------
6331 --
6332 --  NAME         :
6333 --  DESCRIPTION  :
6334 --  PURPOSE      :
6335 --  INVOKED FROM :
6336 --  ARGUMENTS    :
6337 --  REFERENCE    : PN_COMMON.debug()
6338 --  HISTORY      : Shabda. Set global variables g_calc_type and g_invoice_on.
6339 --
6340 --  dd-mon-yyyy  name     o Created
6341 --  21-AUG-2008  acprakas o Bug#6849764. Modified to pass rec_get_per.period_id for period id while calling
6342 --                          pn_var_rent_calc_pkg.calculate_rent.
6343 --------------------------------------------------------------------------------
6344 PROCEDURE process_rent_batch ( errbuf                OUT NOCOPY  VARCHAR2,
6345                                retcode               OUT NOCOPY  VARCHAR2,
6346                                p_property_code       IN  VARCHAR2,
6347                                p_property_name       IN  VARCHAR2,
6348                                p_lease_num_from      IN  VARCHAR2,
6349                                p_lease_num_to        IN  VARCHAR2,
6350                                p_location_code_from  IN  VARCHAR2,
6351                                p_location_code_to    IN  VARCHAR2,
6352                                p_vrent_num_from      IN  VARCHAR2,
6353                                p_vrent_num_to        IN  VARCHAR2,
6354                                p_period_num_from     IN  NUMBER,
6355                                p_period_num_to       IN  NUMBER,
6356                                p_responsible_user    IN  NUMBER,
6357                                p_invoice_on          IN  VARCHAR2 ,
6358                                p_var_rent_id         IN  NUMBER,
6359                                p_period_id           IN  NUMBER,
6360                                p_line_item_id        IN  NUMBER,
6361                                p_invoice_date        IN  DATE,
6362                                p_calc_type           IN  VARCHAR2,
6363                                p_period_date         IN  VARCHAR2,
6364                                p_org_id              IN  NUMBER )
6365 IS
6366 
6367 CURSOR csr_get_vrent_wprop IS
6368 SELECT pvr.var_rent_id,
6369        pvr.invoice_on,
6370        pvr.cumulative_vol,
6371        pvr.rent_num,
6372        pl.org_id
6373 FROM   pn_leases            pl,
6374        pn_lease_details_all  pld,
6375        pn_var_rents_all      pvr,
6376        pn_locations_all      ploc
6380 AND    ploc.location_id IN (SELECT location_id
6377 WHERE  pl.lease_id = pvr.lease_id
6378 AND    pld.lease_id = pvr.lease_id
6379 AND    ploc.location_id = pvr.location_id
6381                              FROM  pn_locations_all
6382                            START WITH location_id
6383                                               IN
6384                                                 (SELECT location_id
6385                                                    FROM pn_locations_all
6386                                                   WHERE property_id IN(SELECT property_id
6387                                                                        FROM pn_properties_all
6388                                                                       WHERE property_code=NVL(p_property_code,property_code)
6389                                                                          OR property_name=NVL(p_property_name,property_name))
6390                                                 )
6391                           CONNECT BY PRIOR location_id=parent_location_id)
6392 AND    pl.lease_num >= NVL(p_lease_num_from, pl.lease_num)
6393 AND    pl.lease_num <= NVL(p_lease_num_to, pl.lease_num)
6394 AND    ploc.location_code >= NVL(p_location_code_from, ploc.location_code)
6395 AND    ploc.location_code <= NVL(p_location_code_to, ploc.location_code)
6396 AND    pvr.rent_num >= NVL(p_vrent_num_from,pvr.rent_num)
6397 AND    pvr.rent_num <= NVL(p_vrent_num_to,pvr.rent_num)
6398 AND    pld.responsible_user = NVL(p_responsible_user, pld.responsible_user)
6399 AND    pvr.invoice_on = NVL(p_invoice_on,pvr.invoice_on)
6400 AND    pl.org_id = NVL(p_org_id,pl.org_id)
6401 ORDER BY pl.lease_id, pvr.var_rent_id;
6402 
6403 CURSOR csr_get_vrent_wloc IS
6404 SELECT pvr.var_rent_id,
6405        pvr.invoice_on,
6406        pvr.cumulative_vol,
6407        pvr.rent_num,
6408        pl.org_id
6409 FROM   pn_leases           pl,
6410        pn_lease_details_all  pld,
6411        pn_var_rents_all      pvr,
6412        pn_locations_all      ploc
6413 WHERE  pl.lease_id = pvr.lease_id
6414 AND    pld.lease_id = pvr.lease_id
6415 AND    ploc.location_id = pvr.location_id
6416 AND    pl.lease_num >= NVL(p_lease_num_from, pl.lease_num)
6417 AND    pl.lease_num <= NVL(p_lease_num_to, pl.lease_num)
6418 AND    ploc.location_code >= NVL(p_location_code_from, ploc.location_code)
6419 AND    ploc.location_code <= NVL(p_location_code_to, ploc.location_code)
6420 AND    pvr.rent_num >= NVL(p_vrent_num_from,pvr.rent_num)
6421 AND    pvr.rent_num <= NVL(p_vrent_num_to,pvr.rent_num)
6422 AND    pld.responsible_user = NVL(p_responsible_user, pld.responsible_user)
6423 AND    pvr.invoice_on = NVL(p_invoice_on,pvr.invoice_on)
6424 AND    pl.org_id = NVL(p_org_id,pl.org_id)
6425 ORDER BY pl.lease_id, pvr.var_rent_id;
6426 
6427 CURSOR csr_get_vrent_woloc IS
6428 SELECT pvr.var_rent_id,
6429        pvr.invoice_on,
6430        pvr.cumulative_vol,
6431        pvr.rent_num,
6432        pl.org_id
6433 FROM   pn_var_rents_all      pvr,
6434        pn_leases             pl,
6435        pn_lease_details_all  pld
6436 WHERE  pl.lease_id = pvr.lease_id
6437 AND    pld.lease_id = pvr.lease_id
6438 AND    pl.lease_num >= NVL(p_lease_num_from, pl.lease_num)
6439 AND    pl.lease_num <= NVL(p_lease_num_to, pl.lease_num)
6440 AND    pvr.rent_num >= NVL(p_vrent_num_from,pvr.rent_num)
6441 AND    pvr.rent_num <= NVL(p_vrent_num_to,pvr.rent_num)
6442 AND    pld.responsible_user = NVL(p_responsible_user, pld.responsible_user)
6443 AND    pvr.var_rent_id = NVL(p_var_rent_id,pvr.var_rent_id)
6444 AND    pvr.invoice_on = NVL(p_invoice_on,pvr.invoice_on)
6445 AND    pl.org_id = NVL(p_org_id,pl.org_id)
6446 ORDER BY pl.lease_id, pvr.var_rent_id;
6447 
6448 CURSOR csr_get_per(ip_var_rent_id NUMBER) IS
6449 SELECT period_id,
6450        period_num,
6451        start_date,
6452        end_date
6453 FROM pn_var_periods_all
6454 WHERE var_rent_id = ip_var_rent_id
6455 AND period_id = NVL(p_period_id,period_id)
6456 AND start_date <= NVL(fnd_date.canonical_to_date(p_period_date),TO_DATE('12/31/4712','mm/dd/yyyy'))
6457 AND period_num >= NVL(p_period_num_from,period_num)
6458 AND period_num <= NVL(p_period_num_to,period_num);
6459 
6460 
6461 l_var_rent_id  pn_var_rents.var_rent_id%TYPE;
6462 l_invoice_on   pn_var_rents.invoice_on%TYPE;
6463 l_cumulative   pn_var_rents.cumulative_vol%TYPE;
6464 l_rent_num     pn_var_rents.rent_num%TYPE;
6465 l_errbuf       VARCHAR2(2000);
6466 l_retcode      VARCHAR2(2000);
6467 l_ext_precision NUMBER;
6468 l_min_acct_unit NUMBER;
6469 v_var_id_details_exists NUMBER;
6470 
6471 
6472 BEGIN
6473 
6474   pnp_debug_pkg.log
6475   ('++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++');
6476   pnp_debug_pkg.log('+++++++++ process_rent_batch START +++++++++++');
6477   pnp_debug_pkg.log(' ');
6478   pnp_debug_pkg.log('Setting invoice_on and calc_type');
6479  -- g_invoice_on := p_invoice_on;
6480   g_calc_type  := p_calc_type;
6481   pnp_debug_pkg.log('g_invoice_on:'||g_invoice_on);
6482   pnp_debug_pkg.log('g_calc_type'||g_calc_type);
6483 
6484     pnp_debug_pkg.log('pn_var_rent_calc_pkg.process_rent_batch (+)' );
6485 
6486 
6487     fnd_message.set_name ('PN','PN_VRAM_PRM');
6488     fnd_message.set_token ('PT_NAME', p_property_name);
6489     fnd_message.set_token ('PT_CODE', p_property_code);
6490     fnd_message.set_token ('LSNO_FRM', p_lease_num_from);
6491     fnd_message.set_token ('LSNO_TO', p_lease_num_to);
6492     fnd_message.set_token ('LOC_FRM', p_location_code_from);
6496     fnd_message.set_token ('PRD_FRM', p_period_num_from);
6493     fnd_message.set_token ('LOC_TO', p_location_code_to);
6494     fnd_message.set_token ('VR_FRM', p_vrent_num_from);
6495     fnd_message.set_token ('VR_TO', p_vrent_num_to);
6497     fnd_message.set_token ('PRD_TO', p_period_num_to);
6498     fnd_message.set_token ('USR', p_responsible_user);
6499     fnd_message.set_token ('DATE', p_period_date);
6500     pnp_debug_pkg.put_log_msg(fnd_message.get);
6501 
6502     pnp_debug_pkg.log   ('process_rent_batch - Calculation TYPE : ' || p_calc_TYPE);
6503 
6504     IF p_property_code IS NOT NULL OR p_property_name IS NOT NULL THEN
6505 
6506         OPEN csr_get_vrent_wprop;
6507 
6508 
6509     ELSIF p_location_code_from IS NOT NULL or p_location_code_to IS NOT NULL THEN
6510         -----------------------------------------------------------------------------
6511         -- Checking Location Code From, Location Code To to open appropriate cursor.
6512         -----------------------------------------------------------------------------
6513         OPEN csr_get_vrent_wloc;
6514 
6515     ELSE
6516 
6517         OPEN csr_get_vrent_woloc;
6518 
6519     END IF;
6520 
6521 
6522     LOOP
6523 
6524          IF csr_get_vrent_wprop%ISOPEN THEN
6525 
6526            FETCH csr_get_vrent_wprop INTO l_var_rent_id,l_invoice_on,l_cumulative,l_rent_num,g_org_id;
6527            EXIT WHEN csr_get_vrent_wprop%NOTFOUND;
6528            pnp_debug_pkg.log   ('process_rent_batch - Inside cur : ' );
6529          ELSIF csr_get_vrent_wloc%ISOPEN THEN
6530 
6531            FETCH csr_get_vrent_wloc INTO l_var_rent_id,l_invoice_on,l_cumulative,l_rent_num,g_org_id;
6532            EXIT WHEN csr_get_vrent_wloc%NOTFOUND;
6533 
6534          ELSIF csr_get_vrent_woloc%ISOPEN THEN
6535 
6536            FETCH csr_get_vrent_woloc INTO l_var_rent_id,l_invoice_on,l_cumulative,l_rent_num,g_org_id;
6537            EXIT WHEN csr_get_vrent_woloc%NOTFOUND;
6538 
6539          END IF;
6540 
6541        g_invoice_on := NVL(p_invoice_on,l_invoice_on);
6542        g_precision := nvl(pn_var_rent_calc_pkg.get_currency_precision(g_org_id),4);
6543 
6544        fnd_message.set_name ('PN','PN_VRAM_VRN_PROC');
6545        fnd_message.set_token ('NUM',l_rent_num);
6546        pnp_debug_pkg.put_log_msg(fnd_message.get);
6547 
6548        pnp_debug_pkg.log   ('process_rent_batch - Variable Rent id     :'||l_var_rent_id);
6549        pnp_debug_pkg.log   ('process_rent_batch - org_id               :'||g_org_id);
6550 
6551         v_var_id_details_exists :=PN_VAR_RENT_PKG.find_if_volhist_bkpts_exist
6552                                      ( l_var_rent_id,
6553                                        'VAR_RENT_ID' );
6554 
6555        IF v_var_id_details_exists = 1 THEN
6556 
6557          FOR rec_get_per in csr_get_per(l_var_rent_id)
6558          LOOP
6559 
6560              fnd_message.set_name ('PN','PN_VRAM_PRD_PROC');
6561                   fnd_message.set_token ('NUM',rec_get_per.period_num);
6562                   pnp_debug_pkg.put_log_msg(fnd_message.get);
6563 
6564              pnp_debug_pkg.log   ('process_rent_batch - period st date : '||rec_get_per.start_date);
6565              pnp_debug_pkg.log   ('process_rent_batch - period end date: '||rec_get_per.end_date);
6566 
6567 
6568 
6569             pn_var_rent_calc_pkg.calculate_rent
6570                          (p_var_rent_id => l_var_rent_id
6571                           ,p_period_id  => rec_get_per.period_id);	   --Bug#6849764
6572 
6573            END LOOP;
6574 
6575 	   update_summ_id (p_var_rent_id => l_var_rent_id);
6576 
6577           END IF;
6578        END LOOP;
6579 
6580         IF csr_get_vrent_wloc%ISOPEN THEN
6581            CLOSE csr_get_vrent_wloc;
6582         ELSIF csr_get_vrent_woloc%ISOPEN THEN
6583            CLOSE csr_get_vrent_woloc;
6584         ELSIF csr_get_vrent_wprop%ISOPEN THEN
6585            CLOSE csr_get_vrent_wprop;
6586         END IF;
6587 
6588 
6589 
6590     pnp_debug_pkg.log(' ');
6591     pnp_debug_pkg.log('+++++++++ process_rent_batch END +++++++++++');
6592     pnp_debug_pkg.log('++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++');
6593 
6594 EXCEPTION
6595   WHEN OTHERS THEN
6596    pnp_debug_pkg.log('Error in pn_var_rent_calc_pkg.process_rent_batch :'||TO_CHAR(sqlcode)||' : '||sqlerrm);
6597    Errbuf  := SQLERRM;
6598    Retcode := 2;
6599    rollback;
6600    raise;
6601    pnp_debug_pkg.log('pn_var_rent_calc_pkg.process_rent_batch  (-) ');
6602 
6603 END process_rent_batch;
6604 
6605 FUNCTION END_BREAKPOINT(bkpt_start IN NUMBER, bkpt_end IN  NUMBER) RETURN NUMBER IS
6606 l_num  NUMBER;
6607 BEGIN
6608  IF (bkpt_end = 0) THEN
6609      l_num := NULL;
6610  ELSE
6611      l_num := bkpt_end ;
6612  END IF;
6613 
6614  RETURN l_num;
6615 END;
6616 
6617 --------------------------------------------------------------------------------
6618 --
6619 --  NAME         : prev_invoiced_amt
6620 --  DESCRIPTION  :
6621 --  PURPOSE      :
6622 --  INVOKED FROM :
6623 --  ARGUMENTS    : IN  : p_var_rent_inv_id, p_period_id
6624 --
6625 --  REFERENCE    : PN_COMMON.debug()
6626 --  HISTORY      :
6627 --
6628 --  10-NOV-2006  piagrawa     o Created
6629 --------------------------------------------------------------------------------
6633 CURSOR inv_cur IS
6630 FUNCTION prev_invoiced_amt(p_var_rent_inv_id NUMBER, p_period_id NUMBER, p_invoice_date DATE)
6631 RETURN NUMBER IS
6632 
6634   SELECT true_up_amt, actual_invoiced_amount, act_per_rent, for_per_rent, adjust_num
6635   FROM pn_var_rent_inv_all
6636   WHERE var_rent_inv_id = p_var_rent_inv_id;
6637 
6638 CURSOR inv_actual IS
6639  SELECT SUM(actual_invoiced_amount) actual
6640  FROM pn_var_rent_inv_all
6641  WHERE invoice_date = p_invoice_date
6642  AND period_id = p_period_id
6643  AND var_rent_inv_id <= p_var_rent_inv_id;
6644 
6645 CURSOR prev_inv_amt_cur(p_adjust_num NUMBER) IS
6646   SELECT sum(actual_invoiced_amount) prev_amt
6647   FROM pn_var_rent_inv_all rent_inv
6648   WHERE var_rent_inv_id < p_var_rent_inv_id
6649   AND   (true_up_amt IS NULL
6650      OR (true_up_amt IS NOT NULL))
6651   AND period_id = p_period_id;
6652 
6653 l_prev_invoiced_amt NUMBER := 0;
6654 l_actual_amt        NUMBER := 0;
6655 
6656 BEGIN
6657 
6658   FOR rec_actual IN inv_actual LOOP
6659     l_actual_amt := rec_actual.actual;
6660   END LOOP;
6661 
6662   FOR rec IN inv_cur LOOP
6663     IF rec.true_up_amt IS NULL THEN
6664 
6665        IF rec.adjust_num = 0 THEN
6666          l_prev_invoiced_amt := l_actual_amt - rec.actual_invoiced_amount + nvl(rec.for_per_rent,0);
6667        ELSIF rec.adjust_num = 1 THEN
6668          l_prev_invoiced_amt := l_actual_amt - rec.actual_invoiced_amount - nvl(rec.for_per_rent,0);
6669        ELSE
6670          l_prev_invoiced_amt := l_actual_amt - rec.actual_invoiced_amount;
6671        END IF;
6672     ELSE
6673 
6674        FOR prev_inv_rec IN prev_inv_amt_cur(rec.adjust_num) LOOP
6675          l_prev_invoiced_amt := prev_inv_rec.prev_amt;
6676        END LOOP;
6677 
6678     END IF;
6679 
6680   END LOOP;
6681 
6682   return l_prev_invoiced_amt;
6683 
6684 END prev_invoiced_amt;
6685 
6686 --------------------------------------------------------------------------------
6687 --  NAME         : last_year_bkpt
6688 --  DESCRIPTION  :
6689 --  PURPOSE      :
6690 --  INVOKED FROM :
6691 --  ARGUMENTS    :
6692 --  REFERENCE    :
6693 --  HISTORY      :
6694 --
6695 --  3.Nov.06  piagrawa    o Created
6696 --------------------------------------------------------------------------------
6697 PROCEDURE last_year_bkpt( p_vr_id           IN NUMBER
6698                           ,p_vr_comm_date     IN DATE
6699                           ,p_line_item_grp_id IN NUMBER
6700                           ,p_bkpt_rate        IN NUMBER
6701                           ,p_start_bkpt       OUT NOCOPY NUMBER
6702                           ,p_end_bkpt         OUT NOCOPY NUMBER)
6703 IS
6704 
6705   /* get LY breakpoints */
6706   CURSOR ly_bkpts_c( p_vr_id            IN NUMBER
6707                     ,p_vr_term_date     IN DATE
6708                     ,p_line_item_grp_id IN NUMBER
6709           ,p_bkpt_rate        IN NUMBER) IS
6710     SELECT
6711      NVL(SUM(ly_pr_grp_vol_start),0) AS bkpt_start
6712     ,NVL(SUM(ly_pr_grp_vol_end),0)   AS bkpt_end
6713     ,bkpt_rate
6714     FROM
6715     pn_var_trx_details_all
6716     WHERE
6717     trx_header_id IN
6718      (SELECT
6719       trx_header_id
6720       FROM
6721       pn_var_trx_headers_all
6722       WHERE
6723       var_rent_id = p_vr_id AND
6724       line_item_group_id = p_line_item_grp_id AND
6725       calc_prd_end_date >= (ADD_MONTHS(p_vr_term_date, -12) + 1))
6726     AND bkpt_rate = p_bkpt_rate
6727     GROUP BY
6728     bkpt_rate
6729     ORDER BY
6730     bkpt_start;
6731 
6732 BEGIN
6733    FOR ly_bkpts_rec IN ly_bkpts_c( p_vr_id
6734                                   ,p_vr_comm_date
6735                                   ,p_line_item_grp_id
6736                                   ,p_bkpt_rate)
6737    LOOP
6738       p_start_bkpt := ly_bkpts_rec.bkpt_start ;
6739       p_end_bkpt   := ly_bkpts_rec.bkpt_end ;
6740    END LOOP;
6741 
6742 END last_year_bkpt;
6743 
6744 --------------------------------------------------------------------------------
6745 --  NAME         : first_year_bkpt
6746 --  DESCRIPTION  :
6747 --  PURPOSE      :
6748 --  INVOKED FROM :
6749 --  ARGUMENTS    :
6750 --  REFERENCE    :
6751 --  HISTORY      :
6752 --
6753 --  3.Nov.06  piagrawa    o Created
6754 --------------------------------------------------------------------------------
6755 PROCEDURE first_year_bkpt( p_vr_id           IN NUMBER
6756                           ,p_vr_comm_date     IN DATE
6757                           ,p_line_item_grp_id IN NUMBER
6758                           ,p_bkpt_rate        IN NUMBER
6759                           ,p_start_bkpt       OUT NOCOPY NUMBER
6760                           ,p_end_bkpt         OUT NOCOPY NUMBER)
6761 IS
6762   /* get FY breakpoints */
6763   CURSOR fy_bkpts_c( p_vr_id            IN NUMBER
6764                     ,p_vr_comm_date     IN DATE
6765                     ,p_line_item_grp_id IN NUMBER
6766           ,p_bkpt_rate        IN NUMBER) IS
6767     SELECT
6768      NVL(SUM(fy_pr_grp_vol_start),0) AS bkpt_start
6769     ,NVL(SUM(fy_pr_grp_vol_end),0)   AS bkpt_end
6770     ,bkpt_rate
6771     FROM
6772     pn_var_trx_details_all
6773     WHERE
6774     trx_header_id IN
6775      (SELECT
6779       WHERE
6776       trx_header_id
6777       FROM
6778       pn_var_trx_headers_all
6780       var_rent_id = p_vr_id AND
6781       line_item_group_id = p_line_item_grp_id AND
6782       calc_prd_start_date <= (ADD_MONTHS(p_vr_comm_date, 12) - 1))
6783     AND bkpt_rate = p_bkpt_rate
6784     GROUP BY
6785     bkpt_rate
6786     ORDER BY
6787     bkpt_start;
6788 
6789 BEGIN
6790    FOR fy_bkpts_rec IN fy_bkpts_c( p_vr_id
6791                                   ,p_vr_comm_date
6792                                   ,p_line_item_grp_id
6793                                   ,p_bkpt_rate)
6794    LOOP
6795       p_start_bkpt := fy_bkpts_rec.bkpt_start ;
6796       p_end_bkpt   := fy_bkpts_rec.bkpt_end ;
6797    END LOOP;
6798 END first_year_bkpt;
6799 
6800 --------------------------------------------------------------------------------
6801 --  NAME         : ytd_start_bkpt
6802 --  DESCRIPTION  :
6803 --  PURPOSE      :
6804 --  INVOKED FROM :
6805 --  ARGUMENTS    :
6806 --  REFERENCE    :
6807 --  HISTORY      :
6808 --
6809 --  3.Nov.06  piagrawa    o Created
6810 --------------------------------------------------------------------------------
6811 FUNCTION ytd_start_bkpt( p_proration_rule IN VARCHAR2
6812                         ,p_trx_detail_id  IN NUMBER)
6813 RETURN NUMBER IS
6814 
6815   l_first_period                   VARCHAR2(1) := 'N';
6816   l_last_period                    VARCHAR2(1) := 'N';
6817   l_bkpt_start                     NUMBER := 0;
6818   l_bkpt_end                       NUMBER := 0;
6819   l_termination_date               DATE := NULL;
6820   l_commencement_date              DATE := NULL;
6821 
6822   -- Get the details of
6823   CURSOR first_period_cur (p_var_rent_id NUMBER, p_period_id NUMBER) IS
6824     SELECT pvp.period_id, pvr.commencement_date
6825       FROM pn_var_periods_all pvp, pn_var_rents_all pvr
6826      WHERE pvr.var_rent_id = p_var_rent_id
6827      AND   pvp.period_id = p_period_id
6828      AND   pvp.partial_period = 'Y'
6829      AND   pvp.start_date = pvr.commencement_date;
6830 
6831 
6832   -- Get the details of
6833   CURSOR last_period_cur (p_var_rent_id NUMBER, p_period_id NUMBER) IS
6834     SELECT pvp.period_id, pvr.termination_date
6835       FROM pn_var_periods_all pvp, pn_var_rents_all pvr
6836      WHERE pvr.var_rent_id = p_var_rent_id
6837      AND   pvp.period_id = p_period_id
6838      AND   pvp.partial_period = 'Y'
6839      AND   pvp.end_date   = pvr.termination_date;
6840 
6841    -- Get the details of
6842    CURSOR bkpts_cur IS
6843      SELECT dtls.ytd_group_vol_start,
6844             dtls.pr_grp_blended_vol_start,
6845             dtls.fy_pr_grp_vol_start,
6846             dtls.ly_pr_grp_vol_start,
6847           dtls.bkpt_rate,
6848             hdr.var_rent_id,
6849             hdr.period_id,
6850             hdr.line_item_group_id
6851        FROM pn_var_trx_details_all dtls, pn_var_trx_headers_all hdr
6852       WHERE dtls.trx_detail_id = p_trx_detail_id
6853       AND   hdr.trx_header_id =  dtls.trx_header_id;
6854 
6855 BEGIN
6856 
6857     FOR bkpts_rec IN bkpts_cur LOOP
6858 
6859       FOR first_period_rec IN first_period_cur (bkpts_rec.var_rent_id, bkpts_rec.period_id) LOOP
6860           l_first_period := 'Y';
6861           l_commencement_date := first_period_rec.commencement_date;
6862       END LOOP;
6863 
6864       FOR last_period_rec IN last_period_cur (bkpts_rec.var_rent_id, bkpts_rec.period_id) LOOP
6865           l_last_period := 'Y';
6866           l_termination_date := last_period_rec.termination_date;
6867       END LOOP;
6868 
6869       IF (p_proration_rule IN('CYP','CYNP'))
6870       THEN
6871          l_bkpt_start  :=   nvl(bkpts_rec.ytd_group_vol_start,bkpts_rec.pr_grp_blended_vol_start);
6872 
6873       ELSIF p_proration_rule IN('FY','FLY') AND l_first_period = 'Y'
6874       THEN
6875 
6876          pn_var_rent_calc_pkg.first_year_bkpt(bkpts_rec.var_rent_id,
6877                                               l_commencement_date,
6878                                               bkpts_rec.line_item_group_id,
6879                                               bkpts_rec.bkpt_rate,
6880                                               l_bkpt_start,
6881                                               l_bkpt_end);
6882 
6883       ELSIF p_proration_rule IN('LY','FLY') AND l_last_period = 'Y'
6884       THEN
6885 
6886          pn_var_rent_calc_pkg.last_year_bkpt( bkpts_rec.var_rent_id,
6887                                               l_termination_date,
6888                                               bkpts_rec.line_item_group_id,
6889                                               bkpts_rec.bkpt_rate,
6890                                               l_bkpt_start,
6891                                               l_bkpt_end);
6892 
6893       ELSE
6894          l_bkpt_start  :=   bkpts_rec.ytd_group_vol_start;
6895 
6896       END IF;
6897 
6898     END LOOP;
6899 
6900     RETURN l_bkpt_start;
6901 
6902 END ytd_start_bkpt;
6903 
6904 --------------------------------------------------------------------------------
6905 --  NAME         : ytd_end_bkpt
6906 --  DESCRIPTION  :
6907 --  PURPOSE      :
6908 --  INVOKED FROM :
6909 --  ARGUMENTS    :
6910 --  REFERENCE    :
6911 --  HISTORY      :
6912 --
6913 --  3.Nov.06  piagrawa    o Created
6917 RETURN NUMBER IS
6914 --------------------------------------------------------------------------------
6915 FUNCTION ytd_end_bkpt( p_proration_rule IN VARCHAR2
6916                         ,p_trx_detail_id  IN NUMBER)
6918 
6919   l_first_period                   VARCHAR2(1) := 'N';
6920   l_last_period                    VARCHAR2(1) := 'N';
6921   l_bkpt_start                     NUMBER := 0;
6922   l_bkpt_end                       NUMBER := 0;
6923   l_termination_date               DATE := NULL;
6924   l_commencement_date              DATE := NULL;
6925 
6926   -- Get the details of
6927   CURSOR first_period_cur (p_var_rent_id NUMBER, p_period_id NUMBER) IS
6928     SELECT pvp.period_id, pvr.commencement_date
6929       FROM pn_var_periods_all pvp, pn_var_rents_all pvr
6930      WHERE pvr.var_rent_id = p_var_rent_id
6931      AND   pvp.period_id = p_period_id
6932      AND   pvp.partial_period = 'Y'
6933      AND   pvp.start_date = pvr.commencement_date;
6934 
6935 
6936   -- Get the details of
6937   CURSOR last_period_cur (p_var_rent_id NUMBER, p_period_id NUMBER) IS
6938     SELECT pvp.period_id, pvr.termination_date
6939       FROM pn_var_periods_all pvp, pn_var_rents_all pvr
6940      WHERE pvr.var_rent_id = p_var_rent_id
6941      AND   pvp.period_id = p_period_id
6942      AND   pvp.partial_period = 'Y'
6943      AND   pvp.end_date   = pvr.termination_date;
6944 
6945    -- Get the details of
6946    CURSOR bkpts_cur IS
6947      SELECT dtls.ytd_group_vol_start,
6948             dtls.pr_grp_blended_vol_start,
6949             dtls.fy_pr_grp_vol_start,
6950             dtls.ly_pr_grp_vol_start,
6951             dtls.ytd_group_vol_end,
6952             dtls.pr_grp_blended_vol_end,
6953             dtls.fy_pr_grp_vol_end,
6954             dtls.ly_pr_grp_vol_end,
6955        dtls.bkpt_rate,
6956             hdr.var_rent_id,
6957             hdr.period_id,
6958        hdr.line_item_group_id
6959        FROM pn_var_trx_details_all dtls, pn_var_trx_headers_all hdr
6960       WHERE dtls.trx_detail_id = p_trx_detail_id
6961       AND   hdr.trx_header_id =  dtls.trx_header_id;
6962 
6963 BEGIN
6964 
6965     FOR bkpts_rec IN bkpts_cur LOOP
6966 
6967       FOR first_period_rec IN first_period_cur (bkpts_rec.var_rent_id, bkpts_rec.period_id) LOOP
6968           l_first_period := 'Y';
6969           l_commencement_date := first_period_rec.commencement_date;
6970       END LOOP;
6971 
6972       FOR last_period_rec IN last_period_cur (bkpts_rec.var_rent_id, bkpts_rec.period_id) LOOP
6973           l_last_period := 'Y';
6974           l_termination_date := last_period_rec.termination_date;
6975       END LOOP;
6976 
6977       IF (p_proration_rule IN('CYP','CYNP'))
6978       THEN
6979          l_bkpt_start  :=   nvl(bkpts_rec.ytd_group_vol_start,bkpts_rec.pr_grp_blended_vol_start);
6980          l_bkpt_end    :=   nvl(bkpts_rec.ytd_group_vol_end,bkpts_rec.pr_grp_blended_vol_end);
6981 
6982       ELSIF p_proration_rule IN('FY','FLY') AND l_first_period = 'Y'
6983       THEN
6984 
6985          pn_var_rent_calc_pkg.first_year_bkpt(bkpts_rec.var_rent_id,
6986                                               l_commencement_date,
6987                                               bkpts_rec.line_item_group_id,
6988                                               bkpts_rec.bkpt_rate,
6989                                               l_bkpt_start,
6990                                               l_bkpt_end);
6991 
6992       ELSIF p_proration_rule IN('LY','FLY') AND l_last_period = 'Y'
6993       THEN
6994 
6995          pn_var_rent_calc_pkg.last_year_bkpt( bkpts_rec.var_rent_id,
6996                                               l_termination_date,
6997                                               bkpts_rec.line_item_group_id,
6998                                               bkpts_rec.bkpt_rate,
6999                                               l_bkpt_start,
7000                                               l_bkpt_end);
7001 
7002       ELSE
7003          l_bkpt_start  :=   bkpts_rec.ytd_group_vol_start;
7004          l_bkpt_end    :=   bkpts_rec.ytd_group_vol_end;
7005 
7006       END IF;
7007 
7008       l_bkpt_end := pn_var_rent_calc_pkg.end_breakpoint(l_bkpt_start, l_bkpt_end);
7009 
7010     END LOOP;
7011 
7012     RETURN l_bkpt_end;
7013 
7014 END ytd_end_bkpt;
7015 
7016 --------------------------------------------------------------------------------
7017 --  NAME         : overage_cal
7018 --  DESCRIPTION  :
7019 --  PURPOSE      :
7020 --  INVOKED FROM :
7021 --  ARGUMENTS    :
7022 --  REFERENCE    :
7023 --  HISTORY      :
7024 --
7025 --  3.Nov.06  Ram Kumar     o Created
7026 --------------------------------------------------------------------------------
7027 FUNCTION overage_cal(p_proration_rule IN VARCHAR2,
7028                      p_calculation_method IN VARCHAR2,
7029                      detail_id IN NUMBER) RETURN NUMBER IS
7030 
7031 l_group_sales                    NUMBER := 0;
7032 l_group_deductions               NUMBER := 0;
7033 l_bkpt_start                     NUMBER := 0;
7034 l_bkpt_end                       NUMBER := 0;
7035 overage                          NUMBER :=  0;
7036 l_applicable_sales               NUMBER := 0;
7037 l_first_period                   VARCHAR2(1) := 'N';
7038 l_last_period                    VARCHAR2(1) := 'N';
7039 l_termination_date               DATE := NULL;
7040 l_commencement_date              DATE := NULL;
7041 
7045   FROM  pn_var_trx_headers_all
7042 /* This cursor fetches applicable sales for cumulative */
7043 CURSOR total_sales_C (p_trx_header_id NUMBER) IS
7044   SELECT (NVL(ytd_sales, 0) - NVL(ytd_deductions, 0)) applicable_sales
7046   WHERE trx_header_id = p_trx_header_id;
7047 
7048   -- Get the details of
7049   CURSOR first_period_cur (p_var_rent_id NUMBER, p_period_id NUMBER) IS
7050     SELECT pvp.period_id, pvr.commencement_date
7051       FROM pn_var_periods_all pvp, pn_var_rents_all pvr
7052      WHERE pvr.var_rent_id = p_var_rent_id
7053      AND   pvp.period_id = p_period_id
7054      AND   pvp.partial_period = 'Y'
7055      AND   pvp.start_date = pvr.commencement_date;
7056 
7057 
7058   -- Get the details of
7059   CURSOR last_period_cur (p_var_rent_id NUMBER, p_period_id NUMBER) IS
7060     SELECT pvp.period_id, pvr.termination_date
7061       FROM pn_var_periods_all pvp, pn_var_rents_all pvr
7062      WHERE pvr.var_rent_id = p_var_rent_id
7063      AND   pvp.period_id = p_period_id
7064      AND   pvp.partial_period = 'Y'
7065      AND   pvp.end_date   = pvr.termination_date;
7066 
7067 CURSOR overage_cur IS
7068   SELECT  hdr.trx_header_id,
7069           hdr.calc_prd_start_date,
7070           hdr.period_id,
7071           hdr.var_rent_id,
7072           hdr.line_item_group_id,
7073           dtls.bkpt_rate,
7074           dtls.prorated_grp_vol_start,
7075           dtls.prorated_grp_vol_end,
7076           dtls.ytd_group_vol_start,
7077           dtls.ytd_group_vol_end,
7078           dtls.blended_period_vol_start,
7079           dtls.blended_period_vol_end,
7080           dtls.FY_PR_GRP_VOL_START,
7081           dtls.FY_PR_GRP_VOL_END,
7082           dtls.LY_PR_GRP_VOL_START,
7083           dtls.LY_PR_GRP_VOL_END,
7084           dtls.PR_GRP_BLENDED_VOL_START,
7085           dtls.PR_GRP_BLENDED_VOL_END,
7086           hdr.prorated_group_sales,
7087           hdr.ytd_sales,
7088           hdr.prorated_group_deductions,
7089           hdr.ytd_deductions
7090   FROM    pn_var_trx_headers_all hdr,
7091           pn_var_trx_details_all dtls
7092   WHERE   hdr.trx_header_id=dtls.trx_header_id
7093   AND dtls.trx_detail_id = detail_id;
7094 
7095 BEGIN
7096 
7097   FOR overage_rec IN overage_cur LOOP
7098 
7099     FOR first_period_rec IN first_period_cur (overage_rec.var_rent_id, overage_rec.period_id) LOOP
7100         l_first_period := 'Y';
7101         l_commencement_date := first_period_rec.commencement_date;
7102     END LOOP;
7103 
7104     FOR last_period_rec IN last_period_cur (overage_rec.var_rent_id, overage_rec.period_id) LOOP
7105         l_last_period := 'Y';
7106         l_termination_date := last_period_rec.termination_date;
7107     END LOOP;
7108 
7109     IF p_proration_rule IN('FY','FLY') AND l_first_period = 'Y'
7110     THEN
7111 
7112        pn_var_rent_calc_pkg.first_year_bkpt(overage_rec.var_rent_id, l_commencement_date,
7113                                             overage_rec.line_item_group_id, overage_rec.bkpt_rate,
7114                                             l_bkpt_start, l_bkpt_end);
7115 
7116        l_applicable_sales := pn_var_rent_calc_pkg.first_year_sales( overage_rec.var_rent_id
7117                                                                   ,l_commencement_date
7118                                                                   ,overage_rec.line_item_group_id);
7119 
7120     ELSIF p_proration_rule IN('LY','FLY') AND l_last_period = 'Y'
7121     THEN
7122 
7123        pn_var_rent_calc_pkg.last_year_bkpt( overage_rec.var_rent_id, l_termination_date,
7124                                             overage_rec.line_item_group_id, overage_rec.bkpt_rate,
7125                                             l_bkpt_start, l_bkpt_end);
7126 
7127        l_applicable_sales := pn_var_rent_calc_pkg.last_year_sales( overage_rec.var_rent_id
7128                                                                   ,l_termination_date
7129                                                                   ,overage_rec.line_item_group_id);
7130     ELSE
7131        FOR rec IN total_sales_C(overage_rec.trx_header_id)  LOOP
7132          l_applicable_sales := rec.applicable_sales;
7133        END LOOP;
7134 
7135        IF  p_calculation_method IN ('N', 'T')
7136        THEN
7137           l_applicable_sales := (overage_rec.prorated_group_sales - NVL(overage_rec.prorated_group_deductions,0));
7138 
7139        ELSIF p_calculation_method IN ('Y', 'C')
7140        THEN
7141           l_applicable_sales := (overage_rec.ytd_sales - NVL(overage_rec.ytd_deductions,0));
7142 
7143        END IF;
7144 
7145        IF  p_calculation_method IN ('N', 'T')
7146        THEN
7147           IF p_proration_rule IN ('CYNP') THEN
7148 
7149             l_bkpt_start := NVL(overage_rec.pr_grp_blended_vol_start
7150                                 ,overage_rec.prorated_grp_vol_start);
7151             l_bkpt_end   := NVL(overage_rec.pr_grp_blended_vol_end
7152                                 ,overage_rec.prorated_grp_vol_end);
7153 
7154           ELSE
7155 
7156             l_bkpt_start := overage_rec.prorated_grp_vol_start;
7157             l_bkpt_end   := overage_rec.prorated_grp_vol_end;
7158 
7159           END IF;
7160 
7161        ELSIF p_calculation_method IN ('Y')
7162        THEN
7163 
7164          l_bkpt_start  :=   overage_rec.ytd_group_vol_start;
7165          l_bkpt_end    :=   overage_rec.ytd_group_vol_end;
7166 
7167        ELSIF p_calculation_method IN ('C')
7171 
7168        THEN
7169 
7170           IF p_proration_rule IN ('NP') THEN
7172             l_bkpt_start := overage_rec.prorated_grp_vol_start;
7173             l_bkpt_end   := overage_rec.prorated_grp_vol_end;
7174 
7175           ELSE
7176 
7177             l_bkpt_start := overage_rec.blended_period_vol_start;
7178             l_bkpt_end   := overage_rec.blended_period_vol_end;
7179 
7180           END IF;
7181 
7182        END IF;
7183 
7184     END IF;
7185 
7186     IF(l_bkpt_end = 0) THEN
7187        overage := greatest(l_applicable_sales - l_bkpt_start,0);
7188     ELSE
7189        IF((l_applicable_sales >= l_bkpt_start) AND (l_applicable_sales <= l_bkpt_end)) THEN
7190            overage :=  l_applicable_sales - l_bkpt_start;
7191        ELSIF(l_applicable_sales > l_bkpt_end) THEN
7192            overage := l_bkpt_end - l_bkpt_start;
7193        ELSIF(l_applicable_sales < l_bkpt_start) THEN
7194            overage := 0;
7195        END IF;
7196     END IF;
7197 
7198   END LOOP;
7199 
7200   return overage;
7201 
7202   EXCEPTION
7203   WHEN OTHERS THEN RAISE;
7204 END overage_cal;
7205 
7206 --------------------------------------------------------------------------------
7207 --  NAME         : first_year_sales
7208 --  DESCRIPTION  :
7209 --  PURPOSE      :
7210 --  INVOKED FROM :
7211 --  ARGUMENTS    :
7212 --  REFERENCE    :
7213 --  HISTORY      :
7214 --
7215 --  3.Nov.06  piagrawa    o Created
7216 --------------------------------------------------------------------------------
7217 FUNCTION first_year_sales( p_vr_id            IN NUMBER
7218                            ,p_vr_comm_date     IN DATE
7219                            ,p_line_item_grp_id IN NUMBER)
7220 RETURN NUMBER IS
7221 
7222   /* get FY sales */
7223   CURSOR fy_sales_c( p_vr_id            IN NUMBER
7224                     ,p_vr_comm_date     IN DATE
7225                     ,p_line_item_grp_id IN NUMBER) IS
7226     SELECT
7227     NVL(SUM(fy_proration_sales - NVL(fy_proration_deductions,0) ),0) AS sales
7228     FROM
7229     pn_var_trx_headers_all
7230     WHERE
7231     var_rent_id = p_vr_id AND
7232     line_item_group_id = p_line_item_grp_id AND
7233     calc_prd_start_date <= (ADD_MONTHS(p_vr_comm_date, 12) - 1) ;
7234 
7235   l_sales NUMBER := 0;
7236 
7237 BEGIN
7238    FOR fy_sales_rec IN fy_sales_c( p_vr_id
7239                                   ,p_vr_comm_date
7240                                   ,p_line_item_grp_id)
7241    LOOP
7242       l_sales := fy_sales_rec.sales ;
7243    END LOOP;
7244 
7245    RETURN l_sales;
7246 
7247 END first_year_sales;
7248 
7249 --------------------------------------------------------------------------------
7250 --  NAME         : last_year_sales
7251 --  DESCRIPTION  :
7252 --  PURPOSE      :
7253 --  INVOKED FROM :
7254 --  ARGUMENTS    :
7255 --  REFERENCE    :
7256 --  HISTORY      :
7257 --
7258 --  3.Nov.06  piagrawa    o Created
7259 --------------------------------------------------------------------------------
7260 FUNCTION last_year_sales( p_vr_id            IN NUMBER
7261                            ,p_vr_comm_date     IN DATE
7262                            ,p_line_item_grp_id IN NUMBER)
7263 RETURN NUMBER IS
7264 
7265   /* get LY sales */
7266   CURSOR ly_sales_c( p_vr_id            IN NUMBER
7267                     ,p_vr_term_date     IN DATE
7268                     ,p_line_item_grp_id IN NUMBER) IS
7269     SELECT
7270     NVL(SUM(ly_proration_sales - NVL(ly_proration_deductions,0) ),0) AS sales
7271     FROM
7272     pn_var_trx_headers_all
7273     WHERE
7274     var_rent_id = p_vr_id AND
7275     line_item_group_id = p_line_item_grp_id AND
7276     calc_prd_end_date >= (ADD_MONTHS(p_vr_term_date, -12) + 1);
7277 
7278   l_sales NUMBER := 0;
7279 
7280 BEGIN
7281    FOR ly_sales_rec IN ly_sales_c( p_vr_id
7282                                   ,p_vr_comm_date
7283                                   ,p_line_item_grp_id)
7284    LOOP
7285       l_sales := ly_sales_rec.sales ;
7286    END LOOP;
7287 
7288    RETURN l_sales;
7289 
7290 END last_year_sales;
7291 
7292 
7293 --------------------------------------------------------------------------------
7294 --  NAME         : group_sales
7295 --  DESCRIPTION  :
7296 --  PURPOSE      :
7297 --  INVOKED FROM :
7298 --  ARGUMENTS    :
7299 --  REFERENCE    :
7300 --  HISTORY      :
7301 --
7302 --  3.Nov.06  piagrawa    o Created
7303 --------------------------------------------------------------------------------
7304 FUNCTION group_sales( p_proration_rule   IN VARCHAR2,
7305                                   p_trx_detail_id    IN NUMBER,
7306                                   p_calculation_type IN VARCHAR2)
7307 RETURN NUMBER IS
7308 
7309 -- Get the details of
7310   CURSOR first_period_cur (p_var_rent_id NUMBER, p_period_id NUMBER) IS
7311     SELECT pvp.period_id, pvr.commencement_date
7312       FROM pn_var_periods_all pvp, pn_var_rents_all pvr
7313      WHERE pvr.var_rent_id = p_var_rent_id
7314      AND   pvp.period_id = p_period_id
7315      AND   pvp.partial_period = 'Y'
7316      AND   pvp.start_date = pvr.commencement_date;
7317 
7318 
7319   -- Get the details of
7320   CURSOR last_period_cur (p_var_rent_id NUMBER, p_period_id NUMBER) IS
7324      AND   pvp.period_id = p_period_id
7321     SELECT pvp.period_id, pvr.termination_date
7322       FROM pn_var_periods_all pvp, pn_var_rents_all pvr
7323      WHERE pvr.var_rent_id = p_var_rent_id
7325      AND   pvp.partial_period = 'Y'
7326      AND   pvp.end_date   = pvr.termination_date;
7327 
7328   /* get FY sales */
7329   CURSOR fy_sales_c( p_vr_id            IN NUMBER
7330                     ,p_vr_comm_date     IN DATE
7331                     ,p_line_item_grp_id IN NUMBER) IS
7332     SELECT
7333     NVL(SUM(fy_proration_sales),0) AS sales
7334     FROM
7335     pn_var_trx_headers_all
7336     WHERE
7337     var_rent_id = p_vr_id AND
7338     line_item_group_id = p_line_item_grp_id AND
7339     calc_prd_start_date <= (ADD_MONTHS(p_vr_comm_date, 12) - 1) ;
7340 
7341   /* get LY sales */
7342   CURSOR ly_sales_c( p_vr_id            IN NUMBER
7343                     ,p_vr_term_date     IN DATE
7344                     ,p_line_item_grp_id IN NUMBER) IS
7345     SELECT
7346     NVL(SUM(ly_proration_sales),0) AS sales
7347     FROM
7348     pn_var_trx_headers_all
7349     WHERE
7350     var_rent_id = p_vr_id AND
7351     line_item_group_id = p_line_item_grp_id AND
7352     calc_prd_end_date >= (ADD_MONTHS(p_vr_term_date, -12) + 1);
7353 
7354    -- Get the details of
7355    CURSOR sales_cur IS
7356      SELECT hdr.ytd_sales,
7357             hdr.reporting_group_sales,
7358             hdr.prorated_group_sales,
7359             hdr.line_item_group_id,
7360                   hdr.period_id,
7361                   hdr.var_rent_id
7362       FROM pn_var_trx_headers_all hdr,
7363            pn_var_trx_details_all dtls
7364       WHERE hdr.trx_header_id = dtls.trx_header_id
7365       AND   dtls.trx_detail_id  = p_trx_detail_id;
7366 
7367 l_sales                          NUMBER := 0;
7368 l_first_period                   VARCHAR2(1) := 'N';
7369 l_last_period                    VARCHAR2(1) := 'N';
7370 l_termination_date               DATE := NULL;
7371 l_commencement_date              DATE := NULL;
7372 l_applicable_sales               NUMBER := 0;
7373 
7374 BEGIN
7375 
7376  FOR sales_rec IN sales_cur LOOP
7377 
7378     FOR first_period_rec IN first_period_cur (sales_rec.var_rent_id, sales_rec.period_id) LOOP
7379         l_first_period := 'Y';
7380         l_commencement_date := first_period_rec.commencement_date;
7381     END LOOP;
7382 
7383     FOR last_period_rec IN last_period_cur (sales_rec.var_rent_id, sales_rec.period_id) LOOP
7384         l_last_period := 'Y';
7385         l_termination_date := last_period_rec.termination_date;
7386     END LOOP;
7387 
7388     IF p_proration_rule IN('FY','FLY') AND l_first_period = 'Y'
7389     THEN
7390 
7391       FOR fy_sales_rec IN fy_sales_c(  sales_rec.var_rent_id
7392                                      , l_commencement_date
7393                                      , sales_rec.line_item_group_id)
7394       LOOP
7395         l_applicable_sales := fy_sales_rec.sales ;
7396       END LOOP;
7397 
7398     ELSIF p_proration_rule IN('LY','FLY') AND l_last_period = 'Y'
7399     THEN
7400 
7401       FOR ly_sales_rec IN ly_sales_c( sales_rec.var_rent_id
7402                                      ,l_termination_date
7403                                      ,sales_rec.line_item_group_id)
7404       LOOP
7405         l_applicable_sales := ly_sales_rec.sales ;
7406       END LOOP;
7407 
7408     ELSE
7409 
7410       l_applicable_sales := sales_rec.prorated_group_sales;
7411       /* IF p_calculation_type = 'Y' THEN
7412         l_applicable_sales := sales_rec.ytd_sales;
7413       ELSIF p_calculation_type = 'T' THEN
7414         l_applicable_sales := sales_rec.prorated_group_sales;
7415       ELSIF p_calculation_type = 'C' THEN
7416         l_applicable_sales := sales_rec.reporting_group_sales;
7417       END IF; */
7418 
7419     END IF;
7420 
7421   END LOOP;
7422 
7423   return NVL(l_applicable_sales, 0);
7424 
7425 END group_sales;
7426 
7427 --------------------------------------------------------------------------------
7428 --  NAME         : net_volume
7429 --  DESCRIPTION  :
7430 --  PURPOSE      :
7431 --  INVOKED FROM :
7432 --  ARGUMENTS    :
7433 --  REFERENCE    :
7434 --  HISTORY      :
7435 --
7436 --  3.Nov.06  piagrawa    o Created
7437 --------------------------------------------------------------------------------
7438 FUNCTION net_volume( p_proration_rule   IN VARCHAR2,
7439            p_trx_detail_id    IN NUMBER,
7440            p_calculation_type IN VARCHAR2)
7441 RETURN NUMBER IS
7442 
7443 -- Get the details of
7444   CURSOR first_period_cur (p_var_rent_id NUMBER, p_period_id NUMBER) IS
7445     SELECT pvp.period_id, pvr.commencement_date
7446       FROM pn_var_periods_all pvp, pn_var_rents_all pvr
7447      WHERE pvr.var_rent_id = p_var_rent_id
7448      AND   pvp.period_id = p_period_id
7449      AND   pvp.partial_period = 'Y'
7450      AND   pvp.start_date = pvr.commencement_date;
7451 
7452 
7453   -- Get the details of
7454   CURSOR last_period_cur (p_var_rent_id NUMBER, p_period_id NUMBER) IS
7455     SELECT pvp.period_id, pvr.termination_date
7456       FROM pn_var_periods_all pvp, pn_var_rents_all pvr
7457      WHERE pvr.var_rent_id = p_var_rent_id
7458      AND   pvp.period_id = p_period_id
7459      AND   pvp.partial_period = 'Y'
7460      AND   pvp.end_date   = pvr.termination_date;
7461 
7465             hdr.reporting_group_sales,
7462    -- Get the details of
7463    CURSOR sales_cur IS
7464      SELECT hdr.ytd_sales,
7466             hdr.prorated_group_sales,
7467             hdr.line_item_group_id,
7468             hdr.prorated_group_deductions,
7469             hdr.reporting_group_deductions,
7470             hdr.ytd_deductions,
7471             hdr.period_id,
7472             hdr.var_rent_id
7473       FROM pn_var_trx_headers_all hdr,
7474            pn_var_trx_details_all dtls
7475       WHERE hdr.trx_header_id = dtls.trx_header_id
7476       AND   dtls.trx_detail_id  = p_trx_detail_id;
7477 
7478 l_sales                          NUMBER := 0;
7479 l_first_period                   VARCHAR2(1) := 'N';
7480 l_last_period                    VARCHAR2(1) := 'N';
7481 l_termination_date               DATE := NULL;
7482 l_commencement_date              DATE := NULL;
7483 l_applicable_sales               NUMBER := 0;
7484 
7485 BEGIN
7486 
7487  FOR sales_rec IN sales_cur LOOP
7488 
7489     FOR first_period_rec IN first_period_cur (sales_rec.var_rent_id, sales_rec.period_id) LOOP
7490         l_first_period := 'Y';
7491         l_commencement_date := first_period_rec.commencement_date;
7492     END LOOP;
7493 
7494     FOR last_period_rec IN last_period_cur (sales_rec.var_rent_id, sales_rec.period_id) LOOP
7495         l_last_period := 'Y';
7496         l_termination_date := last_period_rec.termination_date;
7497     END LOOP;
7498 
7499     IF p_proration_rule IN('FY','FLY') AND l_first_period = 'Y'
7500     THEN
7501 
7502         l_applicable_sales := pn_var_rent_calc_pkg.first_year_sales( sales_rec.var_rent_id
7503                                                                     ,l_commencement_date
7504                                                                     ,sales_rec.line_item_group_id);
7505 
7506     ELSIF p_proration_rule IN('LY','FLY') AND l_last_period = 'Y'
7507     THEN
7508 
7509          l_applicable_sales := pn_var_rent_calc_pkg.last_year_sales( sales_rec.var_rent_id
7510                                                                     ,l_termination_date
7511                                                                     ,sales_rec.line_item_group_id);
7512 
7513     ELSE
7514 
7515       l_applicable_sales :=  NVL(sales_rec.prorated_group_sales, 0)
7516                              - NVL(sales_rec.prorated_group_deductions, 0);
7517       /* IF p_calculation_type = 'Y' THEN
7518         l_applicable_sales :=  NVL(sales_rec.ytd_sales, 0)
7519                              - NVL(sales_rec.ytd_deductions, 0);
7520       ELSIF p_calculation_type = 'T' THEN
7521         l_applicable_sales :=  NVL(sales_rec.prorated_group_sales, 0)
7522                              - NVL(sales_rec.prorated_group_deductions, 0);
7523       ELSIF p_calculation_type = 'C' THEN
7524         l_applicable_sales :=  NVL(sales_rec.reporting_group_sales, 0)
7525                              - NVL(sales_rec.reporting_group_deductions, 0);
7526       END IF; */
7527 
7528     END IF;
7529 
7530   END LOOP;
7531 
7532   return l_applicable_sales;
7533 
7534 END net_volume;
7535 
7536 --------------------------------------------------------------------------------
7537 --  NAME         : group_deductions
7538 --  DESCRIPTION  :
7539 --  PURPOSE      :
7540 --  INVOKED FROM :
7541 --  ARGUMENTS    :
7542 --  REFERENCE    :
7543 --  HISTORY      :
7544 --
7545 --  3.Nov.06  piagrawa    o Created
7546 --------------------------------------------------------------------------------
7547 FUNCTION group_deductions( p_proration_rule   IN VARCHAR2,
7548                                   p_trx_detail_id    IN NUMBER,
7549                                   p_calculation_type IN VARCHAR2)
7550 RETURN NUMBER IS
7551 
7552 -- Get the details of
7553   CURSOR first_period_cur (p_var_rent_id NUMBER, p_period_id NUMBER) IS
7554     SELECT pvp.period_id, pvr.commencement_date
7555       FROM pn_var_periods_all pvp, pn_var_rents_all pvr
7556      WHERE pvr.var_rent_id = p_var_rent_id
7557      AND   pvp.period_id = p_period_id
7558      AND   pvp.partial_period = 'Y'
7559      AND   pvp.start_date = pvr.commencement_date;
7560 
7561 
7562   -- Get the details of
7563   CURSOR last_period_cur (p_var_rent_id NUMBER, p_period_id NUMBER) IS
7564     SELECT pvp.period_id, pvr.termination_date
7565       FROM pn_var_periods_all pvp, pn_var_rents_all pvr
7566      WHERE pvr.var_rent_id = p_var_rent_id
7567      AND   pvp.period_id = p_period_id
7568      AND   pvp.partial_period = 'Y'
7569      AND   pvp.end_date   = pvr.termination_date;
7570 
7571   /* get FY sales */
7572   CURSOR fy_deductions_c( p_vr_id            IN NUMBER
7573                     ,p_vr_comm_date     IN DATE
7574                     ,p_line_item_grp_id IN NUMBER) IS
7575     SELECT
7576     NVL(SUM(fy_proration_deductions),0) AS deductions
7577     FROM
7578     pn_var_trx_headers_all
7579     WHERE
7580     var_rent_id = p_vr_id AND
7581     line_item_group_id = p_line_item_grp_id AND
7582     calc_prd_start_date <= (ADD_MONTHS(p_vr_comm_date, 12) - 1) ;
7583 
7584   /* get LY sales */
7585   CURSOR ly_deductions_c( p_vr_id            IN NUMBER
7586                     ,p_vr_term_date     IN DATE
7587                     ,p_line_item_grp_id IN NUMBER) IS
7588     SELECT
7589     NVL(SUM(ly_proration_deductions),0) AS deductions
7590     FROM
7591     pn_var_trx_headers_all
7592     WHERE
7596 
7593     var_rent_id = p_vr_id AND
7594     line_item_group_id = p_line_item_grp_id AND
7595     calc_prd_end_date >= (ADD_MONTHS(p_vr_term_date, -12) + 1);
7597    -- Get the details of
7598    CURSOR deductions_cur IS
7599      SELECT hdr.prorated_group_deductions,
7600             hdr.reporting_group_deductions,
7601             hdr.ytd_deductions,
7602             hdr.line_item_group_id,
7603                   hdr.period_id,
7604                   hdr.var_rent_id
7605       FROM pn_var_trx_headers_all hdr,
7606            pn_var_trx_details_all dtls
7607       WHERE hdr.trx_header_id = dtls.trx_header_id
7608       AND   dtls.trx_detail_id  = p_trx_detail_id;
7609 
7610 l_first_period                   VARCHAR2(1) := 'N';
7611 l_last_period                    VARCHAR2(1) := 'N';
7612 l_termination_date               DATE := NULL;
7613 l_commencement_date              DATE := NULL;
7614 l_applicable_deductions          NUMBER := 0;
7615 
7616 BEGIN
7617 
7618  FOR deductions_rec IN deductions_cur LOOP
7619 
7620     FOR first_period_rec IN first_period_cur (deductions_rec.var_rent_id, deductions_rec.period_id) LOOP
7621         l_first_period := 'Y';
7622         l_commencement_date := first_period_rec.commencement_date;
7623     END LOOP;
7624 
7625     FOR last_period_rec IN last_period_cur (deductions_rec.var_rent_id, deductions_rec.period_id) LOOP
7626         l_last_period := 'Y';
7627         l_termination_date := last_period_rec.termination_date;
7628     END LOOP;
7629 
7630     IF p_proration_rule IN('FY','FLY') AND l_first_period = 'Y'
7631     THEN
7632 
7633       FOR fy_deductions_rec IN fy_deductions_c(  deductions_rec.var_rent_id
7634                                      , l_commencement_date
7635                                      , deductions_rec.line_item_group_id)
7636       LOOP
7637         l_applicable_deductions := fy_deductions_rec.deductions ;
7638       END LOOP;
7639 
7640     ELSIF p_proration_rule IN('LY','FLY') AND l_last_period = 'Y'
7641     THEN
7642 
7643       FOR ly_deductions_rec IN ly_deductions_c( deductions_rec.var_rent_id
7644                                      ,l_termination_date
7645                                      ,deductions_rec.line_item_group_id)
7646       LOOP
7647         l_applicable_deductions := ly_deductions_rec.deductions ;
7648       END LOOP;
7649 
7650     ELSE
7651 
7652       l_applicable_deductions := deductions_rec.prorated_group_deductions;
7653       /* IF p_calculation_type = 'Y' THEN
7654         l_applicable_deductions := deductions_rec.ytd_deductions;
7655       ELSIF p_calculation_type = 'T' THEN
7656         l_applicable_deductions := deductions_rec.prorated_group_deductions;
7657       ELSIF p_calculation_type = 'C' THEN
7658         l_applicable_deductions := deductions_rec.reporting_group_deductions;
7659       END IF; */
7660 
7661     END IF;
7662 
7663   END LOOP;
7664 
7665   return NVL(l_applicable_deductions, 0);
7666 
7667 END group_deductions;
7668 
7669 --------------------------------------------------------------------------------
7670 --  NAME         : net_volume
7671 --  DESCRIPTION  :
7672 --  PURPOSE      :
7673 --  INVOKED FROM :
7674 --  ARGUMENTS    :
7675 --  REFERENCE    :
7676 --  HISTORY      :
7677 --
7678 --  3.Nov.06  piagrawa    o Created
7679 --------------------------------------------------------------------------------
7680 FUNCTION cumulative_volume( p_proration_rule   IN VARCHAR2,
7681            p_trx_detail_id    IN NUMBER,
7682            p_calculation_type IN VARCHAR2)
7683 RETURN NUMBER IS
7684 
7685 -- Get the details of
7686   CURSOR first_period_cur (p_var_rent_id NUMBER, p_period_id NUMBER) IS
7687     SELECT pvp.period_id, pvr.commencement_date
7688       FROM pn_var_periods_all pvp, pn_var_rents_all pvr
7689      WHERE pvr.var_rent_id = p_var_rent_id
7690      AND   pvp.period_id = p_period_id
7691      AND   pvp.partial_period = 'Y'
7692      AND   pvp.start_date = pvr.commencement_date;
7693 
7694 
7695   -- Get the details of
7696   CURSOR last_period_cur (p_var_rent_id NUMBER, p_period_id NUMBER) IS
7697     SELECT pvp.period_id, pvr.termination_date
7698       FROM pn_var_periods_all pvp, pn_var_rents_all pvr
7699      WHERE pvr.var_rent_id = p_var_rent_id
7700      AND   pvp.period_id = p_period_id
7701      AND   pvp.partial_period = 'Y'
7702      AND   pvp.end_date   = pvr.termination_date;
7703 
7704    -- Get the details of
7705    CURSOR sales_cur IS
7706      SELECT hdr.ytd_sales,
7707             hdr.ytd_deductions,
7708             hdr.line_item_group_id,
7709             hdr.period_id,
7710             hdr.var_rent_id,
7711             hdr.trx_header_id,
7712             hdr.calc_prd_start_date,
7713             hdr.line_item_id
7714       FROM pn_var_trx_headers_all hdr,
7715            pn_var_trx_details_all dtls
7716       WHERE hdr.trx_header_id = dtls.trx_header_id
7717       AND   dtls.trx_detail_id  = p_trx_detail_id;
7718 
7719    -- Get the details of
7720    /*CURSOR cum_sales_cur (p_period_id NUMBER,
7721                          p_line_item_id NUMBER,
7722                          p_calc_period_start_date DATE) IS
7723      SELECT NVL(SUM(hdr.prorated_group_sales), 0) - NVL(SUM(hdr.prorated_group_deductions), 0) sales
7724      FROM pn_var_trx_headers_all hdr
7725      WHERE hdr.period_id = p_period_id
7726      AND   hdr.line_item_id = p_line_item_id
7730 
7727      AND   hdr.calc_prd_start_date <= p_calc_period_start_date
7728      ORDER BY calc_prd_start_date;*/
7729 
7731 l_sales                          NUMBER := 0;
7732 l_first_period                   VARCHAR2(1) := 'N';
7733 l_last_period                    VARCHAR2(1) := 'N';
7734 l_termination_date               DATE := NULL;
7735 l_commencement_date              DATE := NULL;
7736 l_applicable_sales               NUMBER := 0;
7737 
7738 BEGIN
7739 
7740  FOR sales_rec IN sales_cur LOOP
7741 
7742     FOR first_period_rec IN first_period_cur (sales_rec.var_rent_id, sales_rec.period_id) LOOP
7743         l_first_period := 'Y';
7744         l_commencement_date := first_period_rec.commencement_date;
7745     END LOOP;
7746 
7747     FOR last_period_rec IN last_period_cur (sales_rec.var_rent_id, sales_rec.period_id) LOOP
7748         l_last_period := 'Y';
7749         l_termination_date := last_period_rec.termination_date;
7750     END LOOP;
7751 
7752     IF p_proration_rule IN('FY','FLY') AND l_first_period = 'Y'
7753     THEN
7754 
7755         l_applicable_sales := pn_var_rent_calc_pkg.first_year_sales( sales_rec.var_rent_id
7756                                                                     ,l_commencement_date
7757                                                                     ,sales_rec.line_item_group_id);
7758 
7759     ELSIF p_proration_rule IN('LY','FLY') AND l_last_period = 'Y'
7760     THEN
7761 
7762          l_applicable_sales := pn_var_rent_calc_pkg.last_year_sales( sales_rec.var_rent_id
7763                                                                     ,l_termination_date
7764                                                                     ,sales_rec.line_item_group_id);
7765 
7766     ELSE
7767        /*FOR cum_sales_rec IN cum_sales_cur(sales_rec.period_id,
7768                                           sales_rec.line_item_id,
7769                                           sales_rec.calc_prd_start_date)
7770        LOOP*/
7771        l_applicable_sales := NVL(sales_rec.ytd_sales, 0) - NVL(sales_rec.ytd_deductions, 0);
7772           /*l_applicable_sales := cum_sales_rec.sales;
7773        END LOOP;*/
7774 
7775     END IF;
7776 
7777   END LOOP;
7778 
7779   return l_applicable_sales;
7780 
7781 END cumulative_volume;
7782 
7783 --------------------------------------------------------------------------------
7784 --  NAME         : ytd_start_bkpt
7785 --  DESCRIPTION  :
7786 --  PURPOSE      :
7787 --  INVOKED FROM :
7788 --  ARGUMENTS    :
7789 --  REFERENCE    :
7790 --  HISTORY      :
7791 --
7792 --  3.Nov.06  piagrawa    o Created
7793 --------------------------------------------------------------------------------
7794 FUNCTION annual_start_bkpt( p_proration_rule IN VARCHAR2
7795                            ,p_cumulative_vol IN VARCHAR2
7796                            ,p_trx_detail_id  IN NUMBER)
7797 RETURN NUMBER IS
7798 
7799   l_first_period                   VARCHAR2(1) := 'N';
7800   l_last_period                    VARCHAR2(1) := 'N';
7801   l_bkpt_start                     NUMBER := 0;
7802   l_bkpt_end                       NUMBER := 0;
7803   l_termination_date               DATE := NULL;
7804   l_commencement_date              DATE := NULL;
7805   l_annual_bkpt_start              NUMBER;
7806   l_bkpt_vol_start                 NUMBER;
7807   l_bkpt_vol_end                   NUMBER;
7808 
7809   -- Get the details of
7810   CURSOR first_period_cur (p_var_rent_id NUMBER, p_period_id NUMBER) IS
7811     SELECT pvp.period_id, pvr.commencement_date
7812       FROM pn_var_periods_all pvp, pn_var_rents_all pvr
7813      WHERE pvr.var_rent_id = p_var_rent_id
7814      AND   pvp.period_id = p_period_id
7815      AND   pvp.partial_period = 'Y'
7816      AND   pvp.start_date = pvr.commencement_date;
7817 
7818 
7819   -- Get the details of
7820   CURSOR last_period_cur (p_var_rent_id NUMBER, p_period_id NUMBER) IS
7821     SELECT pvp.period_id, pvr.termination_date
7822       FROM pn_var_periods_all pvp, pn_var_rents_all pvr
7823      WHERE pvr.var_rent_id = p_var_rent_id
7824      AND   pvp.period_id = p_period_id
7825      AND   pvp.partial_period = 'Y'
7826      AND   pvp.end_date   = pvr.termination_date;
7827 
7828    -- Get the details of
7829    CURSOR bkpts_cur IS
7830      SELECT dtls.prorated_grp_vol_start,
7831             dtls.pr_grp_blended_vol_start,
7832             dtls.blended_period_vol_start,
7833             dtls.bkpt_rate,
7834             hdr.var_rent_id,
7835             hdr.period_id,
7836             hdr.line_item_group_id
7837        FROM pn_var_trx_details_all dtls, pn_var_trx_headers_all hdr
7838       WHERE dtls.trx_detail_id = p_trx_detail_id
7839       AND   hdr.trx_header_id =  dtls.trx_header_id;
7840 
7841     CURSOR blended_prd_csr (p_period_id IN NUMBER, p_bkpt_rate IN NUMBER) IS
7842      SELECT sum(dtls.prorated_grp_vol_start)  bkpt_start
7843      FROM pn_var_trx_details_all dtls,
7844           pn_var_trx_headers_all hdr
7845      WHERE hdr.trx_header_id = dtls.trx_header_id
7846      AND hdr.period_id = p_period_id
7847      AND dtls.bkpt_rate = p_bkpt_rate;
7848 
7849 BEGIN
7850 
7851     FOR bkpts_rec IN bkpts_cur LOOP
7852 
7853       FOR blended_prd_rec IN blended_prd_csr(bkpts_rec.period_id, bkpts_rec.bkpt_rate) LOOP
7854           l_annual_bkpt_start := blended_prd_rec.bkpt_start;
7855       END LOOP;
7856 
7860       END LOOP;
7857       FOR first_period_rec IN first_period_cur (bkpts_rec.var_rent_id, bkpts_rec.period_id) LOOP
7858           l_first_period := 'Y';
7859           l_commencement_date := first_period_rec.commencement_date;
7861 
7862       FOR last_period_rec IN last_period_cur (bkpts_rec.var_rent_id, bkpts_rec.period_id) LOOP
7863           l_last_period := 'Y';
7864           l_termination_date := last_period_rec.termination_date;
7865       END LOOP;
7866 
7867       IF p_proration_rule IN('FY','FLY') AND l_first_period = 'Y'
7868       THEN
7869 
7870          pn_var_rent_calc_pkg.first_year_bkpt(bkpts_rec.var_rent_id,
7871                                               l_commencement_date,
7872                                               bkpts_rec.line_item_group_id,
7873                                               bkpts_rec.bkpt_rate,
7874                                               l_bkpt_start,
7875                                               l_bkpt_end);
7876 
7877       ELSIF p_proration_rule IN('LY','FLY') AND l_last_period = 'Y'
7878       THEN
7879 
7880          pn_var_rent_calc_pkg.last_year_bkpt( bkpts_rec.var_rent_id,
7881                                               l_termination_date,
7882                                               bkpts_rec.line_item_group_id,
7883                                               bkpts_rec.bkpt_rate,
7884                                               l_bkpt_start,
7885                                               l_bkpt_end);
7886 
7887       ELSE
7888 
7889          IF (p_cumulative_vol = 'T')
7890          THEN
7891             IF p_proration_rule IN ('CYP','CYNP')
7892             THEN
7893 
7894                true_up_bkpt ( bkpts_rec.period_id,
7895                               bkpts_rec.bkpt_rate,
7896                               l_bkpt_vol_start,
7897                               l_bkpt_vol_end);
7898                l_bkpt_start := NVL(l_bkpt_vol_start,l_annual_bkpt_start);
7899 
7900             ELSE
7901                l_bkpt_start := l_annual_bkpt_start;
7902             END IF;
7903 
7904          ELSIF (p_cumulative_vol = 'C')
7905          THEN
7906 
7907             IF p_proration_rule = pn_var_rent_calc_pkg.G_PRORUL_NP
7908             THEN
7909                l_bkpt_start := bkpts_rec.prorated_grp_vol_start;
7910             ELSE
7911                l_bkpt_start := bkpts_rec.blended_period_vol_start;
7912             END IF;
7913 
7914          END IF;
7915 
7916       END IF;
7917 
7918     END LOOP;
7919 
7920     RETURN NVL(l_bkpt_start, 0);
7921 
7922 END annual_start_bkpt;
7923 
7924 --------------------------------------------------------------------------------
7925 --  NAME         : annual_end_bkpt
7926 --  DESCRIPTION  :
7927 --  PURPOSE      :
7928 --  INVOKED FROM :
7929 --  ARGUMENTS    :
7930 --  REFERENCE    :
7931 --  HISTORY      :
7932 --
7933 --  3.Nov.06  piagrawa    o Created
7934 --------------------------------------------------------------------------------
7935 FUNCTION annual_end_bkpt( p_proration_rule IN VARCHAR2
7936                          ,p_cumulative_vol IN VARCHAR2
7937                          ,p_trx_detail_id  IN NUMBER)
7938 RETURN NUMBER IS
7939 
7940   l_first_period                   VARCHAR2(1) := 'N';
7941   l_last_period                    VARCHAR2(1) := 'N';
7942   l_bkpt_start                     NUMBER := 0;
7943   l_bkpt_end                       NUMBER := 0;
7944   l_termination_date               DATE := NULL;
7945   l_commencement_date              DATE := NULL;
7946   l_annual_bkpt_start              NUMBER;
7947   l_annual_bkpt_end                NUMBER;
7948   l_bkpt_vol_start                 NUMBER;
7949   l_bkpt_vol_end                   NUMBER;
7950 
7951 
7952   -- Get the details of
7953   CURSOR first_period_cur (p_var_rent_id NUMBER, p_period_id NUMBER) IS
7954     SELECT pvp.period_id, pvr.commencement_date
7955       FROM pn_var_periods_all pvp, pn_var_rents_all pvr
7956      WHERE pvr.var_rent_id = p_var_rent_id
7957      AND   pvp.period_id = p_period_id
7958      AND   pvp.partial_period = 'Y'
7959      AND   pvp.start_date = pvr.commencement_date;
7960 
7961 
7962   -- Get the details of
7963   CURSOR last_period_cur (p_var_rent_id NUMBER, p_period_id NUMBER) IS
7964     SELECT pvp.period_id, pvr.termination_date
7965       FROM pn_var_periods_all pvp, pn_var_rents_all pvr
7966      WHERE pvr.var_rent_id = p_var_rent_id
7967      AND   pvp.period_id = p_period_id
7968      AND   pvp.partial_period = 'Y'
7969      AND   pvp.end_date   = pvr.termination_date;
7970 
7971    -- Get the details of
7972    CURSOR bkpts_cur IS
7973      SELECT dtls.prorated_grp_vol_start,
7974             dtls.pr_grp_blended_vol_start,
7975             dtls.blended_period_vol_start,
7976             dtls.prorated_grp_vol_end,
7977             dtls.pr_grp_blended_vol_end,
7978             dtls.blended_period_vol_end,
7979             dtls.bkpt_rate,
7980             hdr.var_rent_id,
7981             hdr.period_id,
7982             hdr.line_item_group_id
7983        FROM pn_var_trx_details_all dtls, pn_var_trx_headers_all hdr
7984        WHERE dtls.trx_detail_id = p_trx_detail_id
7985        AND   hdr.trx_header_id =  dtls.trx_header_id;
7986 
7987     CURSOR blended_prd_csr (p_period_id IN NUMBER, p_bkpt_rate IN NUMBER) IS
7988      SELECT sum(prorated_grp_vol_start)  bkpt_start,
7989             sum(prorated_grp_vol_end)  bkpt_end
7993      AND hdr.period_id = p_period_id
7990      FROM pn_var_trx_details_all dtls,
7991           pn_var_trx_headers_all hdr
7992      WHERE hdr.trx_header_id = dtls.trx_header_id
7994      AND dtls.bkpt_rate = p_bkpt_rate;
7995 
7996 BEGIN
7997 
7998     FOR bkpts_rec IN bkpts_cur LOOP
7999       FOR blended_prd_rec IN blended_prd_csr(bkpts_rec.period_id,bkpts_rec.bkpt_rate) LOOP
8000           l_annual_bkpt_start := blended_prd_rec.bkpt_start;
8001           l_annual_bkpt_end := blended_prd_rec.bkpt_end;
8002       END LOOP;
8003 
8004       FOR first_period_rec IN first_period_cur (bkpts_rec.var_rent_id, bkpts_rec.period_id) LOOP
8005           l_first_period := 'Y';
8006           l_commencement_date := first_period_rec.commencement_date;
8007       END LOOP;
8008 
8009       FOR last_period_rec IN last_period_cur (bkpts_rec.var_rent_id, bkpts_rec.period_id) LOOP
8010           l_last_period := 'Y';
8011           l_termination_date := last_period_rec.termination_date;
8012       END LOOP;
8013 
8014       IF p_proration_rule IN('FY','FLY') AND l_first_period = 'Y'
8015       THEN
8016 
8017          pn_var_rent_calc_pkg.first_year_bkpt(bkpts_rec.var_rent_id,
8018                                               l_commencement_date,
8019                                               bkpts_rec.line_item_group_id,
8020                                               bkpts_rec.bkpt_rate,
8021                                               l_bkpt_start,
8022                                               l_bkpt_end);
8023 
8024       ELSIF p_proration_rule IN('LY','FLY') AND l_last_period = 'Y'
8025       THEN
8026 
8027          pn_var_rent_calc_pkg.last_year_bkpt( bkpts_rec.var_rent_id,
8028                                               l_termination_date,
8029                                               bkpts_rec.line_item_group_id,
8030                                               bkpts_rec.bkpt_rate,
8031                                               l_bkpt_start,
8032                                               l_bkpt_end);
8033 
8034       ELSE
8035          IF (p_cumulative_vol = 'T')
8036          THEN
8037             IF p_proration_rule IN ('CYP','CYNP')
8038             THEN
8039 
8040                true_up_bkpt ( bkpts_rec.period_id,
8041                               bkpts_rec.bkpt_rate,
8042                               l_bkpt_vol_start,
8043                               l_bkpt_vol_end);
8044 
8045                l_bkpt_start := NVL(l_bkpt_vol_start,l_annual_bkpt_start);
8046                l_bkpt_end   := NVL(l_bkpt_vol_end,l_annual_bkpt_end);
8047 
8048             ELSE
8049                l_bkpt_start := l_annual_bkpt_start;
8050                l_bkpt_end := l_annual_bkpt_end;
8051             END IF;
8052 
8053          ELSIF (p_cumulative_vol = 'C')
8054          THEN
8055 
8056             IF p_proration_rule = pn_var_rent_calc_pkg.G_PRORUL_NP
8057             THEN
8058                l_bkpt_start := bkpts_rec.prorated_grp_vol_start;
8059                l_bkpt_end := bkpts_rec.prorated_grp_vol_end;
8060             ELSE
8061                l_bkpt_start := bkpts_rec.blended_period_vol_start;
8062                l_bkpt_end   := bkpts_rec.blended_period_vol_end;
8063             END IF;
8064 
8065          END IF;
8066       END IF;
8067 
8068       l_bkpt_end := pn_var_rent_calc_pkg.end_breakpoint(l_bkpt_start, l_bkpt_end);
8069 
8070     END LOOP;
8071 
8072     RETURN l_bkpt_end;
8073 
8074 END annual_end_bkpt;
8075 
8076 --------------------------------------------------------------------------------
8077 --  NAME         : prorated_start_bkpt
8078 --  DESCRIPTION  :
8079 --  PURPOSE      :
8080 --  INVOKED FROM :
8081 --  ARGUMENTS    :
8082 --  REFERENCE    :
8083 --  HISTORY      :
8084 --
8085 --  3.Nov.06  piagrawa    o Created
8086 --------------------------------------------------------------------------------
8087 FUNCTION prorated_start_bkpt( p_proration_rule IN VARCHAR2
8088                              ,p_trx_detail_id  IN NUMBER)
8089 RETURN NUMBER IS
8090 
8091   l_first_period                   VARCHAR2(1) := 'N';
8092   l_last_period                    VARCHAR2(1) := 'N';
8093   l_bkpt_start                     NUMBER := 0;
8094   l_bkpt_end                       NUMBER := 0;
8095   l_termination_date               DATE := NULL;
8096   l_commencement_date              DATE := NULL;
8097 
8098   -- Get the details of
8099   CURSOR first_period_cur (p_var_rent_id NUMBER, p_period_id NUMBER) IS
8100     SELECT pvp.period_id, pvr.commencement_date
8101       FROM pn_var_periods_all pvp, pn_var_rents_all pvr
8102      WHERE pvr.var_rent_id = p_var_rent_id
8103      AND   pvp.period_id = p_period_id
8104      AND   pvp.partial_period = 'Y'
8105      AND   pvp.start_date = pvr.commencement_date;
8106 
8107 
8108   -- Get the details of
8109   CURSOR last_period_cur (p_var_rent_id NUMBER, p_period_id NUMBER) IS
8110     SELECT pvp.period_id, pvr.termination_date
8111       FROM pn_var_periods_all pvp, pn_var_rents_all pvr
8112      WHERE pvr.var_rent_id = p_var_rent_id
8113      AND   pvp.period_id = p_period_id
8114      AND   pvp.partial_period = 'Y'
8115      AND   pvp.end_date   = pvr.termination_date;
8116 
8117    -- Get the details of
8118    CURSOR bkpts_cur IS
8119      SELECT dtls.prorated_grp_vol_start,
8120             dtls.pr_grp_blended_vol_start,
8124             hdr.period_id,
8121             dtls.bkpt_rate,
8122             bkpts.group_bkpt_vol_start,
8123             hdr.var_rent_id,
8125             hdr.line_item_group_id
8126        FROM pn_var_trx_details_all dtls, pn_var_trx_headers_all hdr,
8127             pn_var_bkpts_det_all bkpts
8128       WHERE dtls.trx_detail_id = p_trx_detail_id
8129       AND   hdr.trx_header_id =  dtls.trx_header_id
8130       AND   bkpts.bkpt_detail_id = dtls.bkpt_detail_id;
8131 
8132 BEGIN
8133 
8134     FOR bkpts_rec IN bkpts_cur LOOP
8135 
8136       FOR first_period_rec IN first_period_cur (bkpts_rec.var_rent_id, bkpts_rec.period_id) LOOP
8137           l_first_period := 'Y';
8138           l_commencement_date := first_period_rec.commencement_date;
8139       END LOOP;
8140 
8141       FOR last_period_rec IN last_period_cur (bkpts_rec.var_rent_id, bkpts_rec.period_id) LOOP
8142           l_last_period := 'Y';
8143           l_termination_date := last_period_rec.termination_date;
8144       END LOOP;
8145 
8146       IF p_proration_rule IN('FY','FLY') AND l_first_period = 'Y'
8147       THEN
8148 
8149          pn_var_rent_calc_pkg.first_year_bkpt(bkpts_rec.var_rent_id,
8150                                               l_commencement_date,
8151                                               bkpts_rec.line_item_group_id,
8152                                               bkpts_rec.bkpt_rate,
8153                                               l_bkpt_start,
8154                                               l_bkpt_end);
8155 
8156       ELSIF p_proration_rule IN('LY','FLY') AND l_last_period = 'Y'
8157       THEN
8158 
8159          pn_var_rent_calc_pkg.last_year_bkpt( bkpts_rec.var_rent_id,
8160                                               l_termination_date,
8161                                               bkpts_rec.line_item_group_id,
8162                                               bkpts_rec.bkpt_rate,
8163                                               l_bkpt_start,
8164                                               l_bkpt_end);
8165 
8166       ELSIF p_proration_rule IN('CYNP', 'CYP')
8167       THEN
8168          l_bkpt_start := NVL(bkpts_rec.pr_grp_blended_vol_start, bkpts_rec.prorated_grp_vol_start);
8169 
8170       ELSIF p_proration_rule IN('NP')
8171       THEN
8172          l_bkpt_start := bkpts_rec.group_bkpt_vol_start;
8173       ELSE
8174          l_bkpt_start := bkpts_rec.prorated_grp_vol_start;
8175 
8176       END IF;
8177 
8178     END LOOP;
8179 
8180     RETURN NVL(l_bkpt_start, 0);
8181 
8182 END prorated_start_bkpt;
8183 
8184 --------------------------------------------------------------------------------
8185 --  NAME         : prorated_end_bkpt
8186 --  DESCRIPTION  :
8187 --  PURPOSE      :
8188 --  INVOKED FROM :
8189 --  ARGUMENTS    :
8190 --  REFERENCE    :
8191 --  HISTORY      :
8192 --
8193 --  3.Nov.06  piagrawa    o Created
8194 --------------------------------------------------------------------------------
8195 FUNCTION prorated_end_bkpt( p_proration_rule IN VARCHAR2
8196                            ,p_trx_detail_id  IN NUMBER)
8197 RETURN NUMBER IS
8198 
8199   l_first_period                   VARCHAR2(1) := 'N';
8200   l_last_period                    VARCHAR2(1) := 'N';
8201   l_bkpt_start                     NUMBER := 0;
8202   l_bkpt_end                       NUMBER := 0;
8203   l_termination_date               DATE := NULL;
8204   l_commencement_date              DATE := NULL;
8205 
8206   -- Get the details of
8207   CURSOR first_period_cur (p_var_rent_id NUMBER, p_period_id NUMBER) IS
8208     SELECT pvp.period_id, pvr.commencement_date
8209       FROM pn_var_periods_all pvp, pn_var_rents_all pvr
8210      WHERE pvr.var_rent_id = p_var_rent_id
8211      AND   pvp.period_id = p_period_id
8212      AND   pvp.partial_period = 'Y'
8213      AND   pvp.start_date = pvr.commencement_date;
8214 
8215 
8216   -- Get the details of
8217   CURSOR last_period_cur (p_var_rent_id NUMBER, p_period_id NUMBER) IS
8218     SELECT pvp.period_id, pvr.termination_date
8219       FROM pn_var_periods_all pvp, pn_var_rents_all pvr
8220      WHERE pvr.var_rent_id = p_var_rent_id
8221      AND   pvp.period_id = p_period_id
8222      AND   pvp.partial_period = 'Y'
8223      AND   pvp.end_date   = pvr.termination_date;
8224 
8225    -- Get the details of
8226    CURSOR bkpts_cur IS
8227      SELECT dtls.prorated_grp_vol_start,
8228             dtls.prorated_grp_vol_end,
8229             dtls.pr_grp_blended_vol_start,
8230             dtls.pr_grp_blended_vol_end,
8231             dtls.bkpt_rate,
8232             bkpts.group_bkpt_vol_start,
8233             bkpts.group_bkpt_vol_end,
8234             hdr.var_rent_id,
8235             hdr.period_id,
8236             hdr.line_item_group_id
8237        FROM pn_var_trx_details_all dtls, pn_var_trx_headers_all hdr,
8238             pn_var_bkpts_det_all bkpts
8239        WHERE dtls.trx_detail_id = p_trx_detail_id
8240        AND   hdr.trx_header_id =  dtls.trx_header_id
8241        AND   bkpts.bkpt_detail_id = dtls.bkpt_detail_id;
8242 
8243 BEGIN
8244 
8245     FOR bkpts_rec IN bkpts_cur LOOP
8246 
8247       FOR first_period_rec IN first_period_cur (bkpts_rec.var_rent_id, bkpts_rec.period_id) LOOP
8248           l_first_period := 'Y';
8249           l_commencement_date := first_period_rec.commencement_date;
8250       END LOOP;
8251 
8255       END LOOP;
8252       FOR last_period_rec IN last_period_cur (bkpts_rec.var_rent_id, bkpts_rec.period_id) LOOP
8253           l_last_period := 'Y';
8254           l_termination_date := last_period_rec.termination_date;
8256 
8257       IF p_proration_rule IN('FY','FLY') AND l_first_period = 'Y'
8258       THEN
8259 
8260          pn_var_rent_calc_pkg.first_year_bkpt(bkpts_rec.var_rent_id,
8261                                               l_commencement_date,
8262                                               bkpts_rec.line_item_group_id,
8263                                               bkpts_rec.bkpt_rate,
8264                                               l_bkpt_start,
8265                                               l_bkpt_end);
8266 
8267       ELSIF p_proration_rule IN('LY','FLY') AND l_last_period = 'Y'
8268       THEN
8269 
8270          pn_var_rent_calc_pkg.last_year_bkpt( bkpts_rec.var_rent_id,
8271                                               l_termination_date,
8272                                               bkpts_rec.line_item_group_id,
8273                                               bkpts_rec.bkpt_rate,
8274                                               l_bkpt_start,
8275                                               l_bkpt_end);
8276 
8277       ELSIF p_proration_rule IN('CYNP', 'CYP')
8278       THEN
8279          l_bkpt_start := NVL(bkpts_rec.pr_grp_blended_vol_start, bkpts_rec.prorated_grp_vol_start);
8280          l_bkpt_end   := NVL(bkpts_rec.pr_grp_blended_vol_end, bkpts_rec.prorated_grp_vol_end);
8281 
8282       ELSIF p_proration_rule IN('NP')
8283       THEN
8284          l_bkpt_start := bkpts_rec.group_bkpt_vol_start;
8285          l_bkpt_end := bkpts_rec.group_bkpt_vol_end;
8286       ELSE
8287          l_bkpt_start := bkpts_rec.prorated_grp_vol_start;
8288          l_bkpt_end := bkpts_rec.prorated_grp_vol_end;
8289       END IF;
8290 
8291       l_bkpt_end := pn_var_rent_calc_pkg.end_breakpoint(l_bkpt_start, l_bkpt_end);
8292 
8293     END LOOP;
8294 
8295     RETURN l_bkpt_end;
8296 
8297 END prorated_end_bkpt;
8298 
8299 --------------------------------------------------------------------------------
8300 --  NAME         : current_gross_vr
8301 --  DESCRIPTION  :
8302 --  PURPOSE      :
8303 --  INVOKED FROM :
8304 --  ARGUMENTS    :
8305 --  REFERENCE    :
8306 --  HISTORY      :
8307 --
8308 --  3.Nov.06  piagrawa    o Created
8309 --------------------------------------------------------------------------------
8310 FUNCTION current_gross_vr( p_proration_rule   IN VARCHAR2,
8311                            p_trx_detail_id    IN NUMBER)
8312 RETURN NUMBER IS
8313 
8314 -- Get the details of
8315   CURSOR first_period_cur (p_var_rent_id NUMBER, p_period_id NUMBER) IS
8316     SELECT pvp.period_id, pvr.commencement_date
8317       FROM pn_var_periods_all pvp, pn_var_rents_all pvr
8318      WHERE pvr.var_rent_id = p_var_rent_id
8319      AND   pvp.period_id = p_period_id
8320      AND   pvp.partial_period = 'Y'
8321      AND   pvp.start_date = pvr.commencement_date;
8322 
8323   -- Get the details of
8324   CURSOR last_period_cur (p_var_rent_id NUMBER, p_period_id NUMBER) IS
8325     SELECT pvp.period_id, pvr.termination_date
8326       FROM pn_var_periods_all pvp, pn_var_rents_all pvr
8327      WHERE pvr.var_rent_id = p_var_rent_id
8328      AND   pvp.period_id = p_period_id
8329      AND   pvp.partial_period = 'Y'
8330      AND   pvp.end_date   = pvr.termination_date;
8331 
8332    -- Get the details of
8333    CURSOR rent_cur IS
8334      SELECT hdr.percent_rent_due,
8335             hdr.first_yr_rent,
8336             hdr.period_id,
8337             hdr.var_rent_id
8338       FROM pn_var_trx_headers_all hdr,
8339            pn_var_trx_details_all dtls
8340       WHERE hdr.trx_header_id = dtls.trx_header_id
8341       AND   dtls.trx_detail_id  = p_trx_detail_id;
8342 
8343    -- Get the details of
8344    CURSOR first_yr_rent (p_var_rent_id NUMBER) IS
8345      SELECT SUM(first_yr_rent) first_yr_rent
8346      FROM pn_var_trx_headers_all
8347      WHERE var_rent_id = p_var_rent_id;
8348 
8349    -- Get the details of
8350    CURSOR last_yr_rent (p_period_id NUMBER) IS
8351      SELECT (SUM(NVL(prorated_rent_due, 0)) - SUM(NVL(first_yr_rent, 0))) last_yr_rent
8352      FROM pn_var_trx_headers_all
8353      WHERE period_id = p_period_id;
8354 
8355 
8356 
8357 l_rent                           NUMBER := 0;
8358 l_first_period                   VARCHAR2(1) := 'N';
8359 l_last_period                    VARCHAR2(1) := 'N';
8360 
8361 BEGIN
8362 
8363  FOR rent_rec IN rent_cur LOOP
8364 
8365     FOR first_period_rec IN first_period_cur (rent_rec.var_rent_id, rent_rec.period_id) LOOP
8366         l_first_period := 'Y';
8367     END LOOP;
8368 
8369     FOR last_period_rec IN last_period_cur (rent_rec.var_rent_id, rent_rec.period_id) LOOP
8370         l_last_period := 'Y';
8371     END LOOP;
8372 
8373     IF p_proration_rule IN('FY','FLY') AND l_first_period = 'Y'
8374     THEN
8375 
8376       FOR first_yr_rec IN first_yr_rent(rent_rec.var_rent_id) LOOP
8377               l_rent := NVL(first_yr_rec.first_yr_rent, 0);
8378       END LOOP;
8379 
8380     ELSIF p_proration_rule IN('LY','FLY') AND l_last_period = 'Y'
8381     THEN
8382 
8383       FOR last_yr_rec IN last_yr_rent(rent_rec.period_id) LOOP
8384               l_rent := NVL(last_yr_rec.last_yr_rent, 0);
8385       END LOOP;
8386 
8387     ELSE
8388 
8392 
8389         l_rent := NVL(rent_rec.percent_rent_due, 0);
8390 
8391     END IF;
8393   END LOOP;
8394 
8395   return l_rent;
8396 
8397 END current_gross_vr;
8398 
8399 --------------------------------------------------------------------------------
8400 --  NAME         : cumulative_gross_vr
8401 --  DESCRIPTION  :
8402 --  PURPOSE      :
8403 --  INVOKED FROM :
8404 --  ARGUMENTS    :
8405 --  REFERENCE    :
8406 --  HISTORY      :
8407 --
8408 --  3.Nov.06  piagrawa    o Created
8409 --------------------------------------------------------------------------------
8410 FUNCTION cumulative_gross_vr( p_proration_rule   IN VARCHAR2,
8411                               p_trx_detail_id    IN NUMBER)
8412 RETURN NUMBER IS
8413 
8414 -- Get the details of
8415   CURSOR first_period_cur (p_var_rent_id NUMBER, p_period_id NUMBER) IS
8416     SELECT pvp.period_id, pvr.commencement_date
8417       FROM pn_var_periods_all pvp, pn_var_rents_all pvr
8418      WHERE pvr.var_rent_id = p_var_rent_id
8419      AND   pvp.period_id = p_period_id
8420      AND   pvp.partial_period = 'Y'
8421      AND   pvp.start_date = pvr.commencement_date;
8422 
8423   -- Get the details of
8424   CURSOR last_period_cur (p_var_rent_id NUMBER, p_period_id NUMBER) IS
8425     SELECT pvp.period_id, pvr.termination_date
8426       FROM pn_var_periods_all pvp, pn_var_rents_all pvr
8427      WHERE pvr.var_rent_id = p_var_rent_id
8428      AND   pvp.period_id = p_period_id
8429      AND   pvp.partial_period = 'Y'
8430      AND   pvp.end_date   = pvr.termination_date;
8431 
8432    -- Get the details of
8433    CURSOR rent_cur IS
8434      SELECT hdr.ytd_percent_rent,
8435             hdr.first_yr_rent,
8436             hdr.period_id,
8437             hdr.var_rent_id
8438       FROM pn_var_trx_headers_all hdr,
8439            pn_var_trx_details_all dtls
8440       WHERE hdr.trx_header_id = dtls.trx_header_id
8441       AND   dtls.trx_detail_id  = p_trx_detail_id;
8442 
8443    -- Get the details of
8444    CURSOR first_yr_rent (p_var_rent_id NUMBER) IS
8445      SELECT SUM(first_yr_rent) first_yr_rent
8446      FROM pn_var_trx_headers_all
8447      WHERE var_rent_id = p_var_rent_id;
8448 
8449    -- Get the details of
8450    CURSOR last_yr_rent (p_period_id NUMBER) IS
8451      SELECT (SUM(NVL(prorated_rent_due, 0)) - SUM(NVL(first_yr_rent, 0))) last_yr_rent
8452      FROM pn_var_trx_headers_all
8453      WHERE period_id = p_period_id;
8454 
8455 l_rent                           NUMBER := 0;
8456 l_first_period                   VARCHAR2(1) := 'N';
8457 l_last_period                    VARCHAR2(1) := 'N';
8458 
8459 BEGIN
8460 
8461  FOR rent_rec IN rent_cur LOOP
8462 
8463     FOR first_period_rec IN first_period_cur (rent_rec.var_rent_id, rent_rec.period_id) LOOP
8464         l_first_period := 'Y';
8465     END LOOP;
8466 
8467     FOR last_period_rec IN last_period_cur (rent_rec.var_rent_id, rent_rec.period_id) LOOP
8468         l_last_period := 'Y';
8469     END LOOP;
8470 
8471     IF p_proration_rule IN('FY','FLY') AND l_first_period = 'Y'
8472     THEN
8473 
8474       FOR first_yr_rec IN first_yr_rent(rent_rec.var_rent_id) LOOP
8475               l_rent := NVL(first_yr_rec.first_yr_rent, 0);
8476       END LOOP;
8477 
8478     ELSIF p_proration_rule IN('LY','FLY') AND l_last_period = 'Y'
8479     THEN
8480 
8481       FOR last_yr_rec IN last_yr_rent(rent_rec.period_id) LOOP
8482               l_rent := NVL(last_yr_rec.last_yr_rent, 0);
8483       END LOOP;
8484 
8485     ELSE
8486 
8487         l_rent := NVL(rent_rec.ytd_percent_rent, 0);
8488 
8489     END IF;
8490 
8491   END LOOP;
8492 
8493   return l_rent;
8494 
8495 END cumulative_gross_vr;
8496 
8497 --------------------------------------------------------------------------------
8498 --  NAME         : fy_net_sales
8499 --  DESCRIPTION  :
8500 --  PURPOSE      :
8501 --  INVOKED FROM :
8502 --  ARGUMENTS    :
8503 --  REFERENCE    :
8504 --  HISTORY      :
8505 --
8506 --  3.Nov.06  piagrawa    o Created
8507 --------------------------------------------------------------------------------
8508 FUNCTION fy_net_sales(  p_var_rent_id       IN NUMBER
8509                        ,p_line_item_id      IN NUMBER)
8510 RETURN NUMBER IS
8511 
8512   /* get FY sales */
8513   CURSOR fy_sales_c( p_vr_id            IN NUMBER
8514                     ,p_vr_comm_date     IN DATE
8515                     ,p_line_item_grp_id IN NUMBER) IS
8516     SELECT
8517     NVL(SUM(fy_proration_sales - NVL(fy_proration_deductions,0) ),0) AS sales
8518     FROM
8519     pn_var_trx_headers_all
8520     WHERE
8521     var_rent_id = p_vr_id AND
8522     line_item_group_id = p_line_item_grp_id AND
8523     calc_prd_start_date <= (ADD_MONTHS(p_vr_comm_date, 12) - 1) ;
8524 
8525   CURSOR line_item_cur IS
8526     SELECT trx.line_item_group_id, pvr.commencement_date
8527      FROM  pn_var_trx_headers_all trx,
8528            pn_var_rents_all pvr
8529      WHERE trx.var_rent_id = p_var_rent_id
8530      AND   trx.var_rent_id = pvr.var_rent_id
8531      AND   trx.line_item_id = p_line_item_id;
8532 
8533   l_sales NUMBER := 0;
8534 
8535 BEGIN
8536 
8537    FOR rec IN line_item_cur LOOP
8538 
8539       FOR fy_sales_rec IN fy_sales_c( p_var_rent_id
8543          l_sales := fy_sales_rec.sales ;
8540                                      ,rec.commencement_date
8541                                      ,rec.line_item_group_id)
8542       LOOP
8544       END LOOP;
8545 
8546    END LOOP;
8547 
8548    RETURN l_sales;
8549 
8550 END fy_net_sales;
8551 
8552 --------------------------------------------------------------------------------
8553 --  NAME         : first_yr_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 first_yr_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),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 first_yr_sales;
8606 
8607 --------------------------------------------------------------------------------
8608 --  NAME         : first_yr_deductions
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_deductions(  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_deduction_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_deductions),0) AS deductions
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_deductions NUMBER := 0;
8644 
8645 BEGIN
8646 
8647    FOR rec IN line_item_cur LOOP
8648 
8649       FOR fy_deduction_rec IN fy_deduction_c( p_var_rent_id
8650                                              ,rec.commencement_date
8651                                              ,rec.line_item_group_id)
8652       LOOP
8653          l_deductions := fy_deduction_rec.deductions ;
8654       END LOOP;
8655 
8656    END LOOP;
8657 
8658    RETURN l_deductions;
8659 
8660 END first_yr_deductions;
8661 
8662 --------------------------------------------------------------------------------
8663 --  NAME         : true_up_details
8664 --  DESCRIPTION  :
8665 --  PURPOSE      :
8666 --  INVOKED FROM :
8667 --  ARGUMENTS    :
8668 --  REFERENCE    :
8669 --  HISTORY      :
8670 --
8671 --  3.Nov.06  piagrawa    o Created
8672 --------------------------------------------------------------------------------
8673 PROCEDURE true_up_details ( p_var_rent_id        IN NUMBER
8674                            ,p_trx_detail_id      IN NUMBER
8675                            ,p_rate               IN NUMBER
8676                            ,p_trueup_bkpt_vol_start OUT NOCOPY  NUMBER
8677                            ,p_trueup_bkpt_vol_end   OUT NOCOPY  NUMBER
8678                            ,p_trueup_volume         OUT NOCOPY  NUMBER
8679                            ,p_deductions            OUT NOCOPY  NUMBER
8680                            ,p_overage               OUT NOCOPY  NUMBER)
8681 IS
8682 
8683   /* get FY sales */
8684 CURSOR true_up_cur IS
8685   SELECT  dtls.ytd_group_vol_start AS trueup_bkpt_vol_start
8686          ,dtls.ytd_group_vol_end   AS trueup_bkpt_vol_end
8690          pn_var_trx_details_all dtls
8687          ,hdr.ytd_sales            AS trueup_volume
8688          ,hdr.ytd_deductions       AS deductions
8689   FROM   pn_var_trx_headers_all hdr,
8691   WHERE  dtls.trx_detail_id = p_trx_detail_id
8692   AND    dtls.bkpt_rate = p_rate
8693   AND    dtls.trx_header_id = hdr.trx_header_id;
8694 
8695   l_applicable_sales NUMBER := 0;
8696 
8697 BEGIN
8698 
8699    FOR true_up_rec IN true_up_cur LOOP
8700       p_trueup_bkpt_vol_start := NVL(true_up_rec.trueup_bkpt_vol_start, 0);
8701       p_trueup_bkpt_vol_end   := NVL(true_up_rec.trueup_bkpt_vol_end, 0);
8702       p_trueup_volume         := NVL(true_up_rec.trueup_volume, 0);
8703       p_deductions            := NVL(true_up_rec.deductions, 0);
8704 
8705       l_applicable_sales := NVl(p_trueup_volume, 0) - NVL(p_deductions, 0);
8706 
8707       IF(p_trueup_bkpt_vol_end = 0) THEN
8708          p_overage := greatest(l_applicable_sales - p_trueup_bkpt_vol_start,0);
8709       ELSE
8710          IF((l_applicable_sales >= p_trueup_bkpt_vol_start) AND (l_applicable_sales <= p_trueup_bkpt_vol_end)) THEN
8711            p_overage :=  l_applicable_sales - p_trueup_bkpt_vol_start;
8712          ELSIF(l_applicable_sales > p_trueup_bkpt_vol_end) THEN
8713            p_overage := p_trueup_bkpt_vol_end - p_trueup_bkpt_vol_start;
8714          ELSIF(l_applicable_sales < p_trueup_bkpt_vol_start) THEN
8715            p_overage := 0;
8716          END IF;
8717       END IF;
8718 
8719       p_trueup_bkpt_vol_end := pn_var_rent_calc_pkg.end_breakpoint(p_trueup_bkpt_vol_start, p_trueup_bkpt_vol_end);
8720 
8721       p_trueup_bkpt_vol_start  := round(p_trueup_bkpt_vol_start,2);
8722       p_trueup_bkpt_vol_end    := round(p_trueup_bkpt_vol_end,2);
8723       p_trueup_volume          := round(p_trueup_volume,2);
8724       p_deductions             := round(p_deductions,2);
8725       p_overage                := round(p_overage,2);
8726 
8727    END LOOP;
8728 
8729 END true_up_details;
8730 
8731 
8732 --------------------------------------------------------------------------------
8733 --  NAME         : true_up_summary
8734 --  DESCRIPTION  :
8735 --  PURPOSE      :
8736 --  INVOKED FROM :
8737 --  ARGUMENTS    :
8738 --  REFERENCE    :
8739 --  HISTORY      :
8740 --
8741 --  3.Nov.06  piagrawa    o Created
8742 --------------------------------------------------------------------------------
8743 PROCEDURE true_up_summary ( p_period_id        IN NUMBER
8744                            ,p_true_up_rent     OUT NOCOPY  NUMBER
8745                            ,p_trueup_volume    OUT NOCOPY  NUMBER
8746                            ,p_deductions       OUT NOCOPY  NUMBER)
8747 IS
8748 
8749   /* get FY sales */
8750 CURSOR true_up_cur IS
8751   SELECT  sum(NVL(act_var_rent, 0)) + sum(NVL(trueup_var_rent, 0)) - sum(NVL(first_yr_rent,0)) true_up_rent,
8752           sum(NVL(tot_act_vol, 0)) true_up_vol,
8753           sum(NVL(tot_ded, 0)) true_up_deductions
8754   FROM   pn_var_rent_summ_all
8755   WHERE  period_id = p_period_id;
8756 
8757 BEGIN
8758 
8759    FOR true_up_rec IN true_up_cur LOOP
8760       p_true_up_rent          := true_up_rec.true_up_rent;
8761       p_trueup_volume         := true_up_rec.true_up_vol;
8762       p_deductions            := true_up_rec.true_up_deductions;
8763 
8764    END LOOP;
8765 
8766 END true_up_summary;
8767 
8768 --------------------------------------------------------------------------------
8769 --  NAME         : pop_inv_date_tab
8770 --  DESCRIPTION  :
8771 --  PURPOSE      :
8772 --  INVOKED FROM :
8773 --  ARGUMENTS    :
8774 --  REFERENCE    :
8775 --  HISTORY      :
8776 --
8777 --  3.Dec.06  lbala    o Created
8778 --------------------------------------------------------------------------------
8779 
8780 PROCEDURE pop_inv_date_tab(p_var_rent_id IN NUMBER,
8781                            p_status IN VARCHAR2 )
8782 IS
8783 -- Get the all invoice_dates
8784 CURSOR get_inv_dates_cur(p_vrent_id IN NUMBER,p_status IN VARCHAR2)
8785    IS
8786 SELECT distinct gd1.invoice_date,gd1.period_id,decode(temp.inv_dt,NULL,'N','Y')
8787 FROM pn_var_grp_dates_all gd1,
8788 (SELECT gd.invoice_date inv_dt
8789  FROM pn_var_grp_dates_all gd
8790  WHERE EXISTS (SELECT NULL from pn_var_vol_hist_all vol
8791                 WHERE vol_hist_status_code = p_status
8792                   AND vol.period_id = gd.period_id
8793                   AND vol.invoicing_date= gd.invoice_date
8794                )
8795 AND
8796 NOT EXISTS   (SELECT NULL from pn_var_rent_inv_all vinv
8797                WHERE vinv.invoice_date=gd.invoice_date
8798                  AND vinv.period_id=gd.period_id
8799              )
8800 AND gd.var_rent_id=p_vrent_id
8801 )temp
8802 WHERE gd1.var_rent_id=p_vrent_id
8803 AND gd1.invoice_date=temp.inv_dt(+)
8804 ORDER BY gd1.invoice_date;
8805 
8806 BEGIN
8807 pnp_debug_pkg.log('+++++++++ POP_INV_DATE_TAB START +++++++++++');
8808 
8809 OPEN get_inv_dates_cur(p_var_rent_id,p_status) ;
8810 FETCH get_inv_dates_cur BULK COLLECT INTO inv_date_tab;
8811 CLOSE get_inv_dates_cur;
8812 
8813 pnp_debug_pkg.log('+++++++++ POP_INV_DATE_TAB END +++++++++++');
8814 END pop_inv_date_tab;
8815 --------------------------------------------------------------------------------
8816 --  NAME         : POP_INV_DATE_TAB_FIRSTYR
8817 --  DESCRIPTION  :
8818 --  PURPOSE      :
8819 --  INVOKED FROM :
8820 --  ARGUMENTS    :
8824 --  3.Dec.06  lbala    o Created
8821 --  REFERENCE    :
8822 --  HISTORY      :
8823 --
8825 --------------------------------------------------------------------------------
8826 
8827 PROCEDURE POP_INV_DATE_TAB_FIRSTYR(p_var_rent_id IN NUMBER,
8828                                    p_status IN VARCHAR2)
8829 IS
8830 -- Get roll fwd flag for 1st partial period
8831 CURSOR get_fst_prd_flag(p_vrent_id IN NUMBER,p_status IN VARCHAR2) IS
8832   SELECT 'Y' fst_prd_flag
8833     FROM dual
8834    WHERE EXISTS
8835          (SELECT period_id FROM pn_var_periods_all vp
8836           WHERE period_num=1
8837           AND var_rent_id=p_vrent_id
8838           AND partial_period='Y'
8839           AND EXISTS (select NULL from pn_var_vol_hist_all vol
8840                       where vol_hist_status_code = p_status
8841                       and vol.period_id = vp.period_id
8842                       and var_rent_id=p_vrent_id
8843                       )
8844           AND NOT EXISTS (select NULL from pn_var_rent_inv_all vinv
8845                           where vinv.var_rent_id = p_vrent_id
8846                           and vinv.period_id = vp.period_id
8847                           )
8848          );
8849 
8850 -- Get invoice dates from 2nd annual period for FY/FLY proration rules
8851 CURSOR get_partial_prd_inv_dates(p_vrent_id IN NUMBER,p_status IN VARCHAR2)
8852 IS
8853 SELECT distinct gd1.invoice_date ,gd1.period_id, decode(temp.inv_dt,NULL,'N','Y')
8854 FROM pn_var_grp_dates_all gd1,
8855      pn_var_periods_all vp,
8856 (SELECT gd.invoice_date inv_dt
8857  FROM pn_var_grp_dates_all gd
8858  WHERE EXISTS(select NULL from pn_var_vol_hist_all vol
8859                where vol_hist_status_code = p_status
8860                  and vol.period_id = gd.period_id
8861                  and vol.invoicing_date= gd.invoice_date
8862              )
8863  AND NOT EXISTS (select NULL from pn_var_rent_inv_all vinv
8864                   where vinv.invoice_date=gd.invoice_date
8865                     and vinv.period_id=gd.period_id
8866                 )
8867  AND gd.var_rent_id=p_vrent_id
8868 )temp
8869 where gd1.var_rent_id=p_vrent_id
8870 and gd1.period_id=vp.period_id
8871 and vp.period_num>1
8872 and gd1.invoice_date=temp.inv_dt(+)
8873 order by gd1.invoice_date;
8874 
8875 BEGIN
8876 pnp_debug_pkg.log('+++++++++ POP_INV_DATE_TAB_FIRSTYR START +++++++++++');
8877 
8878 FOR fst_prd_cur IN get_fst_prd_flag(p_var_rent_id ,p_status) LOOP
8879   g_partial_prd_flag := fst_prd_cur.fst_prd_flag;
8880 END LOOP;
8881 
8882 --pnp_debug_pkg.log('g_partial_prd_flag='||g_partial_prd_flag);
8883 
8884 OPEN get_partial_prd_inv_dates(p_var_rent_id,p_status) ;
8885 FETCH get_partial_prd_inv_dates BULK COLLECT INTO inv_date_tab;
8886 CLOSE get_partial_prd_inv_dates;
8887 
8888 pnp_debug_pkg.log('+++++++++ POP_INV_DATE_TAB_FIRSTYR END +++++++++++');
8889 END POP_INV_DATE_TAB_FIRSTYR;
8890 
8891 --------------------------------------------------------------------------------
8892 --  NAME         : ROLL_FWD_PARTIAL_PRD
8893 --  DESCRIPTION  : Rolls forward the abatement selections when an invoice is
8894 --                 calculated the 1st time for FY/FLY prorationmethod
8895 --  PURPOSE      :
8896 --  INVOKED FROM :
8897 --  ARGUMENTS    :
8898 --  REFERENCE    :
8899 --  HISTORY      :
8900 --
8901 --  3.Dec.06  lbala    o Created
8902 --------------------------------------------------------------------------------
8903 PROCEDURE ROLL_FWD_PARTIAL_PRD(p_var_rent_id IN NUMBER)
8904 IS
8905 
8906 l_pmt_term_id       NUMBER :=NULL;
8907 l_abtmt_term_id     NUMBER :=NULL;
8908 l_min_pmt_term_id   NUMBER :=NULL;
8909 l_row_id            VARCHAR2(18):=NULL;
8910 l_var_abmt_id       NUMBER :=NULL;
8911 l_min_var_abt_id    NUMBER :=NULL;
8912 l_fst_inv_dt        DATE := NULL;
8913 l_inv_id            NUMBER :=NULL;
8914 l_prev_inv_id       NUMBER := NULL;
8915 l_prev_dt           DATE := NULL;
8916 l_org_id            NUMBER;
8917 l_fst_inv_id        NUMBER := NULL;
8918 
8919 CURSOR org_cur(p_var_rent_id IN NUMBER) IS
8920   SELECT org_id
8921   FROM   pn_var_rents_all
8922   WHERE  var_rent_id =p_var_rent_id;
8923 
8924 /*Cursor to get all pmt terms for a particular invoice*/
8925 CURSOR get_all_pmt_terms(p_inv_id IN NUMBER) IS
8926   SELECT  distinct pterm.payment_term_id payment_term_id
8927   FROM pn_payment_terms_all pterm,
8928      pn_var_rents_all vrent,
8929      pn_var_rent_inv_all vinv
8930   WHERE vrent.lease_id = pterm.lease_id
8931   AND vrent.var_rent_id = vinv.var_rent_id
8932   AND pterm.start_date <=
8933   (SELECT MAX(gd.grp_end_date)
8934    FROM pn_var_grp_dates_all gd
8935    WHERE gd.period_id = vinv.period_id
8936    AND gd.invoice_date = vinv.invoice_date
8937   )
8938   AND pterm.end_date >=
8939   (SELECT MIN(gd1.grp_start_date)
8940    FROM pn_var_grp_dates_all gd1
8941    WHERE gd1.period_id = vinv.period_id
8942    AND gd1.invoice_date = vinv.invoice_date
8943   )
8944   AND pterm.var_rent_inv_id IS NULL
8945   AND pterm.index_period_id IS NULL
8946   AND vinv.adjust_num = 0
8947   AND vinv.var_rent_inv_id=p_inv_id;
8948 
8949 /*Cursor to get all abtmt terms for a particular invoice*/
8950 CURSOR get_abtmt_terms_inv(p_inv_id IN NUMBER) IS
8951   select * from pn_var_abatements_all
8952   where var_rent_inv_id=p_inv_id;
8953 
8954 /*Cursor to get abtmt terms for 1st invoice from setup*/
8955 CURSOR get_var_abtmt_id(p_vrent_id IN NUMBER) IS
8959   AND var_rent_id=p_vrent_id;
8956   SELECT var_abatement_id,payment_term_id
8957   FROM pn_var_abatements_all
8958   WHERE var_rent_inv_id = -1
8960 
8961 
8962 -- Get the invoice id for a given period_id and invoice_date
8963 CURSOR check_inv_exists(p_var_rent_id IN NUMBER,p_inv_dt IN DATE,p_prd_id IN NUMBER) IS
8964   SELECT var_rent_inv_id inv_id
8965   FROM pn_var_rent_inv_all
8966   WHERE invoice_date= p_inv_dt
8967   AND   var_rent_id = p_var_rent_id
8968   AND   period_id   = p_prd_id
8969   AND   adjust_num  = 0;
8970 
8971 -- Get the details of invoice for 1st partial period
8972 CURSOR get_fst_inv_id(p_var_rent_id IN NUMBER) IS
8973   SELECT var_rent_inv_id
8974     FROM pn_var_rent_inv_all
8975    WHERE var_rent_id=p_var_rent_id
8976      AND period_id IN (SELECT period_id
8977                        FROM pn_var_periods_all
8978                        WHERE period_num=1
8979                        AND var_rent_id=p_var_rent_id
8980                        AND partial_period='Y'
8981                        )
8982      AND adjust_num=0;
8983 
8984 
8985 BEGIN
8986 pnp_debug_pkg.log('+++++++++ ROLL_FWD_PARTIAL_PRD START +++++++++++');
8987 
8988 FOR rec IN org_cur(p_var_rent_id) LOOP
8989         l_org_id := rec.org_id;
8990 END LOOP;
8991 -- Get invoice id of 1st partial period
8992 FOR fst_inv IN get_fst_inv_id(p_var_rent_id) LOOP
8993    l_fst_inv_id := fst_inv.var_rent_inv_id;
8994 END LOOP;
8995 
8996 IF g_partial_prd_flag='Y' AND l_fst_inv_id IS NOT NULL THEN
8997    /* updation for 1st invoice */
8998    l_min_var_abt_id:=NULL;
8999    l_min_pmt_term_id:=NULL;
9000 
9001    FOR abtmt_exists_rec IN  get_var_abtmt_id(p_var_rent_id) LOOP
9002     l_min_var_abt_id  := abtmt_exists_rec.var_abatement_id;
9003     l_min_pmt_term_id := abtmt_exists_rec.payment_term_id;
9004 
9005     --pnp_debug_pkg.log('prior to update');
9006     PN_VAR_ABATEMENTS_PKG.LOCK_ROW(p_var_rent_id,-1,l_min_pmt_term_id);
9007     update pn_var_abatements_all
9008     set var_rent_inv_id = l_fst_inv_id
9009     where var_abatement_id = l_min_var_abt_id;
9010 
9011    END LOOP;
9012   /* updation for 1st invoice over*/
9013 
9014 END IF;
9015 
9016 FOR i IN 1..inv_date_tab.COUNT LOOP
9017 
9018  l_inv_id:=NULL;
9019  l_prev_inv_id :=NULL;
9020  IF  (inv_date_tab(i).inv_flag ='Y') THEN
9021    pnp_debug_pkg.log('invoice '||inv_date_tab(i).inv_flag||inv_date_tab(i).inv_date||inv_date_tab(i).period_id);
9022 
9023    FOR rec IN check_inv_exists(p_var_rent_id ,inv_date_tab(i).inv_date,inv_date_tab(i).period_id) LOOP
9024       l_inv_id:= rec.inv_id;
9025    END LOOP;
9026    pnp_debug_pkg.log('invoice id= '||l_inv_id);
9027 
9028    IF i=1 THEN
9029       l_prev_inv_id:=l_fst_inv_id;
9030    ELSE
9031      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
9032       l_prev_inv_id:= rec1.inv_id;
9033      END LOOP;
9034    END IF;
9035 
9036    IF l_prev_inv_id IS NOT NULL THEN
9037 
9038         FOR pmt_term_rec IN get_all_pmt_terms(l_inv_id) LOOP
9039           l_pmt_term_id:= pmt_term_rec.payment_term_id;
9040 
9041           FOR abtmt_inv_rec IN get_abtmt_terms_inv(l_prev_inv_id) LOOP
9042            l_abtmt_term_id := abtmt_inv_rec.payment_term_id;
9043 
9044            IF (l_pmt_term_id = l_abtmt_term_id) THEN
9045 
9046             l_row_id := NULL;
9047             l_var_abmt_id :=NULL;
9048 
9049             PN_VAR_ABATEMENTS_PKG.INSERT_ROW(
9050                    X_ROWID             => l_row_id,
9051                    X_VAR_ABATEMENT_ID  => l_var_abmt_id,
9052                    X_VAR_RENT_ID       => p_var_rent_id,
9053                    X_VAR_RENT_INV_ID   => l_inv_id,
9054                    X_PAYMENT_TERM_ID   => l_pmt_term_id,
9055                    X_INCLUDE_TERM      => abtmt_inv_rec.include_term,
9056                    X_INCLUDE_INCREASES => abtmt_inv_rec.include_increases,
9057                    X_UPDATE_FLAG       => NULL,
9058                    X_CREATION_DATE     => sysdate,
9059                    X_CREATED_BY        => NVL(fnd_profile.value('USER_ID'),-1),
9060                    X_LAST_UPDATE_DATE  => sysdate,
9061                    X_LAST_UPDATED_BY   => NVL(fnd_profile.value('USER_ID'),-1),
9062                    X_LAST_UPDATE_LOGIN => NVL(fnd_profile.value('USER_ID'),-1),
9063                    X_ORG_ID            => l_org_id  );
9064            END IF;
9065 
9066          END LOOP;
9067 
9068        END LOOP;
9069 
9070    ELSE
9071         EXIT ;
9072 
9073    END IF;
9074  END IF;
9075 END LOOP;
9076 pnp_debug_pkg.log('+++++++++ ROLL_FWD_PARTIAL_PRD END +++++++++++');
9077 END ROLL_FWD_PARTIAL_PRD;
9078 --------------------------------------------------------------------------------
9079 --  NAME         : ROLL_FWD_LST_PARTIAL_PRD
9080 --  DESCRIPTION  : Rolls forward the abatement selections when the last partial
9081 --                 period invoice is calculated the 1st time
9082 --  PURPOSE      :
9083 --  INVOKED FROM :
9084 --  ARGUMENTS    :
9085 --  REFERENCE    :
9086 --  HISTORY      :
9087 --
9088 --  3.Dec.06  lbala    o Created
9089 --------------------------------------------------------------------------------
9090 PROCEDURE ROLL_FWD_LST_PARTIAL_PRD(p_var_rent_id IN NUMBER)
9091 IS
9092 --- Get org_id
9096   WHERE  var_rent_id =p_var_rent_id;
9093 CURSOR org_cur(p_var_rent_id IN NUMBER) IS
9094   SELECT org_id
9095   FROM   pn_var_rents_all
9097 
9098 -- Get the last partial period id
9099 CURSOR get_last_partial_prd(p_var_rent_id IN NUMBER) IS
9100  SELECT prd.period_id
9101    FROM pn_var_periods_all prd ,pn_var_rents_all vrent
9102   WHERE prd.var_rent_id=p_var_rent_id
9103     AND vrent.var_rent_id = prd.var_rent_id
9104     AND prd.end_date = vrent.termination_date
9105     AND partial_period='Y';
9106 
9107 -- Get the invoice id
9108 CURSOR get_last_invoice_id(p_var_rent_id IN NUMBER
9109                           ,p_prd_id IN NUMBER
9110                           ,p_inv_dt IN DATE
9111                           )
9112   IS
9113   SELECT var_rent_inv_id
9114     FROM pn_var_rent_inv_all
9115    WHERE var_rent_id=p_var_rent_id
9116      AND period_id=p_prd_id
9117      AND invoice_date=p_inv_dt
9118      AND adjust_num=0;
9119 
9120 -- Get all invoices for a given period
9121 CURSOR get_last_prd_inv(p_var_rent_id IN NUMBER
9122                        ,p_prd_id IN NUMBER
9123                        ,p_inv_id IN NUMBER)
9124   IS
9125   SELECT var_rent_inv_id
9126     FROM pn_var_rent_inv_all
9127    WHERE var_rent_id=p_var_rent_id
9128      AND period_id=p_prd_id
9129      AND var_rent_inv_id <> p_inv_id
9130      AND adjust_num=0;
9131 
9132 /*Cursor to get all abtmt terms for a particular invoice*/
9133 CURSOR get_abtmt_terms_inv(p_inv_id IN NUMBER) IS
9134   SELECT * FROM pn_var_abatements_all
9135   WHERE var_rent_inv_id=p_inv_id;
9136 
9137 -- Check whether a given combination of (payment_term_id,var_rent_inv_id)
9138 --       exists in pn_var_abatements_all
9139 CURSOR check_abtmt_exists(p_inv_id IN NUMBER,p_pmt_id IN NUMBER)
9140 IS
9141   SELECT 'Y' abt_exists
9142     FROM dual
9143    WHERE EXISTS ( SELECT NULL
9144                   FROM pn_var_abatements_all
9145                   WHERE var_rent_inv_id=p_inv_id
9146                   AND payment_term_id = p_pmt_id );
9147 -- Get the invoice_date for an invoice with a given grp_end_dt
9148 CURSOR get_inv_date(p_var_rent_id IN NUMBER,p_prd_id IN NUMBER,p_end_dt IN DATE)
9149 IS
9150 SELECT invoice_date
9151 FROM pn_var_grp_dates_all
9152 WHERE var_rent_id = p_var_rent_id
9153 AND period_id = p_prd_id
9154 AND grp_end_date = p_end_dt;
9155 
9156 l_org_id      NUMBER :=NULL;
9157 l_last_prd_id NUMBER :=NULL;
9158 l_last_inv_id NUMBER :=NULL;
9159 l_inv_id      NUMBER :=NULL;
9160 l_pmt_term_id NUMBER :=NULL;
9161 l_abt_exists  VARCHAR2(1):=NULL;
9162 l_row_id      ROWID ;
9163 l_var_abmt_id NUMBER :=NULL;
9164 l_last_inv_dt DATE   :=NULL;
9165 j             NUMBER :=NULL;
9166 BEGIN
9167 pnp_debug_pkg.log('+++++++++ ROLL_FWD_LST_PARTIAL_PRD START +++++++++++');
9168 
9169 --1. Get last partial period id
9170 --2. Get invoice date for the last invoice of this partial period whose grp end date is
9171 --   Variable Rent Agreement's termination date
9172 --3. Get the index of the corresponding record from inv_date_tab for combination of the above
9173 --   invoice date and last partial period id and determine the corresponding invoice id
9174 --4. If roll fwd flag='Y' , then roll forward the UNION of selecns from other invoices of the
9175 --   last partial period to this invoice id
9176 
9177 FOR rec IN org_cur(p_var_rent_id) LOOP
9178   l_org_id := rec.org_id;
9179 END LOOP;
9180 
9181 -- Get last partial period id
9182 FOR last_prd_rec IN get_last_partial_prd(p_var_rent_id) LOOP
9183    l_last_prd_id := last_prd_rec.period_id;
9184 END LOOP;
9185 
9186 --pnp_debug_pkg.log('last period id= '||l_last_prd_id);
9187 
9188 IF l_last_prd_id IS NOT NULL THEN
9189 
9190  FOR rec IN get_inv_date(p_var_rent_id,l_last_prd_id,g_vr_termination_date) LOOP
9191   l_last_inv_dt := rec.invoice_date;
9192  END LOOP;
9193 
9194  FOR i IN 1..inv_date_tab.COUNT LOOP
9195      IF inv_date_tab(i).period_id=l_last_prd_id AND
9196         inv_date_tab(i).inv_date= l_last_inv_dt THEN
9197         j:=i;
9198         EXIT;
9199      END IF;
9200  END LOOP;
9201 
9202  IF ((j IS NOT NULL) AND inv_date_tab(j).inv_flag ='Y') THEN
9203 
9204   FOR last_inv_rec IN get_last_invoice_id(p_var_rent_id,l_last_prd_id,inv_date_tab(j).inv_date) LOOP
9205    l_last_inv_id := last_inv_rec.var_rent_inv_id;
9206   END LOOP;
9207   --pnp_debug_pkg.log('last invoice id= '||l_last_inv_id);
9208 
9209   FOR inv_rec IN get_last_prd_inv(p_var_rent_id,l_last_prd_id,l_last_inv_id) LOOP
9210    l_inv_id := inv_rec.var_rent_inv_id;
9211    --pnp_debug_pkg.log('invoice id = '||l_inv_id);
9212 
9213    FOR abtmt_inv_rec IN get_abtmt_terms_inv(l_inv_id) LOOP
9214      l_pmt_term_id := abtmt_inv_rec.payment_term_id;
9215 
9216      FOR rec1 IN check_abtmt_exists(l_last_inv_id,l_pmt_term_id) LOOP
9217        l_abt_exists := rec1.abt_exists;
9218      END LOOP;
9219 
9220      IF l_abt_exists <> 'Y' THEN
9221        l_row_id := NULL;
9222        l_var_abmt_id :=NULL;
9223 
9224        PN_VAR_ABATEMENTS_PKG.INSERT_ROW(
9225                    X_ROWID             => l_row_id,
9226                    X_VAR_ABATEMENT_ID  => l_var_abmt_id,
9227                    X_VAR_RENT_ID       => p_var_rent_id,
9228                    X_VAR_RENT_INV_ID   => l_last_inv_id,
9232                    X_UPDATE_FLAG       => NULL,
9229                    X_PAYMENT_TERM_ID   => l_pmt_term_id,
9230                    X_INCLUDE_TERM      => abtmt_inv_rec.include_term,
9231                    X_INCLUDE_INCREASES => abtmt_inv_rec.include_increases,
9233                    X_CREATION_DATE     => sysdate,
9234                    X_CREATED_BY        => NVL(fnd_profile.value('USER_ID'),-1),
9235                    X_LAST_UPDATE_DATE  => sysdate,
9236                    X_LAST_UPDATED_BY   => NVL(fnd_profile.value('USER_ID'),-1),
9237                    X_LAST_UPDATE_LOGIN => NVL(fnd_profile.value('USER_ID'),-1),
9238                    X_ORG_ID            => l_org_id  );
9239 
9240      END IF;
9241 
9242    END LOOP;
9243 
9244   END LOOP;
9245 
9246  END IF;
9247 
9248 END IF;
9249 pnp_debug_pkg.log('+++++++++ ROLL_FWD_LST_PARTIAL_PRD END +++++++++++');
9250 END ROLL_FWD_LST_PARTIAL_PRD;
9251 
9252 --------------------------------------------------------------------------------
9253 --  NAME         : ROLL_FWD_SELECNS
9254 --  DESCRIPTION  : Rolls forward the abatement selections when an invoice is
9255 --                 calculated the 1st time
9256 --  PURPOSE      :
9257 --  INVOKED FROM :
9258 --  ARGUMENTS    :
9259 --  REFERENCE    :
9260 --  HISTORY      :
9261 --
9262 --  3.Dec.06  lbala    o Created
9263 --------------------------------------------------------------------------------
9264 
9265 PROCEDURE ROLL_FWD_SELECNS(p_var_rent_id IN NUMBER)
9266 IS
9267 
9268 l_pmt_term_id       NUMBER :=NULL;
9269 l_abtmt_term_id     NUMBER :=NULL;
9270 l_min_pmt_term_id   NUMBER :=NULL;
9271 l_row_id            VARCHAR2(18):=NULL;
9272 l_var_abmt_id       NUMBER :=NULL;
9273 l_min_var_abt_id    NUMBER :=NULL;
9274 l_fst_inv_dt        DATE := NULL;
9275 l_inv_id            NUMBER :=NULL;
9276 l_prev_inv_id       NUMBER := NULL;
9277 l_prev_dt           DATE := NULL;
9278 l_org_id            NUMBER;
9279 
9280 
9281 /* Cursor to get 1st invoice date*/
9282 CURSOR get_min_inv(p_var_rent_id IN NUMBER) IS
9283    SELECT min(invoice_date) fst_inv_dt
9284    FROM pn_var_grp_dates_all
9285    WHERE var_rent_id= p_var_rent_id ;
9286 
9287 
9288 /*Cursor to get all pmt terms for a particular invoice*/
9289 CURSOR get_all_pmt_terms(p_inv_id IN NUMBER) IS
9290   SELECT distinct pterm.payment_term_id payment_term_id
9291   FROM pn_payment_terms_all pterm,
9292        pn_var_rents_all     vrent,
9293        pn_var_rent_inv_all  vinv
9294   WHERE vrent.lease_id = pterm.lease_id
9295   AND vrent.var_rent_id = vinv.var_rent_id
9296   AND pterm.start_date <=
9297   (SELECT MAX(gd.grp_end_date)
9298    FROM pn_var_grp_dates_all gd
9299    WHERE gd.period_id = vinv.period_id
9300    AND gd.invoice_date = vinv.invoice_date
9301   )
9302   AND pterm.end_date >=
9303   (SELECT MIN(gd1.grp_start_date)
9304    FROM pn_var_grp_dates_all gd1
9305    WHERE gd1.period_id = vinv.period_id
9306    AND gd1.invoice_date = vinv.invoice_date
9307   )
9308   AND pterm.var_rent_inv_id IS NULL
9309   AND pterm.index_period_id IS NULL
9310   AND vinv.adjust_num = 0
9311   AND vinv.var_rent_inv_id=p_inv_id;
9312 
9313 /*Cursor to get all abtmt terms for a particular invoice*/
9314 CURSOR get_abtmt_terms_inv(p_inv_id IN NUMBER) IS
9315   select * from pn_var_abatements_all
9316   where var_rent_inv_id=p_inv_id;
9317 
9318 /*Cursor to get abtmt terms for 1st invoice from setup*/
9319 CURSOR get_var_abtmt_id(p_var_rent_id IN NUMBER) IS
9320   SELECT var_abatement_id , payment_term_id
9321   FROM pn_var_abatements_all
9322   WHERE var_rent_inv_id = -1
9323   AND var_rent_id=p_var_rent_id;
9324 
9325 -- Get the invoice id for combination of a given invoice_date and period_id
9326 CURSOR check_inv_exists(p_var_rent_id IN NUMBER,p_inv_dt IN DATE,p_prd_id IN NUMBER) IS
9327   SELECT var_rent_inv_id inv_id
9328   FROM pn_var_rent_inv_all
9329   WHERE invoice_date=p_inv_dt
9330   AND   var_rent_id =p_var_rent_id
9331   AND   period_id  =p_prd_id
9332   AND   adjust_num=0;
9333 
9334 CURSOR org_cur(p_var_rent_id IN NUMBER) IS
9335   SELECT org_id
9336   FROM   pn_var_rents_all
9337   WHERE  var_rent_id =p_var_rent_id;
9338 
9339 BEGIN
9340 /* Get 1st invoice */
9341 pnp_debug_pkg.log('+++++++++ ROLL_FWD_SELECNS START +++++++++++');
9342 
9343 FOR rec IN org_cur(p_var_rent_id) LOOP
9344   l_org_id := rec.org_id;
9345 END LOOP;
9346 
9347 FOR min_inv_rec IN get_min_inv(p_var_rent_id) LOOP
9348   l_fst_inv_dt := min_inv_rec.fst_inv_dt;
9349 END LOOP;
9350 --pnp_debug_pkg.log('1st invoice date= '||l_fst_inv_dt);
9351 
9352 FOR i IN 1..inv_date_tab.COUNT LOOP
9353 
9354  l_inv_id:=NULL;
9355  l_prev_inv_id :=NULL;
9356 
9357  IF  (inv_date_tab(i).inv_flag ='Y') THEN
9358    --pnp_debug_pkg.log('invoice '||inv_date_tab(i).inv_flag||inv_date_tab(i).inv_date||p_var_rent_id);
9359 
9360    FOR rec IN check_inv_exists(p_var_rent_id ,inv_date_tab(i).inv_date,inv_date_tab(i).period_id) LOOP
9361        l_inv_id:= rec.inv_id;
9362    END LOOP;
9363        --pnp_debug_pkg.log('invoice id= '||l_inv_id);
9364 
9365        IF  (inv_date_tab(i).inv_date=l_fst_inv_dt) THEN
9366           /* updation for 1st invoice */
9367 
9368            IF l_inv_id IS NOT NULL THEN
9372 
9369                 l_min_pmt_term_id:=NULL;
9370                 l_min_var_abt_id:=NULL;
9371                 FOR abtmt_exists_rec IN get_var_abtmt_id(p_var_rent_id) LOOP
9373                   l_min_var_abt_id:= abtmt_exists_rec.var_abatement_id;
9374                   l_min_pmt_term_id:= abtmt_exists_rec.payment_term_id;
9375                   --pnp_debug_pkg.log('prior to update');
9376 
9377                   PN_VAR_ABATEMENTS_PKG.LOCK_ROW(p_var_rent_id,-1,l_min_pmt_term_id);
9378                   UPDATE pn_var_abatements_all
9379                   SET var_rent_inv_id=l_inv_id
9380                   WHERE var_abatement_id = l_min_var_abt_id;
9381 
9382                 END LOOP;
9383            END IF;
9384            /* updation for 1st invoice over*/
9385        ELSE
9386 
9387           l_prev_dt:= inv_date_tab(i-1).inv_date;
9388           FOR rec1 IN check_inv_exists(p_var_rent_id ,l_prev_dt,inv_date_tab(i-1).period_id) LOOP
9389             l_prev_inv_id:= rec1.inv_id;
9390           END LOOP;
9391 
9392           IF l_prev_inv_id IS NOT NULL THEN
9393 
9394               FOR pmt_term_rec IN get_all_pmt_terms(l_inv_id) LOOP
9395                l_pmt_term_id:= pmt_term_rec.payment_term_id;
9396 
9397                FOR abtmt_inv_rec IN get_abtmt_terms_inv(l_prev_inv_id) LOOP
9398                 l_abtmt_term_id := abtmt_inv_rec.payment_term_id;
9399 
9400                 IF (l_pmt_term_id = l_abtmt_term_id) THEN
9401                  l_row_id := NULL;
9402                  l_var_abmt_id :=NULL;
9403 
9404                  PN_VAR_ABATEMENTS_PKG.INSERT_ROW(
9405                         X_ROWID             => l_row_id,
9406                         X_VAR_ABATEMENT_ID  => l_var_abmt_id,
9407                         X_VAR_RENT_ID       => p_var_rent_id,
9408                         X_VAR_RENT_INV_ID   => l_inv_id,
9409                         X_PAYMENT_TERM_ID   => l_pmt_term_id,
9410                         X_INCLUDE_TERM      => abtmt_inv_rec.include_term,
9411                         X_INCLUDE_INCREASES => abtmt_inv_rec.include_increases,
9412                         X_UPDATE_FLAG       => NULL,
9413                         X_CREATION_DATE     => sysdate,
9414                         X_CREATED_BY        => NVL(fnd_profile.value('USER_ID'),-1),
9415                         X_LAST_UPDATE_DATE  => sysdate,
9416                         X_LAST_UPDATED_BY   => NVL(fnd_profile.value('USER_ID'),-1),
9417                         X_LAST_UPDATE_LOGIN => NVL(fnd_profile.value('USER_ID'),-1),
9418                         X_ORG_ID            => l_org_id  );
9419                 END IF;
9420 
9421               END LOOP;
9422 
9423             END LOOP;
9424 
9425           ELSE
9426              EXIT ;
9427 
9428           END IF;
9429 
9430       END IF;
9431 END IF;
9432 
9433 END LOOP;
9434 pnp_debug_pkg.log('+++++++++ ROLL_FWD_SELECNS END +++++++++++');
9435 END ROLL_FWD_SELECNS;
9436 --------------------------------------------------------------------------------
9437 --  NAME         : include_increases_firstyr
9438 --  DESCRIPTION  : Includes Rent Increase terms to be abated for 1st partial period
9439 --  PURPOSE      :
9440 --  INVOKED FROM :
9441 --  ARGUMENTS    :
9442 --  REFERENCE    :
9443 --  HISTORY      :
9444 --
9445 --  3.Dec.06  lbala    o Created
9446 --------------------------------------------------------------------------------
9447 PROCEDURE include_increases_firstyr(p_var_rent_id IN NUMBER) IS
9448 
9449 /*Cursor to get all abtmt terms with include_incr='Y' for a particular invoice*/
9450 CURSOR get_abtmt_terms_inv(p_inv_id IN NUMBER,p_var_rent_id IN NUMBER) IS
9451   SELECT * from pn_var_abatements_all
9452    WHERE var_rent_inv_id = p_inv_id
9453     AND  var_rent_id = p_var_rent_id
9454     AND  include_increases = 'Y';
9455 
9456 -- Get the rent increase terms for a payment term of a particular invoice
9457 CURSOR get_rent_incr_cur(p_term_id IN NUMBER,p_inv_id IN NUMBER) IS
9458 
9459 SELECT ppt.payment_term_id rent_incr_term_id
9460  FROM  pn_index_lease_terms_all pilt,
9461        pn_payment_terms_all ppt ,
9462        pn_index_leases_all pil,
9463        pn_var_rent_inv_all vinv
9464 WHERE pilt.index_lease_id = pil.index_lease_id
9465 AND pil.lease_id = ppt.lease_id
9466 AND pilt.index_period_id = ppt.index_period_id
9467 AND pilt.rent_increase_term_id = ppt.payment_term_id
9468 AND ppt.start_date <= (SELECT MAX(gd.grp_end_date)
9469                        FROM pn_var_grp_dates_all gd
9470                        WHERE gd.period_id = vinv.period_id
9471                       )
9472 AND ppt.end_date >=  (SELECT MIN(gd1.grp_start_date)
9473                       FROM pn_var_grp_dates_all gd1
9474                       WHERE gd1.period_id = vinv.period_id
9475                      )
9476 AND pilt.lease_term_id = p_term_id
9477 AND ppt.status='APPROVED'
9478 AND vinv.adjust_num = 0
9479 AND vinv.var_rent_inv_id=p_inv_id;
9480 
9481 -- Check if abatement exists for this pmt term and invoice id combination
9482 CURSOR check_abtmt_exists(pmt_term_id IN NUMBER,invoice_id IN NUMBER) IS
9483   SELECT 'N'
9484     FROM dual
9485    WHERE NOT EXISTS ( SELECT NULL FROM pn_var_abatements_all
9486                        WHERE payment_term_id=pmt_term_id
9487                         AND  var_rent_inv_id=invoice_id);
9488 
9489 CURSOR org_cur(p_var_rent_id IN NUMBER) IS
9490   SELECT org_id
9491   FROM   pn_var_rents_all
9495   SELECT var_rent_inv_id
9492   WHERE  var_rent_id =p_var_rent_id;
9493 --Get invoice id of the 1st partial period
9494 CURSOR get_fst_inv_id(p_var_rent_id IN NUMBER) IS
9496     FROM pn_var_rent_inv_all
9497    WHERE var_rent_id=p_var_rent_id
9498      AND period_id IN (SELECT period_id
9499                        FROM pn_var_periods_all
9500                        WHERE period_num=1
9501                        AND var_rent_id=p_var_rent_id
9502                        AND partial_period='Y')
9503      AND adjust_num=0;
9504 
9505 l_abtmt_exists VARCHAR2(1) := NULL;
9506 l_inv_id       NUMBER      := NULL;
9507 l_row_id       VARCHAR2(18):= NULL;
9508 l_var_abmt_id  NUMBER      := NULL;
9509 l_org_id       NUMBER;
9510 
9511 BEGIN
9512 pnp_debug_pkg.log('+++++++++ include_increases_firstyr START +++++++++++');
9513 FOR rec IN org_cur(p_var_rent_id) LOOP
9514     l_org_id := rec.org_id;
9515 END LOOP;
9516 IF g_partial_prd_flag='Y' THEN
9517 
9518    FOR fst_inv_rec IN get_fst_inv_id(p_var_rent_id) LOOP
9519      l_inv_id := fst_inv_rec.var_rent_inv_id;
9520    END LOOP;
9521 
9522    --pnp_debug_pkg.log('invoice_id =  '||l_inv_id);
9523    FOR parent_rec IN get_abtmt_terms_inv(l_inv_id ,p_var_rent_id ) LOOP
9524 
9525         --pnp_debug_pkg.log('parent term = '||parent_rec.payment_term_id);
9526         FOR rent_incr IN  get_rent_incr_cur(parent_rec.payment_term_id ,l_inv_id ) LOOP
9527 
9528              --pnp_debug_pkg.log('child_term = '||rent_incr.rent_incr_term_id);
9529              l_abtmt_exists := NULL;
9530 
9531              OPEN check_abtmt_exists(rent_incr.rent_incr_term_id,l_inv_id);
9532              FETCH check_abtmt_exists INTO l_abtmt_exists ;
9533              CLOSE check_abtmt_exists;
9534 
9535              IF  l_abtmt_exists  = 'N' THEN
9536 
9537                  l_row_id := NULL;
9538                  l_var_abmt_id :=NULL;
9539                  PN_VAR_ABATEMENTS_PKG.INSERT_ROW(
9540                         X_ROWID             => l_row_id,
9541                         X_VAR_ABATEMENT_ID  => l_var_abmt_id,
9542                         X_VAR_RENT_ID       => p_var_rent_id,
9543                         X_VAR_RENT_INV_ID   => l_inv_id,
9544                         X_PAYMENT_TERM_ID   => rent_incr.rent_incr_term_id,
9545                         X_INCLUDE_TERM      => 'Y',
9546                         X_INCLUDE_INCREASES => 'Y',
9547                         X_UPDATE_FLAG       => NULL,
9548                         X_CREATION_DATE     => sysdate,
9549                         X_CREATED_BY        => NVL(fnd_profile.value('USER_ID'),-1),
9550                         X_LAST_UPDATE_DATE  => sysdate,
9551                         X_LAST_UPDATED_BY   => NVL(fnd_profile.value('USER_ID'),-1),
9552                         X_LAST_UPDATE_LOGIN => NVL(fnd_profile.value('USER_ID'),-1),
9553                         X_ORG_ID            => l_org_id  );
9554              END IF;
9555 
9556         END LOOP;
9557 
9558    END LOOP;
9559 END IF;
9560 pnp_debug_pkg.log('+++++++++ include_increases_firstyr END +++++++++++');
9561 END include_increases_firstyr;
9562 --------------------------------------------------------------------------------
9563 --  NAME         : include_increases
9564 --  DESCRIPTION  : Includes Rent Increase terms to be abated
9565 --  PURPOSE      :
9566 --  INVOKED FROM :
9567 --  ARGUMENTS    :
9568 --  REFERENCE    :
9569 --  HISTORY      :
9570 --
9571 --  3.Dec.06  lbala    o Created
9572 --------------------------------------------------------------------------------
9573 PROCEDURE include_increases(p_var_rent_id IN NUMBER) IS
9574 
9575 /*Cursor to get all abtmt terms with include_incr='Y' for a particular invoice*/
9576 CURSOR get_abtmt_terms_inv(p_inv_id IN NUMBER,p_var_rent_id IN NUMBER) IS
9577   SELECT * from pn_var_abatements_all
9578    WHERE var_rent_inv_id = p_inv_id AND
9579          var_rent_id = p_var_rent_id AND
9580          include_increases = 'Y';
9581 
9582 
9583 -- Get the rent increase terms for a payment term of a particular invoice
9584 CURSOR get_rent_incr_cur(p_term_id IN NUMBER,p_inv_id IN NUMBER) IS
9585 
9586 SELECT ppt.payment_term_id rent_incr_term_id
9587  FROM  pn_index_lease_terms_all pilt,
9588        pn_payment_terms_all ppt ,
9589        pn_index_leases_all pil,
9590        pn_var_rent_inv_all vinv
9591 WHERE pilt.index_lease_id = pil.index_lease_id
9592 AND pil.lease_id = ppt.lease_id
9593 AND pilt.index_period_id = ppt.index_period_id
9594 AND pilt.rent_increase_term_id = ppt.payment_term_id
9595 AND ppt.start_date <= (SELECT MAX(gd.grp_end_date)
9596                        FROM pn_var_grp_dates_all gd
9597                        WHERE gd.period_id = vinv.period_id
9598                        AND gd.invoice_date = vinv.invoice_date
9599                        )
9600 AND ppt.end_date >=  (SELECT MIN(gd1.grp_start_date)
9601                         FROM pn_var_grp_dates_all gd1
9602                         WHERE gd1.period_id = vinv.period_id
9603                         AND gd1.invoice_date = vinv.invoice_date
9604                      )
9605 AND pilt.lease_term_id = p_term_id
9606 AND ppt.status='APPROVED'
9607 AND vinv.adjust_num = 0
9608 AND vinv.var_rent_inv_id=p_inv_id;
9609 
9610 -- Get the details of
9611 CURSOR check_abtmt_exists(pmt_term_id IN NUMBER,invoice_id IN NUMBER) IS
9612   SELECT 'N'
9613     FROM dual
9614    WHERE NOT EXISTS ( SELECT NULL FROM pn_var_abatements_all
9618 CURSOR check_inv_exists(p_var_rent_id IN NUMBER,p_inv_dt IN DATE,p_prd_id IN NUMBER) IS
9615                       WHERE payment_term_id=pmt_term_id
9616                       AND var_rent_inv_id=invoice_id);
9617 
9619   SELECT var_rent_inv_id inv_id
9620   FROM pn_var_rent_inv_all
9621   WHERE invoice_date=p_inv_dt
9622   AND   period_id= p_prd_id
9623   AND  var_rent_id= p_var_rent_id
9624   AND  adjust_num=0;
9625 
9626 CURSOR org_cur(p_var_rent_id IN NUMBER) IS
9627   SELECT org_id
9628   FROM   pn_var_rents_all
9629   WHERE  var_rent_id =p_var_rent_id;
9630 
9631 l_abtmt_exists VARCHAR2(1) := NULL;
9632 l_inv_id       NUMBER      := NULL;
9633 l_row_id       VARCHAR2(18):= NULL;
9634 l_var_abmt_id  NUMBER      := NULL;
9635 l_org_id       NUMBER;
9636 BEGIN
9637 
9638 pnp_debug_pkg.log('+++++++++ include_increases START +++++++++++');
9639 FOR rec IN org_cur(p_var_rent_id) LOOP
9640         l_org_id := rec.org_id;
9641 END LOOP;
9642 
9643 FOR i IN 1..inv_date_tab.COUNT LOOP
9644 
9645   IF  (inv_date_tab(i).inv_flag ='Y') THEN
9646      FOR rec IN check_inv_exists(p_var_rent_id ,inv_date_tab(i).inv_date,inv_date_tab(i).period_id) LOOP
9647                 l_inv_id:= rec.inv_id;
9648      END LOOP;
9649      --pnp_debug_pkg.log('invoice_id =  '||l_inv_id);
9650 
9651      FOR parent_rec IN get_abtmt_terms_inv(l_inv_id ,p_var_rent_id ) LOOP
9652 
9653           --pnp_debug_pkg.log('parent term = '||parent_rec.payment_term_id);
9654 
9655           FOR rent_incr IN  get_rent_incr_cur(parent_rec.payment_term_id ,l_inv_id ) LOOP
9656 
9657              --pnp_debug_pkg.log('child_term = '||rent_incr.rent_incr_term_id);
9658 
9659              l_abtmt_exists := NULL;
9660              OPEN check_abtmt_exists(rent_incr.rent_incr_term_id,l_inv_id);
9661              FETCH check_abtmt_exists INTO l_abtmt_exists ;
9662              CLOSE check_abtmt_exists;
9663 
9664              IF  l_abtmt_exists  = 'N' THEN
9665 
9666                  l_row_id := NULL;
9667                  l_var_abmt_id :=NULL;
9668 
9669                  PN_VAR_ABATEMENTS_PKG.INSERT_ROW(
9670                         X_ROWID             => l_row_id,
9671                         X_VAR_ABATEMENT_ID  => l_var_abmt_id,
9672                         X_VAR_RENT_ID       => p_var_rent_id,
9673                         X_VAR_RENT_INV_ID   => l_inv_id,
9674                         X_PAYMENT_TERM_ID   => rent_incr.rent_incr_term_id,
9675                         X_INCLUDE_TERM      => 'Y',
9676                         X_INCLUDE_INCREASES => 'Y',
9677                         X_UPDATE_FLAG       => NULL,
9678                         X_CREATION_DATE     => sysdate,
9679                         X_CREATED_BY        => NVL(fnd_profile.value('USER_ID'),-1),
9680                         X_LAST_UPDATE_DATE  => sysdate,
9681                         X_LAST_UPDATED_BY   => NVL(fnd_profile.value('USER_ID'),-1),
9682                         X_LAST_UPDATE_LOGIN => NVL(fnd_profile.value('USER_ID'),-1),
9683                         X_ORG_ID            => l_org_id  );
9684 
9685              END IF;
9686 
9687           END LOOP;
9688 
9689      END LOOP;
9690   END IF;
9691 END LOOP;
9692 pnp_debug_pkg.log('+++++++++ include_increases END +++++++++++');
9693 END include_increases;
9694 
9695 --------------------------------------------------------------------------------
9696 --  NAME         : post_summary - global procedure
9697 --  DESCRIPTION  :
9698 --  PURPOSE      :
9699 --  INVOKED FROM :
9700 --  ARGUMENTS    :
9701 --  REFERENCE    : PN_COMMON.debug()
9702 --  HISTORY      : 5/Dec/2006 Shabda Populate deductions in var_rent_summ_all
9703 --                 fix for bug 5679847
9704 --
9705 --  dd-mon-yyyy  name     o Created
9706 --  21-MAY-07    Lokesh   o Added rounding off for bug # 6031202 in
9707 --                          pn_var_rent_summ_all
9708 --------------------------------------------------------------------------------
9709 PROCEDURE post_summary ( p_var_rent_id  IN NUMBER
9710                         ,p_period_id    IN NUMBER)
9711 IS
9712 
9713   /* get all lines */
9714   CURSOR lines_c( p_vr_id  IN NUMBER
9715                  ,p_prd_id IN NUMBER) IS
9716     SELECT
9717     line_item_id
9718     FROM
9719     pn_var_lines_all
9720     WHERE
9721     var_rent_id = p_vr_id AND
9722     period_id = p_prd_id;
9723 
9724   /* get grp date */
9725   CURSOR grp_date_c( p_vr_id  IN NUMBER
9726                     ,p_prd_id IN NUMBER) IS
9727     SELECT
9728      grp.grp_date_id
9729     ,grp.group_date
9730     ,grp.invoice_date
9731     ,grp.org_id
9732     FROM
9733      pn_var_grp_dates_all grp
9734     ,pn_var_periods_all   prd
9735     WHERE
9736     prd.var_rent_id = p_vr_id  AND
9737     prd.period_id   = p_prd_id AND
9738     grp.period_id   = prd.period_id AND
9739     grp.grp_end_date <= prd.end_date;
9740 
9741   TYPE GRP_TBL IS TABLE OF grp_date_c%ROWTYPE INDEX BY BINARY_INTEGER;
9742   l_grp_t GRP_TBL;
9743 
9744   /* Get rent and volume to store in pn_var_rent_summ_all */
9745   CURSOR summ_c( p_vr_id   IN NUMBER
9746                 ,p_prd_id  IN NUMBER
9747                 ,p_line_id IN NUMBER
9748                 ,p_grp_id  IN NUMBER) IS
9749     SELECT
9750      NVL(SUM(hdr.percent_rent_due),0)
9751      + NVL(SUM(DECODE(hdr.invoice_flag
9755               ), 0) AS rent
9752                       ,'I',hdr.prorated_rent_due
9753                           ,0
9754                      )
9756     ,NVL(SUM(hdr.prorated_group_sales)
9757          , 0) AS sales
9758     ,NVL(SUM(hdr.prorated_group_deductions)
9759          , 0) AS ded
9760     ,NVL(SUM(hdr.first_yr_rent), 0) AS first_yr_rent
9761     FROM
9762     pn_var_trx_headers_all hdr
9763     WHERE
9764     hdr.var_rent_id  = p_vr_id AND
9765     hdr.period_id    = p_prd_id AND
9766     hdr.line_item_id = p_line_id AND
9767     hdr.grp_date_id  = p_grp_id;
9768 
9769   /* exists VR summ record */
9770   CURSOR vr_summ_c ( p_vr_id  IN NUMBER
9771                     ,p_prd_id IN NUMBER
9772                     ,p_line_id IN NUMBER
9773                     ,p_grp_id IN NUMBER) IS
9774     SELECT
9775      var_rent_summ_id
9776     ,tot_act_vol
9777     ,tot_ded
9778     ,act_var_rent
9779     ,first_yr_rent
9780     FROM
9781     pn_var_rent_summ_all
9782     WHERE
9783     var_rent_id = p_vr_id AND
9784     period_id = p_prd_id AND
9785     line_item_id = p_line_id AND
9786     grp_date_id = p_grp_id;
9787 
9788   l_vr_summ_id NUMBER;
9789 
9790 BEGIN
9791 
9792   pnp_debug_pkg.log('+++++++++ post_summary START +++++++++++');
9793 
9794   l_grp_t.DELETE;
9795 
9796   OPEN grp_date_c( p_vr_id  => p_var_rent_id
9797                   ,p_prd_id => p_period_id);
9798   FETCH grp_date_c BULK COLLECT INTO l_grp_t;
9799   CLOSE grp_date_c;
9800 
9801   /* loop for all lines in the annual period */
9802   FOR line_rec IN lines_c( p_vr_id  => p_var_rent_id
9803                           ,p_prd_id => p_period_id)
9804   LOOP
9805 
9806     pnp_debug_pkg.log('line_rec.line_item_id...'||line_rec.line_item_id);
9807     /* loop for all calc periods in the annual period */
9808     FOR g IN 1..l_grp_t.COUNT LOOP
9809 
9810       /* get the sum of rents and sales for
9811          vr -> period -> line item -> group combination
9812          from the trx tables
9813          -- loops only once --
9814       */
9815       pnp_debug_pkg.log('g..'||g);
9816       FOR summ_rec IN summ_c( p_vr_id   => p_var_rent_id
9817                              ,p_prd_id  => p_period_id
9818                              ,p_line_id => line_rec.line_item_id
9819                              ,p_grp_id  => l_grp_t(g).grp_date_id)
9820       LOOP
9821 
9822         pnp_debug_pkg.log('summ_rec.sales..'||summ_rec.sales);
9823         pnp_debug_pkg.log('summ_rec.rent..'||summ_rec.rent);
9824         pnp_debug_pkg.log('summ_rec.first_yr_rent..'||summ_rec.first_yr_rent);
9825         l_vr_summ_id := NULL;
9826 
9827         /* chk if VR SUMM record exists for this
9828            vr -> period -> line item -> group combination */
9829         FOR vr_summ_rec IN vr_summ_c( p_vr_id   => p_var_rent_id
9830                                      ,p_prd_id  => p_period_id
9831                                      ,p_line_id => line_rec.line_item_id
9832                                      ,p_grp_id  => l_grp_t(g).grp_date_id)
9833         LOOP
9834 
9835           l_vr_summ_id := vr_summ_rec.var_rent_summ_id;
9836 
9837         pnp_debug_pkg.log('l_vr_summ_id..'||l_vr_summ_id);
9838 
9839           IF summ_rec.sales <> NVL(vr_summ_rec.tot_act_vol, 0) OR
9840              summ_rec.rent  <> NVL(vr_summ_rec.act_var_rent, 0) OR
9841              summ_rec.first_yr_rent  <> NVL(vr_summ_rec.first_yr_rent, 0) OR
9842              NVL(summ_rec.ded, 0)  <> NVL(vr_summ_rec.tot_ded, 0)
9843           THEN
9844 
9845            pnp_debug_pkg.log('before updation ...');
9846             UPDATE
9847             pn_var_rent_summ_all
9848             SET
9849              tot_act_vol  = summ_rec.sales
9850             ,tot_ded      = summ_rec.ded
9851             ,act_var_rent = round(summ_rec.rent,g_precision)
9852             ,first_yr_rent = round(summ_rec.first_yr_rent,g_precision)
9853             ,last_update_date  = SYSDATE
9854             ,last_updated_by   = NVL(fnd_global.user_id, 0)
9855             ,last_update_login = NVL(fnd_global.login_id, 0)
9856             WHERE
9857             var_rent_summ_id = l_vr_summ_id;
9858 
9859           END IF;
9860 
9861         END LOOP; /* chk if VR SUMM exists vr -> prd -> line -> grp combo */
9862 
9863         IF l_vr_summ_id IS NULL THEN
9864 
9865        pnp_debug_pkg.log('before insertion ...');
9866 
9867           /* to insert a new summary record */
9868           INSERT INTO
9869           pn_var_rent_summ_all
9870             (var_rent_summ_id
9871             ,var_rent_id
9872             ,period_id
9873             ,line_item_id
9874             ,invoice_date
9875             ,tot_act_vol
9876             ,tot_ded
9877             ,act_var_rent
9878             ,grp_date_id
9879             ,group_date
9880             ,last_update_date
9881             ,last_updated_by
9882             ,creation_date
9883             ,created_by
9884             ,last_update_login
9885             ,org_id
9886             ,first_yr_rent)
9887           VALUES
9888             (pn_var_rent_summ_s.NEXTVAL
9889             ,p_var_rent_id
9890             ,p_period_id
9891             ,line_rec.line_item_id
9892             ,l_grp_t(g).invoice_date
9893             ,summ_rec.sales
9897             ,l_grp_t(g).group_date
9894             ,summ_rec.ded
9895             ,round(summ_rec.rent,g_precision)
9896             ,l_grp_t(g).grp_date_id
9898             ,SYSDATE
9899             ,NVL(fnd_global.user_id, 0)
9900             ,SYSDATE
9901             ,NVL(fnd_global.user_id, 0)
9902             ,NVL(fnd_global.login_id, 0)
9903             ,NVL(l_grp_t(g).org_id, g_org_id)
9904             ,round(summ_rec.first_yr_rent,g_precision))
9905           RETURNING
9906           var_rent_summ_id
9907           INTO
9908           l_vr_summ_id;
9909 
9910         END IF;
9911 
9912         UPDATE
9913         pn_var_trx_headers_all hdr
9914         SET
9915         hdr.var_rent_summ_id = l_vr_summ_id
9916         WHERE
9917         hdr.var_rent_id  = p_var_rent_id AND
9918         hdr.period_id    = p_period_id AND
9919         hdr.line_item_id = line_rec.line_item_id AND
9920         hdr.grp_date_id  = l_grp_t(g).grp_date_id;
9921 
9922         EXIT;
9923 
9924       END LOOP; /* get the sum of rents and sales for
9925                    vr -> period -> line item -> group combination */
9926 
9927     END LOOP; /* loop for all calc periods in the annual period */
9928 
9929   END LOOP; /* loop for all lines in the annual period */
9930 
9931   pnp_debug_pkg.log('+++++++++ post_summary END +++++++++++');
9932 
9933 EXCEPTION
9934   WHEN OTHERS THEN RAISE;
9935 
9936 END post_summary;
9937 
9938 --------------------------------------------------------------------------------
9939 --  NAME         : forecasted_var_rent
9940 --  DESCRIPTION  : Returns the Forecasted rent for a particular period
9941 --  PURPOSE      :
9942 --  INVOKED FROM : Form view of Annual periods  Tab
9943 --  ARGUMENTS    :
9944 --  REFERENCE    :
9945 --  HISTORY      :
9946 --
9947 --  3.Dec.06  rdonthul    o Created
9948 --------------------------------------------------------------------------------
9949 FUNCTION forecasted_var_rent ( p_var_rent_id IN NUMBER
9950                             , p_period_id  IN NUMBER )
9951 RETURN NUMBER IS
9952 
9953   CURSOR var_rent_type ( l_var_rent_id  IN NUMBER ) IS
9954     SELECT invoice_on
9955     FROM pn_var_rents_all
9956     WHERE var_rent_id = l_var_rent_id
9957     AND invoice_on = 'FORECASTED';
9958 
9959 
9960   CURSOR var_for_rent ( l_period_id IN NUMBER ) IS
9961     SELECT sum(decode(adjust_num,0,
9962                       FOR_PER_RENT,0)) for_var_rent
9963       FROM pn_var_rent_inv_all
9964       WHERE period_id = l_period_id;
9965 
9966   l_for_rent       NUMBER := NULL;
9967 
9968 BEGIN
9969    FOR rec_var_rent_type IN var_rent_type( p_var_rent_id )
9970    LOOP
9971 
9972      FOR rec_var_for_rent IN var_for_rent( p_period_id )
9973      LOOP
9974          l_for_rent := rec_var_for_rent.for_var_rent;
9975      END LOOP;
9976 
9977    END LOOP;
9978 
9979    RETURN l_for_rent;
9980 
9981 END forecasted_var_rent;
9982 
9983 --------------------------------------------------------------------------------
9984 --  NAME         : get_currency_precision
9985 --  DESCRIPTION  : Returns the Currency precision to be followed bsed on the
9986 --                 org_id
9987 --  PURPOSE      :
9988 --  INVOKED FROM :
9989 --  ARGUMENTS    :
9990 --  REFERENCE    :
9991 --  HISTORY      :
9992 --
9993 --  1.Mar.07  rdonthul    o Created
9994 --------------------------------------------------------------------------------
9995 FUNCTION get_currency_precision (p_org_id NUMBER)
9996 RETURN NUMBER IS
9997 
9998 CURSOR csr_currency_code(p_org_id IN NUMBER) is
9999   SELECT currency_code
10000   FROM  gl_sets_of_books
10001   WHERE set_of_books_id = pn_mo_cache_utils.get_profile_value('PN_SET_OF_BOOKS_ID',p_org_ID);
10002 
10003 l_org_id               NUMBER := pn_mo_cache_utils.get_current_org_id;
10004 l_currency_code        gl_sets_of_books.currency_code%TYPE;
10005 l_precision            NUMBER := NULL;
10006 l_ext_precision        NUMBER;
10007 l_min_acct_unit        NUMBER;
10008 
10009 
10010 BEGIN
10011    IF p_org_id IS NOT NULL THEN
10012        l_org_id := p_org_id;
10013    END IF;
10014 
10015    FOR rec_currency_code IN csr_currency_code( l_org_id )
10016    LOOP
10017         l_currency_code    := rec_currency_code.currency_code;
10018    END LOOP;
10019 
10020    fnd_currency.get_info(l_currency_code, l_precision,l_ext_precision, l_min_acct_unit);
10021 
10022    RETURN l_precision;
10023 
10024 END get_currency_precision;
10025 --------------------------------------------------------------------------------
10026 --  NAME         : check_last_calc_prd
10027 --  DESCRIPTION  : Determines the last calculation period for an invoice
10028 --  PURPOSE      :
10029 --  INVOKED FROM : VR summary and detail report
10030 --  ARGUMENTS    :
10031 --  REFERENCE    :
10032 --  HISTORY      :
10033 --
10034 --  7-MAR-07  lbala    o Created
10035 --------------------------------------------------------------------------------
10036 FUNCTION check_last_calc_prd(p_trx_hdr_id IN NUMBER,
10037                              p_prorul     IN VARCHAR2
10038                              )
10039 RETURN NUMBER
10040 IS
10041 -- Get the details of
10042 CURSOR trx_cur
10043 IS
10047 
10044 SELECT var_rent_id,period_id,grp_date_id,calc_prd_start_date
10045 FROM pn_var_trx_headers_All
10046 WHERE trx_header_id=p_trx_hdr_id;
10048 -- Get the details of
10049 CURSOR grp_date_cur(p_prd_id IN NUMBER,
10050                     p_grp_dt_id IN NUMBER
10051                    ) IS
10052 SELECT inv_start_date
10053   FROM pn_var_grp_dates_all gd
10054  WHERE gd.period_id = p_prd_id
10055    AND gd.grp_date_id = p_grp_dt_id;
10056 
10057 -- Get the details of
10058 CURSOR calc_prd_cur(p_prd_id IN NUMBER,
10059                     p_inv_end_dt IN DATE
10060                    ) IS
10061   SELECT max(calc_prd_start_date) calc_prd_st_dt
10062     FROM pn_var_trx_headers_all trx
10063    WHERE trx.calc_prd_end_date <= p_inv_end_dt
10064      AND trx.period_id = p_prd_id;
10065 
10066 l_vr_id  NUMBER :=NULL;
10067 l_prd_id NUMBER :=NULL;
10068 l_gd_id  NUMBER :=NULL;
10069 l_st_dt  DATE   :=NULL;
10070 l_inv_end_dt DATE :=NULL;
10071 l_inv_st_dt DATE :=NULL;
10072 l_max_calc_prd_dt DATE :=NULL;
10073 
10074 BEGIN
10075 
10076  FOR trx_rec IN trx_cur LOOP
10077   l_vr_id  := trx_rec.var_rent_id;
10078   l_prd_id := trx_rec.period_id;
10079   l_gd_id  := trx_rec.grp_date_id;
10080   l_st_dt  := trx_rec.calc_prd_start_date;
10081  END LOOP;
10082 
10083  FOR gd_rec IN grp_date_cur(l_prd_id,l_gd_id)LOOP
10084     l_inv_st_dt  := gd_rec.inv_start_date;
10085  END LOOP;
10086 
10087  l_inv_end_dt := pn_var_rent_calc_pkg.inv_end_date(l_inv_st_dt
10088                                                   ,l_vr_id
10089                                                   ,l_prd_id
10090                                                   );
10091 
10092  FOR calc_prd_rec IN calc_prd_cur(l_prd_id,l_inv_end_dt) LOOP
10093   l_max_calc_prd_dt := calc_prd_rec.calc_prd_st_dt;
10094  END LOOP;
10095 
10096  IF l_st_dt = l_max_calc_prd_dt THEN
10097     RETURN 1;
10098  ELSE RETURN 0;
10099  END IF;
10100 
10101 END check_last_calc_prd;
10102 
10103 --------------------------------------------------------------------------------
10104 --  NAME         : get_cum_rent_due
10105 --  DESCRIPTION  : Gets the rent due for each transaction detail record
10106 --  PURPOSE      :
10107 --  INVOKED FROM : VR detail and summary report
10108 --  ARGUMENTS    :
10109 --  REFERENCE    :
10110 --  HISTORY      :
10111 --
10112 --  7-MAR-07  lbala    o Created
10113 --------------------------------------------------------------------------------
10114 FUNCTION get_rent_due(p_trx_hdr_id IN NUMBER,
10115                       p_prorul     IN VARCHAR2
10116                       )
10117 RETURN NUMBER
10118 IS
10119 -- Get the details of
10120 CURSOR trx_cur
10121 IS
10122 SELECT var_rent_id,period_id,grp_date_id,calc_prd_start_date
10123 FROM pn_var_trx_headers_All
10124 WHERE trx_header_id=p_trx_hdr_id;
10125 
10126 -- Get the details of
10127 CURSOR grp_date_cur(p_prd_id IN NUMBER,
10128                     p_grp_dt_id IN NUMBER
10129                    )
10130 IS
10131 SELECT invoice_date
10132   FROM pn_var_grp_dates_all gd
10133  WHERE gd.period_id = p_prd_id
10134    AND gd.grp_date_id = p_grp_dt_id;
10135 
10136 CURSOR period_cur(vr_id IN NUMBER) IS
10137   SELECT period_id, start_date
10138   FROM pn_var_periods_all
10139   WHERE var_rent_id = vr_id
10140   AND partial_period = 'Y'
10141   AND period_num = 1;
10142 
10143 CURSOR get_act_inv_amt(p_prd_id IN NUMBER,
10144                        p_inv_dt IN DATE
10145                        )
10146 IS
10147 SELECT SUM(rent_inv.ACTUAL_INVOICED_AMOUNT) act_inv_amt
10148 FROM pn_var_rent_inv_all rent_inv
10149 WHERE rent_inv.period_id = p_prd_id
10150 AND (rent_inv.invoice_date = p_inv_dt OR p_inv_dt IS NULL);
10151 
10152 l_vr_id  NUMBER :=NULL;
10153 l_prd_id NUMBER :=NULL;
10154 l_gd_id  NUMBER :=NULL;
10155 l_st_dt  DATE   :=NULL;
10156 l_inv_dt DATE :=NULL;
10157 l_max_calc_prd_dt DATE :=NULL;
10158 l_rent_due NUMBER:=NULL;
10159 
10160 BEGIN
10161 
10162  FOR trx_rec IN trx_cur LOOP
10163   l_vr_id  := trx_rec.var_rent_id;
10164   l_prd_id := trx_rec.period_id;
10165   l_gd_id  := trx_rec.grp_date_id;
10166  END LOOP;
10167 
10168  FOR gd_rec IN grp_date_cur(l_prd_id,l_gd_id)LOOP
10169   l_inv_dt  := gd_rec.invoice_date;
10170  END LOOP;
10171 
10172  IF p_prorul IN ('FY','FLY') THEN
10173    FOR rec IN period_cur(l_vr_id) LOOP
10174       IF(rec.period_id = l_prd_id) THEN
10175 
10176         FOR rec1 IN get_act_inv_amt(l_prd_id,NULL) LOOP
10177           l_rent_due := rec1.act_inv_amt;
10178         END LOOP;
10179         RETURN l_rent_due;
10180 
10181       END IF;
10182    END LOOP;
10183 
10184  END IF;
10185 
10186  FOR rec1 IN get_act_inv_amt(l_prd_id,l_inv_dt) LOOP
10187      l_rent_due := rec1.act_inv_amt;
10188  END LOOP;
10189  RETURN l_rent_due;
10190 
10191 END get_rent_due;
10192 
10193 --------------------------------------------------------------------------------
10194 --  NAME         : get_cum_rent_due
10195 --  DESCRIPTION  : Gets the cumulative rent for each transaction detail record
10196 --  PURPOSE      :
10197 --  INVOKED FROM : VR detail and summary report
10198 --  ARGUMENTS    :
10199 --  REFERENCE    :
10200 --  HISTORY      :
10204 FUNCTION get_cum_rent_due(p_trx_hdr_id IN NUMBER,
10201 --
10202 --  7-MAR-07  lbala    o Created
10203 --------------------------------------------------------------------------------
10205                           p_prorul     IN VARCHAR2
10206                          )
10207 RETURN NUMBER
10208 IS
10209 -- Get the details of
10210 CURSOR trx_cur
10211 IS
10212 SELECT var_rent_id,period_id,grp_date_id,calc_prd_start_date
10213 FROM pn_var_trx_headers_All
10214 WHERE trx_header_id=p_trx_hdr_id;
10215 
10216 -- Get the details of
10217 CURSOR grp_date_cur(p_prd_id IN NUMBER,
10218                     p_grp_dt_id IN NUMBER
10219                    )
10220 IS
10221 SELECT invoice_date
10222 FROM pn_var_grp_dates_all gd
10223 WHERE gd.period_id = p_prd_id
10224 AND gd.grp_date_id = p_grp_dt_id;
10225 
10226 CURSOR period_cur(vr_id IN NUMBER)
10227 IS
10228 SELECT period_id, start_date
10229 FROM pn_var_periods_all
10230 WHERE var_rent_id = vr_id
10231 AND partial_period = 'Y'
10232 AND period_num = 1;
10233 
10234 CURSOR get_act_inv_amt(p_prd_id IN NUMBER,
10235                        p_inv_dt IN DATE
10236                        )
10237 IS
10238 SELECT SUM(rent_inv.ACTUAL_INVOICED_AMOUNT) act_inv_amt
10239 FROM pn_var_rent_inv_all rent_inv
10240 WHERE rent_inv.period_id = p_prd_id
10241 AND (rent_inv.invoice_date <= p_inv_dt OR p_inv_dt IS NULL);
10242 
10243 l_vr_id  NUMBER :=NULL;
10244 l_prd_id NUMBER :=NULL;
10245 l_gd_id  NUMBER :=NULL;
10246 l_st_dt  DATE   :=NULL;
10247 l_inv_dt DATE :=NULL;
10248 l_max_calc_prd_dt DATE :=NULL;
10249 l_cum_rent_due NUMBER:=NULL;
10250 
10251 BEGIN
10252 
10253  FOR trx_rec IN trx_cur LOOP
10254   l_vr_id  := trx_rec.var_rent_id;
10255   l_prd_id := trx_rec.period_id;
10256   l_gd_id  := trx_rec.grp_date_id;
10257  END LOOP;
10258 
10259  FOR gd_rec IN grp_date_cur(l_prd_id,l_gd_id)LOOP
10260   l_inv_dt  := gd_rec.invoice_date;
10261  END LOOP;
10262 
10263  IF p_prorul IN ('FY','FLY') THEN
10264    FOR rec IN period_cur(l_vr_id) LOOP
10265       IF(rec.period_id = l_prd_id) THEN
10266 
10267         FOR rec1 IN get_act_inv_amt(l_prd_id,NULL) LOOP
10268           l_cum_rent_due := rec1.act_inv_amt;
10269         END LOOP;
10270         RETURN l_cum_rent_due;
10271 
10272       END IF;
10273    END LOOP;
10274 
10275  END IF;
10276 
10277  FOR rec1 IN get_act_inv_amt(l_prd_id,l_inv_dt) LOOP
10278      l_cum_rent_due := rec1.act_inv_amt;
10279  END LOOP;
10280  RETURN l_cum_rent_due;
10281 
10282 END get_cum_rent_due;
10283 
10284 --------------------------------------------------------------------------------
10285 --  NAME         : INCLUDE_PRD_NO_TERM
10286 --  DESCRIPTION  : Determines whether the period has all 0 rent invoices
10287 --  PURPOSE      :
10288 --  INVOKED FROM : VR detail and summary report
10289 --  ARGUMENTS    :
10290 --  REFERENCE    :
10291 --  HISTORY      :
10292 --
10293 --  7-MAR-07  lbala    o Created
10294 --------------------------------------------------------------------------------
10295 FUNCTION include_prd_no_term(p_prd_id IN NUMBER
10296                            )
10297 RETURN VARCHAR2 IS
10298 -- Get the details of
10299 CURSOR incl_prd(p_prd_id IN NUMBER)
10300 IS
10301 SELECT 'y' AS include_flag
10302 FROM DUAL
10303 WHERE NOT EXISTS (SELECT NULL
10304                   FROM pn_var_rent_inv_all vinv
10305                   WHERE vinv.ACTUAL_INVOICED_AMOUNT <> 0
10306                   AND vinv.period_id = p_prd_id
10307                  );
10308 l_include VARCHAR2(1):= 'n';
10309 BEGIN
10310 
10311 FOR rec IN incl_prd(p_prd_id) LOOP
10312  l_include := rec.include_flag;
10313 END LOOP;
10314 
10315 RETURN l_include;
10316 END include_prd_no_term;
10317 
10318 
10319 --------------------------------------------------------------------------------
10320 --  NAME         : delete_draft_terms
10321 --  DESCRIPTION  : deletes the draft term for which invoice_date or term
10322 --                 template has changed.
10323 --  PURPOSE      :
10324 --  INVOKED FROM :
10325 --  ARGUMENTS    :
10326 --  REFERENCE    :
10327 --  HISTORY      :
10328 --
10329 --  8.Mar.07  piagrawa    o Created
10330 --------------------------------------------------------------------------------
10331 PROCEDURE delete_draft_terms( p_var_rent_id IN NUMBER) IS
10332 
10333    /* get term template id for variable rent */
10334    CURSOR template_cur IS
10335       SELECT term_template_id
10336       FROM pn_var_rents_all
10337       WHERE var_rent_id = p_var_rent_id;
10338 
10339    /* get invoice dates for variable rent */
10340    CURSOR invoice_cur( p_vr_id  IN NUMBER) IS
10341       SELECT
10342       invoice_date, period_id
10343       FROM
10344       pn_var_rent_summ_all
10345       WHERE
10346       var_rent_id = p_vr_id
10347       GROUP BY
10348       invoice_date, period_id
10349       ORDER BY
10350       invoice_date;
10351 
10352   /* get latest invoice */
10353   CURSOR invoice2upd_c( p_vr_id  IN NUMBER
10354                        ,p_prd_id IN NUMBER
10355                        ,p_inv_dt IN DATE
10359     FROM
10356                        ,p_inv_sch_date DATE
10357                        ,p_term_template_id NUMBER) IS
10358     SELECT inv.var_rent_inv_id
10360     pn_var_rent_inv_all inv
10361     WHERE
10362     var_rent_id = p_vr_id AND
10363     period_id = p_prd_id AND
10364     invoice_date = p_inv_dt AND
10365     EXISTS (SELECT term.payment_term_id
10366             FROM pn_payment_terms_all term
10367             WHERE term.var_rent_inv_id = inv.var_rent_inv_id
10368             AND status = 'DRAFT'
10369             AND (start_date <> p_inv_sch_date OR
10370                  term_template_id <> p_term_template_id));
10371 
10372   /* get invoice dates for a period */
10373    /*CURSOR payment_cur (p_inv_sch_date DATE,
10374                        p_term_template_id NUMBER) IS
10375       SELECT payment_term_id, var_rent_inv_id
10376       FROM pn_payment_terms_all
10377       WHERE var_rent_inv_id IN (SELECT var_rent_inv_id
10378                                 FROM pn_var_rent_inv_all
10379                                 WHERE var_rent_id = p_var_rent_id)
10380       AND status = 'DRAFT'
10381       AND (start_date <> p_inv_sch_date OR
10382            term_template_id <> p_term_template_id);*/
10383 
10384    l_inv_start_date           DATE;
10385    l_payment_start_date       DATE;
10386    l_term_template_id         NUMBER;
10387 
10388 BEGIN
10389 
10390    FOR term_temp_rec IN template_cur LOOP
10391       l_term_template_id := term_temp_rec.term_template_id;
10392    END LOOP;
10393 
10394    FOR inv_rec IN invoice_cur (p_var_rent_id)
10395    LOOP
10396 
10397       /*l_inv_start_date := pn_var_rent_calc_pkg.inv_start_date(inv_start_date => inv_rec.invoice_date
10398                                                                ,vr_id => p_var_rent_id
10399                                                                ,approved_status => 'N'); */
10400 
10401       l_payment_start_date := pn_var_rent_calc_pkg.inv_sch_date(inv_start_date => inv_rec.invoice_date
10402                                                                ,vr_id => p_var_rent_id
10403                                                                ,p_period_id => inv_rec.period_id);
10404 
10405       FOR rec IN invoice2upd_c ( p_var_rent_id
10406                                , inv_rec.period_id
10407                                , inv_rec.invoice_date
10408                                , l_payment_start_date
10409                                , l_term_template_id) LOOP
10410 
10411          DELETE
10412          pn_payment_terms_all
10413          WHERE
10414          var_rent_inv_id = rec.var_rent_inv_id
10415          AND status = 'DRAFT'
10416          AND (start_date <> l_payment_start_date OR
10417              term_template_id <> l_term_template_id);
10418 
10419          IF(g_invoice_on=G_INV_ON_ACTUAL) THEN
10420 
10421             /* update the invoice */
10422             /*Since forcasted rents are not yet exported, we can update them.*/
10423             UPDATE
10424             pn_var_rent_inv_all
10425             SET
10426             actual_term_status      = 'N'
10427             ,last_update_date       = SYSDATE
10428             ,last_updated_by        = NVL(fnd_global.user_id,0)
10429             ,last_update_login      = NVL(fnd_global.login_id,0)
10430             WHERE
10431             var_rent_inv_id = rec.var_rent_inv_id;
10432 
10433          ELSIF (g_invoice_on = G_INV_ON_FORECASTED AND g_calc_type = G_CALC_TYPE_CALCULATE) THEN
10434 
10435             /* update the invoice */
10436             /*Since forcasted rents are not yet exported, we can update them.*/
10437             UPDATE
10438             pn_var_rent_inv_all
10439             SET
10440             forecasted_term_status  = 'N'
10441             ,last_update_date       = SYSDATE
10442             ,last_updated_by        = NVL(fnd_global.user_id,0)
10443             ,last_update_login      = NVL(fnd_global.login_id,0)
10444             WHERE
10445             var_rent_inv_id = rec.var_rent_inv_id;
10446 
10447          ELSIF (g_invoice_on = G_INV_ON_FORECASTED AND g_calc_type = G_CALC_TYPE_RECONCILE) THEN
10448 
10449             /* update the invoice */
10450             /*Since forcasted rents are not yet exported, we can update them.*/
10451             UPDATE
10452             pn_var_rent_inv_all
10453             SET
10454             actual_term_status      = 'N'
10455             ,last_update_date       = SYSDATE
10456             ,last_updated_by        = NVL(fnd_global.user_id,0)
10457             ,last_update_login      = NVL(fnd_global.login_id,0)
10458             WHERE
10459             var_rent_inv_id = rec.var_rent_inv_id;
10460 
10461          END IF;
10462 
10463       END LOOP;
10464    END LOOP;
10465 
10466 END delete_draft_terms;
10467 
10468 --------------------------------------------------------------------------------
10469 --  NAME         : actual_rent
10470 --  DESCRIPTION  : returns the actual rent for the given invoice period.
10471 --  PURPOSE      :
10472 --  INVOKED FROM :
10473 --  ARGUMENTS    :
10474 --  REFERENCE    :
10475 --  HISTORY      :
10476 --
10477 -- 21.Mar.07  Ram kumar    o Created
10478 --------------------------------------------------------------------------------
10482 CURSOR csr_get_inv IS
10479 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)
10480 RETURN NUMBER IS
10481 
10483  SELECT sum(actual_invoiced_amount) AS actual_rent
10484  FROM pn_var_rent_inv_all
10485  WHERE period_id = p_period_id
10486  AND invoice_date = p_invoice_date
10487  AND var_rent_inv_id <= p_var_rent_inv_id
10488  AND true_up_amt IS NULL;
10489 
10490 CURSOR csr_get_true IS
10491  SELECT constr_actual_rent
10492  FROM pn_var_rent_inv_all
10493  WHERE invoice_date = p_invoice_date
10494  AND true_up_amt IS NOT NULL
10495  AND var_rent_inv_id = p_var_rent_inv_id;
10496 
10497 l_actual_rent  NUMBER;
10498 
10499 BEGIN
10500 
10501    IF p_true_up_amt IS NULL THEN
10502      FOR rec_get_inv IN csr_get_inv LOOP
10503        l_actual_rent := rec_get_inv.actual_rent;
10504      END LOOP;
10505    ELSE
10506      FOR rec_get_true IN csr_get_true LOOP
10507        l_actual_rent := rec_get_true.constr_actual_rent;
10508      END LOOP;
10509    END IF;
10510 
10511    RETURN l_actual_rent;
10512 
10513 END actual_rent;
10514 
10515 --------------------------------------------------------------------------------
10516 --
10517 --  NAME         : VALIDATE_LY_CALC()
10518 --  DESCRIPTION  : Validates if a period is last period for an an agreement
10519 --                 which is less than 24 months long, has a proration rule of
10520 --                 FLY, has 2 periods both of which are partial
10521 --
10522 --  PURPOSE      :
10523 --  INVOKED FROM :
10524 --  ARGUMENTS    : NONE
10525 --  REFERENCE    : PN_COMMON.debug()
10526 --  HISTORY      :
10527 --
10528 --   27-FEB-07 piagrawa   o Created
10529 --------------------------------------------------------------------------------
10530 FUNCTION VALIDATE_LY_CALC (p_varRentId NUMBER, p_periodId  IN NUMBER)
10531 RETURN NUMBER
10532 IS
10533 
10534   /* verifying if agreement's length is less than 24 */
10535   CURSOR vr_length IS
10536       SELECT var_rent_id, proration_rule, termination_date
10537       FROM pn_var_rents_all
10538       WHERE var_rent_id = p_varRentId
10539       AND proration_rule = 'FLY'
10540       AND MONTHS_BETWEEN(commencement_date, termination_date) < 24;
10541 
10542   /* get the number of periods */
10543   CURSOR period_num_c ( p_vr_id IN NUMBER, term_date DATE) IS
10544       SELECT count(*) period_num
10545       FROM pn_var_periods_all
10546       WHERE var_rent_id = p_vr_id
10547       AND term_date > start_date;
10548 
10549   /* verify if last period for variable rent agreement is partial */
10550   CURSOR last_period_c (p_vr_id NUMBER, p_new_term_date DATE) IS
10551     SELECT period_id
10552     FROM pn_var_periods_all
10553     WHERE var_rent_id = p_vr_id
10554     AND p_new_term_date BETWEEN start_date AND end_date
10555     AND partial_period = 'Y';
10556 
10557   /* get the first partial period */
10558   CURSOR first_period_c( p_vr_id     IN NUMBER) IS
10559     SELECT
10560      prd.period_id
10561     ,prd.partial_period
10562     FROM
10563     pn_var_periods_all prd,
10564     pn_var_rents_all   var
10565     WHERE
10566     prd.var_rent_id = p_vr_id AND
10567     prd.var_rent_id = var.var_rent_id AND
10568     prd.start_date = var.commencement_date AND
10569     prd.partial_period = 'Y';
10570 
10571    l_first_partial VARCHAR2(1);
10572    l_last_partial  VARCHAR2(1);
10573    l_last_periodId NUMBER;
10574    l_period_num    NUMBER  := 0;
10575    l_ly_calc       NUMBER := NULL;
10576    l_new_term_date DATE;
10577 
10578 BEGIN
10579    pnp_debug_pkg.log('+++++++++ VALIDATE_LY_CALC START +++++++++++');
10580 
10581    FOR vr_length_rec IN vr_length
10582    LOOP
10583 
10584       FOR period_num_rec IN period_num_c (p_varRentId, vr_length_rec.termination_date)
10585       LOOP
10586          l_period_num := period_num_rec.period_num;
10587       END LOOP;
10588 
10589       FOR first_period_rec IN first_period_c (p_varRentId)
10590       LOOP
10591          l_first_partial := first_period_rec.partial_period;
10592       END LOOP;
10593 
10594       FOR last_period_rec IN last_period_c (p_varRentId, vr_length_rec.termination_date )
10595       LOOP
10596          l_last_partial := 'Y';
10597          l_last_periodId := last_period_rec.period_id;
10598       END LOOP;
10599 
10600      /* IMP: when we have just 2 periods and first year and last year period is
10601         partial, in such a case we would not be calculating last year rent. */
10602       IF l_period_num = 2 AND l_first_partial = 'Y' AND
10603         l_last_partial = 'Y' AND l_last_periodId = p_periodId
10604       THEN
10605          l_ly_calc := p_periodId;
10606       END IF;
10607 
10608 
10609    END LOOP;
10610 
10611    return l_ly_calc;
10612 
10613    pnp_debug_pkg.log('+++++++++ VALIDATE_LY_CALC END +++++++++++');
10614 
10615 END VALIDATE_LY_CALC;
10616 --------------------------------------------------------------------------------
10617 --  NAME         : full_yr_summary
10618 --  DESCRIPTION  :
10619 --  PURPOSE      :
10620 --  INVOKED FROM :
10621 --  ARGUMENTS    :
10622 --  REFERENCE    :
10626 --------------------------------------------------------------------------------
10623 --  HISTORY      :
10624 --
10625 -- 16.Apr.07  Ram kumar    o Created
10627 PROCEDURE full_yr_summary ( p_line_item_id      IN NUMBER
10628                            ,p_yr_volume         OUT NOCOPY  NUMBER
10629                            ,p_deductions        OUT NOCOPY  NUMBER)
10630 IS
10631 
10632 CURSOR full_yr_cur IS
10633   SELECT  sum(NVL(tot_act_vol, 0)) yr_vol,
10634           sum(NVL(tot_ded, 0)) yr_deductions
10635   FROM   pn_var_rent_summ_all
10636   WHERE  line_item_id = p_line_item_id;
10637 
10638 BEGIN
10639 
10640    FOR yr_rec IN full_yr_cur LOOP
10641       p_yr_volume     := yr_rec.yr_vol;
10642       p_deductions    := yr_rec.yr_deductions;
10643    END LOOP;
10644 
10645 END full_yr_summary;
10646 
10647 --------------------------------------------------------------------------------
10648 --  NAME         : trueup_rent
10649 --  DESCRIPTION  :
10650 --  PURPOSE      :
10651 --  INVOKED FROM :
10652 --  ARGUMENTS    :
10653 --  REFERENCE    :
10654 --  HISTORY      :
10655 --
10656 -- 19.Apr.07  Ram kumar    o Created
10657 --------------------------------------------------------------------------------
10658 FUNCTION trueup_rent ( p_var_rent_id IN NUMBER
10659                       ,p_period_id   IN NUMBER
10660                       ,p_grp_date_id IN NUMBER)
10661 RETURN NUMBER
10662 IS
10663 
10664   CURSOR trueup_rent_c IS
10665     SELECT
10666      SUM(trueup_rent_due)         AS trueup_rent
10667     ,MAX(calc_prd_end_date)       AS trueup_date
10668     ,line_item_id
10669     FROM
10670     pn_var_trx_headers_all
10671     WHERE
10672     var_rent_id = p_var_rent_id AND
10673     period_id = p_period_id
10674     GROUP BY
10675     line_item_id
10676     ORDER BY
10677     line_item_id;
10678 
10679   -- Get the details of
10680   CURSOR trueup_end_date_c  IS
10681     SELECT grp_end_date
10682       FROM pn_var_grp_dates_all
10683      WHERE grp_date_id = p_grp_date_id;
10684 
10685   l_trueup_rent        NUMBER := 0;
10686   l_trueup_date        DATE;
10687   l_grp_end_date       DATE;
10688 
10689 BEGIN
10690 
10691   FOR trueup_rec IN trueup_rent_c  LOOP
10692     l_trueup_rent := trueup_rec.trueup_rent;
10693     l_trueup_date := trueup_rec.trueup_date;
10694   END LOOP;
10695 
10696   FOR trueup_date_rec IN trueup_end_date_c  LOOP
10697     l_grp_end_date := trueup_date_rec.grp_end_date;
10698   END LOOP;
10699 
10700 
10701   IF l_grp_end_date = l_trueup_date THEN
10702     RETURN l_trueup_rent;
10703   ELSE
10704     RETURN NULL;
10705   END IF;
10706 
10707 END trueup_rent;
10708 --------------------------------------------------------------------------------
10709 --  NAME         : true_up_bkpt
10710 --  DESCRIPTION  :
10711 --  PURPOSE      :
10712 --  INVOKED FROM :
10713 --  ARGUMENTS    :
10714 --  REFERENCE    :
10715 --  HISTORY      :
10716 --
10717 -- 25.Apr.07  Ram kumar    o Created
10718 --------------------------------------------------------------------------------
10719 PROCEDURE true_up_bkpt ( p_period_id      IN NUMBER
10720                         ,p_bkpt_rate      IN NUMBER
10721                         ,p_bkpt_vol_start OUT NOCOPY  NUMBER
10722                         ,p_bkpt_vol_end   OUT NOCOPY  NUMBER)
10723 IS
10724 
10725 CURSOR get_period_dtls_csr IS
10726   SELECT  period_num,var_rent_id
10727   FROM pn_var_periods_all
10728   WHERE period_id = p_period_id;
10729 
10730 CURSOR get_blended_bkpt_csr(p_var_rent_id IN NUMBER) IS
10731   SELECT sum(pr_grp_blended_vol_start) bkpt_start,
10732          sum(pr_grp_blended_vol_end) bkpt_end
10733   FROM pn_var_trx_details_all dtls,
10734        pn_var_trx_headers_all hdr
10735   WHERE var_rent_id = p_var_rent_id
10736   AND hdr.trx_header_id = dtls.trx_header_id
10737   AND dtls.bkpt_rate = p_bkpt_rate
10738   GROUP BY dtls.bkpt_rate;
10739 
10740 l_var_rent_id  NUMBER;
10741 l_period_num   NUMBER;
10742 l_bkpt_start   NUMBER;
10743 l_bkpt_end     NUMBER;
10744 
10745 BEGIN
10746 
10747 --
10748 FOR rec_prd_details IN get_period_dtls_csr LOOP
10749   l_period_num := rec_prd_details.period_num;
10750   l_var_rent_id := rec_prd_details.var_rent_id;
10751 END LOOP;
10752 
10753 FOR rec_blended_bkpt IN get_blended_bkpt_csr(l_var_rent_id) LOOP
10754   p_bkpt_vol_start  := rec_blended_bkpt.bkpt_start;
10755   p_bkpt_vol_end    := rec_blended_bkpt.bkpt_end;
10756 END LOOP;
10757 
10758 IF l_period_num NOT IN (1,2) THEN
10759   p_bkpt_vol_start := NULL;
10760   p_bkpt_vol_end := NULL;
10761 END IF;
10762 
10763 END true_up_bkpt;
10764 
10765 --------------------------------------------------------------------------------
10766 --  NAME         : new_term_amount
10767 --  DESCRIPTION  :
10768 --  PURPOSE      :
10769 --  INVOKED FROM :
10770 --  ARGUMENTS    :
10771 --  REFERENCE    :
10772 --  HISTORY      :
10773 --
10774 -- 30.May.07  Ram kumar    o Created
10775 --------------------------------------------------------------------------------
10776 FUNCTION new_term_amount ( p_invoice_date IN DATE
10777                           ,p_period_id   IN NUMBER
10778                           ,p_var_rent_inv_id IN NUMBER)
10779 RETURN NUMBER
10780 IS
10781 
10782 CURSOR inv_details_cur IS
10783   SELECT variance_exp_code, actual_exp_code, adjust_num, actual_invoiced_amount, for_per_rent
10784     FROM pn_var_rent_inv_all
10785    WHERE period_id = p_period_id
10786      AND var_rent_inv_id = p_var_rent_inv_id;
10787 
10788 BEGIN
10789 
10790 FOR rec IN inv_details_cur LOOP
10791 
10792   IF rec.variance_exp_code = 'Y' THEN
10793     RETURN 0;
10794   ELSIF rec.actual_exp_code = 'Y' THEN
10795     RETURN 0;
10796   ELSIF rec.adjust_num = 0 THEN
10797     RETURN (rec.actual_invoiced_amount -nvl(rec.for_per_rent,0));
10798   ELSE
10799     RETURN rec.actual_invoiced_amount;
10800   END IF;
10801 
10802 END LOOP;
10803 
10804 END new_term_amount;
10805 
10806 --------------------------------------------------------------------------------
10807 --  NAME         : true_up_header
10808 --  DESCRIPTION  :
10809 --  PURPOSE      :
10810 --  INVOKED FROM :
10811 --  ARGUMENTS    :
10812 --  REFERENCE    :
10813 --  HISTORY      :
10814 --
10815 -- 10.July.07  Ram kumar    o Created
10816 --------------------------------------------------------------------------------
10817 FUNCTION true_up_header ( p_period_id           IN NUMBER
10818                          ,p_trx_hdr_id          IN NUMBER
10819 								 ,p_calc_prd_end_date   IN DATE)
10820 RETURN VARCHAR2
10821 IS
10822 
10823 CURSOR trx_header_cur IS
10824   SELECT max(calc_prd_end_date) end_date
10825     FROM pn_var_trx_headers_all
10829 CURSOR true_up_cur IS
10826    WHERE period_id = p_period_id
10827    GROUP BY reset_group_id;
10828 
10830   SELECT trueup_rent_due
10831     FROM pn_var_trx_headers_all
10832    WHERE trx_header_id = p_trx_hdr_id;
10833 
10834 l_true_up   VARCHAR2(30)   :=  'N';
10835 
10836 BEGIN
10837 
10838 FOR rec_true_up IN true_up_cur LOOP
10839 	FOR rec IN trx_header_cur LOOP
10840 	   IF rec.end_date = p_calc_prd_end_date AND rec_true_up.trueup_rent_due IS NOT NULL THEN
10841 			l_true_up := 'Y';
10842 		END IF;
10843 	END LOOP;
10844 END LOOP;
10845 
10846 RETURN l_true_up;
10847 
10848 END true_up_header;
10849 
10850 END pn_var_rent_calc_pkg;
10851