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