[Home] [Help]
PACKAGE BODY: APPS.JL_BR_INTEREST_HANDLING
Source
1 PACKAGE BODY JL_BR_INTEREST_HANDLING AS
2 /* $Header: jlbrsinb.pls 120.8 2011/10/21 21:18:41 abuissa ship $ */
3
4 G_LEVEL_STATEMENT CONSTANT NUMBER := FND_LOG.LEVEL_STATEMENT;
5 G_CURRENT_RUNTIME_LEVEL CONSTANT NUMBER := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
6 G_LEVEL_PROCEDURE CONSTANT NUMBER := FND_LOG.LEVEL_PROCEDURE;
7
8
9 -- *****************************************************************************
10 -- This procedure calcualtes interest based on the interest parameteres
11 -- entered by the user. This has MOAC changes needed for R12. bug: 8621688
12 -- Created by: vspuli
13 -- Creation Date : 02-JUL-2009
14 -- ****************************************************************************
15 PROCEDURE JL_BR_INTEREST(X_Interest_Type IN VARCHAR2,
16 X_Interest_Rate_Amount IN NUMBER,
17 X_Period_Days IN NUMBER,
18 X_Interest_Formula IN VARCHAR2,
19 X_Grace_Days IN NUMBER,
20 X_Penalty_Type IN VARCHAR2,
21 X_Penalty_Rate_Amount IN NUMBER,
22 X_Due_Date IN DATE,
23 X_Payment_Date IN DATE,
24 X_Invoice_Amount IN NUMBER,
25 X_JLBR_Calendar IN VARCHAR2,
26 X_JLBR_Local_Holiday IN VARCHAR2,
27 X_JLBR_Action_Non_Workday IN VARCHAR2,
28 X_Interest_Calculated IN OUT NOCOPY NUMBER,
29 X_Days_Late IN OUT NOCOPY NUMBER,
30 X_Exit_Code OUT NOCOPY NUMBER,
31 X_ORG_ID IN NUMBER) IS
32
33 P_Date_Ok DATE;
34 P_Late_Days1 NUMBER(38);
35 P_Late_Days2 NUMBER(38);
36 P_Penalty_Calculated NUMBER; -- BUG Number 859348
37 P_Status NUMBER(38);
38 P_WorkDay_Ok VARCHAR2(11);
39 P_WorkDay_Date DATE;
40 P_Return_Code NUMBER(38);
41 C_interest_tolerance_amount number;
42 jg_app_short_name VARCHAR2(10);
43 l_debug_info VARCHAR2(2000);
44 BEGIN
45 P_Status := 0;
46 X_Exit_Code := 0;
47 P_Late_Days1 := 0;
48 P_Late_Days2 := 0;
49 P_Penalty_Calculated := 0;
50 X_Interest_Calculated := 0;
51 X_Days_Late := 0;
52
53 l_debug_info := 'Entered Interest Package ';
54 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
55 fnd_file.put_line(FND_FILE.LOG,l_debug_info);
56 END IF;
57 P_Date_Ok := X_Due_Date + NVL(X_Grace_Days,0);
58
59 l_debug_info := 'jlbr p_date_ok: '||to_char(P_Date_Ok, 'DD-MON-YYYY');
60 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
61 fnd_file.put_line(FND_FILE.LOG,l_debug_info);
62 END IF;
63
64 --
65 -- Validate Tolerance from ap_system_parameters
66 --
67 SELECT nvl(interest_tolerance_amount,0)
68 Into C_interest_tolerance_amount
69 FROM ap_system_parameters_all
70 WHERE nvl(org_id,-99) = nvl(x_org_id,-99);
71
72
73 /***
74 SELECT nvl(interest_tolerance_amount,0)
75 INTO C_interest_tolerance_amount
76 FROM ap_system_parameters;
77 ***/
78
79
80 l_debug_info := 'jlbr tolerance_amount '||to_char(C_interest_tolerance_amount);
81 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
82 fnd_file.put_line(FND_FILE.LOG,l_debug_info);
83 END IF;
84
85
86 jl_br_workday_calendar.jl_br_check_date(to_char(P_Date_Ok, 'DD-MM-YYYY'),
87 X_JLBR_Calendar,
88 X_JLBR_Local_Holiday,
89 X_JLBR_Action_Non_Workday,
90 P_WorkDay_Ok,
91 P_Status);
92
93 P_WorkDay_Date := to_date(P_WorkDay_Ok, 'DD-MM-YYYY');
94
95 l_debug_info := 'jlbr check_date status '||to_char(P_Status);
96 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
97 fnd_file.put_line(FND_FILE.LOG,l_debug_info);
98 END IF;
99
100
101
102
103 l_debug_info := 'jlbr check_date return '||P_WorkDay_Ok;
104 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
105 fnd_file.put_line(FND_FILE.LOG,l_debug_info);
106 END IF;
107
108 IF P_Status = 0 THEN
109
110 l_debug_info := 'jlbr interest calc ';
111 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
112 fnd_file.put_line(FND_FILE.LOG,l_debug_info);
113 END IF;
114
115 X_Days_Late := trunc(X_Payment_Date - P_WorkDay_Date);
116 P_Late_Days2 := trunc(X_Payment_Date - X_Due_Date);
117
118
119 l_debug_info := 'jlbr interest calc: X_Days_Late' || to_char(X_Days_Late);
120 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
121 fnd_file.put_line(FND_FILE.LOG,l_debug_info);
122 END IF;
123
124 l_debug_info := 'jlbr interest calc: P_Late_Days2' || to_char(P_Late_Days2);
125 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
126 fnd_file.put_line(FND_FILE.LOG,l_debug_info);
127 END IF;
128
129 IF X_Days_Late > 0 THEN
130 IF X_Interest_Type IS NOT NULL THEN
131 IF X_Interest_Type = 'R' THEN
132 IF X_Interest_Formula = 'S' THEN
133 X_Interest_Calculated := round(((NVL(X_Interest_Rate_Amount,0)/NVL(X_Period_Days,0))/100)
134 * NVL(X_Invoice_Amount,0)
135 * NVL(P_Late_Days2,0),2);
136 ELSE
137 X_Interest_Calculated := round(NVL(X_Invoice_Amount,0) *
138 (POWER(( 1 + (NVL(X_Interest_Rate_Amount,0)/100)),
139 (NVL(P_Late_Days2,0)/NVL(X_Period_Days,0))) - 1),2);
140 END IF;
141 ELSE
142 X_Interest_Calculated := round(NVL(P_Late_Days2,0) * (NVL(X_Interest_Rate_Amount,0)/NVL(X_Period_Days,0)),2);
143 END IF;
144 END IF;
145
146 IF X_Penalty_Type IS NOT NULL THEN
147 IF X_Penalty_Type = 'R' THEN
148 P_Penalty_Calculated := round(NVL(X_Penalty_Rate_Amount,0)/100 * NVL(X_Invoice_Amount,0),2);
149 ELSE
150 P_Penalty_Calculated := round(NVL(X_Penalty_Rate_Amount,0),2);
151 END IF;
152 X_Interest_Calculated := round(NVL(X_Interest_Calculated,0) + NVL(P_Penalty_Calculated,0),2);
153 END IF;
154 -- Verify Tolerance vs Interest_Calculated
155 -- Bug# 1480683
156 -- Bug 2020279 check tolerance only for AP
157 --
158 --fnd_profile.get('JGZZ_APPL_SHORT_NAME', jg_app_short_name);
159 jg_app_short_name := JG_ZZ_SHARED_PKG.get_application;
160 --
161 IF jg_app_short_name = 'SQLAP' THEN
162 IF C_interest_tolerance_amount > X_Interest_Calculated THEN
163 X_Interest_Calculated := 0;
164 END IF;
165 END IF;
166 END IF;
167 ELSE
168 X_Exit_Code := 1;
169 END IF;
170
171
172 l_debug_info := 'jlbr interest calc: return' || to_char(X_Interest_Calculated);
173 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
174 fnd_file.put_line(FND_FILE.LOG,l_debug_info);
175 END IF;
176
177 l_debug_info := 'jlbr interest calc: Exit Code' || to_char(X_Exit_Code);
178 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
179 fnd_file.put_line(FND_FILE.LOG,l_debug_info);
180 END IF;
181
182
183 END JL_BR_INTEREST;
184
185
186
187
188
189 PROCEDURE JL_BR_INTEREST(X_Interest_Type IN VARCHAR2,
190 X_Interest_Rate_Amount IN NUMBER,
191 X_Period_Days IN NUMBER,
192 X_Interest_Formula IN VARCHAR2,
193 X_Grace_Days IN NUMBER,
194 X_Penalty_Type IN VARCHAR2,
195 X_Penalty_Rate_Amount IN NUMBER,
196 X_Due_Date IN DATE,
197 X_Payment_Date IN DATE,
198 X_Invoice_Amount IN NUMBER,
199 X_JLBR_Calendar IN VARCHAR2,
200 X_JLBR_Local_Holiday IN VARCHAR2,
201 X_JLBR_Action_Non_Workday IN VARCHAR2,
202 X_Interest_Calculated IN OUT NOCOPY NUMBER,
203 X_Days_Late IN OUT NOCOPY NUMBER,
204 X_Exit_Code OUT NOCOPY NUMBER) IS
205
206 P_Date_Ok DATE;
207 P_Late_Days1 NUMBER(38);
208 P_Late_Days2 NUMBER(38);
209 P_Penalty_Calculated NUMBER; -- BUG Number 859348
210 P_Status NUMBER(38);
211 P_WorkDay_Ok VARCHAR2(11);
212 P_WorkDay_Date DATE;
213 P_Return_Code NUMBER(38);
214 C_interest_tolerance_amount number;
215 jg_app_short_name VARCHAR2(10);
216
217 BEGIN
218 P_Status := 0;
219 X_Exit_Code := 0;
220 P_Late_Days1 := 0;
221 P_Late_Days2 := 0;
222 P_Penalty_Calculated := 0;
223 X_Interest_Calculated := 0;
224 X_Days_Late := 0;
225
226 P_Date_Ok := X_Due_Date + NVL(X_Grace_Days,0);
227 --
228 -- Validate Tolerance from ap_system_parameters
229 --
230 SELECT nvl(interest_tolerance_amount,0)
231 INTO C_interest_tolerance_amount
232 FROM ap_system_parameters;
233
234
235 jl_br_workday_calendar.jl_br_check_date(to_char(P_Date_Ok, 'DD-MM-YYYY'),
236 X_JLBR_Calendar,
237 X_JLBR_Local_Holiday,
238 X_JLBR_Action_Non_Workday,
239 P_WorkDay_Ok,
240 P_Status);
241
242 P_WorkDay_Date := to_date(P_WorkDay_Ok, 'DD-MM-YYYY');
243
244 IF P_Status = 0 THEN
245 X_Days_Late := trunc(X_Payment_Date - P_WorkDay_Date);
246 P_Late_Days2 := trunc(X_Payment_Date - X_Due_Date);
247
248 IF X_Days_Late > 0 THEN
249 IF X_Interest_Type IS NOT NULL THEN
250 IF X_Interest_Type = 'R' THEN
251 IF X_Interest_Formula = 'S' THEN
252 X_Interest_Calculated := round(((NVL(X_Interest_Rate_Amount,0)/NVL(X_Period_Days,0))/100)
253 * NVL(X_Invoice_Amount,0)
254 * NVL(P_Late_Days2,0),2);
255 ELSE
256 X_Interest_Calculated := round(NVL(X_Invoice_Amount,0) *
257 (POWER(( 1 + (NVL(X_Interest_Rate_Amount,0)/100)),
258 (NVL(P_Late_Days2,0)/NVL(X_Period_Days,0))) - 1),2);
259 END IF;
260 ELSE
261 X_Interest_Calculated := round(NVL(P_Late_Days2,0) * (NVL(X_Interest_Rate_Amount,0)/NVL(X_Period_Days,0)),2);
262 END IF;
263 END IF;
264
265 IF X_Penalty_Type IS NOT NULL THEN
266 IF X_Penalty_Type = 'R' THEN
267 P_Penalty_Calculated := round(NVL(X_Penalty_Rate_Amount,0)/100 * NVL(X_Invoice_Amount,0),2);
268 ELSE
269 P_Penalty_Calculated := round(NVL(X_Penalty_Rate_Amount,0),2);
270 END IF;
271 X_Interest_Calculated := round(NVL(X_Interest_Calculated,0) + NVL(P_Penalty_Calculated,0),2);
272 END IF;
273 -- Verify Tolerance vs Interest_Calculated
274 -- Bug# 1480683
275 -- Bug 2020279 check tolerance only for AP
276 --
277 --fnd_profile.get('JGZZ_APPL_SHORT_NAME', jg_app_short_name);
278 jg_app_short_name := JG_ZZ_SHARED_PKG.get_application;
279 --
280 IF jg_app_short_name = 'SQLAP' THEN
281 IF C_interest_tolerance_amount > X_Interest_Calculated THEN
282 X_Interest_Calculated := 0;
283 END IF;
284 END IF;
285 END IF;
286 ELSE
287 X_Exit_Code := 1;
288 END IF;
289 END JL_BR_INTEREST;
290
291
292 -- *****************************************************************************
293 -- This procedure updates the interest inovice description according to
294 -- brazilian rates.
295 -- Created by: Dario Betancourt.
296 -- Creation Date : 29-Mar-1999
297 -- ****************************************************************************
298 PROCEDURE JL_BR_CHANGE_INT_DES(P_invoice_related number,
299 P_invoice_original number,
300 P_payment_num_org number) IS
301 l_interest_type VARCHAR2(15);
302 --l_currency_symbol VARCHAR2(4) := 'R$';
303 --commented above for bug 2870854
304 --increased length to 12.
305 l_currency_symbol VARCHAR2(12) := 'R$';
306 l_rate_amount NUMBER;
307 l_due_date DATE;
308 l_check_date DATE;
309 l_invoice_days_late NUMBER;
310 l_nls_interest VARCHAR2(25);
311 l_nls_days VARCHAR2(25);
312 l_nls_percent VARCHAR2(25);
313 l_invoice_description VARCHAR2(240);
314 BEGIN
315 -- ********************************************************
316 -- Get the Translatable Words for filling the description
317 -- ********************************************************
318 SELECT l1.displayed_field,
319 l2.displayed_field,
320 l3.displayed_field
321 INTO l_nls_interest,
322 l_nls_days,
323 l_nls_percent
324 FROM ap_lookup_codes l1,
325 ap_lookup_codes l2,
326 ap_lookup_codes l3
327 WHERE l1.lookup_type = 'NLS TRANSLATION'
328 AND l1.lookup_code = 'INTEREST'
329 AND l2.lookup_type = 'NLS TRANSLATION'
330 AND l2.lookup_code = 'DAYS'
331 AND l3.lookup_type = 'NLS TRANSLATION'
332 AND l3.lookup_code = 'PERCENT';
333
334 -- ***********************************************************
335 -- Get the interest rate from(GA2) and due_date
336 -- from ap_payment_schedules
337 -- ***********************************************************
338 SELECT substr(global_attribute1, 1, 15),
339 nvl(to_number(substr(global_attribute2, 1, 15)), 0),
340 due_date
341 INTO l_interest_type, l_rate_amount, l_due_date
342 FROM ap_payment_schedules
343 WHERE invoice_id = P_invoice_original
344 AND payment_num = P_payment_num_org;
345
346 -- *********************************************************
347 -- Get the payment_date from ap_invoices (interest invoice)
348 -- *********************************************************
349 SELECT invoice_date
350 INTO l_check_date
351 FROM ap_invoices
352 WHERE invoice_id = P_invoice_related;
353
354
355 -- *********************************************************
356 -- Calculate the days late.
357 -- *********************************************************
358 l_invoice_days_late := LEAST(TRUNC(l_check_date), ADD_MONTHS(TRUNC(l_due_date), 12))
359 - TRUNC(l_due_date);
360
361 -- **********************************************************
362 -- Concat the Description with the appropriate interest rate
363 -- BUG Number 856304
364 -- **********************************************************
365 IF l_interest_type = 'R' THEN
366 l_invoice_description := l_nls_interest || ' ' || to_char(l_invoice_days_late)
367 || ' ' || l_nls_days || to_char(l_rate_amount) || l_nls_percent;
368 ELSIF l_interest_type = 'A' THEN
369 -- *********************************************************
370 -- Get the currency symbol
371 -- *********************************************************
372 SELECT fc.symbol
373 INTO l_currency_symbol
374 FROM ap_invoices ai, fnd_currencies_vl fc
375 WHERE ai.invoice_currency_code = fc.currency_code
376 AND ai.invoice_id = P_invoice_original;
377
378 l_invoice_description := l_nls_interest || ' ' || to_char(l_invoice_days_late)
379 || ' ' || l_nls_days || l_currency_symbol || to_char(l_rate_amount);
380 ELSE
381 l_invoice_description := 'Invalid Interest Type: ' || l_interest_type;
382 END IF;
383
384 UPDATE ap_invoices
385 SET description = l_invoice_description
386 WHERE invoice_id = P_invoice_related;
387
388 EXCEPTION
389 WHEN others THEN NULL;
390 END JL_BR_CHANGE_INT_DES;
391
392 PROCEDURE JL_BR_INTEREST(X_Interest_Type IN VARCHAR2,
393 X_Interest_Rate_Amount IN NUMBER,
394 X_Period_Days IN NUMBER,
395 X_Interest_Formula IN VARCHAR2,
396 X_Grace_Days IN NUMBER,
397 X_Penalty_Type IN VARCHAR2,
398 X_Penalty_Rate_Amount IN NUMBER,
399 X_Due_Date IN DATE,
400 X_Payment_Date IN DATE,
401 X_Invoice_Amount IN NUMBER,
402 X_JLBR_Calendar IN VARCHAR2,
403 X_JLBR_Local_Holiday IN VARCHAR2,
404 X_JLBR_Action_Non_Workday IN VARCHAR2,
405 X_Interest_Calculated IN OUT NOCOPY NUMBER,
406 X_Days_Late IN OUT NOCOPY NUMBER,
407 X_Exit_Code OUT NOCOPY NUMBER,
408 X_JLBR_State IN VARCHAR2) IS -- Bug # 2319552
409
410 P_Date_Ok DATE;
411 P_Late_Days1 NUMBER(38);
412 P_Late_Days2 NUMBER(38);
413 P_Penalty_Calculated NUMBER; -- BUG Number 859348
414 P_Status NUMBER(38);
415 P_WorkDay_Ok VARCHAR2(11);
416 P_WorkDay_Date DATE;
417 P_Return_Code NUMBER(38);
418 C_interest_tolerance_amount number;
419 jg_app_short_name VARCHAR2(10);
420
421 BEGIN
422 P_Status := 0;
423 X_Exit_Code := 0;
424 P_Late_Days1 := 0;
425 P_Late_Days2 := 0;
426 P_Penalty_Calculated := 0;
427 X_Interest_Calculated := 0;
428 X_Days_Late := 0;
429
430 P_Date_Ok := X_Due_Date + NVL(X_Grace_Days,0);
431 --
432 -- Validate Tolerance from ap_system_parameters
433 --
434 SELECT nvl(interest_tolerance_amount,0)
435 INTO C_interest_tolerance_amount
436 FROM ap_system_parameters;
437
438
439 jl_br_workday_calendar.jl_br_check_date(to_char(P_Date_Ok, 'DD-MM-YYYY'),
440 X_JLBR_Calendar,
441 X_JLBR_Local_Holiday,
442 X_JLBR_Action_Non_Workday,
443 P_WorkDay_Ok,
444 P_Status,
445 X_JLBR_State); -- Bug # 2319552
446
447 P_WorkDay_Date := to_date(P_WorkDay_Ok, 'DD-MM-YYYY');
448
449 IF P_Status = 0 THEN
450 X_Days_Late := trunc(X_Payment_Date - P_WorkDay_Date);
451 P_Late_Days2 := trunc(X_Payment_Date - X_Due_Date);
452
453 IF X_Days_Late > 0 THEN
454 IF X_Interest_Type IS NOT NULL THEN
455 IF X_Interest_Type = 'R' THEN
456 IF X_Interest_Formula = 'S' THEN
457 X_Interest_Calculated := round(((NVL(X_Interest_Rate_Amount,0)/NVL(X_Period_Days,0))/100)
458 * NVL(X_Invoice_Amount,0)
459 * NVL(P_Late_Days2,0),2);
460 ELSE
461 X_Interest_Calculated := round(NVL(X_Invoice_Amount,0) *
462 (POWER(( 1 + (NVL(X_Interest_Rate_Amount,0)/100)),
463 (NVL(P_Late_Days2,0)/NVL(X_Period_Days,0))) - 1),2);
464 END IF;
465 ELSE
466 X_Interest_Calculated := round(NVL(P_Late_Days2,0) * (NVL(X_Interest_Rate_Amount,0)/NVL(X_Period_Days,0)),2);
467 END IF;
468 END IF;
469
470 IF X_Penalty_Type IS NOT NULL THEN
471 IF X_Penalty_Type = 'R' THEN
472 P_Penalty_Calculated := round(NVL(X_Penalty_Rate_Amount,0)/100 * NVL(X_Invoice_Amount,0),2);
473 ELSE
474 P_Penalty_Calculated := round(NVL(X_Penalty_Rate_Amount,0),2);
475 END IF;
476 X_Interest_Calculated := round(NVL(X_Interest_Calculated,0) + NVL(P_Penalty_Calculated,0),2);
477 END IF;
478 -- Verify Tolerance vs Interest_Calculated
479 -- Bug# 1480683
480 -- Bug 2020279 check tolerance only for AP
481 --
482 --fnd_profile.get('JGZZ_APPL_SHORT_NAME', jg_app_short_name);
483 jg_app_short_name := JG_ZZ_SHARED_PKG.get_application;
484 --
485 IF jg_app_short_name = 'SQLAP' THEN
486 IF C_interest_tolerance_amount > X_Interest_Calculated THEN
487 X_Interest_Calculated := 0;
488 END IF;
489 END IF;
490 END IF;
491 ELSE
492 X_Exit_Code := 1;
493 END IF;
494 END JL_BR_INTEREST;
495
496 --bug 13244476 - MOAC changes
497 PROCEDURE JL_BR_INTEREST(X_Interest_Type IN VARCHAR2,
498 X_Interest_Rate_Amount IN NUMBER,
499 X_Period_Days IN NUMBER,
500 X_Interest_Formula IN VARCHAR2,
501 X_Grace_Days IN NUMBER,
502 X_Penalty_Type IN VARCHAR2,
503 X_Penalty_Rate_Amount IN NUMBER,
504 X_Due_Date IN DATE,
505 X_Payment_Date IN DATE,
506 X_Invoice_Amount IN NUMBER,
507 X_JLBR_Calendar IN VARCHAR2,
508 X_JLBR_Local_Holiday IN VARCHAR2,
509 X_JLBR_Action_Non_Workday IN VARCHAR2,
510 X_Interest_Calculated IN OUT NOCOPY NUMBER,
511 X_Days_Late IN OUT NOCOPY NUMBER,
512 X_Exit_Code OUT NOCOPY NUMBER,
513 X_JLBR_State IN VARCHAR2, -- Bug # 2319552
514 X_ORG_ID IN NUMBER) IS -- Bug # 13244476
515
516 P_Date_Ok DATE;
517 P_Late_Days1 NUMBER(38);
518 P_Late_Days2 NUMBER(38);
519 P_Penalty_Calculated NUMBER; -- BUG Number 859348
520 P_Status NUMBER(38);
521 P_WorkDay_Ok VARCHAR2(11);
522 P_WorkDay_Date DATE;
523 P_Return_Code NUMBER(38);
524 C_interest_tolerance_amount number;
525 jg_app_short_name VARCHAR2(10);
526
527 BEGIN
528 P_Status := 0;
529 X_Exit_Code := 0;
530 P_Late_Days1 := 0;
531 P_Late_Days2 := 0;
532 P_Penalty_Calculated := 0;
533 X_Interest_Calculated := 0;
534 X_Days_Late := 0;
535
536 P_Date_Ok := X_Due_Date + NVL(X_Grace_Days,0);
537 --
538 -- Validate Tolerance from ap_system_parameters
539 --
540 SELECT nvl(interest_tolerance_amount,0)
541 INTO C_interest_tolerance_amount
542 FROM ap_system_parameters_all --bug 13244476
543 WHERE nvl(org_id,-99) = nvl(x_org_id,-99); --bug 13244476
544
545
546 jl_br_workday_calendar.jl_br_check_date(to_char(P_Date_Ok, 'DD-MM-YYYY'),
547 X_JLBR_Calendar,
548 X_JLBR_Local_Holiday,
549 X_JLBR_Action_Non_Workday,
550 P_WorkDay_Ok,
551 P_Status,
552 X_JLBR_State); -- Bug # 2319552
553
554 P_WorkDay_Date := to_date(P_WorkDay_Ok, 'DD-MM-YYYY');
555
556 IF P_Status = 0 THEN
557 X_Days_Late := trunc(X_Payment_Date - P_WorkDay_Date);
558 P_Late_Days2 := trunc(X_Payment_Date - X_Due_Date);
559
560 IF X_Days_Late > 0 THEN
561 IF X_Interest_Type IS NOT NULL THEN
562 IF X_Interest_Type = 'R' THEN
563 IF X_Interest_Formula = 'S' THEN
564 X_Interest_Calculated := round(((NVL(X_Interest_Rate_Amount,0)/NVL(X_Period_Days,0))/100)
565 * NVL(X_Invoice_Amount,0)
566 * NVL(P_Late_Days2,0),2);
567 ELSE
568 X_Interest_Calculated := round(NVL(X_Invoice_Amount,0) *
569 (POWER(( 1 + (NVL(X_Interest_Rate_Amount,0)/100)),
570 (NVL(P_Late_Days2,0)/NVL(X_Period_Days,0))) - 1),2);
571 END IF;
572 ELSE
573 X_Interest_Calculated := round(NVL(P_Late_Days2,0) * (NVL(X_Interest_Rate_Amount,0)/NVL(X_Period_Days,0)),2);
574 END IF;
575 END IF;
576
577 IF X_Penalty_Type IS NOT NULL THEN
578 IF X_Penalty_Type = 'R' THEN
579 P_Penalty_Calculated := round(NVL(X_Penalty_Rate_Amount,0)/100 * NVL(X_Invoice_Amount,0),2);
580 ELSE
581 P_Penalty_Calculated := round(NVL(X_Penalty_Rate_Amount,0),2);
582 END IF;
583 X_Interest_Calculated := round(NVL(X_Interest_Calculated,0) + NVL(P_Penalty_Calculated,0),2);
584 END IF;
585 -- Verify Tolerance vs Interest_Calculated
586 -- Bug# 1480683
587 -- Bug 2020279 check tolerance only for AP
588 --
589 --fnd_profile.get('JGZZ_APPL_SHORT_NAME', jg_app_short_name);
590 jg_app_short_name := JG_ZZ_SHARED_PKG.get_application;
591 --
592 IF jg_app_short_name = 'SQLAP' THEN
593 IF C_interest_tolerance_amount > X_Interest_Calculated THEN
594 X_Interest_Calculated := 0;
595 END IF;
596 END IF;
597 END IF;
598 ELSE
599 X_Exit_Code := 1;
600 END IF;
601 END JL_BR_INTEREST;
602
603 END JL_BR_INTEREST_HANDLING;