DBA Data[Home] [Help]

PACKAGE BODY: APPS.PN_VAR_ABATEMENT_AMOUNT_PKG

Source


1 PACKAGE BODY pn_var_abatement_amount_pkg AS
2 -- $Header: PNVRCABB.pls 120.8 2007/05/31 11:40:21 sraaj noship $
3 
4 -------------------------------------------------------------------------------
5 -- FUNCTION  : calc_abatement
6 --
7 -- Description : Function to calculate recurring abatement amount for
8 --               an invoice DATE and period_id.
9 --
10 -- 08-Mar-2002  Pooja Sidhu  o Created.
11 -- 14-JUL-05  hareesha o Bug 4284035 - Replaced pn_var_rent_inv,pn_var_rents with _ALL table.
12 -- 30-jan-2006 Shabda  o Bug 5729157 - Instead of checking for inv_id passed,
13 -- check for invoice_id for given date and period
14 ------------------------------------------------------------------------------
15 
16 FUNCTION calc_abatement(p_var_rent_inv_id IN NUMBER,
17                         p_min_grp_dt IN DATE,
18                         p_max_grp_dt IN DATE)
19 RETURN NUMBER IS
20 CURSOR csr_get_amt IS
21 SELECT NVL(SUM(ppi.actual_amount),0)
22 FROM pn_payment_items_all  ppi,
23      pn_var_rent_inv_all inv,    --BUG#2452909   /* hrodda_MOAC -changed to tablename_all*/
24      pn_var_rents_all var ,      --BUG#2452909   /* hrodda_MOAC -changed to tablename_all*/
25      pn_payment_schedules_all pps,
26      pn_var_abatements_all abt
27 WHERE ppi.payment_term_id = abt.payment_term_id
28 AND   abt.var_rent_inv_id = (SELECT inv2.var_rent_inv_id FROM pn_var_rent_inv_all inv1, pn_var_rent_inv_all inv2
29                              WHERE inv1.var_rent_id = inv2.var_rent_id
30                              AND   inv1.period_id = inv2.period_id
31                              AND   inv1.invoice_date = inv2.invoice_date
32                              AND   inv1.var_rent_inv_id = p_var_rent_inv_id
33 			     AND   inv2.true_up_amt IS NULL
34 			     AND   inv2.adjust_num =0)
35 AND   abt.include_term = pn_var_abatement_amount_pkg.G_INCLUDE_TERM_YES
36 AND   inv.var_rent_inv_id = p_var_rent_inv_id  --BUG#2452909,
37 AND   var.var_rent_id = inv.var_rent_id      --BUG#2452909
38 AND   ppi.currency_code = var.currency_code    --BUG#2452909
39 AND   ppi.payment_schedule_id = pps.payment_schedule_id
40 AND   ppi.payment_item_type_lookup_code = 'CASH'
41 AND   TRUNC(pps.schedule_date,'MM') BETWEEN
42       TRUNC(p_min_grp_dt,'MM') AND TRUNC(p_max_grp_dt,'MM');
43 
44 CURSOR csr_get_tu_amt IS
45 SELECT NVL(SUM(ppi.actual_amount),0)
46 FROM pn_payment_items_all  ppi,
47      pn_var_rent_inv_all inv,    --BUG#2452909   /* hrodda_MOAC -changed to tablename_all*/
48      pn_var_rents_all var ,      --BUG#2452909   /* hrodda_MOAC -changed to tablename_all*/
49      pn_payment_schedules_all pps,
50      pn_var_abatements_all abt
51 WHERE ppi.payment_term_id = abt.payment_term_id
52 AND   abt.var_rent_inv_id = (SELECT inv2.var_rent_inv_id FROM pn_var_rent_inv_all inv1, pn_var_rent_inv_all inv2
53                              WHERE inv1.var_rent_id = inv2.var_rent_id
54                              AND   inv1.period_id = inv2.period_id
55                              AND   inv1.invoice_date = inv2.invoice_date
56                              AND   inv1.var_rent_inv_id = p_var_rent_inv_id
57 			     AND   inv2.true_up_amt IS NOT NULL
58 			     AND   inv2.adjust_num =0)
59 AND   abt.include_term = pn_var_abatement_amount_pkg.G_INCLUDE_TERM_YES
60 AND   inv.var_rent_inv_id = p_var_rent_inv_id  --BUG#2452909,
61 AND   var.var_rent_id = inv.var_rent_id      --BUG#2452909
62 AND   ppi.currency_code = var.currency_code    --BUG#2452909
63 AND   ppi.payment_schedule_id = pps.payment_schedule_id
64 AND   ppi.payment_item_type_lookup_code = 'CASH'
65 AND   TRUNC(pps.schedule_date,'MM') BETWEEN
66       TRUNC(p_min_grp_dt,'MM') AND TRUNC(p_max_grp_dt,'MM');
67 
68 -- Get the details of
69 CURSOR is_inv_tu_c(ip_var_rent_inv_id NUMBER
70           ) IS
71   SELECT  true_up_amt
72     FROM  pn_var_rent_inv_all inv
73    WHERE  inv.var_rent_inv_id = ip_var_rent_inv_id;
74 
75 l_abt_amt NUMBER;
76 l_true_up_amt NUMBER;
77 
78 BEGIN
79     pnp_debug_pkg.log('pn_var_abatement_amount_pkg.calc_abatement  (+) :');
80     --
81     FOR tu_rec IN is_inv_tu_c(p_var_rent_inv_id) LOOP
82         l_true_up_amt := tu_rec.true_up_amt;
83         pnp_debug_pkg.log('l_true_up_amt'||l_true_up_amt);
84     END LOOP;
85 
86     IF l_true_up_amt IS NULL THEN
87       -- This is non true up amt
88           pnp_debug_pkg.log('Non true up inv');
89           OPEN csr_get_amt;
90           FETCH csr_get_amt INTO l_abt_amt;
91           CLOSE csr_get_amt;
92     ELSE
93       -- This is true up amt
94           pnp_debug_pkg.log('true up inv');
95           OPEN csr_get_tu_amt;
96           FETCH csr_get_tu_amt INTO l_abt_amt;
97           CLOSE csr_get_tu_amt;
98     END IF;
99     pnp_debug_pkg.log('Amount:'||l_abt_amt);
100     pnp_debug_pkg.log('pn_var_abatement_amount_pkg.calc_abatement  (-) :');
101     RETURN l_abt_amt;
102 EXCEPTION
103 WHEN no_data_found THEN
104 return 0;
105 WHEN others THEN
106 pnp_debug_pkg.log('Error IN pn_var_abatement_amount_pkg.calc_abatement -'||TO_CHAR(sqlcode)||' - '||sqlerrm);
107 RAISE;
108 
109 END calc_abatement;
110 
111 -------------------------------------------------------------------------------
112 -- FUNCTION  : calc_abatement
113 --
114 -- Description : Function to calculate recurring abatement amount for
115 --               an invoice DATE and period_id.
116 --
117 -- Shabda  29-5-07 o Created. _ bug 6041521.
118 ------------------------------------------------------------------------------
119 
120 FUNCTION calc_abatement(p_var_rent_id IN NUMBER,
121                         p_period_id IN NUMBER,
122                         p_var_rent_inv_id IN NUMBER,
123                         p_min_grp_dt IN DATE,
124                         p_max_grp_dt IN DATE,
125 			p_trp_flag IN VARCHAR2)
126 RETURN NUMBER IS
127 CURSOR csr_get_amt(ip_var_rent_inv_id NUMBER,
128                    ip_min_grp_dt DATE,
129 		   ip_max_grp_dt DATE) IS
130 SELECT NVL(SUM(ppi.actual_amount),0) amount
131 FROM pn_payment_items_all  ppi,
132      pn_var_rent_inv_all inv,    --BUG#2452909   /* hrodda_MOAC -changed to tablename_all*/
133      pn_var_rents_all var ,      --BUG#2452909   /* hrodda_MOAC -changed to tablename_all*/
134      pn_payment_schedules_all pps,
135      pn_var_abatements_all abt
136 WHERE ppi.payment_term_id = abt.payment_term_id
137 AND   abt.var_rent_inv_id = (SELECT inv2.var_rent_inv_id FROM pn_var_rent_inv_all inv1, pn_var_rent_inv_all inv2
138                              WHERE inv1.var_rent_id = inv2.var_rent_id
139                              AND   inv1.period_id = inv2.period_id
140                              AND   inv1.invoice_date = inv2.invoice_date
141                              AND   inv1.var_rent_inv_id = ip_var_rent_inv_id
142 			     AND   inv2.true_up_amt IS NULL
143 			     AND   inv2.adjust_num =0)
144 AND   abt.include_term = pn_var_abatement_amount_pkg.G_INCLUDE_TERM_YES
145 AND   inv.var_rent_inv_id = ip_var_rent_inv_id  --BUG#2452909,
146 AND   var.var_rent_id = inv.var_rent_id      --BUG#2452909
147 AND   ppi.currency_code = var.currency_code    --BUG#2452909
148 AND   ppi.payment_schedule_id = pps.payment_schedule_id
149 AND   ppi.payment_item_type_lookup_code = 'CASH'
150 AND   TRUNC(pps.schedule_date,'MM') BETWEEN
151       TRUNC(ip_min_grp_dt,'MM') AND TRUNC(ip_max_grp_dt,'MM');
152 
153 CURSOR csr_get_tu_amt IS
154 SELECT NVL(SUM(ppi.actual_amount),0)
155 FROM pn_payment_items_all  ppi,
156      pn_var_rent_inv_all inv,    --BUG#2452909   /* hrodda_MOAC -changed to tablename_all*/
157      pn_var_rents_all var ,      --BUG#2452909   /* hrodda_MOAC -changed to tablename_all*/
158      pn_payment_schedules_all pps,
159      pn_var_abatements_all abt
160 WHERE ppi.payment_term_id = abt.payment_term_id
161 AND   abt.var_rent_inv_id = (SELECT inv2.var_rent_inv_id FROM pn_var_rent_inv_all inv1, pn_var_rent_inv_all inv2
162                              WHERE inv1.var_rent_id = inv2.var_rent_id
163                              AND   inv1.period_id = inv2.period_id
164                              AND   inv1.invoice_date = inv2.invoice_date
165                              AND   inv1.var_rent_inv_id = p_var_rent_inv_id
166 			     AND   inv2.true_up_amt IS NOT NULL
167 			     AND   inv2.adjust_num =0)
168 AND   abt.include_term = pn_var_abatement_amount_pkg.G_INCLUDE_TERM_YES
169 AND   inv.var_rent_inv_id = p_var_rent_inv_id  --BUG#2452909,
170 AND   var.var_rent_id = inv.var_rent_id      --BUG#2452909
171 AND   ppi.currency_code = var.currency_code    --BUG#2452909
172 AND   ppi.payment_schedule_id = pps.payment_schedule_id
173 AND   ppi.payment_item_type_lookup_code = 'CASH'
174 AND   TRUNC(pps.schedule_date,'MM') BETWEEN
175       TRUNC(p_min_grp_dt,'MM') AND TRUNC(p_max_grp_dt,'MM');
176 
177 -- Get the details of
178 CURSOR is_inv_tu_c(ip_var_rent_inv_id NUMBER
179           ) IS
180   SELECT  true_up_amt
181     FROM  pn_var_rent_inv_all inv
182    WHERE  inv.var_rent_inv_id = ip_var_rent_inv_id;
183 
184 -- Get the details of invoices in a specific period
185 CURSOR get_inv_in_prd(ip_period_id NUMBER
186           ) IS
187   SELECT var_rent_inv_id
188     FROM pn_var_rent_inv_all
189    WHERE period_id = ip_period_id;
190 
191 -- Get the details of invoice date
192 CURSOR get_inv_date(ip_inv_id NUMBER
193           ) IS
194   SELECT invoice_date
195     FROM pn_var_rent_inv_all
196    WHERE var_rent_inv_id = ip_inv_id
197    AND true_up_amt IS NULL
198    AND adjust_num = 0;
199   -- Get the proration type
200   CURSOR proration_type_c(ip_var_rent_id NUMBER
201             ) IS
202     SELECT proration_rule
203     FROM pn_var_rents_all
204     WHERE var_rent_id = ip_var_rent_id;
205   -- Get the first period
206   CURSOR get_fy_prd_c(ip_var_rent_id NUMBER
207             ) IS
208     SELECT period_id
209       FROM pn_var_periods_all
210      WHERE start_date = (SELECT min(start_date) from pn_var_periods_all WHERE var_rent_id = ip_var_rent_id)
211        AND var_rent_id = ip_var_rent_id;
212 
213   CURSOR invoice_dates_fy_c(ip_period_id NUMBER
214             ) IS
215     SELECT per.start_date, per.end_date
216       FROM pn_var_periods_all per
217      WHERE period_id = ip_period_id;
218 
219 
220 l_abt_amt NUMBER;
221 l_true_up_amt NUMBER;
222 l_inv_date DATE;
223 l_min_grp_date DATE;
224 l_max_grp_date DATE;
225 l_proration_type VARCHAR2(30);
226 l_min_prd_id NUMBER;
227 
228 BEGIN
229     l_true_up_amt := 0;
230     pnp_debug_pkg.log('pn_var_abatement_amount_pkg.calc_abatement  (+) :');
231     --
232     FOR rec IN proration_type_c(p_var_rent_id) LOOP
233       l_proration_type := rec.proration_rule;
234     END LOOP;
235 
236     --
237     FOR rec IN get_fy_prd_c(p_var_rent_id) LOOP
238        l_min_prd_id := rec.period_id;
239     END LOOP;
240 
241 
242     --
243     FOR tu_rec IN is_inv_tu_c(p_var_rent_inv_id) LOOP
244         l_true_up_amt := tu_rec.true_up_amt;
245         pnp_debug_pkg.log('l_true_up_amt'||l_true_up_amt);
246     END LOOP;
247 
248     IF l_true_up_amt IS NULL THEN
249       -- This is non true up amt
250           pnp_debug_pkg.log('Non true up inv');
251           OPEN csr_get_amt(p_var_rent_inv_id, p_min_grp_dt, p_max_grp_dt);
252           FETCH csr_get_amt INTO l_abt_amt;
253           CLOSE csr_get_amt;
254     ELSE
255       -- This is true up amt
256           pnp_debug_pkg.log('true up inv');
257 	  --
258           l_abt_amt := 0;
259 	  FOR inv_in_prd_rec IN get_inv_in_prd(p_period_id) LOOP
260 	     --
261 	     pnp_debug_pkg.log('inv_in_prd_rec.var_rent_inv_id:'||inv_in_prd_rec.var_rent_inv_id);
262 	     FOR inv_date_rec IN get_inv_date(inv_in_prd_rec.var_rent_inv_id) LOOP
263 	        l_inv_date := inv_date_rec.invoice_date;
264 	     END LOOP;
265 	     pnp_debug_pkg.log('l_inv_date:'||l_inv_date);
266              l_min_grp_date := get_group_dt(l_inv_date, p_period_id, 'MIN');
267 	     l_max_grp_date := get_group_dt(l_inv_date, p_period_id, 'MAX');
268 	     IF (l_proration_type IN ('FY', 'FLY') AND p_period_id = l_min_prd_id)  THEN
269 	        --
270 	        FOR rec IN invoice_dates_fy_c(p_period_id) LOOP
271 	           l_min_grp_date := rec.start_date;
272 		   l_max_grp_date := rec.end_date;
273 	        END LOOP;
274 
275 
276 	     END IF;
277 
278 	     pnp_debug_pkg.log('l_min_grp_date:'||l_min_grp_date);
279 	     pnp_debug_pkg.log('l_max_grp_date:'||l_max_grp_date);
280 	     --
281 	     FOR amt_rec IN csr_get_amt(inv_in_prd_rec.var_rent_inv_id, l_min_grp_date, l_max_grp_date) LOOP
282 	       l_abt_amt := l_abt_amt + amt_rec.amount;
283 	     END LOOP;
284 	     pnp_debug_pkg.log('l_abt_amt:'||l_abt_amt);
285 
286 	  END LOOP;
287 
288     END IF;
289     pnp_debug_pkg.log('Amount:'||l_abt_amt);
290     pnp_debug_pkg.log('pn_var_abatement_amount_pkg.calc_abatement  (-) :');
291     RETURN l_abt_amt;
292 EXCEPTION
293 WHEN no_data_found THEN
294 return 0;
295 WHEN others THEN
296 pnp_debug_pkg.log('Error IN pn_var_abatement_amount_pkg.calc_abatement -'||TO_CHAR(sqlcode)||' - '||sqlerrm);
297 RAISE;
298 
299 END calc_abatement;
300 
301 
302 
303 ----------------------------------------------------------------------------
304 --  PROCEDURE  : process_abatement
305 --
306 --               Called FROM the View Variable Rent by Period window when
307 --               the user calculates abatement amount.
308 --
309 --  08-Mar-2002  Pooja Sidhu  o Created.
313 PROCEDURE process_abatement(p_var_rent_inv_id IN NUMBER,
310 --  16-Jan-2003  Daniel Thota o Added parameter l_exported to check if an
311 --                              invoice has been transferred. Fix for bug # 2722191
312 ---------------------------------------------------------------------------
314                             p_negative_rent_flag IN VARCHAR2,
315                             p_term_exists IN VARCHAR2,
316                             p_var_rent_type IN VARCHAR2,
317                             p_min_grp_dt IN DATE,
318                             p_max_grp_dt IN DATE)
319 IS
320 l_abt_amt       NUMBER := 0;
321 l_exported      NUMBER := null;
322 BEGIN
323     pnp_debug_pkg.log('pn_var_abatement_amount_pkg.process_abatement  (+) :');
324 
325     /* Calculate the recurring abatement amount */
326 
327     --Fix for bug # 2722191
328     l_exported:= PN_VAR_RENT_PKG.FIND_IF_EXPORTED(p_var_rent_inv_id,'PERIODS_INV_BLK');
329 
330 
331     /*If an actual/variance term exists for the invoice DATE then
332       DELETE the term FROM pn_payment_terms */
333 
334    IF l_exported IS NULL THEN --Fix for bug # 2722191
335 
336     l_abt_amt := NVL(calc_abatement(p_var_rent_inv_id,p_min_grp_dt,p_max_grp_dt),0);
337 
338     IF NVL(p_term_exists,'N') = 'Y' THEN
339        DELETE FROM pn_payment_terms_all
340        WHERE var_rent_inv_id=p_var_rent_inv_id
341        and var_rent_type = p_var_rent_type
342        and NVL(status,'DRAFT')='DRAFT';
343     END IF;
344 
345     /* Update pn_var_rent_inv with the recurring abatement amount and also
346        UPDATE the actual invoiced amount */
347 
348     UPDATE pn_var_rent_inv_all
349     SET rec_abatement = l_abt_amt,
350         actual_term_status = DECODE(p_var_rent_type,'ACTUAL','N',actual_term_status),
351         variance_term_status = DECODE(p_var_rent_type,'VARIANCE','N',variance_term_status),
352         actual_invoiced_amount = pn_variable_amount_pkg.derive_actual_invoiced_amt(
353                                                  constr_actual_rent,
354                                                  p_negative_rent_flag,
355                                                  abatement_appl,
356                                                  negative_rent,
357                                                  l_abt_amt,
358                                                  rec_abatement_override)
359     WHERE var_rent_inv_id = p_var_rent_inv_id;
360 
361    END IF;
362 
363 
364     pnp_debug_pkg.log('pn_var_abatement_amount_pkg.process_abatement  (-) :');
365 
366 EXCEPTION
367 WHEN OTHERS THEN
368 pnp_debug_pkg.log('Error IN pn_var_abatement_amount_pkg.process_abatement -'||TO_CHAR(sqlcode)||' - '||sqlerrm);
369 raise;
370 
371 END process_abatement;
372 
373 -----------------------------------------------------------------------------------------------------
374 -- FUNCTION   : get_group_dt
375 --
376 -- Description : Function to get the minimum or maximum group_date
377 --               FROM pn_var_grp_dates table for an invoice DATE and period_id
378 --
379 -----------------------------------------------------------------------------------------------------
380 
381 FUNCTION get_group_dt(
382                 p_invoice_date DATE,
383                 p_period_id NUMBER,
384                 p_date_type IN VARCHAR2)
385 RETURN DATE IS
386 CURSOR csr_min_gd IS
387 SELECT MIN(grp_start_date)
388 FROM pn_var_grp_dates_all
389 WHERE invoice_date = p_invoice_date
390 AND period_id = p_period_id;
391 
392 CURSOR csr_max_gd IS
393 SELECT MAX(grp_end_date)
394 FROM pn_var_grp_dates_all
395 WHERE invoice_date = p_invoice_date
396 AND period_id = p_period_id;
397 
398 l_grp_date DATE;
399 
400 BEGIN
401 
402 pnp_debug_pkg.log('pn_var_abatement_amount_pkg.get_group_dt  (-) :');
403 
404 IF p_date_type ='MIN' THEN
405     OPEN csr_min_gd;
406     FETCH csr_min_gd INTO l_grp_date;
407     CLOSE csr_min_gd;
408 ELSIF p_date_type = 'MAX' THEN
409     OPEN csr_max_gd;
410     FETCH csr_max_gd into l_grp_date;
411     CLOSE csr_max_gd;
412 END IF;
413 
414 RETURN l_grp_date;
415 
416 pnp_debug_pkg.log('pn_var_abatement_amount_pkg.get_group_dt  (-) :');
417 
418 END get_group_dt;
419 
420 ---------------------------------------------------------------------------------------------------------------
421 -- FUNCTION    : get_term_exists
422 --
423 -- Description : Return Y' if a record
424 --               exists IN pn_var_abatements table for the
425 --               combination of payment_term_id and var_rent_inv_id.
426 --
427 -- 08-Mar-2002   Pooja sidhu  o Created
428 -------------------------------------------------------------------------------------------------------------
429 FUNCTION get_term_exists (p_payment_term_id IN NUMBER,
430                           p_var_rent_inv_id NUMBER)
431 RETURN VARCHAR2 IS
432 CURSOR csr_term_exists IS
433 SELECT 'Y'
434 FROM dual
435 WHERE EXISTS(SELECT null
436              FROM pn_var_abatements_all
437              WHERE payment_term_id = p_payment_term_id
438              AND var_rent_inv_id = p_var_rent_inv_id);
439 
440 l_term_exists VARCHAR2(1) := 'N';
441 
442 BEGIN
443     OPEN csr_term_exists;
444     FETCH csr_term_exists into l_term_exists;
445     if csr_term_exists%notfound then
446         l_term_exists := 'N';
447     end if;
448     CLOSE csr_term_exists;
449 
450     return l_term_exists;
451 
452 EXCEPTION
453 WHEN no_data_found THEN
454 RETURN 'N';
455 
456 END get_term_exists;
457 
458 
459 END pn_var_abatement_amount_pkg;
460 
461