[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