[Home] [Help]
PACKAGE BODY: APPS.FII_AP_INV_SUM_INC
Source
1 Package Body FII_AP_INV_SUM_INC AS
2 /* $Header: FIIAP19B.pls 120.14 2006/10/10 23:32:45 vkazhipu noship $ */
3
4 g_errbuf VARCHAR2(2000) := NULL;
5 g_retcode VARCHAR2(200) := NULL;
6 g_exception_msg VARCHAR2(4000) := NULL;
7 g_prim_currency VARCHAR2(15) := NULL;
8 g_sec_currency VARCHAR2(15) := NULL;
9 g_state VARCHAR2(200);
10 g_start_date DATE;
11 g_sysdate DATE := TRUNC(SYSDATE);
12 g_seq_id NUMBER;
13 g_debug_flag VARCHAR2(1) := NVL(FND_PROFILE.value('FII_DEBUG_MODE'), 'N');
14 g_oper_imp_prof_flag VARCHAR2(1) := NVL(FND_PROFILE.value('FII_AP_DBI_IMP'), 'N');
15 g_exp_imp_prof_flag VARCHAR2(1) := NVL(FND_PROFILE.value('FII_AP_DBI_EXP_IMP'), 'N');
16 g_manual_sources VARCHAR2(2000) := FND_PROFILE.value('FII_AP_MANUAL_SOURCES');
17 g_last_start_date DATE;
18
19 g_prim_rate_type VARCHAR2(30);
20 g_sec_rate_type VARCHAR2(30);
21 g_primary_mau NUMBER;
22 g_secondary_mau NUMBER;
23 g_fii_user_id NUMBER(15);
24 g_fii_login_id NUMBER(15);
25
26 g_fii_schema VARCHAR2(30);
27 G_TABLE_NOT_EXIST EXCEPTION;
28 PRAGMA EXCEPTION_INIT(G_TABLE_NOT_EXIST, -942);
29 G_LOGIN_INFO_NOT_AVABLE EXCEPTION;
30 G_IMP_NOT_SET EXCEPTION;
31 G_MISSING_RATES EXCEPTION;
32 G_MISS_GLOBAL_PARAMS EXCEPTION;
33 G_NEED_SECONDARY_INFO EXCEPTION;
34 G_INVALID_MANUAL_SOURCE EXCEPTION;
35 G_RUN_INIT EXCEPTION;
36
37 g_due_bucket1 NUMBER := 31;
38 g_due_bucket2 NUMBER := 30;
39 g_due_bucket3 NUMBER := 15;
40
41 g_past_bucket1 NUMBER := 31;
42 g_past_bucket2 NUMBER := 30;
43 g_past_bucket3 NUMBER := 15;
44
45 g_bucket_interval NUMBER := 15;
46 g_no_buckets NUMBER := 6;
47
48
49 g_timestamp1 DATE;
50 g_timestamp2 DATE;
51 g_timestamp3 DATE;
52 g_timestamp4 DATE;
53
54 g_act_part1 NUMBER;
55 g_act_part2 NUMBER;
56 g_old_act_part1 NUMBER;
57 g_old_act_part2 NUMBER;
58
59 g_ap_schema VARCHAR2(30) := 'AP';
60 --Define Record Types to Populate Memory Structures.
61
62 --Inv_Type is used to populate the Invoices Memory Structure, FII_AP_Inv_MS.
63 TYPE Inv_Rec IS RECORD(
64 Org_ID NUMBER(15,0),
65 Supplier_ID NUMBER(15,0),
66 Invoice_ID NUMBER(15,0),
67 Invoice_Type VARCHAR2(25),
68 Invoice_Number VARCHAR2(50),
69 Invoice_Date DATE,
70 Invoice_Amount NUMBER,
71 Invoice_Currency_Code VARCHAR2(25),
72 Base_Currency_Code VARCHAR2(25),
73 Exchange_Date DATE,
74 Exchange_Rate NUMBER,
75 Exchange_Rate_Type VARCHAR2(30),
76 Entered_Date DATE,
77 Created_By NUMBER(15,0),
78 Payment_Currency_Code VARCHAR2(25),
79 Payment_Status_Flag VARCHAR2(1),
80 Payment_Cross_Rate NUMBER,
81 Terms_ID NUMBER(15,0),
82 Source VARCHAR2(25),
83 E_Invoices_Flag VARCHAR2(1),
84 Cancel_Flag VARCHAR2(1),
85 Cancel_Date DATE,
86 Dist_Count NUMBER(15,0),
87 Minimum_Accountable_Unit NUMBER,
88 Functional_MAU NUMBER,
89 To_Func_Rate NUMBER,
90 To_Prim_Rate NUMBER,
91 To_Sec_Rate NUMBER,
92 Invoice_B_Flag VARCHAR2(1),
93 Pay_Sched_B_Flag VARCHAR2(1));
94 TYPE Inv_Type IS TABLE OF Inv_Rec
95 INDEX BY BINARY_INTEGER;
96
97 --Pay_Sched_Type is used to populate the Payment Schedule Memory Structure, FII_AP_Pay_Sched_MS.
98 TYPE Pay_Sched_Rec IS RECORD(
99 Invoice_ID NUMBER(15,0),
100 Payment_Num NUMBER(15,0),
101 Due_Date DATE,
102 Discount_Date DATE,
103 Gross_Amount NUMBER,
104 Second_Discount_Date DATE,
105 Third_Discount_Date DATE,
106 Discount_Amount_Available NUMBER,
107 Second_Disc_Amt_Available NUMBER,
108 Third_Disc_Amt_Available NUMBER,
109 Created_By NUMBER(15,0),
110 Fully_Paid_Date DATE);
111 TYPE Pay_Sched_Type IS TABLE OF Pay_Sched_Rec
112 INDEX BY BINARY_INTEGER;
113
114 --Inv_Pay_Type is used to populate the Invoice Payment Memory Structure, FII_AP_Inv_Pay_MS.
115 TYPE Inv_Pay_Rec IS RECORD(
116 Amount NUMBER,
117 Check_ID NUMBER(15,0),
118 Invoice_ID NUMBER(15,0),
119 Invoice_Payment_ID NUMBER(15,0),
120 Payment_Num NUMBER(15,0),
121 Created_By NUMBER(15,0),
122 Creation_Date DATE,
123 Discount_Taken NUMBER,
124 Check_Date DATE,
125 Processing_Type VARCHAR2(30));
126 TYPE Inv_Pay_Type IS TABLE OF Inv_Pay_Rec
127 INDEX BY BINARY_INTEGER;
128
129 --WH_Tax_Type is used to populate the Withholding/Tax Memory Structure, FII_AP_WH_Tax_MS.
130 TYPE WH_Tax_Rec IS RECORD(
131 Invoice_ID NUMBER(15,0),
132 Line_Type_Lookup_Code VARCHAR2(25),
133 Amount NUMBER,
134 Creation_Date DATE,
135 Invoice_Distribution_ID NUMBER(15,0));
136 TYPE WH_Tax_Type IS TABLE OF WH_Tax_Rec
137 INDEX BY BINARY_INTEGER;
138
139 --Prepay_Applied_Type is used to populate the Prepayments Applied Memory Structure, FII_AP_Prepay_Applied_MS.
140 TYPE Prepay_Applied_Rec IS RECORD(
141 Invoice_ID NUMBER(15,0),
142 Amount NUMBER,
143 Creation_Date DATE,
144 Check_ID NUMBER(15,0),
145 Check_Date DATE,
146 Processing_Type VARCHAR2(30),
147 Unallocated_Amount NUMBER);
148 TYPE Prepay_Applied_Type IS TABLE OF Prepay_Applied_Rec
149 INDEX BY BINARY_INTEGER;
150
151 --Pay_Sched_Temp_Type is used to populate the memory structure FII_AP_Pay_Sched_Temp_MS.
152 TYPE Pay_Sched_Temp_Rec IS RECORD(
153 Action VARCHAR2(30),
154 Action_Date DATE,
155 Number1 NUMBER,
156 Number2 NUMBER,
157 Number3 NUMBER(15,0),
158 Number4 NUMBER(15,0),
159 Number5 NUMBER,
160 Date1 DATE,
161 String1 VARCHAR2(25));
162 TYPE Pay_Sched_Temp_Type IS TABLE OF Pay_Sched_Temp_Rec
163 INDEX BY VARCHAR2(50);
164
165 --PS_Aging_Type is used to populate the memory structure FII_AP_PS_Aging_MS.
166 TYPE PS_Aging_Rec IS RECORD(
167 Action_Date DATE,
168 Due_Bucket1 NUMBER(15,0),
169 Due_Bucket2 NUMBER(15,0),
170 Due_Bucket3 NUMBER(15,0),
171 Past_Due_Bucket3 NUMBER(15,0),
172 Past_Due_Bucket2 NUMBER(15,0),
173 Past_Due_Bucket1 NUMBER(15,0));
174 TYPE PS_Aging_Type IS TABLE OF PS_Aging_Rec
175 INDEX BY VARCHAR2(50);
176
177 --Pay_Sched_B_Type is used to populate the memory structure FII_AP_Pay_Sched_B_MS
178 TYPE Pay_Sched_B_Type IS TABLE OF FII_AP_PAY_SCHED_B%ROWTYPE
179 INDEX BY BINARY_INTEGER;
180
181 --Invoice_B_Type is used to populate the memory structure FII_AP_Invoice_B_MS
182 TYPE Invoice_B_Type IS TABLE OF FII_AP_INVOICE_B%ROWTYPE
183 INDEX BY BINARY_INTEGER;
184
185 --Aging_Bkts_B_Type is used to populate the memory structure FII_AP_Aging_Bkts_B_MS
186 TYPE Aging_Bkts_B_Type IS TABLE OF FII_AP_AGING_BKTS_B%ROWTYPE
187 INDEX BY BINARY_INTEGER;
188
189 --Due_Counts_B_Type is used to populate the memory structure FII_AP_Due_Counts_B_MS
190 TYPE Due_Counts_B_Type IS TABLE OF FII_AP_DUE_COUNTS_B%ROWTYPE
191 INDEX BY BINARY_INTEGER;
192
193 --Used to hold deleted records from FII_AP_Pay_Sched_B.
194 TYPE Pay_Sched_D_Rec IS RECORD(
195 Invoice_ID NUMBER(15,0),
196 Payment_Num NUMBER(15,0),
197 Action_Date DATE,
198 Action VARCHAR2(30),
199 Inv_Pymt_Flag VARCHAR2(1),
200 Unique_ID NUMBER);
201 TYPE Pay_Sched_D_Type IS TABLE OF Pay_Sched_D_Rec
202 INDEX BY BINARY_INTEGER;
203
204 --Used to hold deleted records from FII_AP_Invoice_B.
205 TYPE Invoice_D_Rec IS RECORD(
206 Invoice_ID Number(15,0));
207 TYPE Invoice_D_Type IS TABLE OF Invoice_D_Rec
208 INDEX BY BINARY_INTEGER;
209
210
211 FII_AP_Pay_Sched_B_MS Pay_Sched_B_Type;
212 g_pay_sched_b_marker BINARY_INTEGER;
213 FII_AP_Pay_Sched_UI_MS Pay_Sched_B_Type; --Stores records that have been updated or inserted.
214 FII_AP_Pay_Sched_D_MS Pay_Sched_D_Type; --Stores records that have been deleted.
215 FII_AP_Invoice_B_MS Invoice_B_Type;
216 g_invoice_b_marker BINARY_INTEGER;
217 FII_AP_Invoice_UI_MS Invoice_B_Type; --Stores records that have been updated or inserted.
218 FII_AP_Invoice_D_MS Invoice_D_Type; --Stores records that have been deleted.
219 FII_AP_Inv_MS Inv_Type;
220 FII_AP_Pay_Sched_MS Pay_Sched_Type;
221 FII_AP_Inv_Pay_MS Inv_Pay_Type;
222 FII_AP_WH_Tax_MS WH_Tax_Type;
223 FII_AP_Prepay_Applied_MS Prepay_Applied_Type;
224 FII_AP_Aging_Bkts_B_MS Aging_Bkts_B_Type;
225 FII_AP_Due_Counts_B_MS Due_Counts_B_Type;
226 l_pay_sched_marker BINARY_INTEGER;
227 l_inv_pay_marker BINARY_INTEGER;
228 l_wh_tax_marker BINARY_INTEGER;
229 l_ps_wh_tax_marker BINARY_INTEGER; --Used to store the first WH/Tax for a payment schedule.
230 l_prepay_applied_marker BINARY_INTEGER;
231
232
233 -- ------------------------------------------------------------
234 -- Private Functions and Procedures
235 -- ------------------------------------------------------------
236
237 ---------------------------------------------------
238 -- PROCEDURE TRUNCATE_TABLE
239 ---------------------------------------------------
240
241 PROCEDURE Truncate_table (p_table_name VARCHAR2) IS
242 l_stmt VARCHAR2(100);
243 BEGIN
244 l_stmt := 'TRUNCATE table '||g_fii_schema||'.'||p_table_name;
245 if g_debug_flag = 'Y' then
246 FII_UTIL.put_line('g_fii_schema '||g_fii_schema);
247 FII_UTIL.put_line('');
248 FII_UTIL.put_line(l_stmt);
249 end if;
250 EXECUTE IMMEDIATE l_stmt;
251
252 EXCEPTION
253 WHEN G_TABLE_NOT_EXIST THEN
254 null; -- Oracle 942, table does not exist, no actions
255 WHEN OTHERS THEN
256 g_errbuf := 'Error in Procedure: TRUNCATE_TABLE Message: '||sqlerrm;
257 RAISE;
258 END Truncate_Table;
259
260
261
262 -------------------------------------------------------------------
263 -- PROCEDURE Init
264 -- Purpose
265 -- This procedure INIT initialises the global variables.
266 -------------------------------------------------------------------
267 PROCEDURE Init is
268
269 l_status VARCHAR2(30);
270 l_industry VARCHAR2(30);
271 l_global_param_list dbms_sql.varchar2_table;
272
273 BEGIN
274
275 g_state := 'Initializing the global variables';
276
277 -- --------------------------------------------------------
278 -- Find the schema owner
279 -- --------------------------------------------------------
280
281 IF (FND_INSTALLATION.GET_APP_INFO('FII', l_status, l_industry, g_fii_schema)) THEN
282 NULL;
283 if g_debug_flag = 'Y' then
284 FII_UTIL.put_line('g_fii_schema is '||g_fii_schema);
285 end if;
286 END IF;
287
288 -- --------------------------------------------------------
289 -- Find the schema owner (AP)
290 -- --------------------------------------------------------
291
292 g_ap_schema := FII_UTIL.get_schema_name('SQLAP');
293 if g_debug_flag = 'Y' then
294 FII_UTIL.put_line('g_ap_schema is '||g_ap_schema);
295 end if;
296
297
298 if g_debug_flag = 'Y' then
299 FII_UTIL.put_line('Initializing the Global Currency Precision');
300 end if;
301
302 g_primary_mau := nvl(fii_currency.get_mau_primary, 0.01 );
303 g_secondary_mau:= nvl(fii_currency.get_mau_secondary, 0.01);
304
305 if g_debug_flag = 'Y' then
306 FII_UTIL.put_line('Initializing the Global Currencies');
307 end if;
308
309 g_prim_currency := bis_common_parameters.get_currency_code;
310 g_sec_currency := bis_common_parameters.get_secondary_currency_code;
311
312 if g_debug_flag = 'Y' then
313 FII_UTIL.put_line('Initializing Global Currency Rate Types');
314 end if;
315
316 g_prim_rate_type := bis_common_parameters.get_rate_type;
317 g_sec_rate_type := bis_common_parameters.get_secondary_rate_type;
318
319
320 l_global_param_list(1) := 'BIS_GLOBAL_START_DATE';
321 l_global_param_list(2) := 'BIS_PRIMARY_CURRENCY_CODE';
322 l_global_param_list(3) := 'BIS_PRIMARY_RATE_TYPE';
323 IF (NOT bis_common_parameters.check_global_parameters(l_global_param_list)) THEN
324 RAISE G_MISS_GLOBAL_PARAMS;
325 END IF;
326
327 if ((g_sec_currency IS NULL and g_sec_rate_type IS NOT NULL) OR
328 (g_sec_currency IS NOT NULL and g_sec_rate_type IS NULL)) THEN
329 RAISE G_NEED_SECONDARY_INFO;
330 END IF;
331
332 g_fii_user_id := FND_GLOBAL.User_Id;
333 g_fii_login_id := FND_GLOBAL.Login_Id;
334
335 IF (g_fii_user_id IS NULL OR g_fii_login_id IS NULL) THEN
336 RAISE G_LOGIN_INFO_NOT_AVABLE;
337 END IF;
338
339 if g_debug_flag = 'Y' then
340 FII_UTIL.put_line('User ID: ' || g_fii_user_id || ' Login ID: ' || g_fii_login_id);
341 end if;
342
343 EXCEPTION
344 WHEN G_LOGIN_INFO_NOT_AVABLE THEN
345 g_retcode := -1;
346 g_errbuf := 'Can not get User ID and Login ID, program exit';
347 RAISE;
348
349 WHEN G_MISS_GLOBAL_PARAMS THEN
350 g_retcode := -1;
351 g_errbuf := fnd_message.get_string('FII', 'FII_BAD_GLOBAL_PARA');
352 RAISE;
353
354 WHEN G_NEED_SECONDARY_INFO THEN
355 g_retcode := -1;
356 g_errbuf := fnd_message.get_string('FII', 'FII_AP_SEC_MISS');
357 RAISE;
358
359 WHEN OTHERS THEN
360 g_retcode := -1;
361 g_errbuf := '
362 ---------------------------------
363 Error in Procedure: INIT
364 Message: '||sqlerrm;
365 RAISE;
366
367 END Init;
368
369
370
371 -----------------------------------------------------------
372 -- FUNCTION VERIFY_MISSING_RATES
373 -----------------------------------------------------------
374 FUNCTION Verify_Missing_Rates RETURN NUMBER IS
375 l_miss_rates_prim NUMBER := 0;
376 l_miss_rates_sec NUMBER := 0;
377 l_payment_currency VARCHAR2(2000) := NULL;
378 l_trx_date VARCHAR2(2000) := NULL;
379 l_miss_rates_func NUMBER := 0;
380
381 --------------------------------------------------------
382 -- Cursor declaration required to generate output file
383 -- containing rows with MISSING CONVERSION RATES
384 --------------------------------------------------------
385
386 CURSOR prim_MissingRate IS
387 SELECT DISTINCT Functional_Currency From_Currency,
388 decode(prim_conversion_rate,-3, to_date('01/01/1999','MM/DD/RRRR'),
389 LEAST(TRX_DATE,sysdate)) Trx_Date
390 FROM FII_AP_PS_RATES_TEMP RATES
391 WHERE RATES.Prim_Conversion_Rate < 0 ;
392
393 CURSOR sec_MissingRate IS
394 SELECT DISTINCT FUNCTIONAL_CURRENCY From_Currency,
395 decode(sec_conversion_rate,-3, to_date('01/01/1999','MM/DD/RRRR'),
396 least(TRX_DATE,sysdate)) Trx_Date
397 FROM FII_AP_PS_RATES_TEMP RATES
398 WHERE RATES.Sec_Conversion_Rate < 0 ;
399
400 CURSOR func_MissingRate IS
401 SELECT DISTINCT From_Currency,
402 To_Currency,
403 decode(conversion_rate,-3, to_date('01/01/1999','MM/DD/RRRR'),
404 least(TRX_DATE,sysdate)) Trx_Date,
405 Conversion_Type
406 FROM FII_AP_FUNC_RATES_TEMP RATES
407 WHERE RATES.Conversion_Rate < 0 ;
408
409 BEGIN
410 g_state := 'Checking to see which additional rates need to be defined, if any';
411
412 if g_debug_flag = 'Y' then
413 fii_util.put_line(' ');
414 fii_util.put_line(g_state);
415 fii_util.start_timer;
416 fii_util.put_line('');
417 end if;
418
419 SELECT COUNT(*)
420 INTO l_miss_rates_prim
421 FROM FII_AP_PS_RATES_TEMP RATES
422 WHERE RATES.Prim_Conversion_Rate < 0;
423
424 SELECT COUNT(*)
425 INTO l_miss_rates_sec
426 FROM FII_AP_PS_RATES_TEMP RATES
427 WHERE RATES.Sec_Conversion_Rate < 0;
428
429 SELECT COUNT(*)
430 INTO l_miss_rates_func
431 FROM FII_AP_FUNC_RATES_TEMP RATES
432 WHERE RATES.Conversion_Rate < 0;
433
434 --------------------------------------------------------
435 -- Print out translated messages to let user know there
436 -- are missing exchange rate information
437 --------------------------------------------------------
438 IF (l_miss_rates_prim > 0 OR
439 l_miss_rates_sec > 0 OR
440 l_miss_rates_func > 0) THEN
441 FII_MESSAGE.write_log(
442 msg_name => 'BIS_DBI_CURR_PARTIAL_LOAD',
443 token_num => 0);
444 END IF;
445
446 --------------------------------------------------------
447 -- Print out missing rates report
448 --------------------------------------------------------
449
450 IF (l_miss_rates_prim > 0 OR
451 l_miss_rates_sec > 0 OR
452 l_miss_rates_func > 0) THEN
453 BIS_COLLECTION_UTILITIES.writeMissingRateHeader;
454
455 FOR rate_record in func_MissingRate
456 LOOP
457 BIS_COLLECTION_UTILITIES.writeMissingRate(
458 rate_record.conversion_type,
459 rate_record.from_currency,
460 rate_record.to_currency,
461 rate_record.trx_date);
462 END LOOP;
463
464
465 FOR rate_record in prim_MissingRate
466 LOOP
467 BIS_COLLECTION_UTILITIES.writeMissingRate(
468 g_prim_rate_type,
469 rate_record.from_currency,
470 g_prim_currency,
471 rate_record.trx_date);
472 END LOOP;
473
474
475 FOR rate_record in sec_MissingRate
476 LOOP
477 BIS_COLLECTION_UTILITIES.writeMissingRate(
478 g_sec_rate_type,
479 rate_record.from_currency,
480 g_sec_currency,
481 rate_record.trx_date);
482 END LOOP;
483
484 RETURN -1;
485
486 ELSE
487 RETURN 1;
488 END IF; /* IF (l_miss_rates_prim > 0) */
489
490 EXCEPTION
491 WHEN OTHERS THEN
492 g_errbuf:=sqlerrm;
493 g_retcode:= -1;
494 g_exception_msg := g_retcode || ':' || g_errbuf;
495 FII_UTIL.put_line('Error occured while ' || g_state);
496 FII_UTIL.put_line(g_exception_msg);
497 RAISE;
498 END Verify_Missing_Rates;
499
500
501 ------------------------------------
502 ---- PROCEDURE INSERT_RATES
503 ------------------------------------
504
505 PROCEDURE Insert_Rates IS
506
507 BEGIN
508
509
510 INSERT INTO FII_AP_RATES_GT(
511 Trx_Currency,
512 Func_Currency,
513 Exchange_Date,
514 Exchange_Rate_Type,
515 Exchange_Rate,
516 Functional_MAU,
517 Invoice_Date)
518 SELECT AI.Payment_Currency_Code Trx_Currency,
519 ASP.Base_Currency_Code Func_Currency,
520 TRUNC(NVL(AI.Exchange_Date, AI.Invoice_Date)) Exchange_Date,
521 NVL(AI.Exchange_Rate_Type,'No Rate Type') Exchange_Rate_Type,
522 AI.Exchange_Rate Exchange_Rate,
523 NVL(FC.Minimum_Accountable_Unit, 0.01) Functional_MAU,
524 TRUNC(AI.Invoice_Date) Invoice_Date
525 FROM FII_AP_Invoice_IDS ID,
526 AP_Invoices_All AI,
527 AP_System_Parameters_All ASP,
528 FND_Currencies FC
529 WHERE ID.Invoice_ID = AI.Invoice_ID
530 AND ID.Get_Rate_Flag = 'Y'
531 AND AI.Org_ID = ASP.Org_ID
532 AND AI.Set_Of_Books_ID = ASP.Set_Of_Books_ID
533 AND AI.Invoice_Type_Lookup_Code <> 'EXPENSE REPORT'
534 AND (AI.Invoice_Amount <> 0 OR (AI.Invoice_Amount = 0 AND AI.Cancelled_Date IS NOT NULL))
535 AND TRUNC(AI.Creation_Date) >= g_start_date
536 AND ASP.Base_Currency_Code = FC.Currency_Code;
537
538
539
540 g_state := 'Loading data into rates table';
541
542 if g_debug_flag = 'Y' then
543 fii_util.put_line(' ');
544 fii_util.put_line(g_state);
545 fii_util.start_timer;
546 fii_util.put_line('');
547 end if;
548
549 INSERT INTO FII_AP_PS_RATES_TEMP
550 (Functional_Currency,
551 Trx_Date,
552 Prim_Conversion_Rate,
553 Sec_Conversion_Rate)
554 SELECT Functional_Currency,
555 Trx_Date,
556 DECODE(Functional_Currency, g_prim_currency, 1,
557 FII_CURRENCY.GET_GLOBAL_RATE_PRIMARY(Functional_Currency,
558 least(Trx_Date,sysdate))) PRIM_CONVERSION_RATE,
559 DECODE(Functional_Currency, g_sec_currency, 1,
560 FII_CURRENCY.GET_GLOBAL_RATE_SECONDARY(Functional_Currency,
561 least(Trx_Date,sysdate))) SEC_CONVERSION_RATE
562 FROM (SELECT /*+ no_merge */ DISTINCT
563 Func_Currency Functional_Currency,
564 Invoice_Date Trx_Date
565 FROM FII_AP_RATES_GT);
566
567 if g_debug_flag = 'Y' then
568 fii_util.put_line('Processed '||SQL%ROWCOUNT||' rows');
569 fii_util.stop_timer;
570 fii_util.print_timer('Duration');
571 end if;
572
573
574 if g_debug_flag = 'Y' then
575 fii_util.put_line(' ');
576 fii_util.put_line('Loading data into functional rates table');
577 fii_util.start_timer;
578 fii_util.put_line('');
579 end if;
580
581
582 INSERT INTO FII_AP_FUNC_RATES_TEMP
583 (From_Currency,
584 To_Currency,
585 Trx_Date,
586 Conversion_Type,
587 Conversion_Rate,
588 Functional_MAU)
589 SELECT From_Currency,
590 To_Currency,
591 Trx_Date,
592 Exchange_Rate_Type,
593 DECODE(Exchange_Rate_Type, 'User', Exchange_Rate, 'No Rate Type', 1,
594 DECODE(From_Currency, To_Currency, 1,
595 FII_CURRENCY.get_rate(From_Currency, To_Currency,
596 least(Trx_Date,sysdate), Exchange_Rate_Type)))
597 Conversion_Rate,
598 Functional_MAU
599 FROM (SELECT /*+ no_merge */ DISTINCT
600 Trx_Currency From_Currency,
601 Func_Currency To_Currency,
602 Exchange_Date Trx_Date,
603 Exchange_Rate_Type,
604 DECODE(Exchange_Rate_Type, 'User', Exchange_Rate, null) Exchange_Rate,
605 Functional_MAU
606 FROM FII_AP_RATES_GT);
607
608
609 if g_debug_flag = 'Y' then
610 fii_util.put_line('Processed '||SQL%ROWCOUNT||' rows');
611 fii_util.stop_timer;
612 fii_util.print_timer('Duration');
613 end if;
614
615 FND_STATS.GATHER_TABLE_STATS(OWNNAME => 'FII', TABNAME => 'FII_AP_PS_RATES_TEMP');
616
617 FND_STATS.GATHER_TABLE_STATS(OWNNAME => 'FII', TABNAME => 'FII_AP_FUNC_RATES_TEMP');
618
619
620 EXCEPTION
621 WHEN OTHERS THEN
622 g_errbuf:=sqlerrm;
623 g_retcode:= -1;
624 g_exception_msg := g_retcode || ':' || g_errbuf;
625 FII_UTIL.put_line('Error occured while ' || g_state);
626 FII_UTIL.put_line(g_exception_msg);
627 RAISE;
628
629 END Insert_Rates;
630
631
632 ------------------------------------------------------------------
633 -- Procedure DELETE_SUMMARY
634 -- Purpose
635 -- This DELETE_SUMMARY routine deletes the records from the
636 -- summary tables the invoices that have been deleted.
637 ------------------------------------------------------------------
638
639 PROCEDURE DELETE_SUMMARY IS
640
641 BEGIN
642
643 g_state := 'Inside the procedure DELETE_SUMMARY';
644 if g_debug_flag = 'Y' then
645 FII_UTIL.put_line('');
646 FII_UTIL.put_line(g_state);
647 end if;
648
649 g_state := 'Deleting records from the FII_AP_AGING_BKTS_B table';
650 if g_debug_flag = 'Y' then
651 FII_UTIL.put_line('');
652 FII_UTIL.put_line(g_state);
653 end if;
654
655 DELETE FROM FII_AP_AGING_BKTS_B
656 WHERE Invoice_ID IN (SELECT Key_Value1_Num
657 FROM FII_AP_DBI_LOG_T
658 WHERE Table_Name = 'AP_INVOICES'
659 AND Operation_Flag = 'D');
660
661 if g_debug_flag = 'Y' then
662 FII_UTIL.put_line('Deleted '|| SQL%ROWCOUNT ||' records from the FII_AP_AGING_BKTS_B');
663 FII_UTIL.put_line('');
664 end if;
665
666
667 g_state := 'Deleting records from the FII_AP_DUE_COUNTS_B table';
668 if g_debug_flag = 'Y' then
669 FII_UTIL.put_line('');
670 FII_UTIL.put_line(g_state);
671 end if;
672
673 DELETE FROM FII_AP_DUE_COUNTS_B
674 WHERE Invoice_ID IN (SELECT Key_Value1_Num
675 FROM FII_AP_DBI_LOG_T
676 WHERE Table_Name = 'AP_INVOICES'
677 AND Operation_Flag = 'D');
678
679 if g_debug_flag = 'Y' then
680 FII_UTIL.put_line('Deleted '|| SQL%ROWCOUNT ||' records from the FII_AP_DUE_COUNTS_B');
681 FII_UTIL.put_line('');
682 end if;
683
684
685 g_state := 'Deleting records from the FII_AP_INV_HOLDS_B table';
686 if g_debug_flag = 'Y' then
687 FII_UTIL.put_line('');
688 FII_UTIL.put_line(g_state);
689 end if;
690
691 DELETE FROM FII_AP_INV_HOLDS_B
692 WHERE Invoice_ID IN (SELECT Key_Value1_Num
693 FROM FII_AP_DBI_LOG_T
694 WHERE Table_Name = 'AP_INVOICES'
695 AND Operation_Flag = 'D');
696
697 if g_debug_flag = 'Y' then
698 FII_UTIL.put_line('Deleted '|| SQL%ROWCOUNT ||' records from the FII_AP_INV_HOLDS_B');
699 FII_UTIL.put_line('');
700 end if;
701
702
703 g_state := 'Deleting records from the FII_AP_HOLD_HIST_B table';
704 if g_debug_flag = 'Y' then
705 FII_UTIL.put_line('');
706 FII_UTIL.put_line(g_state);
707 end if;
708
709 DELETE FROM FII_AP_HOLD_HIST_B
710 WHERE Invoice_ID IN (SELECT Key_Value1_Num
711 FROM FII_AP_DBI_LOG_T
712 WHERE Table_Name = 'AP_INVOICES'
713 AND Operation_Flag = 'D');
714
715 if g_debug_flag = 'Y' then
716 FII_UTIL.put_line('Deleted '|| SQL%ROWCOUNT ||' records from the FII_AP_HOLD_HIST_B');
717 FII_UTIL.put_line('');
718 end if;
719
720
721 EXCEPTION
722 WHEN OTHERS THEN
723 g_errbuf:=sqlerrm;
724 g_retcode:= -1;
725 g_exception_msg := g_retcode || ':' || g_errbuf;
726 FII_UTIL.put_line('Error occured while ' || g_state);
727 FII_UTIL.put_line(g_exception_msg);
728 RAISE;
729
730 END DELETE_SUMMARY;
731
732
733 ------------------------------------------------------------------
734 -- Procedure POPULATE_HOLDS_SUM
735 -- Purpose
736 -- This POPULATE_HOLDS_SUM routine inserts records into the
737 -- FII AP Holds summary tables.
738 ------------------------------------------------------------------
739
740 PROCEDURE POPULATE_HOLDS_SUM IS
741
742 BEGIN
743
744 if g_debug_flag = 'Y' then
745 FII_UTIL.put_line('Inside the procedure POPULATE_HOLDS_SUM');
746 end if;
747
748 g_state := 'Deleting holds from FII_AP_INV_HOLDS_B';
749 if g_debug_flag = 'Y' then
750 FII_UTIL.put_line('');
751 FII_UTIL.put_line(g_state);
752 FII_UTIL.start_timer;
753 FII_UTIL.put_line('');
754 end if;
755
756 DELETE FROM FII_AP_INV_HOLDS_B
757 WHERE Invoice_ID IN (SELECT /*+ cardinality(T,100) */ Key_Value1_Num
758 FROM FII_AP_DBI_LOG_T T
759 WHERE Table_Name = 'AP_HOLDS');
760
761 DELETE /*+ index(B) push_subq */ FROM FII_AP_INV_HOLDS_B B
762 WHERE Invoice_ID IN (SELECT /*+ cardinality(Log,1) */ Key_Value1_Num
763 FROM FII_AP_DBI_LOG_T Log, FII_AP_Invoice_B AI
764 WHERE Log.Key_Value1_Num = AI.Invoice_ID
765 AND AI.Cancel_Date IS NOT NULL
766 AND Log.Table_Name = 'AP_INVOICES');
767
768 g_state := 'Populating FII_AP_INV_HOLDS_B FROM AP_HOLDS_ALL table';
769 if g_debug_flag = 'Y' then
770 FII_UTIL.put_line(g_state);
771 end if;
772
773 INSERT INTO FII_AP_INV_HOLDS_B
774 (Time_ID,
775 Period_Type_ID,
776 Org_ID,
777 Supplier_ID,
778 Invoice_ID,
779 Hold_Date,
780 Hold_Code,
781 Held_By,
782 Hold_Category,
783 Release_Date,
784 Released_By,
785 Created_By,
786 Creation_Date,
787 Last_Updated_By,
788 Last_Update_Date,
789 Last_Update_Login)
790 SELECT /*+ ordered use_nl(AH,AI) */ TO_NUMBER(TO_CHAR(AH.Hold_Date,'J')),
791 1,
792 AH.Org_ID,
793 AI.Supplier_ID,
794 AH.Invoice_ID,
795 TRUNC(AH.Hold_Date),
796 AH.Hold_Lookup_Code,
797 AH.Held_By,
798 (CASE
799 WHEN Hold_Lookup_Code IN ('DIST ACCT INVALID', 'ERV ACCT INVALID')
800 THEN 'ACCOUNT'
801 WHEN Hold_Lookup_Code IN ('CANT FUNDS CHECK', 'INSUFFICIENT FUNDS')
802 THEN 'FUNDS'
803 WHEN Hold_Lookup_Code IN ('AMOUNT', 'AWT ERROR', 'VENDOR',
804 'NATURAL ACCOUNT TAX')
805 THEN 'INVOICE'
806 WHEN Hold_Lookup_Code IN ('CANT CLOSE PO', 'CANT TRY PO CLOSE',
807 'FINAL MATCHING', 'PO REQUIRED', 'MAX QTY ORD',
808 'MAX QTY REC', 'MAX RATE AMOUNT', 'MAX SHIP AMOUNT',
809 'MAX TOTAL AMOUNT', 'PRICE', 'QTY ORD', 'QTY REC',
810 'QUANTITY', 'REC EXCEPTION', 'TAX DIFFERENCE')
811 THEN 'PO MATCHING'
812 WHEN Hold_Lookup_Code IN ('DIST VARIANCE', 'TAX VARIANCE', 'TAX AMOUNT RANGE', 'LINE VARIANCE')
813 THEN 'VARIANCE'
814 WHEN Hold_Lookup_Code IN ('NO RATE', 'VENDOR')
815 THEN 'MISCELLANEOUS'
816 ELSE 'USER DEFINED'
817 END) AS Hold_Category,
818 DECODE(AH.Release_Lookup_Code, Null, Null,
819 AH.Last_Update_Date),
820 DECODE(AH.Release_Lookup_Code, Null, Null,
821 AH.Last_Updated_By),
822 g_fii_user_id Created_By,
823 sysdate Creation_Date,
824 g_fii_user_id Last_Updated_By,
825 sysdate Last_Update_Date,
826 g_fii_login_id Last_Update_Login
827 FROM (SELECT /*+ no_merge */ distinct Key_Value1_Num
828 FROM FII_AP_DBI_LOG_T
829 WHERE Table_Name = 'AP_HOLDS'
830 AND Operation_Flag IN ('I','U')) T,
831 AP_Holds_All AH,
832 FII_AP_Invoice_B AI
833 WHERE AH.Invoice_ID = AI.Invoice_ID
834 AND AI.Cancel_Date IS NULL
835 AND AI.Invoice_Type NOT IN ('PREPAYMENT')
836 AND AH.Invoice_ID = T.Key_Value1_Num;
837
838 if g_debug_flag = 'Y' then
839 FII_UTIL.put_line('Inserted ' || SQL%ROWCOUNT || ' records into FII_AP_INV_HOLDS_B');
840 FII_UTIL.put_line('');
841 FII_UTIL.stop_timer;
842 FII_UTIL.print_timer('Duration');
843 end if;
844
845 UPDATE FII_AP_INV_HOLDS_B HSUM
846 SET Supplier_ID = (SELECT AI.Supplier_ID
847 FROM FII_AP_Invoice_B AI
848 WHERE AI.Invoice_ID = HSUM.Invoice_ID)
849 WHERE HSUM.Invoice_ID IN (SELECT Key_Value1_Num
850 FROM FII_AP_DBI_LOG_T
851 WHERE Table_Name = 'AP_INVOICES'
852 AND Operation_Flag = 'U');
853
854
855
856 EXCEPTION
857 WHEN OTHERS THEN
858 g_errbuf:=sqlerrm;
859 g_retcode:= -1;
860 g_exception_msg := g_retcode || ':' || g_errbuf;
861 FII_UTIL.put_line('Error occured while ' || g_state);
862 FII_UTIL.put_line(g_exception_msg);
863 RAISE;
864
865 END;
866
867
868 ------------------------------------------------------------------
869 -- Procedure POPULATE_HOLD_HISTORY
870 -- Purpose
871 -- This POPULATE_HOLD_HISTORY routine inserts records into the
872 -- FII Hold History summary table.
873 ------------------------------------------------------------------
874
875 PROCEDURE POPULATE_HOLD_HISTORY IS
876
877 BEGIN
878
879 g_state := 'Inside the procedure POPULATE_HOLD_HISTORY';
880 if g_debug_flag = 'Y' then
881 FII_UTIL.put_line('');
882 FII_UTIL.put_line(g_state);
883 end if;
884
885 g_state := 'Deleting records from FII_AP_HOLD_HIST_B that are already existing';
886 if g_debug_flag = 'Y' then
887 FII_UTIL.put_line('');
888 FII_UTIL.put_line(g_state);
889 end if;
890
891
892 /* Deleting the records from the Hold History table. This will ensure
893 that the records will not be duplicated in the History table */
894
895 DELETE FROM FII_AP_Hold_Hist_B
896 WHERE Invoice_ID IN (SELECT LOG.Key_Value1_Num
897 FROM FII_AP_DBI_LOG_T LOG
898 WHERE Table_Name = 'AP_HOLDS');
899
900 DELETE /*+ index(B) push_subq */ FROM FII_AP_Hold_Hist_B
901 WHERE Invoice_ID IN (SELECT /*+ cardinality(LOG,1) */ Key_Value1_Num
902 FROM FII_AP_DBI_LOG_T LOG, FII_AP_Invoice_B AI
903 WHERE LOG.Key_Value1_Num = AI.Invoice_ID
904 AND AI.Cancel_Date IS NOT NULL
905 AND LOG.Table_Name = 'AP_INVOICES');
906
907
908
909 g_state := 'Populating FII_AP_HOLD_HIST_B FROM AP_HOLDS_ALL table';
910 if g_debug_flag = 'Y' then
911 FII_UTIL.put_line(g_state);
912 end if;
913
914 g_state := 'Populating Hold records';
915 if g_debug_flag = 'Y' then
916 FII_UTIL.put_line(g_state);
917 FII_UTIL.start_timer;
918 FII_UTIL.put_line('');
919 end if;
920
921 /* If in the AP_HOLDS_ALL table there are overlapping holds then we
922 will only select the first hold and insert into the hold history table.
923 The subquery in the select statement checks if any overlapping holds exist
924 with hold date between the first hold and release dates */
925
926 /* Made changes for bug # 3212761 changed query for inserting Rec_type 'R' and 'H'*/
927
928 INSERT INTO FII_AP_Hold_Hist_B HH
929 (Time_ID,
930 Period_Type_ID,
931 Org_ID,
932 Supplier_ID,
933 Invoice_ID,
934 Seq_ID,
935 Action,
936 Action_Date,
937 Created_By,
938 Creation_Date,
939 Last_Updated_By,
940 Last_Update_Date,
941 Last_Update_Login)
942 SELECT TO_NUMBER(TO_CHAR(H_R_Date,'J')),
943 1,
944 Org_ID,
945 Supplier_ID,
946 Invoice_ID,
947 DECODE(Rec_Type, 'H', FII_AP_HOLD_HIST_B_S.NEXTVAL, NULL),
948 rec_type,
949 H_R_Date,
950 g_fii_user_id Created_By,
951 sysdate Creation_Date,
952 g_fii_user_id Last_Updated_By,
953 sysdate Last_Update_Date,
954 g_fii_login_id Last_Update_Login
955 FROM
956 (SELECT /*+ NO_EXPAND ordered use_nl(AH,AI) */ DISTINCT AI.Org_ID,
957 AI.Supplier_ID,
958 AI.Invoice_ID,
959 TRUNC(DECODE(RT.Rec_Type, 'H', AH.Hold_Date, AH.Last_Update_Date)) H_R_Date,
960 RT.Rec_Type
961 FROM (SELECT /*+ no_merge index(lt) */ distinct Key_Value1_Num
962 FROM FII_AP_DBI_LOG_T lt
963 WHERE Table_Name = 'AP_HOLDS'
964 AND Operation_Flag IN ('I','U')) LOG,
965 AP_HOLDS_ALL AH,
966 FII_AP_INVOICE_B AI,
967 (SELECT 'H' Rec_Type FROM DUAL WHERE dummy IS NOT NULL
968 UNION ALL select 'R' Rec_Type FROM DUAL WHERE dummy IS NOT NULL) RT
969 WHERE AH.Invoice_ID = LOG.Key_Value1_Num
970 AND AI.Invoice_ID = AH.Invoice_ID
971 AND AI.Cancel_Date IS NULL
972 AND AI.Invoice_Type NOT IN ('PREPAYMENT')
973 AND ((RT.Rec_Type = 'H'
974 AND ah.hold_date IN (SELECT min(ah1.hold_date)
975 FROM ap_holds_all ah1
976 WHERE ah1.invoice_id = ah.invoice_id
977 AND trunc(ah1.hold_date) <= decode(ah.release_lookup_code, NULL, sysdate, ah.last_update_date)
978 AND trunc(ah.hold_date) <= decode(ah1.release_lookup_code, NULL, sysdate, ah1.last_update_date)))
979 OR
980 (RT.Rec_Type = 'R'
981 AND AH.Release_Lookup_Code IS NOT NULL
982 AND AH.Last_Update_Date IN (SELECT max(ah1.last_update_date)
983 FROM AP_HOLDS_ALL AH1
984 WHERE AH.invoice_id=AH1.invoice_id
985 AND trunc(ah1.hold_date)<=trunc(ah.last_update_date)
986 AND trunc(ah.hold_date)<=decode(AH1.release_lookup_code,NULL,g_sysdate, trunc(AH1.last_update_date)))
987 AND NOT EXISTS (SELECT 'Unrelease holds'
988 FROM AP_HOLDS_ALL AH2
989 WHERE AH2.invoice_id=AH.invoice_id
990 AND trunc(AH2.hold_date)<=trunc(AH.last_update_date)
991 AND ah2.release_lookup_code IS NULL))));
992
993
994 if g_debug_flag = 'Y' then
995 FII_UTIL.put_line('Inserted '|| SQL%ROWCOUNT ||' Hold and Release records into FII_AP_HOLD_HIST_B');
996 FII_UTIL.put_line('');
997 FII_UTIL.stop_timer;
998 FII_UTIL.print_timer('Duration');
999 end if;
1000
1001 g_state := 'Updating the Seq_ID on the Release records';
1002 if g_debug_flag = 'Y' then
1003 FII_UTIL.put_line(g_state);
1004 FII_UTIL.start_timer;
1005 FII_UTIL.put_line('');
1006 end if;
1007
1008 UPDATE FII_AP_Hold_Hist_B HH
1009 SET Seq_ID = (SELECT HH1.Seq_ID
1010 FROM FII_AP_Hold_Hist_B HH1
1011 WHERE HH1.Action = 'H'
1012 AND HH1.Invoice_ID = HH.Invoice_ID
1013 AND HH1.Period_Type_ID = 1
1014 AND HH1.Action_Date IN
1015 (SELECT MIN(TRUNC(AH1.Hold_Date))
1016 FROM AP_Holds_ALL AH1, AP_Holds_ALL AH2
1017 WHERE AH1.Invoice_ID = HH1.Invoice_ID
1018 AND AH2.Invoice_ID = HH1.Invoice_ID
1019 AND TRUNC(AH2.Last_Update_Date) = HH.Action_Date
1020 AND AH2.Release_Lookup_Code IS NOT NULL
1021 AND TRUNC(AH1.Last_Update_Date) >= TRUNC(AH2.Hold_Date)
1022 AND AH1.Release_Lookup_Code IS NOT NULL
1023 AND TRUNC(AH1.Last_Update_Date)
1024 <= TRUNC(AH2.Last_Update_Date)))
1025 WHERE HH.Action = 'R'
1026 AND HH.Period_Type_ID = 1
1027 AND HH.Seq_ID IS NULL;
1028
1029 if g_debug_flag = 'Y' then
1030 FII_UTIL.put_line('Updated '|| SQL%ROWCOUNT ||' Release records in the FII_AP_HOLD_HIST_B');
1031 FII_UTIL.put_line('');
1032 FII_UTIL.stop_timer;
1033 FII_UTIL.print_timer('Duration');
1034 end if;
1035
1036
1037 g_state := 'Updating the Hold Count on the Hold and Release records';
1038 if g_debug_flag = 'Y' then
1039 FII_UTIL.put_line(g_state);
1040 FII_UTIL.start_timer;
1041 FII_UTIL.put_line('');
1042 end if;
1043 /*
1044 UPDATE FII_AP_Hold_Hist_B HH
1045 SET Hold_Count = (SELECT DECODE(HH.Action,'H', COUNT(*), -1 * COUNT(*))
1046 FROM AP_Holds_ALL AH
1047 WHERE AH.Invoice_ID = HH.Invoice_ID
1048 AND (EXISTS (SELECT 'Hold Exists'
1049 FROM FII_AP_Hold_Hist_B HH1
1050 WHERE HH1.Invoice_ID = AH.Invoice_ID
1051 AND HH1.Seq_ID = HH.Seq_ID
1052 AND HH1.Period_Type_ID = 1
1053 AND TRUNC(AH.Hold_Date) >= DECODE(HH.Action,'H',
1054 HH.Action_Date, HH1.Action_Date)
1055 AND AH.Release_Lookup_Code IS NOT NULL
1056 AND TRUNC(AH.Last_Update_Date) <=
1057 DECODE(HH.Action,'H',HH1.Action_Date,
1058 HH.Action_Date)
1059 AND HH1.Rowid <> HH.Rowid)
1060 OR NOT EXISTS (SELECT 'Release Exists'
1061 FROM FII_AP_Hold_Hist_B HH2
1062 WHERE HH2.Invoice_ID = AH.Invoice_ID
1063 AND HH.Seq_ID = HH2.Seq_ID
1064 AND HH.Period_Type_ID = 1
1065 AND HH2.Rowid <> HH.Rowid)))
1066 WHERE HH.Hold_Count IS NULL
1067 AND HH.Period_Type_ID = 1;
1068
1069 */
1070 UPDATE FII_AP_Hold_Hist_B HH
1071 SET Supplier_ID = (SELECT AI.Vendor_ID
1072 FROM AP_Invoices_ALL AI
1073 WHERE AI.Invoice_ID = HH.Invoice_ID)
1074 WHERE HH.Invoice_ID IN (SELECT Key_Value1_Num
1075 FROM FII_AP_DBI_LOG_T
1076 WHERE Table_Name = 'AP_INVOICES'
1077 AND Operation_Flag = 'U');
1078
1079
1080 if g_debug_flag = 'Y' then
1081 FII_UTIL.put_line('Updated '|| SQL%ROWCOUNT ||' Hold Counts in the FII_AP_HOLD_HIST_B');
1082 FII_UTIL.put_line('');
1083 FII_UTIL.stop_timer;
1084 FII_UTIL.print_timer('Duration');
1085 end if;
1086
1087 /*
1088 if g_debug_flag = 'Y' then
1089 FII_UTIL.put_line('Calling procedure ROLLUP_HOLD_HISTORY');
1090 FII_UTIL.put_line('');
1091 end if;
1092
1093 ROLLUP_HOLD_HISTORY;
1094 */
1095
1096 EXCEPTION
1097 WHEN OTHERS THEN
1098 g_errbuf:=sqlerrm;
1099 g_retcode:= -1;
1100 g_exception_msg := g_retcode || ':' || g_errbuf;
1101 FII_UTIL.put_line('Error occured while ' || g_state);
1102 FII_UTIL.put_line(g_exception_msg);
1103 RAISE;
1104
1105 END POPULATE_HOLD_HISTORY;
1106
1107
1108 ------------------------------------------------------------------
1109 -- Procedure INSERT_DELETED_REC
1110 -- Purpose
1111 -- This INSERT_DELETED_REC routine inserts records into
1112 -- FII_AP_Pay_Sched_D_MS or FII_AP_Invoice_D_MS if
1113 -- it has been deleted since the previous load.
1114 ------------------------------------------------------------------
1115 PROCEDURE INSERT_DELETED_REC(Invoice_ID NUMBER, Payment_Num NUMBER) IS
1116 Deleted_Pay_Sched Pay_Sched_D_Rec;
1117 Deleted_Invoice Invoice_D_Rec;
1118 BEGIN
1119 g_state := 'Inside INSERT_DELETED_REC Procedure.';
1120
1121 IF Invoice_ID IS NOT NULL AND Payment_Num IS NOT NULL THEN --Check if FII_AP_Pay_Sched_B_MS has any deletions.
1122
1123 WHILE g_pay_sched_b_marker IS NOT NULL
1124 AND (FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Invoice_ID < Invoice_ID
1125 OR (FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Invoice_ID = Invoice_ID
1126 AND FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Payment_Num < Payment_Num)) LOOP
1127 Deleted_Pay_Sched.Invoice_ID := FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Invoice_ID;
1128 Deleted_Pay_Sched.Payment_Num := FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Payment_Num;
1129 Deleted_Pay_Sched.Action_Date := FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Action_Date;
1130 Deleted_Pay_Sched.Action := FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Action;
1131 Deleted_Pay_Sched.Inv_Pymt_Flag := FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Inv_Pymt_Flag;
1132 Deleted_Pay_Sched.Unique_ID := FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Unique_ID;
1133 FII_AP_Pay_Sched_D_MS(FII_AP_Pay_Sched_D_MS.Count+1) := Deleted_Pay_Sched;
1134 g_pay_sched_b_marker := FII_AP_Pay_Sched_B_MS.Next(g_pay_sched_b_marker);
1135 END LOOP;
1136
1137 ELSIF Invoice_ID IS NOT NULL AND Payment_Num IS NULL THEN --Check if FII_AP_Invoice_B_MS has any deletions.
1138
1139 WHILE g_invoice_b_marker IS NOT NULL
1140 AND FII_AP_Invoice_B_MS(g_invoice_b_marker).Invoice_ID < Invoice_ID LOOP
1141 Deleted_Invoice.Invoice_ID := FII_AP_Invoice_B_MS(g_invoice_b_marker).Invoice_ID;
1142 FII_AP_Invoice_D_MS(FII_AP_Invoice_D_MS.Count+1) := Deleted_Invoice;
1143 g_invoice_b_marker := FII_AP_Invoice_B_MS.Next(g_invoice_b_marker);
1144 END LOOP;
1145
1146 ELSIF Invoice_ID IS NULL AND Payment_Num IS NULL THEN
1147
1148 WHILE g_pay_sched_b_marker IS NOT NULL LOOP
1149 Deleted_Pay_Sched.Invoice_ID := FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Invoice_ID;
1150 Deleted_Pay_Sched.Payment_Num := FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Payment_Num;
1151 Deleted_Pay_Sched.Action_Date := FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Action_Date;
1152 Deleted_Pay_Sched.Action := FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Action;
1153 Deleted_Pay_Sched.Inv_Pymt_Flag := FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Inv_Pymt_Flag;
1154 Deleted_Pay_Sched.Unique_ID := FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Unique_ID;
1155 FII_AP_Pay_Sched_D_MS(FII_AP_Pay_Sched_D_MS.Count+1) := Deleted_Pay_Sched;
1156 g_pay_sched_b_marker := FII_AP_Pay_Sched_B_MS.Next(g_pay_sched_b_marker);
1157 END LOOP;
1158
1159 WHILE g_invoice_b_marker IS NOT NULL LOOP
1160 Deleted_Invoice.Invoice_ID := FII_AP_Invoice_B_MS(g_invoice_b_marker).Invoice_ID;
1161 FII_AP_Invoice_D_MS(FII_AP_Invoice_D_MS.Count+1) := Deleted_Invoice;
1162 g_invoice_b_marker := FII_AP_Invoice_B_MS.Next(g_invoice_b_marker);
1163 END LOOP;
1164
1165 END IF;
1166
1167 EXCEPTION
1168 WHEN OTHERS THEN
1169 FII_UTIL.put_line('Error in procedure Insert_Deleted_Rec.');
1170 RAISE;
1171 END Insert_Deleted_Rec;
1172
1173 ------------------------------------------------------------------
1174 -- Procedure INSERT_PAY_SCHED_B_REC
1175 -- Purpose
1176 -- This INSERT_PAY_SCHED_B_REC routine inserts records into
1177 -- FII_AP_Pay_Sched_UI_MS and/or
1178 -- FII_AP_Pay_Sched_D_MS by comparing the record passed as a
1179 -- parameter with the current record in FII_AP_Pay_Sched_B_MS
1180 -- (existing data).
1181 ------------------------------------------------------------------
1182 PROCEDURE INSERT_PAY_SCHED_B_REC(Pay_Sched_Rec FII_AP_PAY_SCHED_B%ROWTYPE, Update_Only_Flag VARCHAR2) IS
1183
1184 BEGIN
1185 g_state := 'Inside INSERT_PAY_SCHED_B_REC Procedure.';
1186
1187 IF Update_Only_Flag = 'Y' THEN
1188 FII_AP_Pay_Sched_UI_MS(FII_AP_Pay_Sched_UI_MS.Count+1) := Pay_Sched_Rec;
1189 ELSE
1190
1191
1192 IF Pay_Sched_Rec.Action = 'CREATION' THEN --This is the start of a new payment schedule, so clean up FII_AP_Pay_Sched_B_MS until this payment schedule or beyond.
1193 INSERT_DELETED_REC(Pay_Sched_Rec.Invoice_ID, Pay_Sched_Rec.Payment_Num);
1194 END IF;
1195 --Check if Pay_Sched_Rec exists from previous load.
1196 IF g_pay_sched_b_marker IS NOT NULL
1197 AND FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Invoice_ID = Pay_Sched_Rec.Invoice_ID
1198 AND FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Payment_Num = Pay_Sched_Rec.Payment_Num
1199 AND FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Action_Date = Pay_Sched_Rec.Action_Date
1200 AND FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Action = Pay_Sched_Rec.Action
1201 AND NVL(FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Inv_Pymt_Flag, ' ') = NVL(Pay_Sched_Rec.Inv_Pymt_Flag, ' ')
1202 AND NVL(FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Unique_ID, -99) = NVL(Pay_Sched_Rec.Unique_ID, -99) THEN
1203 --Check if Pay_Sched_Rec has been updated.
1204 IF FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Org_ID <> Pay_Sched_Rec.Org_ID
1205 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Supplier_ID <> Pay_Sched_Rec.Supplier_ID
1206 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Base_Currency_Code <> Pay_Sched_Rec.Base_Currency_Code
1207 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Trx_Date <> Pay_Sched_Rec.Trx_Date
1208 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Due_Date <> Pay_Sched_Rec.Due_Date
1209 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Amount_Remaining <> Pay_Sched_Rec.Amount_Remaining
1210 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Past_Due_Amount <> Pay_Sched_Rec.Past_Due_Amount
1211 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Discount_Available <> Pay_Sched_Rec.Discount_Available
1212 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Discount_Taken <> Pay_Sched_Rec.Discount_Taken
1213 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Discount_Lost <> Pay_Sched_Rec.Discount_Lost
1214 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Payment_Amount <> Pay_Sched_Rec.Payment_Amount
1215 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).On_Time_Payment_Amt <> Pay_Sched_Rec.On_Time_Payment_Amt
1216 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Late_Payment_Amt <> Pay_Sched_Rec.Late_Payment_Amt
1217 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).No_Days_Late <> Pay_Sched_Rec.No_Days_Late
1218 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Due_Bucket1 <> Pay_Sched_Rec.Due_Bucket1
1219 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Due_Bucket2 <> Pay_Sched_Rec.Due_Bucket2
1220 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Due_Bucket3 <> Pay_Sched_Rec.Due_Bucket3
1221 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Past_Due_Bucket1 <> Pay_Sched_Rec.Past_Due_Bucket1
1222 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Past_Due_Bucket2 <> Pay_Sched_Rec.Past_Due_Bucket2
1223 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Past_Due_Bucket3 <> Pay_Sched_Rec.Past_Due_Bucket3
1224 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Amount_Remaining_B <> Pay_Sched_Rec.Amount_Remaining_B
1225 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Past_Due_Amount_B <> Pay_Sched_Rec.Past_Due_Amount_B
1226 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Discount_Available_B <> Pay_Sched_Rec.Discount_Available_B
1227 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Discount_Taken_B <> Pay_Sched_Rec.Discount_Taken_B
1228 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Discount_Lost_B <> Pay_Sched_Rec.Discount_Lost_B
1229 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Payment_Amount_B <> Pay_Sched_Rec.Payment_Amount_B
1230 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).On_Time_Payment_Amt_B <> Pay_Sched_Rec.On_Time_Payment_Amt_B
1231 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Late_Payment_Amt_B <> Pay_Sched_Rec.Late_Payment_Amt_B
1232 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Due_Bucket1_B <> Pay_Sched_Rec.Due_Bucket1_B
1233 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Due_Bucket2_B <> Pay_Sched_Rec.Due_Bucket2_B
1234 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Due_Bucket3_B <> Pay_Sched_Rec.Due_Bucket3_B
1235 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Past_Due_Bucket1_B <> Pay_Sched_Rec.Past_Due_Bucket1_B
1236 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Past_Due_Bucket2_B <> Pay_Sched_Rec.Past_Due_Bucket2_B
1237 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Past_Due_Bucket3_B <> Pay_Sched_Rec.Past_Due_Bucket3_B
1238 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Prim_Amount_Remaining <> Pay_Sched_Rec.Prim_Amount_Remaining
1239 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Prim_Past_Due_Amount <> Pay_Sched_Rec.Prim_Past_Due_Amount
1240 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Prim_Discount_Available <> Pay_Sched_Rec.Prim_Discount_Available
1241 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Prim_Discount_Taken <> Pay_Sched_Rec.Prim_Discount_Taken
1242 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Prim_Discount_Lost <> Pay_Sched_Rec.Prim_Discount_Lost
1243 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Prim_Payment_Amount <> Pay_Sched_Rec.Prim_Payment_Amount
1244 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Prim_On_Time_Payment_Amt <> Pay_Sched_Rec.Prim_On_Time_Payment_Amt
1245 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Prim_Late_Payment_Amt <> Pay_Sched_Rec.Prim_Late_Payment_Amt
1246 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Prim_Due_Bucket1 <> Pay_Sched_Rec.Prim_Due_Bucket1
1247 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Prim_Due_Bucket2 <> Pay_Sched_Rec.Prim_Due_Bucket2
1248 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Prim_Due_Bucket3 <> Pay_Sched_Rec.Prim_Due_Bucket3
1249 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Prim_Past_Due_Bucket1 <> Pay_Sched_Rec.Prim_Past_Due_Bucket1
1250 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Prim_Past_Due_Bucket2 <> Pay_Sched_Rec.Prim_Past_Due_Bucket2
1251 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Prim_Past_Due_Bucket3 <> Pay_Sched_Rec.Prim_Past_Due_Bucket3
1252 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Sec_Amount_Remaining <> Pay_Sched_Rec.Sec_Amount_Remaining
1253 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Sec_Past_Due_Amount <> Pay_Sched_Rec.Sec_Past_Due_Amount
1254 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Sec_Discount_Available <> Pay_Sched_Rec.Sec_Discount_Available
1255 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Sec_Discount_Taken <> Pay_Sched_Rec.Sec_Discount_Taken
1256 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Sec_Discount_Lost <> Pay_Sched_Rec.Sec_Discount_Lost
1257 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Sec_Payment_Amount <> Pay_Sched_Rec.Sec_Payment_Amount
1258 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Sec_On_Time_Payment_Amt <> Pay_Sched_Rec.Sec_On_Time_Payment_Amt
1259 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Sec_Late_Payment_Amt <> Pay_Sched_Rec.Sec_Late_Payment_Amt
1260 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Sec_Due_Bucket1 <> Pay_Sched_Rec.Sec_Due_Bucket1
1261 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Sec_Due_Bucket2 <> Pay_Sched_Rec.Sec_Due_Bucket2
1262 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Sec_Due_Bucket3 <> Pay_Sched_Rec.Sec_Due_Bucket3
1263 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Sec_Past_Due_Bucket1 <> Pay_Sched_Rec.Sec_Past_Due_Bucket1
1264 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Sec_Past_Due_Bucket2 <> Pay_Sched_Rec.Sec_Past_Due_Bucket2
1265 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Sec_Past_Due_Bucket3 <> Pay_Sched_Rec.Sec_Past_Due_Bucket3
1266 OR NVL(FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Check_ID, -99) <> NVL(Pay_Sched_Rec.Check_ID, -99)
1267 OR NVL(FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Payment_Method, ' ') <> NVL(Pay_Sched_Rec.Payment_Method, ' ')
1268 OR FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Created_By <> Pay_Sched_Rec.Created_By
1269 OR NVL(FII_AP_Pay_Sched_B_MS(g_pay_sched_b_marker).Check_Date, g_sysdate) <> NVL(Pay_Sched_Rec.Check_Date, g_sysdate) THEN
1270 --Record has changed, so update.
1271 FII_AP_Pay_Sched_UI_MS(FII_AP_Pay_Sched_UI_MS.Count+1) := Pay_Sched_Rec;
1272 END IF;
1273
1274 g_pay_sched_b_marker := FII_AP_Pay_Sched_B_MS.Next(g_pay_sched_b_marker);
1275
1276 ELSE --Pay_Sched_Rec does not exist in previous load, so insert.
1277 FII_AP_Pay_Sched_UI_MS(FII_AP_Pay_Sched_UI_MS.Count+1) := Pay_Sched_Rec;
1278 END IF;
1279
1280 END IF; --IF Update_Only_Flag = 'Y'
1281
1282 EXCEPTION
1283 WHEN OTHERS THEN
1284 FII_UTIL.put_line('Error in procedure Insert_Pay_Sched_B_Rec.');
1285 RAISE;
1286
1287 END Insert_Pay_Sched_B_Rec;
1288
1289 ------------------------------------------------------------------
1290 -- Procedure INSERT_INVOICE_B_REC
1291 -- Purpose
1292 -- This INSERT_INVOICE_B_REC routine inserts records into
1293 -- FII_AP_Invoice_UI_MS, and/or FII_AP_Invoice_D_MS
1294 -- by comparing the record passed as a parameter with the current
1295 -- record in FII_AP_Invoice_B_MS (existing data).
1296 ------------------------------------------------------------------
1297 PROCEDURE INSERT_INVOICE_B_REC(Invoice_Rec FII_AP_Invoice_B%ROWTYPE) IS
1298
1299 BEGIN
1300 g_state := 'Inside INSERT_INVOICE_B_REC Procedure.';
1301
1302 -- This API call is no longer necessary since we call it at the beginning of the invoice loop.
1303 -- INSERT_DELETED_REC(Invoice_Rec.Invoice_ID, NULL);
1304
1305 --Check if Invoice_Rec exists from previous load.
1306 IF g_invoice_b_marker IS NOT NULL
1307 AND FII_AP_Invoice_B_MS(g_invoice_b_marker).Invoice_ID = Invoice_Rec.Invoice_ID THEN
1308 --Check if Invoice_Rec has been updated.
1309 IF FII_AP_Invoice_B_MS(g_invoice_b_marker).Org_ID <> Invoice_Rec.Org_ID
1310 OR FII_AP_Invoice_B_MS(g_invoice_b_marker).Supplier_ID <> Invoice_Rec.Supplier_ID
1311 OR FII_AP_Invoice_B_MS(g_invoice_b_marker).Invoice_Type <> Invoice_Rec.Invoice_Type
1312 OR FII_AP_Invoice_B_MS(g_invoice_b_marker).Invoice_Number <> Invoice_Rec.Invoice_Number
1313 OR FII_AP_Invoice_B_MS(g_invoice_b_marker).Invoice_Date <> Invoice_Rec.Invoice_Date
1314 OR FII_AP_Invoice_B_MS(g_invoice_b_marker).Invoice_Amount <> Invoice_Rec.Invoice_Amount
1315 OR FII_AP_Invoice_B_MS(g_invoice_b_marker).Base_Amount <> Invoice_Rec.Base_Amount
1316 OR FII_AP_Invoice_B_MS(g_invoice_b_marker).Prim_Amount <> Invoice_Rec.Prim_Amount
1317 OR FII_AP_Invoice_B_MS(g_invoice_b_marker).Sec_Amount <> Invoice_Rec.Sec_Amount
1318 OR FII_AP_Invoice_B_MS(g_invoice_b_marker).Invoice_Currency_Code <> Invoice_Rec.Invoice_Currency_Code
1319 OR FII_AP_Invoice_B_MS(g_invoice_b_marker).Base_Currency_Code <> Invoice_Rec.Base_Currency_Code
1320 OR FII_AP_Invoice_B_MS(g_invoice_b_marker).Entered_Date <> Invoice_Rec.Entered_Date
1321 OR FII_AP_Invoice_B_MS(g_invoice_b_marker).Payment_Currency_Code <> Invoice_Rec.Payment_Currency_Code
1322 OR FII_AP_Invoice_B_MS(g_invoice_b_marker).Fully_Paid_Date <> Invoice_Rec.Fully_Paid_Date
1323 OR FII_AP_Invoice_B_MS(g_invoice_b_marker).Terms_ID <> Invoice_Rec.Terms_ID
1324 OR FII_AP_Invoice_B_MS(g_invoice_b_marker).Source <> Invoice_Rec.Source
1325 OR FII_AP_Invoice_B_MS(g_invoice_b_marker).E_Invoices_Flag <> Invoice_Rec.E_Invoices_Flag
1326 OR FII_AP_Invoice_B_MS(g_invoice_b_marker).Cancel_Flag <> Invoice_Rec.Cancel_Flag
1327 OR FII_AP_Invoice_B_MS(g_invoice_b_marker).Cancel_Date <> Invoice_Rec.Cancel_Date
1328 OR FII_AP_Invoice_B_MS(g_invoice_b_marker).Dist_Count <> Invoice_Rec.Dist_Count
1329 OR FII_AP_Invoice_B_MS(g_invoice_b_marker).Due_Date <> Invoice_Rec.Due_Date
1330 OR FII_AP_Invoice_B_MS(g_invoice_b_marker).Discount_Offered <> Invoice_Rec.Discount_Offered
1331 OR FII_AP_Invoice_B_MS(g_invoice_b_marker).Discount_Offered_B <> Invoice_Rec.Discount_Offered_B
1332 OR FII_AP_Invoice_B_MS(g_invoice_b_marker).Prim_Discount_Offered <> Invoice_Rec.Prim_Discount_Offered
1333 OR FII_AP_Invoice_B_MS(g_invoice_b_marker).Sec_Discount_Offered <> Invoice_Rec.Sec_Discount_Offered
1334 OR FII_AP_Invoice_B_MS(g_invoice_b_marker).First_Hold_Date <> Invoice_Rec.First_Hold_Date
1335 OR FII_AP_Invoice_B_MS(g_invoice_b_marker).Exchange_Date <> Invoice_Rec.Exchange_Date
1336 OR FII_AP_Invoice_B_MS(g_invoice_b_marker).Exchange_Rate <> Invoice_Rec.Exchange_Rate
1337 OR FII_AP_Invoice_B_MS(g_invoice_b_marker).Exchange_Rate_Type <> Invoice_Rec.Exchange_Rate_Type
1338 OR FII_AP_Invoice_B_MS(g_invoice_b_marker).Payment_Status_Flag <> Invoice_Rec.Payment_Status_Flag
1339 OR FII_AP_Invoice_B_MS(g_invoice_b_marker).Payment_Cross_Rate <> Invoice_Rec.Payment_Cross_Rate
1340 OR FII_AP_Invoice_B_MS(g_invoice_b_marker).Fully_Paid_Amount <> Invoice_Rec.Fully_Paid_Amount
1341 OR FII_AP_Invoice_B_MS(g_invoice_b_marker).Fully_Paid_Amount_B <> Invoice_Rec.Fully_Paid_Amount_B
1342 OR FII_AP_Invoice_B_MS(g_invoice_b_marker).Prim_Fully_Paid_Amount <> Invoice_Rec.Prim_Fully_Paid_Amount
1343 OR FII_AP_Invoice_B_MS(g_invoice_b_marker).Sec_Fully_Paid_Amount <> Invoice_Rec.Sec_Fully_Paid_Amount THEN
1344
1345 --Record has changed, so update.
1346 FII_AP_Invoice_UI_MS(FII_AP_Invoice_UI_MS.Count+1) := Invoice_Rec;
1347 END IF;
1348
1349 g_invoice_b_marker := FII_AP_Invoice_B_MS.Next(g_invoice_b_marker);
1350
1351 ELSE --Invoice_Rec does not exist in previous load, so insert.
1352 FII_AP_Invoice_UI_MS(FII_AP_Invoice_UI_MS.Count+1) := Invoice_Rec;
1353 END IF;
1354
1355 EXCEPTION
1356 WHEN OTHERS THEN
1357 FII_UTIL.put_line('Error in procedure Insert_Invoice_B_Rec.');
1358 RAISE;
1359
1360 END Insert_Invoice_B_Rec;
1361
1362
1363 ------------------------------------------------------------------
1364 -- Procedure POPULATE_MEMORY_STRUCTURES
1365 -- Purpose
1366 -- This POPULATE_MEMORY_STRUCTURES routine inserts records into
1367 -- global memory structures stored in memory.
1368 ------------------------------------------------------------------
1369 PROCEDURE POPULATE_MEMORY_STRUCTURES IS
1370 l_timestamp1 BINARY_INTEGER;
1371 l_timestamp1_tmp BINARY_INTEGER;
1372 BEGIN
1373 g_state := 'Begin populating Memory Structures.';
1374 if g_debug_flag = 'Y' then
1375 FII_UTIL.put_line(g_state);
1376 end if;
1377
1378 l_timestamp1 := DBMS_UTILITY.Get_Time;
1379 l_timestamp1_tmp := DBMS_UTILITY.Get_Time;
1380
1381 SELECT AI.Org_ID Org_ID,
1382 AI.Vendor_ID Supplier_ID,
1383 AI.Invoice_ID Invoice_ID,
1384 AI.Invoice_Type_Lookup_Code Invoice_Type,
1385 AI.Invoice_Num Invoice_Number,
1386 TRUNC(AI.Invoice_Date) Invoice_Date,
1387 AI.Invoice_Amount Invoice_Amount,
1388 AI.Invoice_Currency_Code Invoice_Currency_Code,
1389 ASP.Base_Currency_Code Base_Currency_Code,
1390 TRUNC(NVL(AI.Exchange_Date, AI.Invoice_Date)) Exchange_Date,
1391 AI.Exchange_Rate Exchange_Rate,
1392 NVL(AI.Exchange_Rate_Type, 'No Rate Type') Exchange_Rate_Type,
1393 TRUNC(AI.Creation_Date) Entered_Date,
1394 AI.Created_By Created_By,
1395 AI.Payment_Currency_Code Payment_Currency_Code,
1396 AI.Payment_Status_Flag Payment_Status_Flag,
1397 AI.Payment_Cross_Rate Payment_Cross_Rate,
1398 AI.Terms_ID Terms_ID,
1399 AI.Source Source,
1400 CASE WHEN g_manual_sources like '%''' || to_char(upper(AI.Source)) || '''%'
1401 THEN 'N' ELSE 'Y' END E_Invoices_Flag,
1402 DECODE(AI.Cancelled_Date, NULL, 'N', 'Y') Cancel_Flag,
1403 AI.Cancelled_Date Cancel_Date,
1404 COUNT(DISTINCT AID.Invoice_Distribution_ID) Dist_Count,
1405 NVL(FC.Minimum_Accountable_Unit, 0.01) Minimum_Accountable_Unit,
1406 FRATES.Functional_MAU Functional_MAU,
1407 FRATES.Conversion_Rate To_Func_Rate,
1408 DECODE(AI.Invoice_Currency_Code, g_prim_currency, 1,
1409 FRATES.Conversion_Rate * RATES.Prim_Conversion_Rate) To_Prim_Rate,
1410 DECODE(AI.Invoice_Currency_Code, g_sec_currency, 1,
1411 FRATES.Conversion_Rate * RATES.Sec_Conversion_Rate) To_Sec_Rate,
1412 ID.Invoice_B_Flag Invoice_B_Flag,
1413 ID.Pay_Sched_B_Flag Pay_Sched_B_Flag
1414 BULK COLLECT INTO FII_AP_Inv_MS
1415 FROM FII_AP_Invoice_IDS ID,
1416 AP_Invoices_All AI,
1417 AP_Invoice_Distributions_All AID,
1418 AP_System_Parameters_All ASP,
1419 FND_Currencies FC,
1420 FII_AP_PS_Rates_Temp RATES,
1421 FII_AP_Func_Rates_Temp FRATES
1422 WHERE ID.Invoice_ID = AI.Invoice_ID
1423 AND AI.Invoice_ID = AID.Invoice_ID (+)
1424 AND AI.Org_ID = ASP.Org_ID
1425 AND AI.Payment_Currency_Code = FC.Currency_Code
1426 AND FRATES.To_Currency = ASP.Base_Currency_Code
1427 AND FRATES.From_Currency = AI.Payment_Currency_Code
1428 AND FRATES.Trx_Date = TRUNC(NVL(AI.Exchange_Date, AI.Invoice_Date))
1429 AND DECODE(NVL(AI.Exchange_Rate_Type, 'No Rate Type'),'User', AI.Exchange_Rate,1) =
1430 DECODE(FRATES.Conversion_Type,'User', FRATES.Conversion_Rate,1)
1431 AND FRATES.Conversion_Type = NVL(AI.Exchange_Rate_Type, 'No Rate Type')
1432 AND RATES.Functional_Currency = ASP.Base_Currency_Code
1433 AND RATES.Trx_Date = TRUNC(AI.Invoice_Date)
1434 AND (ID.Invoice_B_Flag = 'Y' OR ID.Pay_Sched_B_Flag = 'Y')
1435 GROUP BY AI.Org_ID, AI.Vendor_ID, AI.Invoice_ID, AI.Invoice_Type_Lookup_Code, AI.Invoice_Num,
1436 AI.Invoice_Date, AI.Invoice_Amount, AI.Invoice_Currency_Code,
1437 ASP.Base_Currency_Code, AI.Exchange_Date, AI.Exchange_Rate, AI.Exchange_Rate_Type,
1438 AI.Creation_Date, AI.Created_By, AI.Payment_Currency_Code, AI.Payment_Status_Flag,
1439 AI.Payment_Cross_Rate, AI.Terms_ID, AI.Source, AI.Cancelled_Date, FC.Minimum_Accountable_Unit,
1440 FRATES.Functional_MAU, FRATES.Conversion_Rate, RATES.Prim_Conversion_Rate, RATES.Sec_Conversion_Rate,
1441 ID.Invoice_B_Flag, ID.Pay_Sched_B_Flag
1442 ORDER BY AI.Invoice_ID;
1443
1444 l_timestamp1_tmp := DBMS_UTILITY.Get_Time - l_timestamp1_tmp;
1445
1446
1447 if g_debug_flag = 'Y' then
1448 FII_UTIL.put_line('The Invoices Memory Structure has been populated with ' || FII_AP_Inv_MS.COUNT || ' Invoices.');
1449 FII_UTIL.put_line('The time taken to populate the Invoices Memory Structure is: ' || to_char(l_timestamp1_tmp/100) || ' seconds.');
1450 end if;
1451
1452 l_timestamp1_tmp := DBMS_UTILITY.Get_Time;
1453
1454 SELECT PS.Invoice_ID Invoice_ID,
1455 PS.Payment_Num Payment_Num,
1456 PS.Due_Date Due_Date,
1457 PS.Discount_Date Discount_Date,
1458 PS.Gross_Amount Gross_Amount,
1459 PS.Second_Discount_Date Second_Discount_Date,
1460 PS.Third_Discount_Date Third_Discount_Date,
1461 NVL(PS.Discount_Amount_Available, 0) Discount_Amount_Available,
1462 NVL(PS.Second_Disc_Amt_Available, 0) Second_Disc_Amt_Available,
1463 NVL(PS.Third_Disc_Amt_Available, 0) Third_Disc_Amt_Available,
1464 PS.Created_By Created_By,
1465 NULL Fully_Paid_Date
1466 BULK COLLECT INTO FII_AP_Pay_Sched_MS
1467 FROM FII_AP_Invoice_IDS ID,
1468 AP_Payment_Schedules_All PS
1469 WHERE ID.Invoice_ID = PS.Invoice_ID
1470 AND (ID.Invoice_B_Flag = 'Y' OR ID.Pay_Sched_B_Flag = 'Y')
1471 ORDER BY PS.Invoice_ID, PS.Payment_Num;
1472
1473 l_timestamp1_tmp := DBMS_UTILITY.Get_Time - l_timestamp1_tmp;
1474
1475 if g_debug_flag = 'Y' then
1476 FII_UTIL.put_line('The Payment Schedules Memory Structure has been populated with ' || FII_AP_Pay_Sched_MS.COUNT || ' Payment Schedules.');
1477 FII_UTIL.put_line('The time taken to populate the Payment Schedules Memory Structure is: ' || to_char(l_timestamp1_tmp/100) || ' seconds.');
1478 end if;
1479
1480 l_timestamp1_tmp := DBMS_UTILITY.Get_Time;
1481
1482 SELECT AIP.Amount Amount,
1483 AIP.Check_ID Check_ID,
1484 AIP.Invoice_ID Invoice_ID,
1485 AIP.Invoice_Payment_ID Invoice_Payment_ID,
1486 AIP.Payment_Num Payment_Num,
1487 AIP.Created_By Created_By,
1488 AIP.Creation_Date Creation_Date,
1489 NVL(AIP.Discount_Taken, 0) Discount_Taken,
1490 AC.Check_Date Check_Date,
1491 DECODE(IBY_SYS_PROF_B.Processing_Type,NULL,DECODE(AC.Payment_Method_Lookup_Code, 'EFT', 'E', 'WIRE', 'E', 'M')
1492 ,DECODE(IBY_SYS_PROF_B.Processing_Type, 'ELECTRONIC', 'E', 'M')) Processing_Type
1493 BULK COLLECT INTO FII_AP_Inv_Pay_MS
1494 FROM FII_AP_Invoice_IDS ID,
1495 AP_Invoice_Payments_ALL AIP,
1496 AP_Checks_ALL AC,
1497 IBY_SYS_PMT_PROFILES_B IBY_SYS_PROF_B, --IBY CHANGE
1498 IBY_ACCT_PMT_PROFILES_B IBY_ACCT_PROF_B--IBY CHANGE
1499 WHERE ID.Invoice_ID = AIP.Invoice_ID
1500 AND AIP.Check_ID = AC.Check_ID
1501 AND AC.Payment_Profile_ID = IBY_ACCT_PROF_B.Payment_Profile_ID(+)--IBY CHANGE
1502 AND IBY_ACCT_PROF_B.system_profile_code = IBY_SYS_PROF_B.system_profile_code(+)--IBY CHANGE
1503 AND (ID.Invoice_B_Flag = 'Y' OR ID.Pay_Sched_B_Flag = 'Y')
1504 AND AC.Void_Date IS NULL
1505 ORDER BY AIP.Invoice_ID, AIP.Payment_Num, AIP.Creation_Date;
1506
1507 l_timestamp1_tmp := DBMS_UTILITY.Get_Time - l_timestamp1_tmp;
1508
1509 if g_debug_flag = 'Y' then
1510 FII_UTIL.put_line('The Invoice Payments Memory Structure has been populated with ' || FII_AP_Inv_Pay_MS.COUNT || ' Invoice Payments.');
1511 FII_UTIL.put_line('The time taken to populate the Invoices Memory Structure is: ' || to_char(l_timestamp1_tmp/100) || ' seconds .');
1512 end if;
1513
1514
1515
1516 l_timestamp1_tmp := DBMS_UTILITY.Get_Time;
1517
1518 SELECT /*+ USE_NL (ID, AID) */ AID.Invoice_ID Invoice_ID,
1519 AID.Line_Type_Lookup_Code Line_Type_Lookup_Code,
1520 SUM(AID.Amount) Amount,
1521 TRUNC(AID.Creation_Date) Creation_Date,
1522 MAX(AID.Invoice_Distribution_ID) Invoice_Distribution_ID --Any invoice distribution id is ok. Just used to make the record unique.
1523 BULK COLLECT INTO FII_AP_WH_Tax_MS
1524 FROM FII_AP_Invoice_IDS ID,
1525 AP_Invoice_Distributions_ALL AID,
1526 AP_Invoice_Lines_ALL AIL
1527 WHERE ID.Invoice_ID = AID.Invoice_ID
1528 AND AID.Invoice_ID = AIL.Invoice_ID
1529 AND AID.Invoice_Line_Number = AIL.Line_Number
1530 AND (ID.Invoice_B_Flag = 'Y' OR ID.Pay_Sched_B_Flag = 'Y')
1531 AND (AID.Line_Type_Lookup_Code IN ('AWT') OR (AID.Line_Type_Lookup_Code IN ('NONREC_TAX', 'REC_TAX') AND AID.Prepay_Distribution_ID IS NOT NULL))
1532 AND (AIL.Invoice_Includes_Prepay_Flag IS NULL OR AIL.Invoice_Includes_Prepay_Flag = 'N')
1533 --AND AID.Reversal_Flag IS NULL
1534 AND NVL(AID.Reversal_Flag,'N') = 'N'
1535 GROUP BY AID.Invoice_ID, AID.Line_Type_Lookup_Code,
1536 TRUNC(AID.Creation_Date)
1537 ORDER BY AID.Invoice_ID, TRUNC(AID.Creation_Date), AID.Line_Type_Lookup_Code;
1538
1539 l_timestamp1_tmp := DBMS_UTILITY.Get_Time - l_timestamp1_tmp;
1540
1541 if g_debug_flag = 'Y' then
1542 FII_UTIL.put_line('The Withholding/Tax Memory Structure has been populated with ' || FII_AP_WH_Tax_MS.COUNT || ' Withholding/Tax Distributions.');
1543 FII_UTIL.put_line('The time taken to populate the Withholding/Tax Memory Structure is: ' || to_char(l_timestamp1_tmp/100) || ' seconds.');
1544 end if;
1545
1546 l_timestamp1_tmp := DBMS_UTILITY.Get_Time;
1547
1548 SELECT /*+ ORDERED USE_NL(AC) */
1549 TEMP2.Invoice_ID Invoice_ID,
1550 -1 * SUM(TEMP2.Amount) Amount,
1551 TEMP2.Creation_Date Creation_Date,
1552 AC.Check_ID Check_ID,
1553 AC.Check_Date Check_Date,
1554 DECODE(IBY_SYS_PROF_B.Processing_Type,NULL,DECODE(AC.Payment_Method_Lookup_Code, 'EFT', 'E', 'WIRE', 'E', 'M')
1555 ,DECODE(IBY_SYS_PROF_B.Processing_Type, 'ELECTRONIC', 'E', 'M')) Processing_Type,
1556 -1 * SUM(TEMP2.Amount) Unallocated_Amount
1557 BULK COLLECT INTO FII_AP_Prepay_Applied_MS
1558 FROM (SELECT /*+ NO_MERGE ORDERED USE_NL(AIP) */
1559 TEMP1.Invoice_ID,
1560 TEMP1.Creation_Date,
1561 TEMP1.Amount,
1562 MIN(AIP.Check_ID) Check_ID
1563 FROM (SELECT /*+ NO_MERGE ORDERED USE_NL(AID, TEMP) */
1564 AID.Invoice_ID,
1565 TRUNC(AID.Creation_Date) Creation_Date,
1566 TEMP.Invoice_ID Prepay_Invoice_ID,
1567 SUM(AID.Amount) Amount
1568 FROM FII_AP_Invoice_IDS ID,
1569 AP_Invoice_Distributions_All AID,
1570 AP_Invoice_Lines_ALL AIL,
1571 AP_Invoice_Distributions_ALL TEMP
1572 WHERE ID.Invoice_ID = AID.Invoice_ID
1573 AND AID.Invoice_ID = AIL.Invoice_ID
1574 AND AID.Invoice_Line_Number = AIL.Line_Number
1575 AND (ID.Invoice_B_Flag = 'Y' OR ID.Pay_Sched_B_Flag = 'Y')
1576 AND AID.Line_Type_Lookup_Code = 'PREPAY'
1577 --AND AID.Reversal_Flag IS NULL
1578 AND NVL(AID.Reversal_Flag,'N') = 'N'
1579 AND (AIL.Invoice_Includes_Prepay_Flag IS NULL OR AIL.Invoice_Includes_Prepay_Flag = 'N')
1580 AND AID.Prepay_Distribution_ID = TEMP.Invoice_Distribution_ID
1581 GROUP BY AID.Invoice_ID, TRUNC(AID.Creation_Date), TEMP.Invoice_ID) TEMP1,
1582 AP_Invoice_Payments_All AIP
1583 WHERE TEMP1.Prepay_Invoice_ID = AIP.Invoice_ID
1584 GROUP BY TEMP1.Invoice_ID, TEMP1.Creation_Date, TEMP1.Prepay_Invoice_ID, TEMP1.Amount) TEMP2,
1585 AP_Checks_All AC,
1586 IBY_SYS_PMT_PROFILES_B IBY_SYS_PROF_B,--IBY CHANGE
1587 IBY_ACCT_PMT_PROFILES_B IBY_ACCT_PROF_B--IBY CHANGE
1588 WHERE TEMP2.Check_ID = AC.Check_ID
1589 AND AC.Payment_Profile_ID = IBY_ACCT_PROF_B.Payment_Profile_ID(+)--IBY CHANGE
1590 AND IBY_ACCT_PROF_B.system_profile_code= IBY_SYS_PROF_B.system_profile_code(+)--IBY CHANGE
1591 GROUP BY TEMP2.Invoice_ID, TEMP2.Creation_Date, AC.Check_ID, AC.Check_Date,
1592 IBY_SYS_PROF_B.Processing_Type,AC.Payment_Method_Lookup_Code
1593
1594 ORDER BY TEMP2.Invoice_ID, TEMP2.Creation_Date, AC.Check_ID;
1595
1596
1597 l_timestamp1_tmp := DBMS_UTILITY.Get_Time - l_timestamp1_tmp;
1598
1599 if g_debug_flag = 'Y' then
1600 FII_UTIL.put_line('The Prepayments Applied Memory Structure has been populated with ' || FII_AP_Prepay_Applied_MS.COUNT || ' Prepayments Applied .');
1601 FII_UTIL.put_line('The time taken to populate the Prepayments Applied Memory Structure is: ' || to_char(l_timestamp1_tmp/100) || ' seconds .');
1602 end if;
1603
1604
1605
1606
1607
1608
1609 l_timestamp1_tmp := DBMS_UTILITY.Get_Time;
1610
1611 /* Populate with existing data to compare to new data and reduce MV log.*/
1612 SELECT /*+ ordered index(PSUM, FII_AP_PAY_SCHED_B_N1) */
1613 PSUM.Time_ID, PSUM.Period_Type_ID, PSUM.Action_Date, PSUM.Action,
1614 PSUM.Update_Sequence, PSUM.Org_ID, PSUM.Supplier_ID, PSUM.Invoice_ID,
1615 PSUM.Base_Currency_Code, PSUM.Trx_Date, PSUM.Payment_Num, PSUM.Due_Date,
1616 PSUM.Amount_Remaining, PSUM.Past_Due_Amount, PSUM.Discount_Available,
1617 PSUM.Discount_Taken, PSUM.Discount_Lost, PSUM.Payment_Amount,
1618 PSUM.On_Time_Payment_Amt, PSUM.Late_Payment_Amt, PSUM.No_Days_Late,
1619 PSUM.Due_Bucket1, PSUM.Due_Bucket2, PSUM.Due_Bucket3, PSUM.Past_Due_Bucket1,
1620 PSUM.Past_Due_Bucket2, PSUM.Past_Due_Bucket3, PSUM.Amount_Remaining_B,
1621 PSUM.Past_Due_Amount_B, PSUM.Discount_Available_B, PSUM.Discount_Taken_B,
1622 PSUM.Discount_Lost_B, PSUM.Payment_Amount_B, PSUM.On_Time_Payment_Amt_B,
1623 PSUM.Late_Payment_Amt_B, PSUM.Due_Bucket1_B, PSUM.Due_Bucket2_B,
1624 PSUM.Due_Bucket3_B, PSUM.Past_Due_Bucket1_B, PSUM.Past_Due_Bucket2_B,
1625 PSUM.Past_Due_Bucket3_B, PSUM.Prim_Amount_Remaining, PSUM.Prim_Past_Due_Amount,
1626 PSUM.Prim_Discount_Available, PSUM.Prim_Discount_Taken, PSUM.Prim_Discount_Lost,
1627 PSUM.Prim_Payment_Amount, PSUM.Prim_On_Time_Payment_Amt,
1628 PSUM.Prim_Late_Payment_Amt, PSUM.Prim_Due_Bucket1, PSUM.Prim_Due_Bucket2,
1629 PSUM.Prim_Due_Bucket3, PSUM.Prim_Past_Due_Bucket1, PSUM.Prim_Past_Due_Bucket2,
1630 PSUM.Prim_Past_Due_Bucket3, PSUM.Sec_Amount_Remaining, PSUM.Sec_Past_Due_Amount,
1631 PSUM.Sec_Discount_Available, PSUM.Sec_Discount_Taken, PSUM.Sec_Discount_Lost,
1632 PSUM.Sec_Payment_Amount, PSUM.Sec_On_Time_Payment_Amt, PSUM.Sec_Late_Payment_Amt,
1633 PSUM.Sec_Due_Bucket1, PSUM.Sec_Due_Bucket2, PSUM.Sec_Due_Bucket3,
1634 PSUM.Sec_Past_Due_Bucket1, PSUM.Sec_Past_Due_Bucket2, PSUM.Sec_Past_Due_Bucket3,
1635 PSUM.Fully_Paid_Date, PSUM.Check_ID, PSUM.Payment_Method, PSUM.Last_Update_Date,
1636 PSUM.Last_Updated_By, PSUM.Creation_Date, PSUM.Created_By, PSUM.Last_Update_Login,
1637 PSUM.Check_Date, PSUM.Inv_Pymt_Flag, PSUM.Unique_ID
1638 BULK COLLECT INTO FII_AP_Pay_Sched_B_MS
1639 FROM FII_AP_Invoice_IDS ID,
1640 FII_AP_Pay_Sched_B PSUM
1641 WHERE ID.Invoice_ID = PSUM.Invoice_ID
1642 AND (ID.Pay_Sched_B_Flag = 'Y' OR ID.Delete_Inv_Flag='Y')
1643 ORDER BY PSUM.Invoice_ID,
1644 PSUM.Payment_Num,
1645 PSUM.Action_Date,
1646 DECODE(PSUM.Action, 'CREATION', 1,
1647 'DISCOUNT', 2,
1648 'DUE BUCKET', 3,
1649 'DUE', 3,
1650 'PAST BUCKET', 3,
1651 'TAX', 4,
1652 'WITHHOLDING', 5,
1653 'PAYMENT', 6,
1654 'PREPAYMENT', 7),
1655 DECODE(PSUM.Inv_Pymt_Flag, NULL, 0, 'N', 1, 'Y', 2, 0),
1656 NVL(PSUM.Unique_ID, 0);
1657
1658 l_timestamp1_tmp := DBMS_UTILITY.Get_Time - l_timestamp1_tmp;
1659
1660 if g_debug_flag = 'Y' then
1661 FII_UTIL.put_line('The Memory Structure FII_AP_Pay_Sched_B_MS has been populated with ' || FII_AP_Pay_Sched_B_MS.COUNT || ' records.');
1662 FII_UTIL.put_line('The time taken to populate FII_AP_Pay_Sched_B_MS is: ' || to_char(l_timestamp1_tmp/100) || ' seconds.');
1663 end if;
1664
1665
1666 l_timestamp1_tmp := DBMS_UTILITY.Get_Time;
1667
1668
1669 SELECT /*+ ordered index(AI, FII_AP_INVOICE_B_U1) */
1670 AI.Org_ID, AI.Supplier_ID, AI.Invoice_ID, AI.Invoice_Type, AI.Invoice_Number,
1671 AI.Invoice_Date, AI.Invoice_Amount, AI.Base_Amount, AI.Prim_Amount,
1672 AI.Sec_Amount, Ai.Invoice_Currency_Code, AI.Base_Currency_Code, AI.Entered_Date,
1673 AI.Payment_Currency_Code, AI.Fully_Paid_Date, AI.Terms_ID, AI.Source,
1674 AI.E_Invoices_Flag, AI.Cancel_Flag, AI.Cancel_Date, AI.Dist_Count, AI.Due_Date,
1675 AI.Discount_Offered, AI.Discount_Offered_B, AI.Prim_Discount_Offered,
1676 AI.Sec_Discount_Offered, AI.First_Hold_Date, AI.Last_Update_Date,
1677 AI.Last_Updated_By, AI.Creation_Date, AI.Created_By, AI.Last_Update_Login,
1678 AI.Exchange_Date, AI.Exchange_Rate, AI.Exchange_Rate_Type, AI.Payment_Status_Flag,
1679 AI.Payment_Cross_Rate, AI.Fully_Paid_Amount, AI.Fully_Paid_Amount_B,
1680 AI.Prim_Fully_Paid_Amount, AI.Sec_Fully_Paid_Amount
1681 BULK COLLECT INTO FII_AP_Invoice_B_MS
1682 FROM FII_AP_Invoice_IDS ID,
1683 FII_AP_Invoice_B AI
1684 WHERE ID.Invoice_ID = AI.Invoice_ID
1685 AND ID.Invoice_B_Flag = 'Y'
1686 ORDER BY AI.Invoice_ID;
1687
1688 l_timestamp1_tmp := DBMS_UTILITY.Get_Time - l_timestamp1_tmp;
1689
1690 if g_debug_flag = 'Y' then
1691 FII_UTIL.put_line('The Memory Structure FII_AP_Invoice_B_MS has been populated with ' || FII_AP_Invoice_B_MS.COUNT || ' records.');
1692 FII_UTIL.put_line('The time taken to populate FII_AP_Invoice_B_MS is: ' || to_char(l_timestamp1_tmp/100) || ' seconds.');
1693 end if;
1694
1695
1696 l_timestamp1 := DBMS_UTILITY.Get_Time - l_timestamp1;
1697
1698 if g_debug_flag = 'Y' then
1699 FII_UTIL.put_line('The time taken to populate all Memory Structures is: ' || to_char(l_timestamp1/100) || ' seconds.');
1700 end if;
1701
1702 EXCEPTION
1703 WHEN OTHERS THEN
1704 FII_UTIL.put_line('Error in procedure Populate_Memory_Structures.');
1705 RAISE;
1706
1707 END POPULATE_MEMORY_STRUCTURES;
1708
1709
1710 ------------------------------------------------------------------
1711 -- Procedure POPULATE_TABLES_FROM_MS
1712 -- Purpose
1713 -- This POPULATE_TABLES_FROM_MS routine inserts records into
1714 -- tables from the respective memory structures.
1715 ------------------------------------------------------------------
1716
1717 PROCEDURE POPULATE_TABLES_FROM_MS IS
1718 l_timestamp1 BINARY_INTEGER;
1719 l_timestamp1_tmp BINARY_INTEGER;
1720 BEGIN
1721 l_timestamp1 := DBMS_UTILITY.Get_Time;
1722
1723 g_state := 'Bulk inserting into FII_AP_Invoice_D_GT from FII_AP_Invoice_D_MS.';
1724 l_timestamp1_tmp := DBMS_UTILITY.Get_Time;
1725
1726 IF FII_AP_Invoice_D_MS.Count > 0 THEN
1727 FORALL i IN FII_AP_Invoice_D_MS.First..FII_AP_Invoice_D_MS.Last
1728 INSERT INTO FII_AP_Invoice_D_GT VALUES FII_AP_Invoice_D_MS(i);
1729 END IF;
1730
1731 l_timestamp1_tmp := DBMS_UTILITY.Get_Time - l_timestamp1_tmp;
1732
1733 if g_debug_flag = 'Y' then
1734 FII_UTIL.put_line('The time taken to bulk insert into FII_AP_Invoice_D_GT is: ' || to_char(l_timestamp1_tmp/100) || ' seconds.');
1735 end if;
1736
1737 g_state := 'Bulk inserting into FII_AP_Invoice_UI_GT from FII_AP_Invoice_UI_MS.';
1738 l_timestamp1_tmp := DBMS_UTILITY.Get_Time;
1739
1740 IF FII_AP_Invoice_UI_MS.Count > 0 THEN
1741 FORALL i IN FII_AP_Invoice_UI_MS.First..FII_AP_Invoice_UI_MS.Last
1742 INSERT INTO FII_AP_Invoice_UI_GT VALUES FII_AP_Invoice_UI_MS(i);
1743 END IF;
1744
1745 l_timestamp1_tmp := DBMS_UTILITY.Get_Time - l_timestamp1_tmp;
1746
1747 if g_debug_flag = 'Y' then
1748 FII_UTIL.put_line('The time taken to bulk insert records into FII_AP_Invoice_UI_GT is: ' || to_char(l_timestamp1_tmp/100) || ' seconds.');
1749 end if;
1750
1751 g_state := 'Bulk inserting into FII_AP_Pay_Sched_D_GT from FII_AP_Pay_Sched_D_MS.';
1752 l_timestamp1_tmp := DBMS_UTILITY.Get_Time;
1753
1754 IF FII_AP_Pay_Sched_D_MS.Count > 0 THEN
1755 FORALL i IN FII_AP_Pay_Sched_D_MS.First..FII_AP_Pay_Sched_D_MS.Last
1756 INSERT INTO FII_AP_Pay_Sched_D_GT VALUES FII_AP_Pay_Sched_D_MS(i);
1757 END IF;
1758
1759 l_timestamp1_tmp := DBMS_UTILITY.Get_Time - l_timestamp1_tmp;
1760
1761 if g_debug_flag = 'Y' then
1762 FII_UTIL.put_line('The time taken to bulk insert into FII_AP_Pay_Sched_D_GT is: ' || to_char(l_timestamp1_tmp/100) || ' seconds.');
1763 end if;
1764
1765 g_state := 'Bulk inserting into FII_AP_Pay_Sched_UI_GT from FII_AP_Pay_Sched_UI_MS.';
1766 l_timestamp1_tmp := DBMS_UTILITY.Get_Time;
1767
1768 IF FII_AP_Pay_Sched_UI_MS.Count > 0 THEN
1769 FORALL i IN FII_AP_Pay_Sched_UI_MS.First..FII_AP_Pay_Sched_UI_MS.Last
1770 INSERT INTO FII_AP_Pay_Sched_UI_GT VALUES FII_AP_Pay_Sched_UI_MS(i);
1771 END IF;
1772
1773 l_timestamp1_tmp := DBMS_UTILITY.Get_Time - l_timestamp1_tmp;
1774
1775 if g_debug_flag = 'Y' then
1776 FII_UTIL.put_line('The time taken to bulk insert records into FII_AP_Pay_Sched_UI_GT is: ' || to_char(l_timestamp1_tmp/100) || ' seconds.');
1777 end if;
1778
1779
1780 g_state := 'Bulk inserting into FII_AP_Aging_Bkts_B from FII_AP_Aging_Bkts_B_MS.';
1781 l_timestamp1_tmp := DBMS_UTILITY.Get_Time;
1782
1783 IF FII_AP_Aging_Bkts_B_MS.Count > 0 THEN
1784 FORALL i IN FII_AP_Aging_Bkts_B_MS.First..FII_AP_Aging_Bkts_B_MS.Last
1785 INSERT INTO FII_AP_AGING_BKTS_B VALUES FII_AP_Aging_Bkts_B_MS(i);
1786 END IF;
1787
1788 l_timestamp1_tmp := DBMS_UTILITY.Get_Time - l_timestamp1_tmp;
1789
1790 if g_debug_flag = 'Y' then
1791 FII_UTIL.put_line('The time taken to bulk insert into FII_AP_Aging_Bkts_B is: ' || to_char(l_timestamp1_tmp/100) || ' seconds.');
1792 end if;
1793
1794 g_state := 'Bulk inserting into FII_AP_Due_Counts_B from FII_AP_Due_Counts_B_MS.';
1795 l_timestamp1_tmp := DBMS_UTILITY.Get_Time;
1796
1797 IF FII_AP_Due_Counts_B_MS.Count > 0 THEN
1798 FORALL i IN FII_AP_Due_Counts_B_MS.First..FII_AP_Due_Counts_B_MS.Last
1799 INSERT INTO FII_AP_DUE_COUNTS_B VALUES FII_AP_Due_Counts_B_MS(i);
1800 END IF;
1801
1802 l_timestamp1_tmp := DBMS_UTILITY.Get_Time - l_timestamp1_tmp;
1803
1804 if g_debug_flag = 'Y' then
1805 FII_UTIL.put_line('The time taken to bulk insert into FII_AP_Due_Counts_B is: ' || to_char(l_timestamp1_tmp/100) || ' seconds.');
1806 end if;
1807
1808 l_timestamp1 := DBMS_UTILITY.Get_Time - l_timestamp1;
1809 if g_debug_flag = 'Y' then
1810 FII_UTIL.put_line('The time taken to populate all Tables from Memory Structures is: ' || to_char(l_timestamp1/100) || ' seconds.');
1811 end if;
1812
1813 EXCEPTION
1814 WHEN OTHERS THEN
1815 FII_UTIL.put_line('Error in procedure Populate_Tables_From_MS.');
1816 RAISE;
1817
1818 END Populate_Tables_From_MS;
1819
1820 ------------------------------------------------------------------
1821 -- Procedure MAINTAIN_PAY_SCHED_B
1822 -- Purpose
1823 -- This MAINTAIN_PAY_SCHED_B routine deletes deleted records,
1824 -- updates changed records and inserts new records into base
1825 -- summary table FII_AP_PAY_SCHED_B.
1826 ------------------------------------------------------------------
1827
1828 PROCEDURE MAINTAIN_PAY_SCHED_B IS
1829 l_timestamp1 BINARY_INTEGER;
1830 l_timestamp1_tmp BINARY_INTEGER;
1831 BEGIN
1832
1833 g_state := 'Deleting records from FII_AP_Pay_Sched_B.';
1834 if g_debug_flag = 'Y' then
1835 FII_UTIL.put_line(g_state);
1836 end if;
1837
1838 l_timestamp1 := DBMS_UTILITY.Get_Time;
1839 l_timestamp1_tmp := DBMS_UTILITY.Get_Time;
1840
1841 DELETE FROM FII_AP_Pay_Sched_B PSUM
1842 WHERE EXISTS
1843 (SELECT 1
1844 FROM FII_AP_Pay_Sched_D_GT D
1845 WHERE D.Invoice_ID = PSUM.Invoice_ID
1846 AND D.Payment_Num = PSUM.Payment_Num
1847 AND D.Action_Date = PSUM.Action_Date
1848 AND D.Action = PSUM.Action
1849 AND NVL(D.Inv_Pymt_Flag, ' ') = NVL(PSUM.Inv_Pymt_Flag, ' ')
1850 AND NVL(D.Unique_ID, -99) = NVL(PSUM.Unique_ID, -99));
1851
1852 l_timestamp1_tmp := DBMS_UTILITY.Get_Time - l_timestamp1_tmp;
1853
1854 if g_debug_flag = 'Y' then
1855 FII_UTIL.put_line('The time taken to delete records from FII_AP_Pay_Sched_B is: ' || to_char(l_timestamp1_tmp/100) || ' seconds.');
1856 end if;
1857
1858 g_state := 'Updating and Inserting records in FII_AP_Pay_Sched_B.';
1859 if g_debug_flag = 'Y' then
1860 FII_UTIL.put_line(g_state);
1861 end if;
1862
1863 l_timestamp1_tmp := DBMS_UTILITY.Get_Time;
1864
1865 MERGE INTO FII_AP_Pay_Sched_B PSUM
1866 USING FII_AP_Pay_Sched_UI_GT UI
1867 ON (PSUM.Invoice_ID = UI.Invoice_ID
1868 AND PSUM.Payment_Num = UI.Payment_Num
1869 AND PSUM.Action_Date = UI.Action_Date
1870 AND PSUM.Action = UI.Action
1871 AND NVL(PSUM.Inv_Pymt_Flag, ' ') = NVL(UI.Inv_Pymt_Flag, ' ')
1872 AND NVL(PSUM.Unique_ID, -99) = NVL(UI.Unique_ID, -99))
1873 WHEN MATCHED THEN
1874 UPDATE SET PSUM.Org_ID = UI.Org_ID,
1875 PSUM.Supplier_ID = UI.Supplier_ID,
1876 PSUM.Base_Currency_Code = UI.Base_Currency_Code,
1877 PSUM.Trx_Date = UI.Trx_Date,
1878 PSUM.Due_Date = UI.Due_Date,
1879 PSUM.Amount_Remaining = UI.Amount_Remaining,
1880 PSUM.Past_Due_Amount = UI.Past_Due_Amount,
1881 PSUM.Discount_Available = UI.Discount_Available,
1882 PSUM.Discount_Taken = UI.Discount_Taken,
1883 PSUM.Discount_Lost = UI.Discount_Lost,
1884 PSUM.Payment_Amount = UI.Payment_Amount,
1885 PSUM.On_Time_Payment_Amt = UI.On_Time_Payment_Amt,
1886 PSUM.Late_Payment_Amt = UI.Late_Payment_Amt,
1887 PSUM.No_Days_Late = UI.No_Days_Late,
1888 PSUM.Due_Bucket1 = UI.Due_Bucket1,
1889 PSUM.Due_Bucket2 = UI.Due_Bucket2,
1890 PSUM.Due_Bucket3 = UI.Due_Bucket3,
1891 PSUM.Past_Due_Bucket1 = UI.Past_Due_Bucket1,
1892 PSUM.Past_Due_Bucket2 = UI.Past_Due_Bucket2,
1893 PSUM.Past_Due_Bucket3 = UI.Past_Due_Bucket3,
1894 PSUM.Amount_Remaining_B = UI.Amount_Remaining_B,
1895 PSUM.Past_Due_Amount_B = UI.Past_Due_Amount_B,
1896 PSUM.Discount_Available_B = UI.Discount_Available_B,
1897 PSUM.Discount_Taken_B = UI.Discount_Taken_B,
1898 PSUM.Discount_Lost_B = UI.Discount_Lost_B,
1899 PSUM.Payment_Amount_B = UI.Payment_Amount_B,
1900 PSUM.On_Time_Payment_Amt_B = UI.On_Time_Payment_Amt_B,
1901 PSUM.Late_Payment_Amt_B = UI.Late_Payment_Amt_B,
1902 PSUM.Due_Bucket1_B = UI.Due_Bucket1_B,
1903 PSUM.Due_Bucket2_B = UI.Due_Bucket2_B,
1904 PSUM.Due_Bucket3_B = UI.Due_Bucket3_B,
1905 PSUM.Past_Due_Bucket1_B = UI.Past_Due_Bucket1_B,
1906 PSUM.Past_Due_Bucket2_B = UI.Past_Due_Bucket2_B,
1907 PSUM.Past_Due_Bucket3_B = UI.Past_Due_Bucket3_B,
1908 PSUM.Prim_Amount_Remaining = UI.Prim_Amount_Remaining,
1909 PSUM.Prim_Past_Due_Amount = UI.Prim_Past_Due_Amount,
1910 PSUM.Prim_Discount_Available = UI.Prim_Discount_Available,
1911 PSUM.Prim_Discount_Taken = UI.Prim_Discount_Taken,
1912 PSUM.Prim_Discount_Lost = UI.Prim_Discount_Lost,
1913 PSUM.Prim_Payment_Amount = UI.Prim_Payment_Amount,
1914 PSUM.Prim_On_Time_Payment_Amt = UI.Prim_On_Time_Payment_Amt,
1915 PSUM.Prim_Late_Payment_Amt = UI.Prim_Late_Payment_Amt,
1916 PSUM.Prim_Due_Bucket1 = UI.Prim_Due_Bucket1,
1917 PSUM.Prim_Due_Bucket2 = UI.Prim_Due_Bucket2,
1918 PSUM.Prim_Due_Bucket3 = UI.Prim_Due_Bucket3,
1919 PSUM.Prim_Past_Due_Bucket1 = UI.Prim_Past_Due_Bucket1,
1920 PSUM.Prim_Past_Due_Bucket2 = UI.Prim_Past_Due_Bucket2,
1921 PSUM.Prim_Past_Due_Bucket3 = UI.Prim_Past_Due_Bucket3,
1922 PSUM.Sec_Amount_Remaining = UI.Sec_Amount_Remaining,
1923 PSUM.Sec_Past_Due_Amount = UI.Sec_Past_Due_Amount,
1924 PSUM.Sec_Discount_Available = UI.Sec_Discount_Available,
1925 PSUM.Sec_Discount_Taken = UI.Sec_Discount_Taken,
1926 PSUM.Sec_Discount_Lost = UI.Sec_Discount_Lost,
1927 PSUM.Sec_Payment_Amount = UI.Sec_Payment_Amount,
1928 PSUM.Sec_On_Time_Payment_Amt = UI.Sec_On_Time_Payment_Amt,
1929 PSUM.Sec_Late_Payment_Amt = UI.Sec_Late_Payment_Amt,
1930 PSUM.Sec_Due_Bucket1 = UI.Sec_Due_Bucket1,
1931 PSUM.Sec_Due_Bucket2 = UI.Sec_Due_Bucket2,
1932 PSUM.Sec_Due_Bucket3 = UI.Sec_Due_Bucket3,
1933 PSUM.Sec_Past_Due_Bucket1 = UI.Sec_Past_Due_Bucket1,
1934 PSUM.Sec_Past_Due_Bucket2 = UI.Sec_Past_Due_Bucket2,
1935 PSUM.Sec_Past_Due_Bucket3 = UI.Sec_Past_Due_Bucket3,
1936 PSUM.Check_ID = UI.Check_ID,
1937 PSUM.Payment_Method = UI.Payment_Method,
1938 PSUM.Created_By = UI.Created_By,
1939 PSUM.Check_Date = UI.Check_Date,
1940 PSUM.Last_Update_Date = UI.Last_Update_Date
1941 WHEN NOT MATCHED THEN
1942 INSERT (PSUM.Time_ID, PSUM.Period_Type_ID, PSUM.Action_Date, PSUM.Action,
1943 PSUM.Update_Sequence, PSUM.Org_ID, PSUM.Supplier_ID, PSUM.Invoice_ID,
1944 PSUM.Base_Currency_Code, PSUM.Trx_Date, PSUM.Payment_Num, PSUM.Due_Date,
1945 PSUM.Amount_Remaining, PSUM.Past_Due_Amount, PSUM.Discount_Available,
1946 PSUM.Discount_Taken, PSUM.Discount_Lost, PSUM.Payment_Amount,
1947 PSUM.On_Time_Payment_Amt, PSUM.Late_Payment_Amt, PSUM.No_Days_Late,
1948 PSUM.Due_Bucket1, PSUM.Due_Bucket2, PSUM.Due_Bucket3, PSUM.Past_Due_Bucket1,
1949 PSUM.Past_Due_Bucket2, PSUM.Past_Due_Bucket3, PSUM.Amount_Remaining_B,
1950 PSUM.Past_Due_Amount_B, PSUM.Discount_Available_B, PSUM.Discount_Taken_B,
1951 PSUM.Discount_Lost_B, PSUM.Payment_Amount_B, PSUM.On_Time_Payment_Amt_B,
1952 PSUM.Late_Payment_Amt_B, PSUM.Due_Bucket1_B, PSUM.Due_Bucket2_B,
1953 PSUM.Due_Bucket3_B, PSUM.Past_Due_Bucket1_B, PSUM.Past_Due_Bucket2_B,
1954 PSUM.Past_Due_Bucket3_B, PSUM.Prim_Amount_Remaining, PSUM.Prim_Past_Due_Amount,
1955 PSUM.Prim_Discount_Available, PSUM.Prim_Discount_Taken, PSUM.Prim_Discount_Lost,
1956 PSUM.Prim_Payment_Amount, PSUM.Prim_On_Time_Payment_Amt,
1957 PSUM.Prim_Late_Payment_Amt, PSUM.Prim_Due_Bucket1, PSUM.Prim_Due_Bucket2,
1958 PSUM.Prim_Due_Bucket3, PSUM.Prim_Past_Due_Bucket1, PSUM.Prim_Past_Due_Bucket2,
1959 PSUM.Prim_Past_Due_Bucket3, PSUM.Sec_Amount_Remaining, PSUM.Sec_Past_Due_Amount,
1960 PSUM.Sec_Discount_Available, PSUM.Sec_Discount_Taken, PSUM.Sec_Discount_Lost,
1961 PSUM.Sec_Payment_Amount, PSUM.Sec_On_Time_Payment_Amt, PSUM.Sec_Late_Payment_Amt,
1962 PSUM.Sec_Due_Bucket1, PSUM.Sec_Due_Bucket2, PSUM.Sec_Due_Bucket3,
1963 PSUM.Sec_Past_Due_Bucket1, PSUM.Sec_Past_Due_Bucket2, PSUM.Sec_Past_Due_Bucket3,
1964 PSUM.Fully_Paid_Date, PSUM.Check_ID, PSUM.Payment_Method, PSUM.Last_Update_Date,
1965 PSUM.Last_Updated_By, PSUM.Creation_Date, PSUM.Created_By, PSUM.Last_Update_Login,
1966 PSUM.Check_Date, PSUM.Inv_Pymt_Flag, PSUM.Unique_ID)
1967 VALUES (UI.Time_ID, UI.Period_Type_ID, UI.Action_Date, UI.Action,
1968 UI.Update_Sequence, UI.Org_ID, UI.Supplier_ID, UI.Invoice_ID,
1969 UI.Base_Currency_Code, UI.Trx_Date, UI.Payment_Num, UI.Due_Date,
1970 UI.Amount_Remaining, UI.Past_Due_Amount, UI.Discount_Available,
1971 UI.Discount_Taken, UI.Discount_Lost, UI.Payment_Amount,
1972 UI.On_Time_Payment_Amt, UI.Late_Payment_Amt, UI.No_Days_Late,
1973 UI.Due_Bucket1, UI.Due_Bucket2, UI.Due_Bucket3, UI.Past_Due_Bucket1,
1974 UI.Past_Due_Bucket2, UI.Past_Due_Bucket3, UI.Amount_Remaining_B,
1975 UI.Past_Due_Amount_B, UI.Discount_Available_B, UI.Discount_Taken_B,
1976 UI.Discount_Lost_B, UI.Payment_Amount_B, UI.On_Time_Payment_Amt_B,
1977 UI.Late_Payment_Amt_B, UI.Due_Bucket1_B, UI.Due_Bucket2_B,
1978 UI.Due_Bucket3_B, UI.Past_Due_Bucket1_B, UI.Past_Due_Bucket2_B,
1979 UI.Past_Due_Bucket3_B, UI.Prim_Amount_Remaining, UI.Prim_Past_Due_Amount,
1980 UI.Prim_Discount_Available, UI.Prim_Discount_Taken, UI.Prim_Discount_Lost,
1981 UI.Prim_Payment_Amount, UI.Prim_On_Time_Payment_Amt,
1982 UI.Prim_Late_Payment_Amt, UI.Prim_Due_Bucket1, UI.Prim_Due_Bucket2,
1983 UI.Prim_Due_Bucket3, UI.Prim_Past_Due_Bucket1, UI.Prim_Past_Due_Bucket2,
1984 UI.Prim_Past_Due_Bucket3, UI.Sec_Amount_Remaining, UI.Sec_Past_Due_Amount,
1985 UI.Sec_Discount_Available, UI.Sec_Discount_Taken, UI.Sec_Discount_Lost,
1986 UI.Sec_Payment_Amount, UI.Sec_On_Time_Payment_Amt, UI.Sec_Late_Payment_Amt,
1987 UI.Sec_Due_Bucket1, UI.Sec_Due_Bucket2, UI.Sec_Due_Bucket3,
1988 UI.Sec_Past_Due_Bucket1, UI.Sec_Past_Due_Bucket2, UI.Sec_Past_Due_Bucket3,
1989 UI.Fully_Paid_Date, UI.Check_ID, UI.Payment_Method, UI.Last_Update_Date,
1990 UI.Last_Updated_By, UI.Creation_Date, UI.Created_By, UI.Last_Update_Login,
1991 UI.Check_Date, UI.Inv_Pymt_Flag, UI.Unique_ID);
1992
1993
1994 l_timestamp1_tmp := DBMS_UTILITY.Get_Time - l_timestamp1_tmp;
1995
1996 if g_debug_flag = 'Y' then
1997 FII_UTIL.put_line('The time taken to update and insert records in FII_AP_Pay_Sched_B is: ' || to_char(l_timestamp1_tmp/100) || ' seconds.');
1998 end if;
1999
2000 l_timestamp1 := DBMS_UTILITY.Get_Time - l_timestamp1;
2001 if g_debug_flag = 'Y' then
2002 FII_UTIL.put_line('The time taken to maintain FII_AP_Pay_Sched_B is: ' || to_char(l_timestamp1/100) || ' seconds.');
2003 end if;
2004
2005
2006 EXCEPTION
2007 WHEN OTHERS THEN
2008 FII_UTIL.put_line('Error in procedure Maintain_Pay_Sched_B.');
2009 RAISE;
2010
2011 END Maintain_Pay_Sched_B;
2012
2013 ------------------------------------------------------------------
2014 -- Procedure MAINTAIN_INVOICE_B
2015 -- Purpose
2016 -- This MAINTAIN_INVOICE_B routine deletes deleted records,
2017 -- updates changed records and inserts new records into base
2018 -- summary table FII_AP_INVOICE_B.
2019 ------------------------------------------------------------------
2020
2021 PROCEDURE MAINTAIN_INVOICE_B IS
2022 l_timestamp1 BINARY_INTEGER;
2023 l_timestamp1_tmp BINARY_INTEGER;
2024 BEGIN
2025
2026 g_state := 'Deleting records from FII_AP_Invoice_B.';
2027 if g_debug_flag = 'Y' then
2028 FII_UTIL.put_line(g_state);
2029 end if;
2030
2031 l_timestamp1 := DBMS_UTILITY.Get_Time;
2032 l_timestamp1_tmp := DBMS_UTILITY.Get_Time;
2033
2034 DELETE FROM FII_AP_Invoice_B AI
2035 WHERE EXISTS
2036 (SELECT 1
2037 FROM FII_AP_Invoice_D_GT D
2038 WHERE D.Invoice_ID = AI.Invoice_ID);
2039
2040 l_timestamp1_tmp := DBMS_UTILITY.Get_Time - l_timestamp1_tmp;
2041
2042 if g_debug_flag = 'Y' then
2043 FII_UTIL.put_line('The time taken to delete records from FII_AP_Invoice_B is: ' || to_char(l_timestamp1_tmp/100) || ' seconds.');
2044 end if;
2045
2046 g_state := 'Updating and Inserting records in FII_Invoice_B.';
2047 if g_debug_flag = 'Y' then
2048 FII_UTIL.put_line(g_state);
2049 end if;
2050
2051 l_timestamp1_tmp := DBMS_UTILITY.Get_Time;
2052
2053 MERGE INTO FII_AP_Invoice_B AI
2054 USING FII_AP_Invoice_UI_GT UI
2055 ON (AI.Invoice_ID = UI.Invoice_ID)
2056 WHEN MATCHED THEN
2057 UPDATE SET AI.Org_ID = UI.Org_ID,
2058 AI.Supplier_ID = UI.Supplier_ID,
2059 AI.Invoice_Type = UI.Invoice_Type,
2060 AI.Invoice_Number = UI.Invoice_Number,
2061 AI.Invoice_Date = UI.Invoice_Date,
2062 AI.Invoice_Amount = UI.Invoice_Amount,
2063 AI.Base_Amount = UI.Base_Amount,
2064 AI.Prim_Amount = UI.Prim_Amount,
2065 AI.Sec_Amount = UI.Sec_Amount,
2066 AI.Invoice_Currency_Code = UI.Invoice_Currency_Code,
2067 AI.Base_Currency_Code = UI.Base_Currency_Code,
2068 AI.Entered_Date = UI.Entered_Date,
2069 AI.Payment_Currency_Code = UI.Payment_Currency_Code,
2070 AI.Fully_Paid_Date = UI.Fully_Paid_Date,
2071 AI.Terms_ID = UI.Terms_ID,
2072 AI.Source = UI.Source,
2073 AI.E_Invoices_Flag = UI.E_Invoices_Flag,
2074 AI.Cancel_Flag = UI.Cancel_Flag,
2075 AI.Cancel_Date = UI.Cancel_Date,
2076 AI.Dist_Count = UI.Dist_Count,
2077 AI.Due_Date = UI.Due_Date,
2078 AI.Discount_Offered = UI.Discount_Offered,
2079 AI.Discount_Offered_B = UI.Discount_Offered_B,
2080 AI.Prim_Discount_Offered = UI.Prim_Discount_Offered,
2081 AI.Sec_Discount_Offered = UI.Sec_Discount_Offered,
2082 AI.First_Hold_Date = UI.First_Hold_Date,
2083 AI.Exchange_Date = UI.Exchange_Date,
2084 AI.Exchange_Rate = UI.Exchange_Rate,
2085 AI.Exchange_Rate_Type = UI.Exchange_Rate_Type,
2086 AI.Payment_Status_Flag = UI.Payment_Status_Flag,
2087 AI.Payment_Cross_Rate = UI.Payment_Cross_Rate,
2088 AI.Fully_Paid_Amount = UI.Fully_Paid_Amount,
2089 AI.Fully_Paid_Amount_B = UI.Fully_Paid_Amount_B,
2090 AI.Prim_Fully_Paid_Amount = UI.Prim_Fully_Paid_Amount,
2091 AI.Sec_Fully_Paid_Amount = UI.Sec_Fully_Paid_Amount,
2092 AI.Last_Update_Date = UI.Last_Update_Date
2093 WHEN NOT MATCHED THEN
2094 INSERT (AI.Org_ID, AI.Supplier_ID, AI.Invoice_ID, AI.Invoice_Type, AI.Invoice_Number,
2095 AI.Invoice_Date, AI.Invoice_Amount, AI.Base_Amount, AI.Prim_Amount,
2096 AI.Sec_Amount, Ai.Invoice_Currency_Code, AI.Base_Currency_Code, AI.Entered_Date,
2097 AI.Payment_Currency_Code, AI.Fully_Paid_Date, AI.Terms_ID, AI.Source,
2098 AI.E_Invoices_Flag, AI.Cancel_Flag, AI.Cancel_Date, AI.Dist_Count, AI.Due_Date,
2099 AI.Discount_Offered, AI.Discount_Offered_B, AI.Prim_Discount_Offered,
2100 AI.Sec_Discount_Offered, AI.First_Hold_Date, AI.Last_Update_Date,
2101 AI.Last_Updated_By, AI.Creation_Date, AI.Created_By, AI.Last_Update_Login,
2102 AI.Exchange_Date, AI.Exchange_Rate, AI.Exchange_Rate_Type, AI.Payment_Status_Flag,
2103 AI.Payment_Cross_Rate, AI.Fully_Paid_Amount, AI.Fully_Paid_Amount_B,
2104 AI.Prim_Fully_Paid_Amount, AI.Sec_Fully_Paid_Amount)
2105 VALUES (UI.Org_ID, UI.Supplier_ID, UI.Invoice_ID, UI.Invoice_Type, UI.Invoice_Number,
2106 UI.Invoice_Date, UI.Invoice_Amount, UI.Base_Amount, UI.Prim_Amount,
2107 UI.Sec_Amount, Ui.Invoice_Currency_Code, UI.Base_Currency_Code, UI.Entered_Date,
2108 UI.Payment_Currency_Code, UI.Fully_Paid_Date, UI.Terms_ID, UI.Source,
2109 UI.E_Invoices_Flag, UI.Cancel_Flag, UI.Cancel_Date, UI.Dist_Count, UI.Due_Date,
2110 UI.Discount_Offered, UI.Discount_Offered_B, UI.Prim_Discount_Offered,
2111 UI.Sec_Discount_Offered, UI.First_Hold_Date, UI.Last_Update_Date,
2112 UI.Last_Updated_By, UI.Creation_Date, UI.Created_By, UI.Last_Update_Login,
2113 UI.Exchange_Date, UI.Exchange_Rate, UI.Exchange_Rate_Type, UI.Payment_Status_Flag,
2114 UI.Payment_Cross_Rate, UI.Fully_Paid_Amount, UI.Fully_Paid_Amount_B,
2115 UI.Prim_Fully_Paid_Amount, UI.Sec_Fully_Paid_Amount);
2116
2117
2118 l_timestamp1_tmp := DBMS_UTILITY.Get_Time - l_timestamp1_tmp;
2119
2120 if g_debug_flag = 'Y' then
2121 FII_UTIL.put_line('The time taken to update and insert records in FII_AP_Invoice_B is: ' || to_char(l_timestamp1_tmp/100) || ' seconds.');
2122 end if;
2123
2124 l_timestamp1 := DBMS_UTILITY.Get_Time - l_timestamp1;
2125 if g_debug_flag = 'Y' then
2126 FII_UTIL.put_line('The time taken to maintain FII_AP_Invoice_B is: ' || to_char(l_timestamp1/100) || ' seconds.');
2127 end if;
2128
2129
2130 EXCEPTION
2131 WHEN OTHERS THEN
2132 FII_UTIL.put_line('Error in procedure Maintain_Invoice_B.');
2133 RAISE;
2134
2135 END Maintain_Invoice_B;
2136
2137 ------------------------------------------------------------------
2138 -- Procedure POPULATE_INV_PAY_SCHED_SUM
2139 -- Purpose
2140 -- This POPULATE_INV_PAY_SCHED_SUM routine inserts records into base
2141 -- summary tables FII_AP_INVOICE_B, FII_AP_PAY_SCHED_B,
2142 -- FII_AP_AGING_BKTS_B and FII_AP_DUE_COUNTS_B using data cached in memory.
2143 ------------------------------------------------------------------
2144
2145 PROCEDURE POPULATE_INV_PAY_SCHED_SUM IS
2146 l_invoice Inv_Rec;
2147 l_pay_sched Pay_Sched_Rec;
2148 l_inv_pay Inv_Pay_Rec;
2149 l_wh_tax WH_Tax_Rec;
2150 l_prepay_applied Prepay_Applied_Rec;
2151
2152 l_timestamp2 BINARY_INTEGER := 0; --Used to keep track of total time to populate the memory structures for FII_AP_Pay_Sched_B.
2153 l_timestamp2_tmp BINARY_INTEGER;
2154 l_timestamp3 BINARY_INTEGER := 0; --Used to keep track of total time to populate the memory structures for FII_AP_Invoice_B.
2155 l_timestamp3_tmp BINARY_INTEGER;
2156 l_timestamp4 BINARY_INTEGER := 0; --Used to keep track of total time to populate FII_AP_Aging_Bkts_B and FII_AP_Due_Counts_B.
2157 l_timestamp4_tmp BINARY_INTEGER;
2158 BEGIN
2159
2160 g_state := 'Deleting existing records from FII_AP_AGING_BKTS_B';
2161 if g_debug_flag = 'Y' then
2162 FII_UTIL.put_line('');
2163 FII_UTIL.put_line(g_state);
2164 end if;
2165
2166 DELETE /*+ index(A, FII_AP_AGING_BKTS_B_N1) */ FROM FII_AP_Aging_Bkts_B A
2167 WHERE Invoice_ID IN (SELECT Invoice_ID
2168 FROM FII_AP_Invoice_IDS
2169 WHERE Pay_Sched_B_Flag = 'Y');
2170
2171 g_state := 'Deleting existing records from FII_AP_DUE_COUNTS_B';
2172 if g_debug_flag = 'Y' then
2173 FII_UTIL.put_line('');
2174 FII_UTIL.put_line(g_state);
2175 end if;
2176
2177 DELETE /*+ index(A, FII_AP_DUE_COUNTS_B_N1) */ FROM FII_AP_Due_Counts_B A
2178 WHERE Invoice_ID IN (SELECT Invoice_ID
2179 FROM FII_AP_Invoice_IDS
2180 WHERE Pay_Sched_B_Flag = 'Y');
2181
2182
2183 g_state := 'Populating g_seq_id from fii_ap_pay_sched_b';
2184
2185 SELECT fii_ap_pay_sched_b_s.nextval
2186 INTO g_seq_id
2187 FROM dual;
2188
2189
2190 /* Enhancement 4227813: Manual invoice sources are defined by the profile option
2191 'FII: Manual Invoice Sources'. Do dummy select in order to verify that the
2192 format of the profile option is valid. Correct format is: 'Source1',..,'SourceN'*/
2193 g_state := 'Verifying that profile option ''FII: Manual Invoice Sources'' is valid.';
2194
2195 g_manual_sources := upper(g_manual_sources);
2196 IF g_manual_sources IS NULL THEN g_manual_sources := ''''''; END IF;
2197 BEGIN
2198 execute immediate('SELECT 1 FROM (SELECT '' '' SOURCE FROM DUAL)
2199 WHERE SOURCE IN (' || g_manual_sources || ')');
2200 EXCEPTION
2201 WHEN OTHERS THEN
2202 RAISE g_invalid_manual_source;
2203 END;
2204
2205
2206 --Populate Memory Structures to be Cached in Memory.
2207 POPULATE_MEMORY_STRUCTURES;
2208
2209
2210 --Initialize global markers to traverse through Memory Structures.
2211 g_state := 'Initializing global markers to traverse through Memory Structures.';
2212 g_pay_sched_b_marker := FII_AP_Pay_Sched_B_MS.First;
2213 g_invoice_b_marker := FII_AP_Invoice_B_MS.First;
2214 l_pay_sched_marker := FII_AP_Pay_Sched_MS.First;
2215 l_inv_pay_marker := FII_AP_Inv_Pay_MS.First;
2216 l_wh_tax_marker := FII_AP_WH_Tax_MS.First;
2217 l_prepay_applied_marker := FII_AP_Prepay_Applied_MS.First;
2218
2219 g_state := 'Begin looping through Invoices Memory Structure.';
2220 if g_debug_flag = 'Y' then
2221 FII_UTIL.put_line(g_state);
2222 end if;
2223
2224 FOR x in 1..FII_AP_Inv_MS.COUNT LOOP
2225 DECLARE
2226 FII_AP_PS_Aging_MS PS_Aging_Type;
2227
2228 l_inv_f_paid_date DATE := NULL;
2229 l_inv_f_paid_amt NUMBER := 0;
2230 l_inv_disc_avail NUMBER := 0;
2231 l_inv_due_date DATE := NULL;
2232 l_inv_has_mult_ps VARCHAR2(1) := 'N';
2233
2234 l_invoice_b FII_AP_INVOICE_B%ROWTYPE;
2235
2236 l_ps_aging PS_Aging_Rec;
2237 l_ps_aging_marker VARCHAR2(50);
2238 l_aging_bkts_b FII_AP_AGING_BKTS_B%ROWTYPE;
2239 l_due_counts_b FII_AP_DUE_COUNTS_B%ROWTYPE;
2240
2241 l_inv_db1 NUMBER := 0;
2242 l_inv_db2 NUMBER := 0;
2243 l_inv_db3 NUMBER := 0;
2244 l_inv_pdb3 NUMBER := 0;
2245 l_inv_pdb2 NUMBER := 0;
2246 l_inv_pdb1 NUMBER := 0;
2247 l_inv_due NUMBER := 0;
2248 l_inv_past_due NUMBER := 0;
2249
2250 l_supplier_merge_flag VARCHAR2(1);
2251
2252 BEGIN
2253 l_invoice := FII_AP_Inv_MS(x);
2254
2255 --Check if there has been a supplier merge.
2256 INSERT_DELETED_REC(l_invoice.Invoice_ID, NULL);
2257 If g_invoice_b_marker IS NOT NULL
2258 AND FII_AP_Invoice_B_MS(g_invoice_b_marker).Invoice_ID = l_invoice.Invoice_ID
2259 AND FII_AP_Invoice_B_MS(g_invoice_b_marker).Supplier_ID <> l_invoice.Supplier_ID THEN
2260 l_supplier_merge_flag := 'Y';
2261 ELSE l_supplier_merge_flag := 'N';
2262 END IF;
2263
2264 g_state := 'Begin looping through the Payment Schedules Memory Structure for Invoice ' || l_invoice.Invoice_ID || ' with Invoice_B_Flag = ''' || l_invoice.Invoice_B_Flag || ''' and Pay_Sched_B_Flag = ''' || l_invoice.Pay_Sched_B_Flag || '''.';
2265
2266 WHILE l_pay_sched_marker IS NOT NULL AND
2267 FII_AP_Pay_Sched_MS(l_pay_sched_marker).Invoice_ID = l_invoice.Invoice_ID LOOP
2268 DECLARE
2269 FII_AP_Pay_Sched_Temp_MS Pay_Sched_Temp_Type;
2270 l_pay_sched_temp Pay_Sched_Temp_Rec;
2271 l_pay_sched_temp_marker VARCHAR2(50);
2272
2273 l_ps_amount_remaining NUMBER; --REQUIRED
2274 l_ps_disc_avail NUMBER := 0;
2275 l_ps_disc_lost NUMBER := 0; --REQUIRED
2276 l_ps_disc_taken NUMBER := 0; --REQUIRED
2277 l_ps_disc_recently_taken NUMBER := 0; --REQUIRED
2278
2279 l_last_action_date DATE;
2280 BEGIN
2281
2282 l_pay_sched := FII_AP_Pay_Sched_MS(l_pay_sched_marker);
2283
2284 l_ps_amount_remaining := l_pay_sched.Gross_Amount;
2285
2286 g_state := 'Checking Invoice_B_Flag for Invoice ' || l_invoice.Invoice_ID || ', Payment Number ' || l_pay_sched.Payment_Num || '.';
2287
2288 IF l_invoice.Invoice_B_Flag = 'Y' THEN
2289 l_inv_disc_avail := l_inv_disc_avail + l_pay_sched.Discount_Amount_Available;
2290 l_inv_due_date := LEAST(NVL(l_inv_due_date, TRUNC(l_pay_sched.Due_Date)), TRUNC(l_pay_sched.Due_Date));
2291 END IF;
2292
2293 g_state := 'Checking Pay_Sched_B_Flag for Invoice ' || l_invoice.Invoice_ID || ', Payment Number ' || l_pay_sched.Payment_Num || '.';
2294
2295 IF l_invoice.Pay_Sched_B_Flag = 'Y' OR l_supplier_merge_flag = 'Y' THEN
2296
2297 l_timestamp2_tmp := DBMS_UTILITY.Get_Time;
2298
2299 g_state := 'Checking if multiple payment schedules exist for Invoice ' || l_invoice.Invoice_ID || ', Payment Number ' || l_pay_sched.Payment_Num || '.';
2300
2301 IF l_inv_has_mult_ps = 'N'
2302 AND FII_AP_Pay_Sched_MS.Next(l_pay_sched_marker) IS NOT NULL
2303 AND l_pay_sched.Invoice_ID = FII_AP_Pay_Sched_MS(FII_AP_Pay_Sched_MS.Next(l_pay_sched_marker)).Invoice_ID THEN
2304 l_inv_has_mult_ps := 'Y';
2305 END IF;
2306
2307 --Insert 'CREATION' record into FII_AP_Pay_Sched_Temp_MS.
2308 g_state := 'Inserting ''CREATION'' record into FII_AP_Pay_Sched_Temp_MS for Invoice ' || l_invoice.Invoice_ID || ', Payment Number ' || l_pay_sched.Payment_Num || '.';
2309
2310 IF l_invoice.Invoice_Type <> 'PREPAYMENT'
2311 AND l_invoice.Cancel_Date IS NULL THEN
2312 l_pay_sched_temp.Action := 'CREATION';
2313 l_pay_sched_temp.Action_Date := l_invoice.Entered_Date;
2314 l_pay_sched_temp.Number1 := l_pay_sched.Gross_Amount;
2315 FII_AP_Pay_Sched_Temp_MS(to_char(l_pay_sched_temp.Action_Date, 'RRRR/MM/DD') || '/1') := l_pay_sched_temp;
2316 END IF;
2317
2318 --Insert first 'DISCOUNT' record into FII_AP_Pay_Sched_Temp_MS.
2319 g_state := 'Inserting first ''DISCOUNT'' record into FII_AP_Pay_Sched_Temp_MS for Invoice ' || l_invoice.Invoice_ID || ', Payment Number ' || l_pay_sched.Payment_Num || '.';
2320
2321 IF l_invoice.Invoice_Type <> 'PREPAYMENT'
2322 AND l_invoice.Cancel_Date IS NULL
2323 AND TRUNC(l_pay_sched.Discount_Date) + 1 <= g_sysdate THEN
2324 l_pay_sched_temp.Action := 'DISCOUNT';
2325 l_pay_sched_temp.Action_Date := TRUNC(l_pay_sched.Discount_Date) + 1;
2326 l_pay_sched_temp.Number1 := 1;
2327 FII_AP_Pay_Sched_Temp_MS(to_char(l_pay_sched_temp.Action_Date, 'RRRR/MM/DD') || '/2/1') := l_pay_sched_temp;
2328 END IF;
2329
2330 --Insert second 'DISCOUNT' record into FII_AP_Pay_Sched_Temp_MS.
2331 g_state := 'Inserting second ''DISCOUNT'' record into FII_AP_Pay_Sched_Temp_MS for Invoice ' || l_invoice.Invoice_ID || ', Payment Number ' || l_pay_sched.Payment_Num || '.';
2332
2333 IF l_invoice.Invoice_Type <> 'PREPAYMENT'
2334 AND l_invoice.Cancel_Date IS NULL
2335 AND TRUNC(l_pay_sched.Second_Discount_Date) + 1 <= g_sysdate THEN
2336 l_pay_sched_temp.Action := 'DISCOUNT';
2337 l_pay_sched_temp.Action_Date := TRUNC(l_pay_sched.Second_Discount_Date) + 1;
2338 l_pay_sched_temp.Number1 := 2;
2339 FII_AP_Pay_Sched_Temp_MS(to_char(l_pay_sched_temp.Action_Date, 'RRRR/MM/DD') || '/2/2') := l_pay_sched_temp;
2340 END IF;
2341
2342 --Insert third 'DISCOUNT' record into FII_AP_Pay_Sched_Temp_MS.
2343 g_state := 'Inserting third ''DISCOUNT'' record into FII_AP_Pay_Sched_Temp_MS for Invoice ' || l_invoice.Invoice_ID || ', Payment Number ' || l_pay_sched.Payment_Num || '.';
2344
2345 IF l_invoice.Invoice_Type <> 'PREPAYMENT'
2346 AND l_invoice.Cancel_Date IS NULL
2347 AND TRUNC(l_pay_sched.Third_Discount_Date) + 1 <= g_sysdate THEN
2348 l_pay_sched_temp.Action := 'DISCOUNT';
2349 l_pay_sched_temp.Action_Date := TRUNC(l_pay_sched.Third_Discount_Date) + 1;
2350 l_pay_sched_temp.Number1 := 3;
2351 FII_AP_Pay_Sched_Temp_MS(to_char(l_pay_sched_temp.Action_Date, 'RRRR/MM/DD') || '/2/3') := l_pay_sched_temp;
2352 END IF;
2353
2354 --Insert first 'DUE BUCKET' record into FII_AP_Pay_Sched_Temp_MS.
2355 g_state := 'Inserting first ''DUE BUCKET'' record into FII_AP_Pay_Sched_Temp_MS for Invoice ' || l_invoice.Invoice_ID || ', Payment Number ' || l_pay_sched.Payment_Num || '.';
2356
2357 IF l_invoice.Invoice_Type <> 'PREPAYMENT'
2358 AND l_invoice.Cancel_Date IS NULL
2359 AND TRUNC(l_pay_sched.Due_Date) - l_invoice.Entered_Date > g_due_bucket2
2360 AND TRUNC(l_pay_sched.Due_Date) - g_due_bucket2 <= g_sysdate THEN
2361 l_pay_sched_temp.Action := 'DUE BUCKET';
2362 l_pay_sched_temp.Action_Date := TRUNC(l_pay_sched.Due_Date) - g_due_bucket2;
2363 l_pay_sched_temp.Number1 := 1;
2364 FII_AP_Pay_Sched_Temp_MS(to_char(l_pay_sched_temp.Action_Date, 'RRRR/MM/DD') || '/3') := l_pay_sched_temp;
2365 END IF;
2366
2367 --Insert second 'DUE BUCKET' record into FII_AP_Pay_Sched_Temp_MS.
2368 g_state := 'Inserting second ''DUE BUCKET'' record into FII_AP_Pay_Sched_Temp_MS for Invoice ' || l_invoice.Invoice_ID || ', Payment Number ' || l_pay_sched.Payment_Num || '.';
2369
2370 IF l_invoice.Invoice_Type <> 'PREPAYMENT'
2371 AND l_invoice.Cancel_Date IS NULL
2372 AND TRUNC(l_pay_sched.Due_Date) - l_invoice.Entered_Date > g_due_bucket3
2373 AND TRUNC(l_pay_sched.Due_Date) - g_due_bucket3 <= g_sysdate THEN
2374 l_pay_sched_temp.Action := 'DUE BUCKET';
2375 l_pay_sched_temp.Action_Date := TRUNC(l_pay_sched.Due_Date) - g_due_bucket3;
2376 l_pay_sched_temp.Number1 := 2;
2377 FII_AP_Pay_Sched_Temp_MS(to_char(l_pay_sched_temp.Action_Date, 'RRRR/MM/DD') || '/3') := l_pay_sched_temp;
2378 END IF;
2379
2380 --Insert 'DUE' record into FII_AP_Pay_Sched_Temp_MS.
2381 g_state := 'Inserting ''DUE'' record into FII_AP_Pay_Sched_Temp_MS for Invoice ' || l_invoice.Invoice_ID || ', Payment Number ' || l_pay_sched.Payment_Num || '.';
2382
2383 IF l_invoice.Invoice_Type <> 'PREPAYMENT'
2384 AND l_invoice.Cancel_Date IS NULL
2385 AND TRUNC(l_pay_sched.Due_Date) >= l_invoice.Entered_Date
2386 AND TRUNC(l_pay_sched.Due_Date) + 1 <= g_sysdate THEN
2387 l_pay_sched_temp.Action := 'DUE';
2388 l_pay_sched_temp.Action_Date := TRUNC(l_pay_sched.Due_Date) + 1;
2389 FII_AP_Pay_Sched_Temp_MS(to_char(l_pay_sched_temp.Action_Date, 'RRRR/MM/DD') || '/3') := l_pay_sched_temp;
2390 END IF;
2391
2392 --Insert first 'PAST BUCKET' record into FII_AP_Pay_Sched_Temp_MS.
2393 g_state := 'Inserting first ''PAST BUCKET'' record into FII_AP_Pay_Sched_Temp_MS for Invoice ' || l_invoice.Invoice_ID || ', Payment Number ' || l_pay_sched.Payment_Num || '.';
2394
2395 IF l_invoice.Invoice_Type <> 'PREPAYMENT'
2396 AND l_invoice.Cancel_Date IS NULL
2397 AND TRUNC(l_pay_sched.Due_Date) + g_past_bucket3 + 1 > l_invoice.Entered_Date
2398 AND TRUNC(l_pay_sched.Due_Date) + g_past_bucket3 + 1 <= g_sysdate THEN
2399 l_pay_sched_temp.Action := 'PAST BUCKET';
2400 l_pay_sched_temp.Action_Date := TRUNC(l_pay_sched.Due_Date) + g_past_bucket3 + 1;
2401 l_pay_sched_temp.Number1 := 1;
2402 FII_AP_Pay_Sched_Temp_MS(to_char(l_pay_sched_temp.Action_Date, 'RRRR/MM/DD') || '/3') := l_pay_sched_temp;
2403 END IF;
2404
2405 --Insert second 'PAST BUCKET' record into FII_AP_Pay_Sched_Temp_MS.
2406 g_state := 'Inserting second ''PAST BUCKET'' record into FII_AP_Pay_Sched_Temp_MS for Invoice ' || l_invoice.Invoice_ID || ', Payment Number ' || l_pay_sched.Payment_Num || '.';
2407
2408 IF l_invoice.Invoice_Type <> 'PREPAYMENT'
2409 AND l_invoice.Cancel_Date IS NULL
2410 AND TRUNC(l_pay_sched.Due_Date) + g_past_bucket2 + 1 > l_invoice.Entered_Date
2411 AND TRUNC(l_pay_sched.Due_Date) + g_past_bucket2 + 1 <= g_sysdate THEN
2412 l_pay_sched_temp.Action := 'PAST BUCKET';
2413 l_pay_sched_temp.Action_Date := TRUNC(l_pay_sched.Due_Date) + g_past_bucket2 + 1;
2414 l_pay_sched_temp.Number1 := 2;
2415 FII_AP_Pay_Sched_Temp_MS(to_char(l_pay_sched_temp.Action_Date, 'RRRR/MM/DD') || '/3') := l_pay_sched_temp;
2416 END IF;
2417
2418 l_timestamp2_tmp := DBMS_UTILITY.Get_Time - l_timestamp2_tmp;
2419 l_timestamp2 := l_timestamp2 + l_timestamp2_tmp;
2420
2421 END IF; --IF l_invoice.Pay_Sched_B_Flag = 'Y' ...
2422
2423 g_state := 'Begin looping through the Invoice Payments Memory Structure for Invoice ' || l_invoice.Invoice_ID || ', Payment Number ' || l_pay_sched.Payment_Num || '.';
2424
2425 WHILE l_inv_pay_marker IS NOT NULL
2426 AND FII_AP_Inv_Pay_MS(l_inv_pay_marker).Invoice_ID = l_invoice.Invoice_ID
2427 AND FII_AP_Inv_Pay_MS(l_inv_pay_marker).Payment_Num = l_pay_sched.Payment_Num LOOP
2428
2429 l_inv_pay := FII_AP_Inv_Pay_MS(l_inv_pay_marker);
2430
2431 g_state := 'Inserting invoice payment record into FII_AP_Pay_Sched_Temp_MS for Invoice ' || l_invoice.Invoice_ID || ', Payment Number ' || l_pay_sched.Payment_Num || ', Invoice Payment ' || l_inv_pay.Invoice_Payment_ID || '.';
2432
2433
2434 IF l_invoice.Pay_Sched_B_Flag = 'Y' OR l_supplier_merge_flag = 'Y' THEN
2435
2436 l_timestamp2_tmp := DBMS_UTILITY.Get_Time;
2437
2438 IF l_invoice.Cancel_Date IS NULL THEN
2439 IF l_invoice.Invoice_Type = 'PREPAYMENT' THEN
2440 l_pay_sched_temp.Action := 'PREPAYMENT';
2441 ELSE l_pay_sched_temp.Action := 'PAYMENT';
2442 END IF;
2443 l_pay_sched_temp.Action_Date := TRUNC(l_inv_pay.Creation_Date);
2444 l_pay_sched_temp.Number1 := l_inv_pay.Amount;
2445 l_pay_sched_temp.Number2 := l_inv_pay.Discount_Taken;
2446 l_pay_sched_temp.Number3 := l_inv_pay.Created_By;
2447 l_pay_sched_temp.Number4 := l_inv_pay.Check_ID;
2448 l_pay_sched_temp.Number5 := l_inv_pay.Invoice_Payment_ID;
2449 l_pay_sched_temp.Date1 := l_inv_pay.Check_Date;
2450 l_pay_sched_temp.String1 := l_inv_pay.Processing_Type;
2451 FII_AP_Pay_Sched_Temp_MS(to_char(l_pay_sched_temp.Action_Date, 'RRRR/MM/DD') || '/5/' || l_inv_pay.Invoice_Payment_ID) := l_pay_sched_temp;
2452 END IF;
2453
2454 l_timestamp2_tmp := DBMS_UTILITY.Get_Time - l_timestamp2_tmp;
2455 l_timestamp2 := l_timestamp2 + l_timestamp2_tmp;
2456
2457 END IF; --IF l_invoice.Pay_Sched_B_Flag = 'Y' ...
2458
2459 g_state := 'Updating invoice variables with invoice payment amounts for Invoice ' || l_invoice.Invoice_ID || ', Payment Number ' || l_pay_sched.Payment_Num || ', Invoice Payment ' || l_inv_pay.Invoice_Payment_ID || '.';
2460
2461 IF l_invoice.Invoice_B_Flag = 'Y' THEN
2462 l_inv_f_paid_date := TRUNC(l_inv_pay.Creation_Date);
2463 l_inv_f_paid_amt := l_inv_f_paid_amt + l_inv_pay.Amount + l_inv_pay.Discount_Taken;
2464 END IF;
2465
2466 l_inv_pay_marker := FII_AP_Inv_Pay_MS.Next(l_inv_pay_marker);
2467 END LOOP; --End of Invoice Payments Loop.
2468
2469 g_state := 'Begin looping through the Withholding/Tax Memory Structure for Invoice ' || l_invoice.Invoice_ID || ', Payment Number ' || l_pay_sched.Payment_Num || '.';
2470
2471 l_ps_wh_tax_marker := NULL;
2472 WHILE l_wh_tax_marker IS NOT NULL
2473 AND FII_AP_WH_Tax_MS(l_wh_tax_marker).Invoice_ID = l_invoice.Invoice_ID LOOP
2474 l_wh_tax := FII_AP_WH_Tax_MS(l_wh_tax_marker);
2475
2476 --Mark the first wh/tax record for this invoice. If this invoice has more payment schedules,
2477 --go back to the first wh/tax record and prorate amounts. Wh/Tax is at the invoice level.
2478 IF l_ps_wh_tax_marker IS NULL THEN l_ps_wh_tax_marker := l_wh_tax_marker; END IF;
2479
2480 g_state := 'Inserting withholding/tax record into FII_AP_Pay_Sched_Temp_MS for Invoice ' || l_invoice.Invoice_ID || ', Payment Number ' || l_pay_sched.Payment_Num || ', Invoice Distribution ' || l_wh_tax.Invoice_Distribution_ID || '.';
2481
2482 IF l_invoice.Pay_Sched_B_Flag = 'Y' OR l_supplier_merge_flag = 'Y' THEN
2483
2484 l_timestamp2_tmp := DBMS_UTILITY.Get_Time;
2485
2486 IF --l_invoice.Invoice_Type <> 'PREPAYMENT' AND
2487 l_invoice.Cancel_Date IS NULL THEN
2488 IF l_wh_tax.Line_Type_Lookup_Code = 'AWT' THEN
2489 l_pay_sched_temp.Action := 'WITHHOLDING';
2490 ELSE l_pay_sched_temp.Action := 'TAX';
2491 END IF;
2492 l_pay_sched_temp.Action_Date := TRUNC(l_wh_tax.Creation_Date);
2493 IF l_invoice.Invoice_Amount = 0 THEN
2494 l_pay_sched_temp.Number1 := 0;
2495 ELSE l_pay_sched_temp.Number1 := l_pay_sched.Gross_Amount * l_wh_tax.Amount / l_invoice.Invoice_Amount;
2496 END IF;
2497 FII_AP_Pay_Sched_Temp_MS(to_char(l_pay_sched_temp.Action_Date, 'RRRR/MM/DD') || '/4/' || l_wh_tax.Invoice_Distribution_ID) := l_pay_sched_temp;
2498 END IF; --l_invoice.Cancel_Date IS NULL THEN ...
2499
2500 l_timestamp2_tmp := DBMS_UTILITY.Get_Time - l_timestamp2_tmp;
2501 l_timestamp2 := l_timestamp2 + l_timestamp2_tmp;
2502
2503 END IF; --IF l_invoice.Pay_Sched_B_Flag = 'Y' ...
2504
2505 l_wh_tax_marker := FII_AP_WH_Tax_MS.Next(l_wh_tax_marker);
2506 END LOOP; --End of Witholding/Tax Loop.
2507
2508 --Only reset the wh/tax marker to the first wh/tax record for this invoice if a higher payment schedule
2509 --exists for this invoice and has yet to be traversed.
2510 g_state := 'Reseting wh/tax marker for Invoice ' || l_invoice.Invoice_ID || ', Payment Number ' || l_pay_sched.Payment_Num || '.';
2511
2512 IF l_ps_wh_tax_marker IS NOT NULL
2513 AND FII_AP_Pay_Sched_MS.Next(l_pay_sched_marker) IS NOT NULL
2514 AND l_pay_sched.Invoice_ID = FII_AP_Pay_Sched_MS(FII_AP_Pay_Sched_MS.Next(l_pay_sched_marker)).Invoice_ID THEN
2515 l_wh_tax_marker := l_ps_wh_tax_marker;
2516 END IF;
2517
2518
2519 IF l_invoice.Pay_Sched_B_Flag = 'Y' OR l_supplier_merge_flag = 'Y' THEN
2520
2521 l_timestamp2_tmp := DBMS_UTILITY.Get_Time;
2522
2523 --Loop through FII_AP_Pay_Sched_Temp_MS.
2524 g_state := 'Looping through the temporary memory structure FII_AP_Pay_Sched_Temp_MS for Invoice ' || l_invoice.Invoice_ID || ', Payment Number ' || l_pay_sched.Payment_Num || '.';
2525
2526 l_pay_sched_temp_marker := FII_AP_Pay_Sched_Temp_MS.First;
2527
2528 WHILE l_pay_sched_temp_marker IS NOT NULL OR
2529 --If the last action for a payment schedule is a prepayment applied.
2530 (l_prepay_applied_marker IS NOT NULL
2531 AND FII_AP_Prepay_Applied_MS(l_prepay_applied_marker).Invoice_ID = l_invoice.Invoice_ID
2532 --This is an assumption anyway.
2533 AND TRUNC(FII_AP_Prepay_Applied_MS(l_prepay_applied_marker).Creation_Date) >= NVL(l_last_Action_Date, TRUNC(FII_AP_Prepay_Applied_MS(l_prepay_applied_marker).Creation_Date))
2534 AND l_ps_amount_remaining <> 0) LOOP
2535 DECLARE
2536 l_pay_sched_temp Pay_Sched_Temp_Rec;
2537 l_pay_sched_b FII_AP_PAY_SCHED_B%ROWTYPE;
2538
2539 l_ps_db1 NUMBER := 0;
2540 l_ps_db2 NUMBER := 0;
2541 l_ps_db3 NUMBER := 0;
2542 l_ps_pdb3 NUMBER := 0;
2543 l_ps_pdb2 NUMBER := 0;
2544 l_ps_pdb1 NUMBER := 0;
2545 BEGIN
2546 IF l_pay_sched_temp_marker IS NOT NULL THEN
2547 l_pay_sched_temp := FII_AP_Pay_Sched_Temp_MS(l_pay_sched_temp_marker);
2548 END IF;
2549
2550 g_state := 'Deciding what action to insert for Invoice ' || l_invoice.Invoice_ID || ', Payment Number ' || l_pay_sched.Payment_Num || '.';
2551
2552 --Check if a Prepayment Applied 'PAYMENT' record should be inserted first.
2553 IF l_pay_sched_temp_marker IS NULL OR
2554 (l_pay_sched_temp_marker IS NOT NULL
2555 AND l_prepay_applied_marker IS NOT NULL
2556 AND FII_AP_Prepay_Applied_MS(l_prepay_applied_marker).Invoice_ID = l_invoice.Invoice_ID
2557 AND ((TRUNC(FII_AP_Prepay_Applied_MS(l_prepay_applied_marker).Creation_Date)
2558 < l_pay_sched_temp.Action_Date) OR
2559 (TRUNC(FII_AP_Prepay_Applied_MS(l_prepay_applied_marker).Creation_Date)
2560 = l_pay_sched_temp.Action_Date AND
2561 l_pay_sched_temp.Action IN ('PAYMENT', 'PREPAYMENT')))
2562 AND l_ps_amount_remaining <> 0) THEN
2563 DECLARE
2564 l_prepay_amount NUMBER;
2565 l_Amount_Remaining_T NUMBER;
2566 l_Past_Due_Amount_T NUMBER;
2567 l_On_Time_Payment_Amt_T NUMBER;
2568 l_Late_Payment_Amt_T NUMBER;
2569 l_Payment_Amount_T NUMBER;
2570 l_Due_Bucket1_T NUMBER;
2571 l_Due_Bucket2_T NUMBER;
2572 l_Due_Bucket3_T NUMBER;
2573 l_Past_Due_Bucket1_T NUMBER;
2574 l_Past_Due_Bucket2_T NUMBER;
2575 l_Past_Due_Bucket3_T NUMBER;
2576 BEGIN
2577
2578 l_prepay_applied := FII_AP_Prepay_Applied_MS(l_prepay_applied_marker);
2579
2580 g_state := 'Inserting prepayment applied record for Invoice ' || l_invoice.Invoice_ID || ', Payment Number ' || l_pay_sched.Payment_Num || '.';
2581
2582 IF l_prepay_applied.Unallocated_Amount <= l_ps_amount_remaining THEN
2583 l_prepay_amount := l_prepay_applied.Unallocated_Amount;
2584 l_prepay_applied_marker := FII_AP_Prepay_Applied_MS.Next(l_prepay_applied_marker);
2585 ELSE
2586 l_prepay_applied.Unallocated_Amount := l_prepay_applied.Unallocated_Amount - l_ps_amount_remaining;
2587 FII_AP_Prepay_Applied_MS(l_prepay_applied_marker) := l_prepay_applied;
2588 l_prepay_amount := l_ps_amount_remaining;
2589 END IF;
2590
2591 IF l_invoice.Invoice_B_Flag = 'Y' THEN
2592 l_inv_f_paid_date := GREATEST(NVL(l_inv_f_paid_date,TRUNC(l_prepay_applied.Creation_Date)), TRUNC(l_prepay_applied.Creation_Date));
2593 l_inv_f_paid_amt := l_inv_f_paid_amt + l_prepay_amount;
2594 END IF;
2595
2596 IF l_invoice.Invoice_Type <> 'PREPAYMENT' AND l_invoice.Cancel_Date IS NULL THEN
2597
2598 l_Amount_Remaining_T := -1 * l_prepay_amount;
2599 IF TRUNC(l_pay_sched.Due_Date) - TRUNC(l_prepay_applied.Creation_Date) < 0 THEN
2600 l_Past_Due_Amount_T := -1 * l_prepay_amount;
2601 l_On_Time_Payment_Amt_T := 0;
2602 l_Late_Payment_Amt_T := l_prepay_amount;
2603 l_pay_sched_b.No_Days_Late := TRUNC(l_prepay_applied.Creation_Date) - TRUNC(l_pay_sched.Due_Date);
2604 ELSE l_Past_Due_Amount_T := 0;
2605 l_On_Time_Payment_Amt_T := l_prepay_amount;
2606 l_Late_Payment_Amt_T := 0;
2607 l_pay_sched_b.No_Days_Late := 0;
2608 END IF;
2609 l_Payment_Amount_T := l_prepay_amount;
2610
2611 IF TRUNC(l_pay_sched.Due_Date) - TRUNC(l_prepay_applied.Creation_Date) >= g_due_bucket1 THEN
2612 l_Due_Bucket1_T := -1 * l_prepay_amount;
2613 l_ps_db1 := -1;
2614 ELSE l_Due_Bucket1_T := 0;
2615 END IF;
2616
2617 IF TRUNC(l_pay_sched.Due_Date) - TRUNC(l_prepay_applied.Creation_Date) <= g_due_bucket2
2618 AND TRUNC(l_pay_sched.Due_Date) - TRUNC(l_prepay_applied.Creation_Date) > g_due_bucket3 THEN
2619 l_Due_Bucket2_T := -1 * l_prepay_amount;
2620 l_ps_db2 := -1;
2621 ELSE l_Due_Bucket2_T := 0;
2622 END IF;
2623
2624 IF TRUNC(l_pay_sched.Due_Date) - TRUNC(l_prepay_applied.Creation_Date) <= g_due_bucket3
2625 AND TRUNC(l_pay_sched.Due_Date) - TRUNC(l_prepay_applied.Creation_Date) >= 0 THEN
2626 l_Due_Bucket3_T := -1 * l_prepay_amount;
2627 l_ps_db3 := -1;
2628 ELSE l_Due_Bucket3_T := 0;
2629 END IF;
2630
2631 IF TRUNC(l_prepay_applied.Creation_Date) - TRUNC(l_pay_sched.Due_Date) >= g_past_bucket1 THEN
2632 l_Past_Due_Bucket1_T := -1 * l_prepay_amount;
2633 l_ps_pdb1 := -1;
2634 ELSE l_Past_Due_Bucket1_T := 0;
2635 END IF;
2636
2637 IF TRUNC(l_prepay_applied.Creation_Date) - TRUNC(l_pay_sched.Due_Date) <= g_past_bucket2
2638 AND TRUNC(l_prepay_applied.Creation_Date) - TRUNC(l_pay_sched.Due_Date) > g_past_bucket3 THEN
2639 l_Past_Due_Bucket2_T := -1 * l_prepay_amount;
2640 l_ps_pdb2 := -1;
2641 ELSE l_Past_Due_Bucket2_T := 0;
2642 END IF;
2643
2644 IF TRUNC(l_prepay_applied.Creation_Date) - TRUNC(l_pay_sched.Due_Date) <= g_past_bucket3
2645 AND TRUNC(l_prepay_applied.Creation_Date) - TRUNC(l_pay_sched.Due_Date) > 0 THEN
2646 l_Past_Due_Bucket3_T := -1 * l_prepay_amount;
2647 l_ps_pdb3 := -1;
2648 ELSE l_Past_Due_Bucket3_T := 0;
2649 END IF;
2650
2651 l_pay_sched_b.Time_ID := To_Number(To_Char(TRUNC(l_prepay_applied.Creation_Date), 'J'));
2652 l_pay_sched_b.Period_Type_ID := 1;
2653 l_pay_sched_b.Action_Date := TRUNC(l_prepay_applied.Creation_Date);
2654 l_pay_sched_b.Action := 'PAYMENT';
2655 l_pay_sched_b.Update_Sequence := g_seq_id;
2656 l_pay_sched_b.Org_ID := l_invoice.Org_ID;
2657 l_pay_sched_b.Supplier_ID := l_invoice.Supplier_ID;
2658 l_pay_sched_b.Invoice_ID := l_invoice.Invoice_ID;
2659 l_pay_sched_b.Base_Currency_Code := l_invoice.Base_Currency_Code;
2660 l_pay_sched_b.Trx_Date := l_invoice.Invoice_Date;
2661 l_pay_sched_b.Payment_Num := l_pay_sched.Payment_Num;
2662 l_pay_sched_b.Due_Date := TRUNC(l_pay_sched.Due_Date);
2663 l_pay_sched_b.Amount_Remaining := ROUND(l_Amount_Remaining_T / l_invoice.Minimum_Accountable_Unit) * l_invoice.Minimum_Accountable_Unit;
2664 l_pay_sched_b.Past_Due_Amount := ROUND(l_Past_Due_Amount_T / l_invoice.Minimum_Accountable_Unit) * l_invoice.Minimum_Accountable_Unit;
2665 l_pay_sched_b.Discount_Available := 0;
2666 l_pay_sched_b.Discount_Taken := 0;
2667 l_pay_sched_b.Discount_Lost := 0;
2668 l_pay_sched_b.Payment_Amount := ROUND(l_Payment_Amount_T / l_invoice.Minimum_Accountable_Unit) * l_invoice.Minimum_Accountable_Unit;
2669 l_pay_sched_b.On_Time_Payment_Amt := ROUND(l_On_Time_Payment_Amt_T / l_invoice.Minimum_Accountable_Unit) * l_invoice.Minimum_Accountable_Unit;
2670 l_pay_sched_b.Late_Payment_Amt := ROUND(l_Late_Payment_Amt_T / l_invoice.Minimum_Accountable_Unit) * l_invoice.Minimum_Accountable_Unit;
2671 l_pay_sched_b.Due_Bucket1 := ROUND(l_Due_Bucket1_T / l_invoice.Minimum_Accountable_Unit) * l_invoice.Minimum_Accountable_Unit;
2672 l_pay_sched_b.Due_Bucket2 := ROUND(l_Due_Bucket2_T / l_invoice.Minimum_Accountable_Unit) * l_invoice.Minimum_Accountable_Unit;
2673 l_pay_sched_b.Due_Bucket3 := ROUND(l_Due_Bucket3_T / l_invoice.Minimum_Accountable_Unit) * l_invoice.Minimum_Accountable_Unit;
2674 l_pay_sched_b.Past_Due_Bucket1 := ROUND(l_Past_Due_Bucket1_T / l_invoice.Minimum_Accountable_Unit) * l_invoice.Minimum_Accountable_Unit;
2675 l_pay_sched_b.Past_Due_Bucket2 := ROUND(l_Past_Due_Bucket2_T / l_invoice.Minimum_Accountable_Unit) * l_invoice.Minimum_Accountable_Unit;
2676 l_pay_sched_b.Past_Due_Bucket3 := ROUND(l_Past_Due_Bucket3_T / l_invoice.Minimum_Accountable_Unit) * l_invoice.Minimum_Accountable_Unit;
2677 l_pay_sched_b.Amount_Remaining_B := ROUND((l_Amount_Remaining_T * l_invoice.To_Func_Rate)/l_invoice.Minimum_Accountable_Unit) * l_invoice.Minimum_Accountable_Unit;
2678 l_pay_sched_b.Past_Due_Amount_B := ROUND((l_Past_Due_Amount_T * l_invoice.To_Func_Rate)/l_invoice.Minimum_Accountable_Unit) * l_invoice.Minimum_Accountable_Unit;
2679 l_pay_sched_b.Discount_Available_B := 0;
2680 l_pay_sched_b.Discount_Taken_B := 0;
2681 l_pay_sched_b.Discount_Lost_B := 0;
2682 l_pay_sched_b.Payment_Amount_B := ROUND((l_Payment_Amount_T * l_invoice.To_Func_Rate)/l_invoice.Minimum_Accountable_Unit) * l_invoice.Minimum_Accountable_Unit;
2683 l_pay_sched_b.On_Time_Payment_Amt_B := ROUND((l_On_Time_Payment_Amt_T * l_invoice.To_Func_Rate)/l_invoice.Minimum_Accountable_Unit) * l_invoice.Minimum_Accountable_Unit;
2684 l_pay_sched_b.Late_Payment_Amt_B := ROUND((l_Late_Payment_Amt_T * l_invoice.To_Func_Rate)/l_invoice.Minimum_Accountable_Unit) * l_invoice.Minimum_Accountable_Unit;
2685 l_pay_sched_b.Due_Bucket1_B := ROUND((l_Due_Bucket1_T * l_invoice.To_Func_Rate)/l_invoice.Minimum_Accountable_Unit) * l_invoice.Minimum_Accountable_Unit;
2686 l_pay_sched_b.Due_Bucket2_B := ROUND((l_Due_Bucket2_T * l_invoice.To_Func_Rate)/l_invoice.Minimum_Accountable_Unit) * l_invoice.Minimum_Accountable_Unit;
2687 l_pay_sched_b.Due_Bucket3_B := ROUND((l_Due_Bucket3_T * l_invoice.To_Func_Rate)/l_invoice.Minimum_Accountable_Unit) * l_invoice.Minimum_Accountable_Unit;
2688 l_pay_sched_b.Past_Due_Bucket1_B := ROUND((l_Past_Due_Bucket1_T * l_invoice.To_Func_Rate)/l_invoice.Minimum_Accountable_Unit) * l_invoice.Minimum_Accountable_Unit;
2689 l_pay_sched_b.Past_Due_Bucket2_B := ROUND((l_Past_Due_Bucket2_T * l_invoice.To_Func_Rate)/l_invoice.Minimum_Accountable_Unit) * l_invoice.Minimum_Accountable_Unit;
2690 l_pay_sched_b.Past_Due_Bucket3_B := ROUND((l_Past_Due_Bucket3_T * l_invoice.To_Func_Rate)/l_invoice.Minimum_Accountable_Unit) * l_invoice.Minimum_Accountable_Unit;
2691 l_pay_sched_b.Prim_Amount_Remaining := ROUND((l_Amount_Remaining_T * l_invoice.To_Prim_Rate) / g_primary_mau) * g_primary_mau;
2692 l_pay_sched_b.Prim_Past_Due_Amount := ROUND((l_Past_Due_Amount_T * l_invoice.To_Prim_Rate) / g_primary_mau) * g_primary_mau;
2693 l_pay_sched_b.Prim_Discount_Available := 0;
2694 l_pay_sched_b.Prim_Discount_Taken := 0;
2695 l_pay_sched_b.Prim_Discount_Lost := 0;
2696 l_pay_sched_b.Prim_Payment_Amount := ROUND((l_Payment_Amount_T * l_invoice.To_Prim_Rate) / g_primary_mau) * g_primary_mau;
2697 l_pay_sched_b.Prim_On_Time_Payment_Amt := ROUND((l_On_Time_Payment_Amt_T * l_invoice.To_Prim_Rate) / g_primary_mau) * g_primary_mau;
2698 l_pay_sched_b.Prim_Late_Payment_Amt := ROUND((l_Late_Payment_Amt_T * l_invoice.To_Prim_Rate) / g_primary_mau) * g_primary_mau;
2699 l_pay_sched_b.Prim_Due_Bucket1 := ROUND((l_Due_Bucket1_T * l_invoice.To_Prim_Rate) / g_primary_mau) * g_primary_mau;
2700 l_pay_sched_b.Prim_Due_Bucket2 := ROUND((l_Due_Bucket2_T * l_invoice.To_Prim_Rate) / g_primary_mau) * g_primary_mau;
2701 l_pay_sched_b.Prim_Due_Bucket3 := ROUND((l_Due_Bucket3_T * l_invoice.To_Prim_Rate) / g_primary_mau) * g_primary_mau;
2702 l_pay_sched_b.Prim_Past_Due_Bucket1 := ROUND((l_Past_Due_Bucket1_T * l_invoice.To_Prim_Rate) / g_primary_mau) * g_primary_mau;
2703 l_pay_sched_b.Prim_Past_Due_Bucket2 := ROUND((l_Past_Due_Bucket2_T * l_invoice.To_Prim_Rate) / g_primary_mau) * g_primary_mau;
2704 l_pay_sched_b.Prim_Past_Due_Bucket3 := ROUND((l_Past_Due_Bucket3_T * l_invoice.To_Prim_Rate) / g_primary_mau) * g_primary_mau;
2705 l_pay_sched_b.Sec_Amount_Remaining := ROUND((l_Amount_Remaining_T * l_invoice.To_Sec_Rate) / g_secondary_mau) * g_secondary_mau;
2706 l_pay_sched_b.Sec_Past_Due_Amount := ROUND((l_Past_Due_Amount_T * l_invoice.To_Sec_Rate) / g_secondary_mau) * g_secondary_mau;
2707 l_pay_sched_b.Sec_Discount_Available := 0;
2708 l_pay_sched_b.Sec_Discount_Taken := 0;
2709 l_pay_sched_b.Sec_Discount_Lost := 0;
2710 l_pay_sched_b.Sec_Payment_Amount := ROUND((l_Payment_Amount_T * l_invoice.To_Sec_Rate) / g_secondary_mau) * g_secondary_mau;
2711 l_pay_sched_b.Sec_On_Time_Payment_Amt := ROUND((l_On_Time_Payment_Amt_T * l_invoice.To_Sec_Rate) / g_secondary_mau) * g_secondary_mau;
2712 l_pay_sched_b.Sec_Late_Payment_Amt := ROUND((l_Late_Payment_Amt_T * l_invoice.To_Sec_Rate) / g_secondary_mau) * g_secondary_mau;
2713 l_pay_sched_b.Sec_Due_Bucket1 := ROUND((l_Due_Bucket1_T * l_invoice.To_Sec_Rate) / g_secondary_mau) * g_secondary_mau;
2714 l_pay_sched_b.Sec_Due_Bucket2 := ROUND((l_Due_Bucket2_T * l_invoice.To_Sec_Rate) / g_secondary_mau) * g_secondary_mau;
2715 l_pay_sched_b.Sec_Due_Bucket3 := ROUND((l_Due_Bucket3_T * l_invoice.To_Sec_Rate) / g_secondary_mau) * g_secondary_mau;
2716 l_pay_sched_b.Sec_Past_Due_Bucket1 := ROUND((l_Past_Due_Bucket1_T * l_invoice.To_Sec_Rate) / g_secondary_mau) * g_secondary_mau;
2717 l_pay_sched_b.Sec_Past_Due_Bucket2 := ROUND((l_Past_Due_Bucket2_T * l_invoice.To_Sec_Rate) / g_secondary_mau) * g_secondary_mau;
2718 l_pay_sched_b.Sec_Past_Due_Bucket3 := ROUND((l_Past_Due_Bucket3_T * l_invoice.To_Sec_Rate) / g_secondary_mau) * g_secondary_mau;
2719 IF l_ps_amount_remaining + l_pay_sched_b.Amount_Remaining = 0 THEN
2720 l_pay_sched_b.Fully_Paid_Date := l_pay_sched_b.Action_Date;
2721 ELSE l_pay_sched_b.Fully_Paid_Date := NULL;
2722 END IF;
2723 l_pay_sched_b.Check_ID := l_prepay_applied.Check_ID;
2724 --IBY CHANGE
2725 IF l_prepay_applied.Processing_Type IN ('ELECTRONIC') OR l_prepay_applied.Processing_Type IN ('EFT') OR l_prepay_applied.Processing_Type IN ('WIRE') THEN
2726 l_pay_sched_b.Payment_Method := 'E';
2727 ELSE l_pay_sched_b.Payment_Method := 'M';
2728 END IF;
2729 l_pay_sched_b.Last_Update_Date := sysdate;
2730 l_pay_sched_b.Last_Updated_By := g_fii_user_id;
2731 l_pay_sched_b.Creation_Date := sysdate;
2732 l_pay_sched_b.Created_By := l_pay_sched.Created_By;
2733 l_pay_sched_b.Last_Update_Login := g_fii_login_id;
2734 l_pay_sched_b.Check_Date := l_prepay_applied.Check_Date;
2735 l_pay_sched_b.Inv_Pymt_Flag := 'N';
2736 l_pay_sched_b.Unique_ID := l_prepay_applied.Check_ID;
2737
2738
2739 l_ps_amount_remaining := l_ps_amount_remaining + l_pay_sched_b.Amount_Remaining;
2740 l_last_action_date := l_pay_sched_b.Action_Date;
2741
2742 IF l_invoice.Pay_Sched_B_Flag = 'N' AND l_supplier_merge_flag = 'Y' THEN
2743 Insert_Pay_Sched_B_Rec(l_pay_sched_b, 'Y');
2744 ELSE Insert_Pay_Sched_B_Rec(l_pay_sched_b, 'N');
2745 END IF;
2746
2747 IF l_ps_amount_remaining = 0 THEN
2748 l_timestamp2_tmp := DBMS_UTILITY.Get_Time - l_timestamp2_tmp;
2749 l_timestamp2 := l_timestamp2 + l_timestamp2_tmp;
2750
2751 l_timestamp4_tmp := DBMS_UTILITY.Get_Time;
2752
2753 g_state := 'Updating aging buckets memory structure(s) with applied prepayment for Invoice ' || l_invoice.Invoice_ID || ', Payment Number ' || l_pay_sched.Payment_Num || '.';
2754
2755 IF l_inv_has_mult_ps = 'N' THEN
2756 l_aging_bkts_b.Time_ID := TO_NUMBER(TO_CHAR(l_pay_sched_b.Action_Date,'J'));
2757 l_aging_bkts_b.Period_Type_ID := 1;
2758 l_aging_bkts_b.Org_ID := l_invoice.Org_ID;
2759 l_aging_bkts_b.Supplier_ID := l_invoice.Supplier_ID;
2760 l_aging_bkts_b.Invoice_ID := l_invoice.Invoice_ID;
2761 l_aging_bkts_b.Action_Date := l_pay_sched_b.Action_Date;
2762 l_aging_bkts_b.Due_Bucket1_Cnt := l_ps_db1;
2763 l_aging_bkts_b.Due_Bucket2_Cnt := l_ps_db2;
2764 l_aging_bkts_b.Due_Bucket3_Cnt := l_ps_db3;
2765 l_aging_bkts_b.Past_Due_Bucket3_Cnt := l_ps_pdb3;
2766 l_aging_bkts_b.Past_Due_Bucket2_Cnt := l_ps_pdb2;
2767 l_aging_bkts_b.Past_Due_Bucket1_Cnt := l_ps_pdb1;
2768 l_aging_bkts_b.Last_Update_Date := sysdate;
2769 l_aging_bkts_b.Last_Updated_By := g_fii_user_id;
2770 l_aging_bkts_b.Creation_Date := sysdate;
2771 l_aging_bkts_b.Created_By := g_fii_user_id;
2772 l_aging_bkts_b.Last_Update_Login := g_fii_login_id;
2773 FII_AP_Aging_Bkts_B_MS(FII_AP_Aging_Bkts_B_MS.Count+1) := l_aging_bkts_b;
2774
2775 l_due_counts_b.Time_ID := TO_NUMBER(TO_CHAR(l_pay_sched_b.Action_Date,'J'));
2776 l_due_counts_b.Period_Type_ID := 1;
2777 l_due_counts_b.Org_ID := l_invoice.Org_ID;
2778 l_due_counts_b.Supplier_ID := l_invoice.Supplier_ID;
2779 l_due_counts_b.Invoice_ID := l_invoice.Invoice_ID;
2780 l_due_counts_b.Action_Date := l_pay_sched_b.Action_Date;
2781 l_due_counts_b.Due_Cnt := l_ps_db1 + l_ps_db2 + l_ps_db3;
2782 l_due_counts_b.Past_Due_Cnt := l_ps_pdb1 + l_ps_pdb2 + l_ps_pdb3;
2783 l_due_counts_b.Last_Update_Date := sysdate;
2784 l_due_counts_b.Last_Updated_By := g_fii_user_id;
2785 l_due_counts_b.Creation_Date := sysdate;
2786 l_due_counts_b.Created_By := g_fii_user_id;
2787 l_due_counts_b.Last_Update_Login := g_fii_login_id;
2788 FII_AP_Due_Counts_B_MS(FII_AP_Due_Counts_B_MS.Count+1) := l_due_counts_b;
2789
2790 ELSE
2791 BEGIN
2792 l_ps_aging := FII_AP_PS_Aging_MS(to_char(l_pay_sched_b.Action_Date, 'RRRR/MM/DD'));
2793
2794 l_ps_aging.Action_Date := l_ps_aging.Action_Date;
2795 l_ps_aging.Due_Bucket1 := l_ps_aging.Due_Bucket1 + l_ps_db1;
2796 l_ps_aging.Due_Bucket2 := l_ps_aging.Due_Bucket2 + l_ps_db2;
2797 l_ps_aging.Due_Bucket3 := l_ps_aging.Due_Bucket3 + l_ps_db3;
2798 l_ps_aging.Past_Due_Bucket3 := l_ps_aging.Past_Due_Bucket3 + l_ps_pdb3;
2799 l_ps_aging.Past_Due_Bucket2 := l_ps_aging.Past_Due_Bucket2 + l_ps_pdb2;
2800 l_ps_aging.Past_Due_Bucket1 := l_ps_aging.Past_Due_Bucket1 + l_ps_pdb1;
2801 FII_AP_PS_Aging_MS(to_char(l_ps_aging.Action_Date, 'RRRR/MM/DD')) := l_ps_aging;
2802
2803 EXCEPTION
2804 WHEN NO_DATA_FOUND THEN
2805
2806 l_ps_aging.Action_Date := l_pay_sched_b.Action_Date;
2807 l_ps_aging.Due_Bucket1 := l_ps_db1;
2808 l_ps_aging.Due_Bucket2 := l_ps_db2;
2809 l_ps_aging.Due_Bucket3 := l_ps_db3;
2810 l_ps_aging.Past_Due_Bucket3 := l_ps_pdb3;
2811 l_ps_aging.Past_Due_Bucket2 := l_ps_pdb2;
2812 l_ps_aging.Past_Due_Bucket1 := l_ps_pdb1;
2813 FII_AP_PS_Aging_MS(to_char(l_ps_aging.Action_Date, 'RRRR/MM/DD')) := l_ps_aging;
2814
2815 WHEN OTHERS THEN
2816 FII_UTIL.put_line('Error occured while inserting applied prepayment record into FII_AP_Aging_MS.');
2817 RAISE;
2818 END;
2819 END IF; --IF l_inv_has_mult_ps = 'N' THEN
2820
2821 l_timestamp4_tmp := DBMS_UTILITY.Get_Time - l_timestamp4_tmp;
2822 l_timestamp4 := l_timestamp4 + l_timestamp4_tmp;
2823
2824 l_timestamp2_tmp := DBMS_UTILITY.Get_Time - l_timestamp2_tmp;
2825
2826 END IF; --IF l_ps_amount_remaining = 0 THEN
2827 ELSIF l_invoice.Invoice_Type = 'PREPAYMENT' AND l_invoice.Cancel_Date IS NULL THEN
2828 l_ps_amount_remaining := l_ps_amount_remaining + ROUND(-1 * l_prepay_amount / l_invoice.Minimum_Accountable_Unit) * l_invoice.Minimum_Accountable_Unit;
2829 END IF; --IF l_invoice.Invoice_Type <> 'PREPAYMENT' AND l_invoice.Cancel_Date IS NULL THEN
2830 END;
2831 --Do not insert a Prepayment Applied 'PAYMENT', so insert a record from FII_AP_Pay_Sched_Temp_MS.
2832 ELSIF l_pay_sched_temp.Action = 'CREATION' THEN
2833 g_state := 'Inserting ''CREATION'' record for Invoice ' || l_invoice.Invoice_ID || ', Payment Number ' || l_pay_sched.Payment_Num || '.';
2834
2835 l_pay_sched_b.Time_ID := To_Number(To_Char(l_pay_sched_temp.Action_Date, 'J'));
2836 l_pay_sched_b.Period_Type_ID := 1;
2837 l_pay_sched_b.Action_Date := l_pay_sched_temp.Action_Date;
2838 l_pay_sched_b.Action := l_pay_sched_temp.Action;
2839 l_pay_sched_b.Update_Sequence := g_seq_id;
2840 l_pay_sched_b.Org_ID := l_invoice.Org_ID;
2841 l_pay_sched_b.Supplier_ID := l_invoice.Supplier_ID;
2842 l_pay_sched_b.Invoice_ID := l_invoice.Invoice_ID;
2843 l_pay_sched_b.Base_Currency_Code := l_invoice.Base_Currency_Code;
2844 l_pay_sched_b.Trx_Date := l_invoice.Invoice_Date;
2845 l_pay_sched_b.Payment_Num := l_pay_sched.Payment_Num;
2846 l_pay_sched_b.Due_Date := TRUNC(l_pay_sched.Due_Date);
2847 l_pay_sched_b.Amount_Remaining := l_pay_sched.Gross_Amount;
2848 IF TRUNC(l_pay_sched.Due_Date) - l_invoice.Entered_Date < 0 THEN
2849 l_pay_sched_b.Past_Due_Amount := l_pay_sched.Gross_Amount;
2850 ELSE l_pay_sched_b.Past_Due_Amount := 0;
2851 END IF;
2852 l_pay_sched_b.Discount_Available := l_pay_sched.Discount_Amount_Available;
2853 l_pay_sched_b.Discount_Taken := 0;
2854 l_pay_sched_b.Discount_Lost := 0;
2855 l_pay_sched_b.Payment_Amount := 0;
2856 l_pay_sched_b.On_Time_Payment_Amt := 0;
2857 l_pay_sched_b.Late_Payment_Amt := 0;
2858 l_pay_sched_b.No_Days_Late := 0;
2859
2860 IF TRUNC(l_pay_sched.Due_Date) - l_invoice.Entered_Date >= g_due_bucket1 THEN
2861 l_pay_sched_b.Due_Bucket1 := l_pay_sched.Gross_Amount;
2862 l_ps_db1 := 1;
2863 ELSE l_pay_sched_b.Due_Bucket1 := 0;
2864 END IF;
2865
2866 IF TRUNC(l_pay_sched.Due_Date) - l_invoice.Entered_Date <= g_due_bucket2
2867 AND TRUNC(l_pay_sched.Due_Date) - l_invoice.Entered_Date > g_due_bucket3 THEN
2868 l_pay_sched_b.Due_Bucket2 := l_pay_sched.Gross_Amount;
2869 l_ps_db2 := 1;
2870 ELSE l_pay_sched_b.Due_Bucket2 := 0;
2871 END IF;
2872
2873 IF TRUNC(l_pay_sched.Due_Date) - l_invoice.Entered_Date <= g_due_bucket3
2874 AND TRUNC(l_pay_sched.Due_Date) - l_invoice.Entered_Date >= 0 THEN
2875 l_pay_sched_b.Due_Bucket3 := l_pay_sched.Gross_Amount;
2876 l_ps_db3 := 1;
2877 ELSE l_pay_sched_b.Due_Bucket3 := 0;
2878 END IF;
2879
2880 IF l_invoice.Entered_Date - TRUNC(l_pay_sched.Due_Date) >= g_past_bucket1 THEN
2881 l_pay_sched_b.Past_Due_Bucket1 := l_pay_sched.Gross_Amount;
2882 l_ps_pdb1 := 1;
2883 ELSE l_pay_sched_b.Past_Due_Bucket1 := 0;
2884 END IF;
2885
2886 IF l_invoice.Entered_Date - TRUNC(l_pay_sched.Due_Date) <= g_past_bucket2
2887 AND l_invoice.Entered_Date - TRUNC(l_pay_sched.Due_Date) > g_past_bucket3 THEN
2888 l_pay_sched_b.Past_Due_Bucket2 := l_pay_sched.Gross_Amount;
2889 l_ps_pdb2 := 1;
2890 ELSE l_pay_sched_b.Past_Due_Bucket2 := 0;
2891 END IF;
2892
2893 IF l_invoice.Entered_Date - TRUNC(l_pay_sched.Due_Date) <= g_past_bucket3
2894 AND l_invoice.Entered_Date - TRUNC(l_pay_sched.Due_Date) > 0 THEN
2895 l_pay_sched_b.Past_Due_Bucket3 := l_pay_sched.Gross_Amount;
2896 l_ps_pdb3 := 1;
2897 ELSE l_pay_sched_b.Past_Due_Bucket3 := 0;
2898 END IF;
2899
2900 l_pay_sched_b.Amount_Remaining_B := ROUND((l_pay_sched_b.Amount_Remaining * l_invoice.To_Func_Rate)/l_invoice.Functional_MAU) * l_invoice.Functional_MAU;
2901 l_pay_sched_b.Past_Due_Amount_B := ROUND((l_pay_sched_b.Past_Due_Amount * l_invoice.To_Func_Rate)/l_invoice.Functional_MAU) * l_invoice.Functional_MAU;
2902 l_pay_sched_b.Discount_Available_B := ROUND((l_pay_sched_b.Discount_Available * l_invoice.To_Func_Rate)/l_invoice.Functional_MAU) * l_invoice.Functional_MAU;
2903 l_pay_sched_b.Discount_Taken_B := 0;
2904 l_pay_sched_b.Discount_Lost_B := 0;
2905 l_pay_sched_b.Payment_Amount_B := 0;
2906 l_pay_sched_b.On_Time_Payment_Amt_B := 0;
2907 l_pay_sched_b.Late_Payment_Amt_B := 0;
2908 l_pay_sched_b.Due_Bucket1_B := ROUND((l_pay_sched_b.Due_Bucket1 * l_invoice.To_Func_Rate)/l_invoice.Functional_MAU) * l_invoice.Functional_MAU;
2909 l_pay_sched_b.Due_Bucket2_B := ROUND((l_pay_sched_b.Due_Bucket2 * l_invoice.To_Func_Rate)/l_invoice.Functional_MAU) * l_invoice.Functional_MAU;
2910 l_pay_sched_b.Due_Bucket3_B := ROUND((l_pay_sched_b.Due_Bucket3 * l_invoice.To_Func_Rate)/l_invoice.Functional_MAU) * l_invoice.Functional_MAU;
2911 l_pay_sched_b.Past_Due_Bucket1_B := ROUND((l_pay_sched_b.Past_Due_Bucket1 * l_invoice.To_Func_Rate)/l_invoice.Functional_MAU) * l_invoice.Functional_MAU;
2912 l_pay_sched_b.Past_Due_Bucket2_B := ROUND((l_pay_sched_b.Past_Due_Bucket2 * l_invoice.To_Func_Rate)/l_invoice.Functional_MAU) * l_invoice.Functional_MAU;
2913 l_pay_sched_b.Past_Due_Bucket3_B := ROUND((l_pay_sched_b.Past_Due_Bucket3 * l_invoice.To_Func_Rate)/l_invoice.Functional_MAU) * l_invoice.Functional_MAU;
2914 l_pay_sched_b.Prim_Amount_Remaining := ROUND((l_pay_sched_b.Amount_Remaining * l_invoice.To_Prim_Rate) / g_primary_mau) * g_primary_mau;
2915 l_pay_sched_b.Prim_Past_Due_Amount := ROUND((l_pay_sched_b.Past_Due_Amount * l_invoice.To_Prim_Rate) / g_primary_mau) * g_primary_mau;
2916 l_pay_sched_b.Prim_Discount_Available := ROUND((l_pay_sched_b.Discount_Available * l_invoice.To_Prim_Rate) / g_primary_mau) * g_primary_mau;
2917 l_pay_sched_b.Prim_Discount_Taken := 0;
2918 l_pay_sched_b.Prim_Discount_Lost := 0;
2919 l_pay_sched_b.Prim_Payment_Amount := 0;
2920 l_pay_sched_b.Prim_On_Time_Payment_Amt := 0;
2921 l_pay_sched_b.Prim_Late_Payment_Amt := 0;
2922 l_pay_sched_b.Prim_Due_Bucket1 := ROUND((l_pay_sched_b.Due_Bucket1 * l_invoice.To_Prim_Rate) / g_primary_mau) * g_primary_mau;
2923 l_pay_sched_b.Prim_Due_Bucket2 := ROUND((l_pay_sched_b.Due_Bucket2 * l_invoice.To_Prim_Rate) / g_primary_mau) * g_primary_mau;
2924 l_pay_sched_b.Prim_Due_Bucket3 := ROUND((l_pay_sched_b.Due_Bucket3 * l_invoice.To_Prim_Rate) / g_primary_mau) * g_primary_mau;
2925 l_pay_sched_b.Prim_Past_Due_Bucket1 := ROUND((l_pay_sched_b.Past_Due_Bucket1 * l_invoice.To_Prim_Rate) / g_primary_mau) * g_primary_mau;
2926 l_pay_sched_b.Prim_Past_Due_Bucket2 := ROUND((l_pay_sched_b.Past_Due_Bucket2 * l_invoice.To_Prim_Rate) / g_primary_mau) * g_primary_mau;
2927 l_pay_sched_b.Prim_Past_Due_Bucket3 := ROUND((l_pay_sched_b.Past_Due_Bucket3 * l_invoice.To_Prim_Rate) / g_primary_mau) * g_primary_mau;
2928 l_pay_sched_b.Sec_Amount_Remaining := ROUND((l_pay_sched_b.Amount_Remaining * l_invoice.To_Sec_Rate) / g_secondary_mau) * g_secondary_mau;
2929 l_pay_sched_b.Sec_Past_Due_Amount := ROUND((l_pay_sched_b.Past_Due_Amount * l_invoice.To_Sec_Rate) / g_secondary_mau) * g_secondary_mau;
2930 l_pay_sched_b.Sec_Discount_Available := ROUND((l_pay_sched_b.Discount_Available * l_invoice.To_Sec_Rate) / g_secondary_mau) * g_secondary_mau;
2931 l_pay_sched_b.Sec_Discount_Taken := 0;
2932 l_pay_sched_b.Sec_Discount_Lost := 0;
2933 l_pay_sched_b.Sec_Payment_Amount := 0;
2934 l_pay_sched_b.Sec_On_Time_Payment_Amt := 0;
2935 l_pay_sched_b.Sec_Late_Payment_Amt := 0;
2936 l_pay_sched_b.Sec_Due_Bucket1 := ROUND((l_pay_sched_b.Due_Bucket1 * l_invoice.To_Sec_Rate) / g_secondary_mau) * g_secondary_mau;
2937 l_pay_sched_b.Sec_Due_Bucket2 := ROUND((l_pay_sched_b.Due_Bucket2 * l_invoice.To_Sec_Rate) / g_secondary_mau) * g_secondary_mau;
2938 l_pay_sched_b.Sec_Due_Bucket3 := ROUND((l_pay_sched_b.Due_Bucket3 * l_invoice.To_Sec_Rate) / g_secondary_mau) * g_secondary_mau;
2939 l_pay_sched_b.Sec_Past_Due_Bucket1 := ROUND((l_pay_sched_b.Past_Due_Bucket1 * l_invoice.To_Sec_Rate) / g_secondary_mau) * g_secondary_mau;
2940 l_pay_sched_b.Sec_Past_Due_Bucket2 := ROUND((l_pay_sched_b.Past_Due_Bucket2 * l_invoice.To_Sec_Rate) / g_secondary_mau) * g_secondary_mau;
2941 l_pay_sched_b.Sec_Past_Due_Bucket3 := ROUND((l_pay_sched_b.Past_Due_Bucket3 * l_invoice.To_Sec_Rate) / g_secondary_mau) * g_secondary_mau;
2942 l_pay_sched_b.Fully_Paid_Date := NULL;
2943 l_pay_sched_b.Check_ID := NULL;
2944 l_pay_sched_b.Payment_Method := NULL;
2945 l_pay_sched_b.Last_Update_Date := sysdate;
2946 l_pay_sched_b.Last_Updated_By := g_fii_user_id;
2947 l_pay_sched_b.Creation_Date := sysdate;
2948 l_pay_sched_b.Created_By := l_pay_sched.Created_By;
2949 l_pay_sched_b.Last_Update_Login := g_fii_login_id;
2950 l_pay_sched_b.Check_Date := NULL;
2951
2952
2953 l_ps_disc_avail := l_ps_disc_avail + l_pay_sched_b.Discount_Available;
2954 l_last_action_date := l_pay_sched_b.Action_Date;
2955
2956 IF l_invoice.Pay_Sched_B_Flag = 'N' AND l_supplier_merge_flag = 'Y' THEN
2957 Insert_Pay_Sched_B_Rec(l_pay_sched_b, 'Y');
2958 ELSE Insert_Pay_Sched_B_Rec(l_pay_sched_b, 'N');
2959 END IF;
2960
2961 l_timestamp2_tmp := DBMS_UTILITY.Get_Time - l_timestamp2_tmp;
2962 l_timestamp2 := l_timestamp2 + l_timestamp2_tmp;
2963
2964 l_timestamp4_tmp := DBMS_UTILITY.Get_Time;
2965
2966 g_state := 'Updating aging buckets memory structure(s) with creation record for Invoice ' || l_invoice.Invoice_ID || ', Payment Number ' || l_pay_sched.Payment_Num || '.';
2967 IF l_inv_has_mult_ps = 'N' THEN
2968 l_aging_bkts_b.Time_ID := TO_NUMBER(TO_CHAR(l_pay_sched_b.Action_Date,'J'));
2969 l_aging_bkts_b.Period_Type_ID := 1;
2970 l_aging_bkts_b.Org_ID := l_invoice.Org_ID;
2971 l_aging_bkts_b.Supplier_ID := l_invoice.Supplier_ID;
2972 l_aging_bkts_b.Invoice_ID := l_invoice.Invoice_ID;
2973 l_aging_bkts_b.Action_Date := l_pay_sched_b.Action_Date;
2974 l_aging_bkts_b.Due_Bucket1_Cnt := l_ps_db1;
2975 l_aging_bkts_b.Due_Bucket2_Cnt := l_ps_db2;
2976 l_aging_bkts_b.Due_Bucket3_Cnt := l_ps_db3;
2977 l_aging_bkts_b.Past_Due_Bucket3_Cnt := l_ps_pdb3;
2978 l_aging_bkts_b.Past_Due_Bucket2_Cnt := l_ps_pdb2;
2979 l_aging_bkts_b.Past_Due_Bucket1_Cnt := l_ps_pdb1;
2980 l_aging_bkts_b.Last_Update_Date := sysdate;
2981 l_aging_bkts_b.Last_Updated_By := g_fii_user_id;
2982 l_aging_bkts_b.Creation_Date := sysdate;
2983 l_aging_bkts_b.Created_By := g_fii_user_id;
2984 l_aging_bkts_b.Last_Update_Login := g_fii_login_id;
2985 FII_AP_Aging_Bkts_B_MS(FII_AP_Aging_Bkts_B_MS.Count+1) := l_aging_bkts_b;
2986
2987 l_due_counts_b.Time_ID := TO_NUMBER(TO_CHAR(l_pay_sched_b.Action_Date,'J'));
2988 l_due_counts_b.Period_Type_ID := 1;
2989 l_due_counts_b.Org_ID := l_invoice.Org_ID;
2990 l_due_counts_b.Supplier_ID := l_invoice.Supplier_ID;
2991 l_due_counts_b.Invoice_ID := l_invoice.Invoice_ID;
2992 l_due_counts_b.Action_Date := l_pay_sched_b.Action_Date;
2993 l_due_counts_b.Due_Cnt := l_ps_db1 + l_ps_db2 + l_ps_db3;
2994 l_due_counts_b.Past_Due_Cnt := l_ps_pdb1 + l_ps_pdb2 + l_ps_pdb3;
2995 l_due_counts_b.Last_Update_Date := sysdate;
2996 l_due_counts_b.Last_Updated_By := g_fii_user_id;
2997 l_due_counts_b.Creation_Date := sysdate;
2998 l_due_counts_b.Created_By := g_fii_user_id;
2999 l_due_counts_b.Last_Update_Login := g_fii_login_id;
3000 FII_AP_Due_Counts_B_MS(FII_AP_Due_Counts_B_MS.Count+1) := l_due_counts_b;
3001
3002
3003 ELSE
3004 BEGIN
3005 l_ps_aging := FII_AP_PS_Aging_MS(to_char(l_pay_sched_b.Action_Date, 'RRRR/MM/DD'));
3006
3007 l_ps_aging.Action_Date := l_ps_aging.Action_Date;
3008 l_ps_aging.Due_Bucket1 := l_ps_aging.Due_Bucket1 + l_ps_db1;
3009 l_ps_aging.Due_Bucket2 := l_ps_aging.Due_Bucket2 + l_ps_db2;
3010 l_ps_aging.Due_Bucket3 := l_ps_aging.Due_Bucket3 + l_ps_db3;
3011 l_ps_aging.Past_Due_Bucket3 := l_ps_aging.Past_Due_Bucket3 + l_ps_pdb3;
3012 l_ps_aging.Past_Due_Bucket2 := l_ps_aging.Past_Due_Bucket2 + l_ps_pdb2;
3013 l_ps_aging.Past_Due_Bucket1 := l_ps_aging.Past_Due_Bucket1 + l_ps_pdb1;
3014 FII_AP_PS_Aging_MS(to_char(l_ps_aging.Action_Date, 'RRRR/MM/DD')) := l_ps_aging;
3015
3016 EXCEPTION
3017 WHEN NO_DATA_FOUND THEN
3018
3019 l_ps_aging.Action_Date := l_pay_sched_b.Action_Date;
3020 l_ps_aging.Due_Bucket1 := l_ps_db1;
3021 l_ps_aging.Due_Bucket2 := l_ps_db2;
3022 l_ps_aging.Due_Bucket3 := l_ps_db3;
3023 l_ps_aging.Past_Due_Bucket3 := l_ps_pdb3;
3024 l_ps_aging.Past_Due_Bucket2 := l_ps_pdb2;
3025 l_ps_aging.Past_Due_Bucket1 := l_ps_pdb1;
3026 FII_AP_PS_Aging_MS(to_char(l_ps_aging.Action_Date, 'RRRR/MM/DD')) := l_ps_aging;
3027
3028 WHEN OTHERS THEN
3029 FII_UTIL.put_line('Error occured while inserting creation record into FII_AP_Aging_MS.');
3030 RAISE;
3031 END;
3032 END IF;
3033
3034 l_timestamp4_tmp := DBMS_UTILITY.Get_Time - l_timestamp4_tmp;
3035 l_timestamp4 := l_timestamp4 + l_timestamp4_tmp;
3036
3037 l_timestamp2_tmp := DBMS_UTILITY.Get_Time - l_timestamp2_tmp;
3038
3039 l_pay_sched_temp_marker := FII_AP_Pay_Sched_Temp_MS.Next(l_pay_sched_temp_marker);
3040
3041 ELSIF l_pay_sched_temp.Action = 'DISCOUNT' THEN
3042 IF l_ps_amount_remaining <> 0 THEN
3043 g_state := 'Inserting discount record for Invoice ' || l_invoice.Invoice_ID || ', Payment Number ' || l_pay_sched.Payment_Num || ', Discount Number ' || l_pay_sched_temp.Number1 || '.';
3044
3045 l_pay_sched_b.Time_ID := To_Number(To_Char(l_pay_sched_temp.Action_Date, 'J'));
3046 l_pay_sched_b.Period_Type_ID := 1;
3047 l_pay_sched_b.Action_Date := l_pay_sched_temp.Action_Date;
3048 l_pay_sched_b.Action := l_pay_sched_temp.Action;
3049 l_pay_sched_b.Update_Sequence := g_seq_id;
3050 l_pay_sched_b.Org_ID := l_invoice.Org_ID;
3051 l_pay_sched_b.Supplier_ID := l_invoice.Supplier_ID;
3052 l_pay_sched_b.Invoice_ID := l_invoice.Invoice_ID;
3053 l_pay_sched_b.Base_Currency_Code := l_invoice.Base_Currency_Code;
3054 l_pay_sched_b.Trx_Date := l_invoice.Invoice_Date;
3055 l_pay_sched_b.Payment_Num := l_pay_sched.Payment_Num;
3056 l_pay_sched_b.Due_Date := TRUNC(l_pay_sched.Due_Date);
3057 l_pay_sched_b.Amount_Remaining := 0;
3058 l_pay_sched_b.Past_Due_Amount := 0;
3059 IF l_pay_sched_temp.Number1 = 1 THEN
3060 l_pay_sched_b.Discount_Available := -1 * (l_pay_sched.Discount_Amount_Available
3061 - l_ps_disc_recently_taken
3062 - l_pay_sched.Second_Disc_Amt_Available);
3063 l_pay_sched_b.Discount_Lost := l_pay_sched.Discount_Amount_Available
3064 - l_ps_disc_recently_taken
3065 - l_pay_sched.Second_Disc_Amt_Available;
3066 ELSIF l_pay_sched_temp.Number1 = 2 THEN
3067 l_pay_sched_b.Discount_Available := -1 * (l_pay_sched.Second_Disc_Amt_Available
3068 - l_ps_disc_recently_taken
3069 - l_pay_sched.Third_Disc_Amt_Available);
3070 l_pay_sched_b.Discount_Lost := l_pay_sched.Second_Disc_Amt_Available
3071 - l_ps_disc_recently_taken
3072 - l_pay_sched.Third_Disc_Amt_Available;
3073 ELSIF l_pay_sched_temp.Number1 = 3 THEN
3074 l_pay_sched_b.Discount_Available := -1 * (l_pay_sched.Third_Disc_Amt_Available
3075 - l_ps_disc_recently_taken);
3076 l_pay_sched_b.Discount_Lost := l_pay_sched.Third_Disc_Amt_Available
3077 - l_ps_disc_recently_taken;
3078 END IF;
3079 l_pay_sched_b.Discount_Taken := 0;
3080 l_pay_sched_b.Payment_Amount := 0;
3081 l_pay_sched_b.On_Time_Payment_Amt := 0;
3082 l_pay_sched_b.Late_Payment_Amt := 0;
3083 l_pay_sched_b.No_Days_Late := 0;
3084 l_pay_sched_b.Due_Bucket1 := 0;
3085 l_pay_sched_b.Due_Bucket2 := 0;
3086 l_pay_sched_b.Due_Bucket3 := 0;
3087 l_pay_sched_b.Past_Due_Bucket1 := 0;
3088 l_pay_sched_b.Past_Due_Bucket2 := 0;
3089 l_pay_sched_b.Past_Due_Bucket3 := 0;
3090 l_pay_sched_b.Amount_Remaining_B := 0;
3091 l_pay_sched_b.Past_Due_Amount_B := 0;
3092 l_pay_sched_b.Discount_Available_B := ROUND((l_pay_sched_b.Discount_Available * l_invoice.To_Func_Rate)/l_invoice.Functional_MAU) * l_invoice.Functional_MAU;
3093 l_pay_sched_b.Discount_Taken_B := 0;
3094 l_pay_sched_b.Discount_Lost_B := ROUND((l_pay_sched_b.Discount_Lost * l_invoice.To_Func_Rate)/l_invoice.Functional_MAU) * l_invoice.Functional_MAU;
3095 l_pay_sched_b.Payment_Amount_B := 0;
3096 l_pay_sched_b.On_Time_Payment_Amt_B := 0;
3097 l_pay_sched_b.Late_Payment_Amt_B := 0;
3098 l_pay_sched_b.Due_Bucket1_B := 0;
3099 l_pay_sched_b.Due_Bucket2_B := 0;
3100 l_pay_sched_b.Due_Bucket3_B := 0;
3101 l_pay_sched_b.Past_Due_Bucket1_B := 0;
3102 l_pay_sched_b.Past_Due_Bucket2_B := 0;
3103 l_pay_sched_b.Past_Due_Bucket3_B := 0;
3104 l_pay_sched_b.Prim_Amount_Remaining := 0;
3105 l_pay_sched_b.Prim_Past_Due_Amount := 0;
3106 l_pay_sched_b.Prim_Discount_Available := ROUND((l_pay_sched_b.Discount_Available * l_invoice.To_Prim_Rate) / g_primary_mau) * g_primary_mau;
3107 l_pay_sched_b.Prim_Discount_Taken := 0;
3108 l_pay_sched_b.Prim_Discount_Lost := ROUND((l_pay_sched_b.Discount_Lost * l_invoice.To_Prim_Rate) / g_primary_mau) * g_primary_mau;
3109 l_pay_sched_b.Prim_Payment_Amount := 0;
3110 l_pay_sched_b.Prim_On_Time_Payment_Amt := 0;
3111 l_pay_sched_b.Prim_Late_Payment_Amt := 0;
3112 l_pay_sched_b.Prim_Due_Bucket1 := 0;
3113 l_pay_sched_b.Prim_Due_Bucket2 := 0;
3114 l_pay_sched_b.Prim_Due_Bucket3 := 0;
3115 l_pay_sched_b.Prim_Past_Due_Bucket1 := 0;
3116 l_pay_sched_b.Prim_Past_Due_Bucket2 := 0;
3117 l_pay_sched_b.Prim_Past_Due_Bucket3 := 0;
3118 l_pay_sched_b.Sec_Amount_Remaining := 0;
3119 l_pay_sched_b.Sec_Past_Due_Amount := 0;
3120 l_pay_sched_b.Sec_Discount_Available := ROUND((l_pay_sched_b.Discount_Available * l_invoice.To_Sec_Rate) / g_secondary_mau) * g_secondary_mau;
3121 l_pay_sched_b.Sec_Discount_Taken := 0;
3122 l_pay_sched_b.Sec_Discount_Lost := ROUND((l_pay_sched_b.Discount_Lost * l_invoice.To_Sec_Rate) / g_secondary_mau) * g_secondary_mau;
3123 l_pay_sched_b.Sec_Payment_Amount := 0;
3124 l_pay_sched_b.Sec_On_Time_Payment_Amt := 0;
3125 l_pay_sched_b.Sec_Late_Payment_Amt := 0;
3126 l_pay_sched_b.Sec_Due_Bucket1 := 0;
3127 l_pay_sched_b.Sec_Due_Bucket2 := 0;
3128 l_pay_sched_b.Sec_Due_Bucket3 := 0;
3129 l_pay_sched_b.Sec_Past_Due_Bucket1 := 0;
3130 l_pay_sched_b.Sec_Past_Due_Bucket2 := 0;
3131 l_pay_sched_b.Sec_Past_Due_Bucket3 := 0;
3132 l_pay_sched_b.Fully_Paid_Date := NULL;
3133 l_pay_sched_b.Check_ID := NULL;
3134 l_pay_sched_b.Payment_Method := NULL;
3135 l_pay_sched_b.Last_Update_Date := sysdate;
3136 l_pay_sched_b.Last_Updated_By := g_fii_user_id;
3137 l_pay_sched_b.Creation_Date := sysdate;
3138 l_pay_sched_b.Created_By := l_pay_sched.Created_By;
3139 l_pay_sched_b.Last_Update_Login := g_fii_login_id;
3140 l_pay_sched_b.Check_Date := NULL;
3141 l_pay_sched_b.Unique_ID := l_pay_sched_temp.Number1;
3142
3143 l_ps_disc_avail := l_ps_disc_avail + l_pay_sched_b.Discount_Available;
3144 l_ps_disc_lost := l_ps_disc_lost + l_pay_sched_b.Discount_Lost;
3145 l_ps_disc_recently_taken := 0;
3146 l_last_action_date := l_pay_sched_b.Action_Date;
3147
3148 IF l_invoice.Pay_Sched_B_Flag = 'N' AND l_supplier_merge_flag = 'Y' THEN
3149 Insert_Pay_Sched_B_Rec(l_pay_sched_b, 'Y');
3150 ELSE Insert_Pay_Sched_B_Rec(l_pay_sched_b, 'N');
3151 END IF;
3152
3153
3154 END IF; --IF l_ps_amount_remaining > 0 THEN
3155 l_pay_sched_temp_marker := FII_AP_Pay_Sched_Temp_MS.Next(l_pay_sched_temp_marker);
3156
3157 ELSIF l_pay_sched_temp.Action IN ('DUE BUCKET', 'DUE', 'PAST BUCKET') THEN
3158 IF l_ps_amount_remaining <> 0 THEN
3159
3160 g_state := 'Inserting Due Bucket/Due/Past Bucket record for Invoice ' || l_invoice.Invoice_ID || ', Payment Number ' || l_pay_sched.Payment_Num || ', Date ' || l_pay_sched_temp.Action_Date || '.';
3161
3162 l_pay_sched_b.Time_ID := To_Number(To_Char(l_pay_sched_temp.Action_Date, 'J'));
3163 l_pay_sched_b.Period_Type_ID := 1;
3164 l_pay_sched_b.Action_Date := l_pay_sched_temp.Action_Date;
3165 l_pay_sched_b.Action := l_pay_sched_temp.Action;
3166 l_pay_sched_b.Update_Sequence := g_seq_id;
3167 l_pay_sched_b.Org_ID := l_invoice.Org_ID;
3168 l_pay_sched_b.Supplier_ID := l_invoice.Supplier_ID;
3169 l_pay_sched_b.Invoice_ID := l_invoice.Invoice_ID;
3170 l_pay_sched_b.Base_Currency_Code := l_invoice.Base_Currency_Code;
3171 l_pay_sched_b.Trx_Date := l_invoice.Invoice_Date;
3172 l_pay_sched_b.Payment_Num := l_pay_sched.Payment_Num;
3173 l_pay_sched_b.Due_Date := TRUNC(l_pay_sched.Due_Date);
3174 l_pay_sched_b.Amount_Remaining := 0;
3175 IF l_pay_sched_temp.Action = 'DUE' THEN
3176 l_pay_sched_b.Past_Due_Amount := l_ps_amount_remaining;
3177 ELSE l_pay_sched_b.Past_Due_Amount := 0;
3178 END IF;
3179 l_pay_sched_b.Discount_Available := 0;
3180 l_pay_sched_b.Discount_Taken := 0;
3181 l_pay_sched_b.Discount_Lost := 0;
3182 l_pay_sched_b.Payment_Amount := 0;
3183 l_pay_sched_b.On_Time_Payment_Amt := 0;
3184 l_pay_sched_b.Late_Payment_Amt := 0;
3185 l_pay_sched_b.No_Days_Late := 0;
3186
3187 IF l_pay_sched_temp.Action = 'DUE BUCKET' AND l_pay_sched_temp.Number1 = 1 THEN
3188 l_pay_sched_b.Due_Bucket1 := -1 * l_ps_amount_remaining;
3189 l_ps_db1 := -1;
3190 ELSE l_pay_sched_b.Due_Bucket1 := 0;
3191 END IF;
3192
3193 IF l_pay_sched_temp.Action = 'DUE BUCKET' AND l_pay_sched_temp.Number1 = 1 THEN
3194 l_pay_sched_b.Due_Bucket2 := l_ps_amount_remaining;
3195 l_ps_db2 := 1;
3196 ELSIF l_pay_sched_temp.Action = 'DUE BUCKET' AND l_pay_sched_temp.Number1 = 2 THEN
3197 l_pay_sched_b.Due_Bucket2 := -1 * l_ps_amount_remaining;
3198 l_ps_db2 := -1;
3199 ELSE l_pay_sched_b.Due_Bucket2 := 0;
3200 END IF;
3201
3202 IF l_pay_sched_temp.Action = 'DUE BUCKET' AND l_pay_sched_temp.Number1 = 2 THEN
3203 l_pay_sched_b.Due_Bucket3 := l_ps_amount_remaining;
3204 l_ps_db3 := 1;
3205 ELSIF l_pay_sched_temp.Action = 'DUE' THEN
3206 l_pay_sched_b.Due_Bucket3 := -1 * l_ps_amount_remaining;
3207 l_ps_db3 := -1;
3208 ELSE l_pay_sched_b.Due_Bucket3 := 0;
3209 END IF;
3210
3211 IF l_pay_sched_temp.Action = 'PAST BUCKET' AND l_pay_sched_temp.Number1 = 2 THEN
3212 l_pay_sched_b.Past_Due_Bucket1 := l_ps_amount_remaining;
3213 l_ps_pdb1 := 1;
3214 ELSE l_pay_sched_b.Past_Due_Bucket1 := 0;
3215 END IF;
3216
3217 IF l_pay_sched_temp.Action = 'PAST BUCKET' AND l_pay_sched_temp.Number1 = 1 THEN
3218 l_pay_sched_b.Past_Due_Bucket2 := l_ps_amount_remaining;
3219 l_ps_pdb2 := 1;
3220 ELSIF l_pay_sched_temp.Action = 'PAST BUCKET' AND l_pay_sched_temp.Number1 = 2 THEN
3221 l_pay_sched_b.Past_Due_Bucket2 := -1 * l_ps_amount_remaining;
3222 l_ps_pdb2 := -1;
3223 ELSE l_pay_sched_b.Past_Due_Bucket2 := 0;
3224 END IF;
3225
3226 IF l_pay_sched_temp.Action = 'DUE' THEN
3227 l_pay_sched_b.Past_Due_Bucket3 := l_ps_amount_remaining;
3228 l_ps_pdb3 := 1;
3229 ELSIF l_pay_sched_temp.Action = 'PAST BUCKET' AND l_pay_sched_temp.Number1 = 1 THEN
3230 l_pay_sched_b.Past_Due_Bucket3 := -1 * l_ps_amount_remaining;
3231 l_ps_pdb3 := -1;
3232 ELSE l_pay_sched_b.Past_Due_Bucket3 := 0;
3233 END IF;
3234
3235 l_pay_sched_b.Amount_Remaining_B := 0;
3236 l_pay_sched_b.Past_Due_Amount_B := ROUND((l_pay_sched_b.Past_Due_Amount * l_invoice.To_Func_Rate)/l_invoice.Functional_MAU) * l_invoice.Functional_MAU;
3237 l_pay_sched_b.Discount_Available_B := 0;
3238 l_pay_sched_b.Discount_Taken_B := 0;
3239 l_pay_sched_b.Discount_Lost_B := 0;
3240 l_pay_sched_b.Payment_Amount_B := 0;
3241 l_pay_sched_b.On_Time_Payment_Amt_B := 0;
3242 l_pay_sched_b.Late_Payment_Amt_B := 0;
3243 l_pay_sched_b.Due_Bucket1_B := ROUND((l_pay_sched_b.Due_Bucket1 * l_invoice.To_Func_Rate)/l_invoice.Functional_MAU) * l_invoice.Functional_MAU;
3244 l_pay_sched_b.Due_Bucket2_B := ROUND((l_pay_sched_b.Due_Bucket2 * l_invoice.To_Func_Rate)/l_invoice.Functional_MAU) * l_invoice.Functional_MAU;
3245 l_pay_sched_b.Due_Bucket3_B := ROUND((l_pay_sched_b.Due_Bucket3 * l_invoice.To_Func_Rate)/l_invoice.Functional_MAU) * l_invoice.Functional_MAU;
3246 l_pay_sched_b.Past_Due_Bucket1_B := ROUND((l_pay_sched_b.Past_Due_Bucket1 * l_invoice.To_Func_Rate)/l_invoice.Functional_MAU) * l_invoice.Functional_MAU;
3247 l_pay_sched_b.Past_Due_Bucket2_B := ROUND((l_pay_sched_b.Past_Due_Bucket2 * l_invoice.To_Func_Rate)/l_invoice.Functional_MAU) * l_invoice.Functional_MAU;
3248 l_pay_sched_b.Past_Due_Bucket3_B := ROUND((l_pay_sched_b.Past_Due_Bucket3 * l_invoice.To_Func_Rate)/l_invoice.Functional_MAU) * l_invoice.Functional_MAU;
3249 l_pay_sched_b.Prim_Amount_Remaining := 0;
3250 l_pay_sched_b.Prim_Past_Due_Amount := ROUND((l_pay_sched_b.Past_Due_Amount * l_invoice.To_Prim_Rate) / g_primary_mau) * g_primary_mau;
3251 l_pay_sched_b.Prim_Discount_Available := 0;
3252 l_pay_sched_b.Prim_Discount_Taken := 0;
3253 l_pay_sched_b.Prim_Discount_Lost := 0;
3254 l_pay_sched_b.Prim_Payment_Amount := 0;
3255 l_pay_sched_b.Prim_On_Time_Payment_Amt := 0;
3256 l_pay_sched_b.Prim_Late_Payment_Amt := 0;
3257 l_pay_sched_b.Prim_Due_Bucket1 := ROUND((l_pay_sched_b.Due_Bucket1 * l_invoice.To_Prim_Rate) / g_primary_mau) * g_primary_mau;
3258 l_pay_sched_b.Prim_Due_Bucket2 := ROUND((l_pay_sched_b.Due_Bucket2 * l_invoice.To_Prim_Rate) / g_primary_mau) * g_primary_mau;
3259 l_pay_sched_b.Prim_Due_Bucket3 := ROUND((l_pay_sched_b.Due_Bucket3 * l_invoice.To_Prim_Rate) / g_primary_mau) * g_primary_mau;
3260 l_pay_sched_b.Prim_Past_Due_Bucket1 := ROUND((l_pay_sched_b.Past_Due_Bucket1 * l_invoice.To_Prim_Rate) / g_primary_mau) * g_primary_mau;
3261 l_pay_sched_b.Prim_Past_Due_Bucket2 := ROUND((l_pay_sched_b.Past_Due_Bucket2 * l_invoice.To_Prim_Rate) / g_primary_mau) * g_primary_mau;
3262 l_pay_sched_b.Prim_Past_Due_Bucket3 := ROUND((l_pay_sched_b.Past_Due_Bucket3 * l_invoice.To_Prim_Rate) / g_primary_mau) * g_primary_mau;
3263 l_pay_sched_b.Sec_Amount_Remaining := 0;
3264 l_pay_sched_b.Sec_Past_Due_Amount := ROUND((l_pay_sched_b.Past_Due_Amount * l_invoice.To_Sec_Rate) / g_secondary_mau) * g_secondary_mau;
3265 l_pay_sched_b.Sec_Discount_Available := 0;
3266 l_pay_sched_b.Sec_Discount_Taken := 0;
3267 l_pay_sched_b.Sec_Discount_Lost := 0;
3268 l_pay_sched_b.Sec_Payment_Amount := 0;
3269 l_pay_sched_b.Sec_On_Time_Payment_Amt := 0;
3270 l_pay_sched_b.Sec_Late_Payment_Amt := 0;
3271 l_pay_sched_b.Sec_Due_Bucket1 := ROUND((l_pay_sched_b.Due_Bucket1 * l_invoice.To_Sec_Rate) / g_secondary_mau) * g_secondary_mau;
3272 l_pay_sched_b.Sec_Due_Bucket2 := ROUND((l_pay_sched_b.Due_Bucket2 * l_invoice.To_Sec_Rate) / g_secondary_mau) * g_secondary_mau;
3273 l_pay_sched_b.Sec_Due_Bucket3 := ROUND((l_pay_sched_b.Due_Bucket3 * l_invoice.To_Sec_Rate) / g_secondary_mau) * g_secondary_mau;
3274 l_pay_sched_b.Sec_Past_Due_Bucket1 := ROUND((l_pay_sched_b.Past_Due_Bucket1 * l_invoice.To_Sec_Rate) / g_secondary_mau) * g_secondary_mau;
3275 l_pay_sched_b.Sec_Past_Due_Bucket2 := ROUND((l_pay_sched_b.Past_Due_Bucket2 * l_invoice.To_Sec_Rate) / g_secondary_mau) * g_secondary_mau;
3276 l_pay_sched_b.Sec_Past_Due_Bucket3 := ROUND((l_pay_sched_b.Past_Due_Bucket3 * l_invoice.To_Sec_Rate) / g_secondary_mau) * g_secondary_mau;
3277 l_pay_sched_b.Fully_Paid_Date := NULL;
3278 l_pay_sched_b.Check_ID := NULL;
3279 l_pay_sched_b.Payment_Method := NULL;
3280 l_pay_sched_b.Last_Update_Date := sysdate;
3281 l_pay_sched_b.Last_Updated_By := g_fii_user_id;
3282 l_pay_sched_b.Creation_Date := sysdate;
3283 l_pay_sched_b.Created_By := l_pay_sched.Created_By;
3284 l_pay_sched_b.Last_Update_Login := g_fii_login_id;
3285 l_pay_sched_b.Check_Date := NULL;
3286
3287 l_last_action_date := l_pay_sched_b.Action_Date;
3288
3289 IF l_invoice.Pay_Sched_B_Flag = 'N' AND l_supplier_merge_flag = 'Y' THEN
3290 Insert_Pay_Sched_B_Rec(l_pay_sched_b, 'Y');
3291 ELSE Insert_Pay_Sched_B_Rec(l_pay_sched_b, 'N');
3292 END IF;
3293
3294 l_timestamp2_tmp := DBMS_UTILITY.Get_Time - l_timestamp2_tmp;
3295 l_timestamp2 := l_timestamp2 + l_timestamp2_tmp;
3296
3297 l_timestamp4_tmp := DBMS_UTILITY.Get_Time;
3298
3299 g_state := 'Updating aging buckets memory structure(s) with Due Bucket/Due/Past Bucket for Invoice ' || l_invoice.Invoice_ID || ', Payment Number ' || l_pay_sched.Payment_Num || ', Date ' || l_pay_sched_b.Action_Date || '.';
3300
3301 IF l_inv_has_mult_ps = 'N' THEN
3302 l_aging_bkts_b.Time_ID := TO_NUMBER(TO_CHAR(l_pay_sched_b.Action_Date,'J'));
3303 l_aging_bkts_b.Period_Type_ID := 1;
3304 l_aging_bkts_b.Org_ID := l_invoice.Org_ID;
3305 l_aging_bkts_b.Supplier_ID := l_invoice.Supplier_ID;
3306 l_aging_bkts_b.Invoice_ID := l_invoice.Invoice_ID;
3307 l_aging_bkts_b.Action_Date := l_pay_sched_b.Action_Date;
3308 l_aging_bkts_b.Due_Bucket1_Cnt := l_ps_db1;
3309 l_aging_bkts_b.Due_Bucket2_Cnt := l_ps_db2;
3310 l_aging_bkts_b.Due_Bucket3_Cnt := l_ps_db3;
3311 l_aging_bkts_b.Past_Due_Bucket3_Cnt := l_ps_pdb3;
3312 l_aging_bkts_b.Past_Due_Bucket2_Cnt := l_ps_pdb2;
3313 l_aging_bkts_b.Past_Due_Bucket1_Cnt := l_ps_pdb1;
3314 l_aging_bkts_b.Last_Update_Date := sysdate;
3315 l_aging_bkts_b.Last_Updated_By := g_fii_user_id;
3316 l_aging_bkts_b.Creation_Date := sysdate;
3317 l_aging_bkts_b.Created_By := g_fii_user_id;
3318 l_aging_bkts_b.Last_Update_Login := g_fii_login_id;
3319 FII_AP_Aging_Bkts_B_MS(FII_AP_Aging_Bkts_B_MS.Count+1) := l_aging_bkts_b;
3320
3321 IF l_ps_db1 + l_ps_db2 + l_ps_db3 <> 0 OR
3322 l_ps_pdb1 + l_ps_pdb2 + l_ps_pdb3 <> 0 THEN
3323 l_due_counts_b.Time_ID := TO_NUMBER(TO_CHAR(l_pay_sched_b.Action_Date,'J'));
3324 l_due_counts_b.Period_Type_ID := 1;
3325 l_due_counts_b.Org_ID := l_invoice.Org_ID;
3326 l_due_counts_b.Supplier_ID := l_invoice.Supplier_ID;
3327 l_due_counts_b.Invoice_ID := l_invoice.Invoice_ID;
3328 l_due_counts_b.Action_Date := l_pay_sched_b.Action_Date;
3329 l_due_counts_b.Due_Cnt := l_ps_db1 + l_ps_db2 + l_ps_db3;
3330 l_due_counts_b.Past_Due_Cnt := l_ps_pdb1 + l_ps_pdb2 + l_ps_pdb3;
3331 l_due_counts_b.Last_Update_Date := sysdate;
3332 l_due_counts_b.Last_Updated_By := g_fii_user_id;
3333 l_due_counts_b.Creation_Date := sysdate;
3334 l_due_counts_b.Created_By := g_fii_user_id;
3335 l_due_counts_b.Last_Update_Login := g_fii_login_id;
3336 FII_AP_Due_Counts_B_MS(FII_AP_Due_Counts_B_MS.Count+1) := l_due_counts_b;
3337 END IF;
3338
3339 ELSE
3340 BEGIN
3341 l_ps_aging := FII_AP_PS_Aging_MS(to_char(l_pay_sched_b.Action_Date, 'RRRR/MM/DD'));
3342
3343 l_ps_aging.Action_Date := l_ps_aging.Action_Date;
3344 l_ps_aging.Due_Bucket1 := l_ps_aging.Due_Bucket1 + l_ps_db1;
3345 l_ps_aging.Due_Bucket2 := l_ps_aging.Due_Bucket2 + l_ps_db2;
3346 l_ps_aging.Due_Bucket3 := l_ps_aging.Due_Bucket3 + l_ps_db3;
3347 l_ps_aging.Past_Due_Bucket3 := l_ps_aging.Past_Due_Bucket3 + l_ps_pdb3;
3348 l_ps_aging.Past_Due_Bucket2 := l_ps_aging.Past_Due_Bucket2 + l_ps_pdb2;
3349 l_ps_aging.Past_Due_Bucket1 := l_ps_aging.Past_Due_Bucket1 + l_ps_pdb1;
3350 FII_AP_PS_Aging_MS(to_char(l_ps_aging.Action_Date, 'RRRR/MM/DD')) := l_ps_aging;
3351
3352 EXCEPTION
3353 WHEN NO_DATA_FOUND THEN
3354
3355 l_ps_aging.Action_Date := l_pay_sched_b.Action_Date;
3356 l_ps_aging.Due_Bucket1 := l_ps_db1;
3357 l_ps_aging.Due_Bucket2 := l_ps_db2;
3358 l_ps_aging.Due_Bucket3 := l_ps_db3;
3359 l_ps_aging.Past_Due_Bucket3 := l_ps_pdb3;
3360 l_ps_aging.Past_Due_Bucket2 := l_ps_pdb2;
3361 l_ps_aging.Past_Due_Bucket1 := l_ps_pdb1;
3362 FII_AP_PS_Aging_MS(to_char(l_ps_aging.Action_Date, 'RRRR/MM/DD')) := l_ps_aging;
3363
3364 WHEN OTHERS THEN
3365 FII_UTIL.put_line('Error occured while inserting due bucket/due/past bucket record into FII_AP_Aging_MS.');
3366 RAISE;
3367 END;
3368 END IF;
3369
3370 l_timestamp4_tmp := DBMS_UTILITY.Get_Time - l_timestamp4_tmp;
3371 l_timestamp4 := l_timestamp4 + l_timestamp4_tmp;
3372
3373 l_timestamp2_tmp := DBMS_UTILITY.Get_Time - l_timestamp2_tmp;
3374
3375 END IF; --IF l_ps_amount_remaining > 0
3376 l_pay_sched_temp_marker := FII_AP_Pay_Sched_Temp_MS.Next(l_pay_sched_temp_marker);
3377
3378
3379 ELSIF l_pay_sched_temp.Action IN ('PAYMENT', 'PREPAYMENT') THEN
3380
3381 g_state := 'Inserting invoice payment record for Invoice ' || l_invoice.Invoice_ID || ', Payment Number ' || l_pay_sched.Payment_Num || ', Marker ' || l_pay_sched_temp_marker || '.';
3382
3383 l_pay_sched_b.Time_ID := To_Number(To_Char(l_pay_sched_temp.Action_Date, 'J'));
3384 l_pay_sched_b.Period_Type_ID := 1;
3385 l_pay_sched_b.Action_Date := l_pay_sched_temp.Action_Date;
3386 l_pay_sched_b.Action := l_pay_sched_temp.Action;
3387 l_pay_sched_b.Update_Sequence := g_seq_id;
3388 l_pay_sched_b.Org_ID := l_invoice.Org_ID;
3389 l_pay_sched_b.Supplier_ID := l_invoice.Supplier_ID;
3390 l_pay_sched_b.Invoice_ID := l_invoice.Invoice_ID;
3391 l_pay_sched_b.Base_Currency_Code := l_invoice.Base_Currency_Code;
3392 l_pay_sched_b.Trx_Date := l_invoice.Invoice_Date;
3393 l_pay_sched_b.Payment_Num := l_pay_sched.Payment_Num;
3394 l_pay_sched_b.Due_Date := TRUNC(l_pay_sched.Due_Date);
3395 l_pay_sched_b.Amount_Remaining := -1 * (l_pay_sched_temp.Number1 + l_pay_sched_temp.Number2);
3396 IF l_invoice.Invoice_Type = 'PREPAYMENT' THEN
3397 l_pay_sched_b.Past_Due_Amount := 0;
3398 ELSIF TRUNC(l_pay_sched.Due_Date) - l_pay_sched_temp.Action_Date < 0 THEN
3399 l_pay_sched_b.Past_Due_Amount := -1 * (l_pay_sched_temp.Number1 + l_pay_sched_temp.Number2);
3400 ELSE l_pay_sched_b.Past_Due_Amount := 0;
3401 END IF;
3402 l_pay_sched_b.Discount_Taken := l_pay_sched_temp.Number2;
3403 IF l_ps_amount_remaining + l_pay_sched_b.Amount_Remaining <> 0 THEN
3404 l_pay_sched_b.Discount_Available := -1 * l_pay_sched_temp.Number2;
3405 l_pay_sched_b.Discount_Lost := 0;
3406 ELSE
3407 l_pay_sched_b.Discount_Available := -1 * l_ps_disc_avail;
3408 l_pay_sched_b.Discount_Lost := GREATEST(l_pay_sched.Discount_Amount_Available,
3409 l_pay_sched.Second_Disc_Amt_Available,
3410 l_pay_sched.Third_Disc_Amt_Available)
3411 - l_ps_disc_taken - l_ps_disc_lost
3412 - l_pay_sched_temp.Number2;
3413 END IF;
3414 l_pay_sched_b.Payment_Amount := l_pay_sched_temp.Number1;
3415 IF TRUNC(l_pay_sched.Due_Date) - l_pay_sched_temp.Action_Date < 0 THEN
3416 l_pay_sched_b.On_Time_Payment_Amt := 0;
3417 l_pay_sched_b.Late_Payment_Amt := l_pay_sched_temp.Number1;
3418 l_pay_sched_b.No_Days_Late := l_pay_sched_temp.Action_Date - TRUNC(l_pay_sched.Due_Date);
3419 ELSE
3420 l_pay_sched_b.On_Time_Payment_Amt := l_pay_sched_temp.Number1;
3421 l_pay_sched_b.Late_Payment_Amt := 0;
3422 l_pay_sched_b.No_Days_Late := 0;
3423 END IF;
3424
3425 IF l_invoice.Invoice_Type <> 'PREPAYMENT'
3426 AND TRUNC(l_pay_sched.Due_Date) - l_pay_sched_temp.Action_Date >= g_due_bucket1 THEN
3427 l_pay_sched_b.Due_Bucket1 := -1 * (l_pay_sched_temp.Number1 + l_pay_sched_temp.Number2);
3428 l_ps_db1 := -1;
3429 ELSE l_pay_sched_b.Due_Bucket1 := 0;
3430 END IF;
3431
3432 IF l_invoice.Invoice_Type <> 'PREPAYMENT'
3433 AND TRUNC(l_pay_sched.Due_Date) - l_pay_sched_temp.Action_Date <= g_due_bucket2
3434 AND TRUNC(l_pay_sched.Due_Date) - l_pay_sched_temp.Action_Date > g_due_bucket3 THEN
3435 l_pay_sched_b.Due_Bucket2 := -1 * (l_pay_sched_temp.Number1 + l_pay_sched_temp.Number2);
3436 l_ps_db2 := -1;
3437 ELSE l_pay_sched_b.Due_Bucket2 := 0;
3438 END IF;
3439
3440 IF l_invoice.Invoice_Type <> 'PREPAYMENT'
3441 AND TRUNC(l_pay_sched.Due_Date) - l_pay_sched_temp.Action_Date <= g_due_bucket3
3442 AND TRUNC(l_pay_sched.Due_Date) - l_pay_sched_temp.Action_Date >= 0 THEN
3443 l_pay_sched_b.Due_Bucket3 := -1 * (l_pay_sched_temp.Number1 + l_pay_sched_temp.Number2);
3444 l_ps_db3 := -1;
3445 ELSE l_pay_sched_b.Due_Bucket3 := 0;
3446 END IF;
3447
3448 IF l_invoice.Invoice_Type <> 'PREPAYMENT'
3449 AND l_pay_sched_temp.Action_Date - TRUNC(l_pay_sched.Due_Date) >= g_past_bucket1 THEN
3450 l_pay_sched_b.Past_Due_Bucket1 := -1 * (l_pay_sched_temp.Number1 + l_pay_sched_temp.Number2);
3451 l_ps_pdb1 := -1;
3452 ELSE l_pay_sched_b.Past_Due_Bucket1 := 0;
3453 END IF;
3454
3455 IF l_invoice.Invoice_Type <> 'PREPAYMENT'
3456 AND l_pay_sched_temp.Action_Date - TRUNC(l_pay_sched.Due_Date) <= g_past_bucket2
3457 AND l_pay_sched_temp.Action_Date - TRUNC(l_pay_sched.Due_Date) > g_past_bucket3 THEN
3458 l_pay_sched_b.Past_Due_Bucket2 := -1 * (l_pay_sched_temp.Number1 + l_pay_sched_temp.Number2);
3459 l_ps_pdb2 := -1;
3460 ELSE l_pay_sched_b.Past_Due_Bucket2 := 0;
3461 END IF;
3462
3463 IF l_invoice.Invoice_Type <> 'PREPAYMENT'
3464 AND l_pay_sched_temp.Action_Date - TRUNC(l_pay_sched.Due_Date) <= g_past_bucket3
3465 AND l_pay_sched_temp.Action_Date - TRUNC(l_pay_sched.Due_Date) > 0 THEN
3466 l_pay_sched_b.Past_Due_Bucket3 := -1 * (l_pay_sched_temp.Number1 + l_pay_sched_temp.Number2);
3467 l_ps_pdb3 := -1;
3468 ELSE l_pay_sched_b.Past_Due_Bucket3 := 0;
3469 END IF;
3470
3471 l_pay_sched_b.Amount_Remaining_B := ROUND((l_pay_sched_b.Amount_Remaining * l_invoice.To_Func_Rate)/l_invoice.Functional_MAU) * l_invoice.Functional_MAU;
3472 l_pay_sched_b.Past_Due_Amount_B := ROUND((l_pay_sched_b.Past_Due_Amount * l_invoice.To_Func_Rate)/l_invoice.Functional_MAU) * l_invoice.Functional_MAU;
3473 l_pay_sched_b.Discount_Available_B := ROUND((l_pay_sched_b.Discount_Available * l_invoice.To_Func_Rate)/l_invoice.Functional_MAU) * l_invoice.Functional_MAU;
3474 l_pay_sched_b.Discount_Taken_B := ROUND((l_pay_sched_b.Discount_Taken * l_invoice.To_Func_Rate)/l_invoice.Functional_MAU) * l_invoice.Functional_MAU;
3475 l_pay_sched_b.Discount_Lost_B := ROUND((l_pay_sched_b.Discount_Lost * l_invoice.To_Func_Rate)/l_invoice.Functional_MAU) * l_invoice.Functional_MAU;
3476 l_pay_sched_b.Payment_Amount_B := ROUND((l_pay_sched_b.Payment_Amount * l_invoice.To_Func_Rate)/l_invoice.Functional_MAU) * l_invoice.Functional_MAU;
3477 l_pay_sched_b.On_Time_Payment_Amt_B := ROUND((l_pay_sched_b.On_Time_Payment_Amt * l_invoice.To_Func_Rate)/l_invoice.Functional_MAU) * l_invoice.Functional_MAU;
3478 l_pay_sched_b.Late_Payment_Amt_B := ROUND((l_pay_sched_b.Late_Payment_Amt * l_invoice.To_Func_Rate)/l_invoice.Functional_MAU) * l_invoice.Functional_MAU;
3479 l_pay_sched_b.Due_Bucket1_B := ROUND((l_pay_sched_b.Due_Bucket1 * l_invoice.To_Func_Rate)/l_invoice.Functional_MAU) * l_invoice.Functional_MAU;
3480 l_pay_sched_b.Due_Bucket2_B := ROUND((l_pay_sched_b.Due_Bucket2 * l_invoice.To_Func_Rate)/l_invoice.Functional_MAU) * l_invoice.Functional_MAU;
3481 l_pay_sched_b.Due_Bucket3_B := ROUND((l_pay_sched_b.Due_Bucket3 * l_invoice.To_Func_Rate)/l_invoice.Functional_MAU) * l_invoice.Functional_MAU;
3482 l_pay_sched_b.Past_Due_Bucket1_B := ROUND((l_pay_sched_b.Past_Due_Bucket1 * l_invoice.To_Func_Rate)/l_invoice.Functional_MAU) * l_invoice.Functional_MAU;
3483 l_pay_sched_b.Past_Due_Bucket2_B := ROUND((l_pay_sched_b.Past_Due_Bucket2 * l_invoice.To_Func_Rate)/l_invoice.Functional_MAU) * l_invoice.Functional_MAU;
3484 l_pay_sched_b.Past_Due_Bucket3_B := ROUND((l_pay_sched_b.Past_Due_Bucket3 * l_invoice.To_Func_Rate)/l_invoice.Functional_MAU) * l_invoice.Functional_MAU;
3485 l_pay_sched_b.Prim_Amount_Remaining := ROUND((l_pay_sched_b.Amount_Remaining * l_invoice.To_Prim_Rate) / g_primary_mau) * g_primary_mau;
3486 l_pay_sched_b.Prim_Past_Due_Amount := ROUND((l_pay_sched_b.Past_Due_Amount * l_invoice.To_Prim_Rate) / g_primary_mau) * g_primary_mau;
3487 l_pay_sched_b.Prim_Discount_Available := ROUND((l_pay_sched_b.Discount_Available * l_invoice.To_Prim_Rate) / g_primary_mau) * g_primary_mau;
3488 l_pay_sched_b.Prim_Discount_Taken := ROUND((l_pay_sched_b.Discount_Taken * l_invoice.To_Prim_Rate) / g_primary_mau) * g_primary_mau;
3489 l_pay_sched_b.Prim_Discount_Lost := ROUND((l_pay_sched_b.Discount_Lost * l_invoice.To_Prim_Rate) / g_primary_mau) * g_primary_mau;
3490 l_pay_sched_b.Prim_Payment_Amount := ROUND((l_pay_sched_b.Payment_Amount * l_invoice.To_Prim_Rate) / g_primary_mau) * g_primary_mau;
3491 l_pay_sched_b.Prim_On_Time_Payment_Amt := ROUND((l_pay_sched_b.On_Time_Payment_Amt * l_invoice.To_Prim_Rate) / g_primary_mau) * g_primary_mau;
3492 l_pay_sched_b.Prim_Late_Payment_Amt := ROUND((l_pay_sched_b.Late_Payment_Amt * l_invoice.To_Prim_Rate) / g_primary_mau) * g_primary_mau;
3493 l_pay_sched_b.Prim_Due_Bucket1 := ROUND((l_pay_sched_b.Due_Bucket1 * l_invoice.To_Prim_Rate) / g_primary_mau) * g_primary_mau;
3494 l_pay_sched_b.Prim_Due_Bucket2 := ROUND((l_pay_sched_b.Due_Bucket2 * l_invoice.To_Prim_Rate) / g_primary_mau) * g_primary_mau;
3495 l_pay_sched_b.Prim_Due_Bucket3 := ROUND((l_pay_sched_b.Due_Bucket3 * l_invoice.To_Prim_Rate) / g_primary_mau) * g_primary_mau;
3496 l_pay_sched_b.Prim_Past_Due_Bucket1 := ROUND((l_pay_sched_b.Past_Due_Bucket1 * l_invoice.To_Prim_Rate) / g_primary_mau) * g_primary_mau;
3497 l_pay_sched_b.Prim_Past_Due_Bucket2 := ROUND((l_pay_sched_b.Past_Due_Bucket2 * l_invoice.To_Prim_Rate) / g_primary_mau) * g_primary_mau;
3498 l_pay_sched_b.Prim_Past_Due_Bucket3 := ROUND((l_pay_sched_b.Past_Due_Bucket3 * l_invoice.To_Prim_Rate) / g_primary_mau) * g_primary_mau;
3499 l_pay_sched_b.Sec_Amount_Remaining := ROUND((l_pay_sched_b.Amount_Remaining * l_invoice.To_Sec_Rate) / g_secondary_mau) * g_secondary_mau;
3500 l_pay_sched_b.Sec_Past_Due_Amount := ROUND((l_pay_sched_b.Past_Due_Amount * l_invoice.To_Sec_Rate) / g_secondary_mau) * g_secondary_mau;
3501 l_pay_sched_b.Sec_Discount_Available := ROUND((l_pay_sched_b.Discount_Available * l_invoice.To_Sec_Rate) / g_secondary_mau) * g_secondary_mau;
3502 l_pay_sched_b.Sec_Discount_Taken := ROUND((l_pay_sched_b.Discount_Taken * l_invoice.To_Sec_Rate) / g_secondary_mau) * g_secondary_mau;
3503 l_pay_sched_b.Sec_Discount_Lost := ROUND((l_pay_sched_b.Discount_Lost * l_invoice.To_Sec_Rate) / g_secondary_mau) * g_secondary_mau;
3504 l_pay_sched_b.Sec_Payment_Amount := ROUND((l_pay_sched_b.Payment_Amount * l_invoice.To_Sec_Rate) / g_secondary_mau) * g_secondary_mau;
3505 l_pay_sched_b.Sec_On_Time_Payment_Amt := ROUND((l_pay_sched_b.On_Time_Payment_Amt * l_invoice.To_Sec_Rate) / g_secondary_mau) * g_secondary_mau;
3506 l_pay_sched_b.Sec_Late_Payment_Amt := ROUND((l_pay_sched_b.Late_Payment_Amt * l_invoice.To_Sec_Rate) / g_secondary_mau) * g_secondary_mau;
3507 l_pay_sched_b.Sec_Due_Bucket1 := ROUND((l_pay_sched_b.Due_Bucket1 * l_invoice.To_Sec_Rate) / g_secondary_mau) * g_secondary_mau;
3508 l_pay_sched_b.Sec_Due_Bucket2 := ROUND((l_pay_sched_b.Due_Bucket2 * l_invoice.To_Sec_Rate) / g_secondary_mau) * g_secondary_mau;
3509 l_pay_sched_b.Sec_Due_Bucket3 := ROUND((l_pay_sched_b.Due_Bucket3 * l_invoice.To_Sec_Rate) / g_secondary_mau) * g_secondary_mau;
3510 l_pay_sched_b.Sec_Past_Due_Bucket1 := ROUND((l_pay_sched_b.Past_Due_Bucket1 * l_invoice.To_Sec_Rate) / g_secondary_mau) * g_secondary_mau;
3511 l_pay_sched_b.Sec_Past_Due_Bucket2 := ROUND((l_pay_sched_b.Past_Due_Bucket2 * l_invoice.To_Sec_Rate) / g_secondary_mau) * g_secondary_mau;
3512 l_pay_sched_b.Sec_Past_Due_Bucket3 := ROUND((l_pay_sched_b.Past_Due_Bucket3 * l_invoice.To_Sec_Rate) / g_secondary_mau) * g_secondary_mau;
3513 IF l_ps_amount_remaining + l_pay_sched_b.Amount_Remaining <> 0 THEN
3514 l_pay_sched_b.Fully_Paid_Date := NULL;
3515 ELSE l_pay_sched_b.Fully_Paid_Date := l_pay_sched_temp.Action_Date;
3516 END IF;
3517 l_pay_sched_b.Check_ID := l_pay_sched_temp.Number4;
3518 --IBY CHANGE
3519 IF l_pay_sched_temp.String1 IN ('ELECTRONIC') OR l_pay_sched_temp.String1 IN ('EFT') OR l_pay_sched_temp.String1 IN ('WIRE') THEN
3520 l_pay_sched_b.Payment_Method := 'E';
3521 ELSE l_pay_sched_b.Payment_Method := 'M';
3522 END IF;
3523 l_pay_sched_b.Last_Update_Date := sysdate;
3524 l_pay_sched_b.Last_Updated_By := g_fii_user_id;
3525 l_pay_sched_b.Creation_Date := sysdate;
3526 l_pay_sched_b.Created_By := l_pay_sched_temp.Number3;
3527 l_pay_sched_b.Last_Update_Login := g_fii_login_id;
3528 l_pay_sched_b.Check_Date := l_pay_sched_temp.Date1;
3529 l_pay_sched_b.Inv_Pymt_Flag := 'Y';
3530 l_pay_sched_b.Unique_ID := l_pay_sched_temp.Number5;
3531
3532 l_ps_amount_remaining := l_ps_amount_remaining + l_pay_sched_b.Amount_Remaining;
3533 l_ps_disc_avail := l_ps_disc_avail + l_pay_sched_b.Discount_Available;
3534 l_ps_disc_lost := l_ps_disc_lost + l_pay_sched_b.Discount_Lost;
3535 l_ps_disc_taken := l_ps_disc_taken + l_pay_sched_b.Discount_Taken;
3536 l_ps_disc_recently_taken := l_ps_disc_recently_taken + l_pay_sched_b.Discount_Taken;
3537 l_last_action_date := l_pay_sched_b.Action_Date;
3538
3539 IF l_invoice.Pay_Sched_B_Flag = 'N' AND l_supplier_merge_flag = 'Y' THEN
3540 Insert_Pay_Sched_B_Rec(l_pay_sched_b, 'Y');
3541 ELSE Insert_Pay_Sched_B_Rec(l_pay_sched_b, 'N');
3542 END IF;
3543
3544
3545 IF l_ps_amount_remaining = 0 THEN
3546 l_timestamp2_tmp := DBMS_UTILITY.Get_Time - l_timestamp2_tmp;
3547 l_timestamp2 := l_timestamp2 + l_timestamp2_tmp;
3548
3549 l_timestamp4_tmp := DBMS_UTILITY.Get_Time;
3550
3551
3552 g_state := 'Updating aging buckets memory structure(s) with invoice payment for Invoice ' || l_invoice.Invoice_ID || ', Payment Number ' || l_pay_sched.Payment_Num || ', Marker ' || l_pay_sched_temp_marker || '.';
3553 IF l_inv_has_mult_ps = 'N' THEN
3554 l_aging_bkts_b.Time_ID := TO_NUMBER(TO_CHAR(l_pay_sched_b.Action_Date,'J'));
3555 l_aging_bkts_b.Period_Type_ID := 1;
3556 l_aging_bkts_b.Org_ID := l_invoice.Org_ID;
3557 l_aging_bkts_b.Supplier_ID := l_invoice.Supplier_ID;
3558 l_aging_bkts_b.Invoice_ID := l_invoice.Invoice_ID;
3559 l_aging_bkts_b.Action_Date := l_pay_sched_b.Action_Date;
3560 l_aging_bkts_b.Due_Bucket1_Cnt := l_ps_db1;
3561 l_aging_bkts_b.Due_Bucket2_Cnt := l_ps_db2;
3562 l_aging_bkts_b.Due_Bucket3_Cnt := l_ps_db3;
3563 l_aging_bkts_b.Past_Due_Bucket3_Cnt := l_ps_pdb3;
3564 l_aging_bkts_b.Past_Due_Bucket2_Cnt := l_ps_pdb2;
3565 l_aging_bkts_b.Past_Due_Bucket1_Cnt := l_ps_pdb1;
3566 l_aging_bkts_b.Last_Update_Date := sysdate;
3567 l_aging_bkts_b.Last_Updated_By := g_fii_user_id;
3568 l_aging_bkts_b.Creation_Date := sysdate;
3569 l_aging_bkts_b.Created_By := g_fii_user_id;
3570 l_aging_bkts_b.Last_Update_Login := g_fii_login_id;
3571 FII_AP_Aging_Bkts_B_MS(FII_AP_Aging_Bkts_B_MS.Count+1) := l_aging_bkts_b;
3572
3573 l_due_counts_b.Time_ID := TO_NUMBER(TO_CHAR(l_pay_sched_b.Action_Date,'J'));
3574 l_due_counts_b.Period_Type_ID := 1;
3575 l_due_counts_b.Org_ID := l_invoice.Org_ID;
3576 l_due_counts_b.Supplier_ID := l_invoice.Supplier_ID;
3577 l_due_counts_b.Invoice_ID := l_invoice.Invoice_ID;
3578 l_due_counts_b.Action_Date := l_pay_sched_b.Action_Date;
3579 l_due_counts_b.Due_Cnt := l_ps_db1 + l_ps_db2 + l_ps_db3;
3580 l_due_counts_b.Past_Due_Cnt := l_ps_pdb1 + l_ps_pdb2 + l_ps_pdb3;
3581 l_due_counts_b.Last_Update_Date := sysdate;
3582 l_due_counts_b.Last_Updated_By := g_fii_user_id;
3583 l_due_counts_b.Creation_Date := sysdate;
3584 l_due_counts_b.Created_By := g_fii_user_id;
3585 l_due_counts_b.Last_Update_Login := g_fii_login_id;
3586 FII_AP_Due_Counts_B_MS(FII_AP_Due_Counts_B_MS.Count+1) := l_due_counts_b;
3587
3588 ELSE
3589 BEGIN
3590 l_ps_aging := FII_AP_PS_Aging_MS(to_char(l_pay_sched_b.Action_Date, 'RRRR/MM/DD'));
3591
3592 l_ps_aging.Action_Date := l_ps_aging.Action_Date;
3593 l_ps_aging.Due_Bucket1 := l_ps_aging.Due_Bucket1 + l_ps_db1;
3594 l_ps_aging.Due_Bucket2 := l_ps_aging.Due_Bucket2 + l_ps_db2;
3595 l_ps_aging.Due_Bucket3 := l_ps_aging.Due_Bucket3 + l_ps_db3;
3596 l_ps_aging.Past_Due_Bucket3 := l_ps_aging.Past_Due_Bucket3 + l_ps_pdb3;
3597 l_ps_aging.Past_Due_Bucket2 := l_ps_aging.Past_Due_Bucket2 + l_ps_pdb2;
3598 l_ps_aging.Past_Due_Bucket1 := l_ps_aging.Past_Due_Bucket1 + l_ps_pdb1;
3599 FII_AP_PS_Aging_MS(to_char(l_ps_aging.Action_Date, 'RRRR/MM/DD')) := l_ps_aging;
3600
3601 EXCEPTION
3602 WHEN NO_DATA_FOUND THEN
3603
3604 l_ps_aging.Action_Date := l_pay_sched_b.Action_Date;
3605 l_ps_aging.Due_Bucket1 := l_ps_db1;
3606 l_ps_aging.Due_Bucket2 := l_ps_db2;
3607 l_ps_aging.Due_Bucket3 := l_ps_db3;
3608 l_ps_aging.Past_Due_Bucket3 := l_ps_pdb3;
3609 l_ps_aging.Past_Due_Bucket2 := l_ps_pdb2;
3610 l_ps_aging.Past_Due_Bucket1 := l_ps_pdb1;
3611 FII_AP_PS_Aging_MS(to_char(l_ps_aging.Action_Date, 'RRRR/MM/DD')) := l_ps_aging;
3612
3613 WHEN OTHERS THEN
3614 FII_UTIL.put_line('Error occured while inserting invoice payment record into FII_AP_Aging_MS.');
3615 RAISE;
3616 END;
3617 END IF; --IF l_inv_has_mult_ps = 'N' THEN
3618
3619 l_timestamp4_tmp := DBMS_UTILITY.Get_Time - l_timestamp4_tmp;
3620 l_timestamp4 := l_timestamp4 + l_timestamp4_tmp;
3621
3622 l_timestamp2_tmp := DBMS_UTILITY.Get_Time - l_timestamp2_tmp;
3623
3624 END IF; --IF l_ps_amount_remaining = 0 THEN
3625
3626 l_pay_sched_temp_marker := FII_AP_Pay_Sched_Temp_MS.Next(l_pay_sched_temp_marker);
3627
3628
3629 ELSIF l_pay_sched_temp.Action IN ('WITHHOLDING', 'TAX') THEN
3630 IF l_invoice.Invoice_Type <> 'PREPAYMENT' THEN
3631 g_state := 'Inserting wh/tax record for Invoice ' || l_invoice.Invoice_ID || ', Payment Number ' || l_pay_sched.Payment_Num || ', Marker ' || l_pay_sched_temp_marker || '.';
3632
3633 l_pay_sched_b.Time_ID := To_Number(To_Char(l_pay_sched_temp.Action_Date, 'J'));
3634 l_pay_sched_b.Period_Type_ID := 1;
3635 l_pay_sched_b.Action_Date := l_pay_sched_temp.Action_Date;
3636 l_pay_sched_b.Action := l_pay_sched_temp.Action;
3637 l_pay_sched_b.Update_Sequence := g_seq_id;
3638 l_pay_sched_b.Org_ID := l_invoice.Org_ID;
3639 l_pay_sched_b.Supplier_ID := l_invoice.Supplier_ID;
3640 l_pay_sched_b.Invoice_ID := l_invoice.Invoice_ID;
3641 l_pay_sched_b.Base_Currency_Code := l_invoice.Base_Currency_Code;
3642 l_pay_sched_b.Trx_Date := l_invoice.Invoice_Date;
3643 l_pay_sched_b.Payment_Num := l_pay_sched.Payment_Num;
3644 l_pay_sched_b.Due_Date := TRUNC(l_pay_sched.Due_Date);
3645
3646 l_pay_sched_b.Amount_Remaining := ROUND(l_pay_sched_temp.Number1 / l_invoice.Minimum_Accountable_Unit) * l_invoice.Minimum_Accountable_Unit;
3647 l_pay_sched_b.Amount_Remaining_B := ROUND((l_pay_sched_temp.Number1 * l_invoice.To_Func_Rate)/l_invoice.Minimum_Accountable_Unit) * l_invoice.Minimum_Accountable_Unit;
3648 l_pay_sched_b.Prim_Amount_Remaining := ROUND((l_pay_sched_temp.Number1 * l_invoice.To_Prim_Rate) / g_primary_mau) * g_primary_mau;
3649 l_pay_sched_b.Sec_Amount_Remaining := ROUND((l_pay_sched_temp.Number1 * l_invoice.To_Sec_Rate) / g_secondary_mau) * g_secondary_mau;
3650
3651 IF TRUNC(l_pay_sched.Due_Date) - l_pay_sched_temp.Action_Date < 0 THEN
3652 l_pay_sched_b.Past_Due_Amount := ROUND(l_pay_sched_temp.Number1 / l_invoice.Minimum_Accountable_Unit) * l_invoice.Minimum_Accountable_Unit;
3653 l_pay_sched_b.Past_Due_Amount_B := ROUND((l_pay_sched_temp.Number1 * l_invoice.To_Func_Rate)/l_invoice.Minimum_Accountable_Unit) * l_invoice.Minimum_Accountable_Unit;
3654 l_pay_sched_b.Prim_Past_Due_Amount := ROUND((l_pay_sched_temp.Number1 * l_invoice.To_Prim_Rate) / g_primary_mau) * g_primary_mau;
3655 l_pay_sched_b.Sec_Past_Due_Amount := ROUND((l_pay_sched_temp.Number1 * l_invoice.To_Sec_Rate) / g_secondary_mau) * g_secondary_mau;
3656 ELSE l_pay_sched_b.Past_Due_Amount := 0;
3657 l_pay_sched_b.Past_Due_Amount_B := 0;
3658 l_pay_sched_b.Prim_Past_Due_Amount := 0;
3659 l_pay_sched_b.Sec_Past_Due_Amount := 0;
3660 END IF;
3661
3662 l_pay_sched_b.Discount_Available := 0;
3663 l_pay_sched_b.Discount_Available_B := 0;
3664 l_pay_sched_b.Prim_Discount_Available := 0;
3665 l_pay_sched_b.Sec_Discount_Available := 0;
3666 l_pay_sched_b.Discount_Taken := 0;
3667 l_pay_sched_b.Discount_Taken_B := 0;
3668 l_pay_sched_b.Prim_Discount_Taken := 0;
3669 l_pay_sched_b.Sec_Discount_Taken := 0;
3670 l_pay_sched_b.Discount_Lost := 0;
3671 l_pay_sched_b.Discount_Lost_B := 0;
3672 l_pay_sched_b.Prim_Discount_Lost := 0;
3673 l_pay_sched_b.Sec_Discount_Lost := 0;
3674 l_pay_sched_b.Payment_Amount := 0;
3675 l_pay_sched_b.Payment_Amount_B := 0;
3676 l_pay_sched_b.Prim_Payment_Amount := 0;
3677 l_pay_sched_b.Sec_Payment_Amount := 0;
3678 l_pay_sched_b.On_Time_Payment_Amt := 0;
3679 l_pay_sched_b.On_Time_Payment_Amt_B := 0;
3680 l_pay_sched_b.Prim_On_Time_Payment_Amt := 0;
3681 l_pay_sched_b.Sec_On_Time_Payment_Amt := 0;
3682 l_pay_sched_b.Late_Payment_Amt := 0;
3683 l_pay_sched_b.Late_Payment_Amt_B := 0;
3684 l_pay_sched_b.Prim_Late_Payment_Amt := 0;
3685 l_pay_sched_b.Sec_Late_Payment_Amt := 0;
3686
3687 IF TRUNC(l_pay_sched.Due_Date) - l_pay_sched_temp.Action_Date < 0 THEN
3688 l_pay_sched_b.No_Days_Late := l_pay_sched_temp.Action_Date - TRUNC(l_pay_sched.Due_Date);
3689 ELSE l_pay_sched_b.No_Days_Late := 0;
3690 END IF;
3691
3692 IF TRUNC(l_pay_sched.Due_Date) - l_pay_sched_temp.Action_Date >= g_due_bucket1 THEN
3693 l_pay_sched_b.Due_Bucket1 := ROUND(l_pay_sched_temp.Number1 / l_invoice.Minimum_Accountable_Unit) * l_invoice.Minimum_Accountable_Unit;
3694 l_pay_sched_b.Due_Bucket1_B := ROUND((l_pay_sched_temp.Number1 * l_invoice.To_Func_Rate)/l_invoice.Minimum_Accountable_Unit) * l_invoice.Minimum_Accountable_Unit;
3695 l_pay_sched_b.Prim_Due_Bucket1 := ROUND((l_pay_sched_temp.Number1 * l_invoice.To_Prim_Rate)/g_primary_mau) * g_primary_mau;
3696 l_pay_sched_b.Sec_Due_Bucket1 := ROUND((l_pay_sched_temp.Number1 * l_invoice.To_Sec_Rate)/g_secondary_mau) * g_secondary_mau;
3697
3698 l_ps_db1 := -1;
3699
3700 ELSE l_pay_sched_b.Due_Bucket1 := 0;
3701 l_pay_sched_b.Due_Bucket1_B := 0;
3702 l_pay_sched_b.Prim_Due_Bucket1 := 0;
3703 l_pay_sched_b.Sec_Due_Bucket1 := 0;
3704 END IF;
3705
3706 IF TRUNC(l_pay_sched.Due_Date) - l_pay_sched_temp.Action_Date <= g_due_bucket2
3707 AND TRUNC(l_pay_sched.Due_Date) - l_pay_sched_temp.Action_Date > g_due_bucket3 THEN
3708 l_pay_sched_b.Due_Bucket2 := ROUND(l_pay_sched_temp.Number1 / l_invoice.Minimum_Accountable_Unit) * l_invoice.Minimum_Accountable_Unit;
3709 l_pay_sched_b.Due_Bucket2_B := ROUND((l_pay_sched_temp.Number1 * l_invoice.To_Func_Rate)/l_invoice.Minimum_Accountable_Unit) * l_invoice.Minimum_Accountable_Unit;
3710 l_pay_sched_b.Prim_Due_Bucket2 := ROUND((l_pay_sched_temp.Number1 * l_invoice.To_Prim_Rate)/g_primary_mau) * g_primary_mau;
3711 l_pay_sched_b.Sec_Due_Bucket2 := ROUND((l_pay_sched_temp.Number1 * l_invoice.To_Sec_Rate)/g_secondary_mau) * g_secondary_mau;
3712
3713 l_ps_db2 := -1;
3714
3715 ELSE l_pay_sched_b.Due_Bucket2 := 0;
3716 l_pay_sched_b.Due_Bucket2_B := 0;
3717 l_pay_sched_b.Prim_Due_Bucket2 := 0;
3718 l_pay_sched_b.Sec_Due_Bucket2 := 0;
3719 END IF;
3720
3721 IF TRUNC(l_pay_sched.Due_Date) - l_pay_sched_temp.Action_Date <= g_due_bucket3
3722 AND TRUNC(l_pay_sched.Due_Date) - l_pay_sched_temp.Action_Date >= 0 THEN
3723 l_pay_sched_b.Due_Bucket3 := ROUND(l_pay_sched_temp.Number1 / l_invoice.Minimum_Accountable_Unit) * l_invoice.Minimum_Accountable_Unit;
3724 l_pay_sched_b.Due_Bucket3_B := ROUND((l_pay_sched_temp.Number1 * l_invoice.To_Func_Rate)/l_invoice.Minimum_Accountable_Unit) * l_invoice.Minimum_Accountable_Unit;
3725 l_pay_sched_b.Prim_Due_Bucket3 := ROUND((l_pay_sched_temp.Number1 * l_invoice.To_Prim_Rate)/g_primary_mau) * g_primary_mau;
3726 l_pay_sched_b.Sec_Due_Bucket3 := ROUND((l_pay_sched_temp.Number1 * l_invoice.To_Sec_Rate)/g_secondary_mau) * g_secondary_mau;
3727
3728 l_ps_db3 := -1;
3729
3730 ELSE l_pay_sched_b.Due_Bucket3 := 0;
3731 l_pay_sched_b.Due_Bucket3_B := 0;
3732 l_pay_sched_b.Prim_Due_Bucket3 := 0;
3733 l_pay_sched_b.Sec_Due_Bucket3 := 0;
3734 END IF;
3735
3736 IF l_pay_sched_temp.Action_Date - TRUNC(l_pay_sched.Due_Date) >= g_past_bucket1 THEN
3737 l_pay_sched_b.Past_Due_Bucket1 := ROUND(l_pay_sched_temp.Number1 / l_invoice.Minimum_Accountable_Unit) * l_invoice.Minimum_Accountable_Unit;
3738 l_pay_sched_b.Past_Due_Bucket1_B := ROUND((l_pay_sched_temp.Number1 * l_invoice.To_Func_Rate)/l_invoice.Minimum_Accountable_Unit) * l_invoice.Minimum_Accountable_Unit;
3739 l_pay_sched_b.Prim_Past_Due_Bucket1 := ROUND((l_pay_sched_temp.Number1 * l_invoice.To_Prim_Rate)/g_primary_mau) * g_primary_mau;
3740 l_pay_sched_b.Sec_Past_Due_Bucket1 := ROUND((l_pay_sched_temp.Number1 * l_invoice.To_Sec_Rate)/g_secondary_mau) * g_secondary_mau;
3741
3742 l_ps_pdb3 := -1;
3743
3744 ELSE l_pay_sched_b.Past_Due_Bucket1 := 0;
3745 l_pay_sched_b.Past_Due_Bucket1_B := 0;
3746 l_pay_sched_b.Prim_Past_Due_Bucket1 := 0;
3747 l_pay_sched_b.Sec_Past_Due_Bucket1 := 0;
3748 END IF;
3749
3750 IF l_pay_sched_temp.Action_Date - TRUNC(l_pay_sched.Due_Date) <= g_past_bucket2
3751 AND l_pay_sched_temp.Action_Date - TRUNC(l_pay_sched.Due_Date) > g_past_bucket3 THEN
3752 l_pay_sched_b.Past_Due_Bucket2 := ROUND(l_pay_sched_temp.Number1 / l_invoice.Minimum_Accountable_Unit) * l_invoice.Minimum_Accountable_Unit;
3753 l_pay_sched_b.Past_Due_Bucket2_B := ROUND((l_pay_sched_temp.Number1 * l_invoice.To_Func_Rate)/l_invoice.Minimum_Accountable_Unit) * l_invoice.Minimum_Accountable_Unit;
3754 l_pay_sched_b.Prim_Past_Due_Bucket2 := ROUND((l_pay_sched_temp.Number1 * l_invoice.To_Prim_Rate)/g_primary_mau) * g_primary_mau;
3755 l_pay_sched_b.Sec_Past_Due_Bucket2 := ROUND((l_pay_sched_temp.Number1 * l_invoice.To_Sec_Rate)/g_secondary_mau) * g_secondary_mau;
3756
3757 l_ps_pdb2 := -1;
3758
3759 ELSE l_pay_sched_b.Past_Due_Bucket2 := 0;
3760 l_pay_sched_b.Past_Due_Bucket2_B := 0;
3761 l_pay_sched_b.Prim_Past_Due_Bucket2 := 0;
3762 l_pay_sched_b.Sec_Past_Due_Bucket2 := 0;
3763 END IF;
3764
3765 IF l_pay_sched_temp.Action_Date - TRUNC(l_pay_sched.Due_Date) <= g_past_bucket3
3766 AND l_pay_sched_temp.Action_Date - TRUNC(l_pay_sched.Due_Date) > 0 THEN
3767 l_pay_sched_b.Past_Due_Bucket3 := ROUND(l_pay_sched_temp.Number1 / l_invoice.Minimum_Accountable_Unit) * l_invoice.Minimum_Accountable_Unit;
3768 l_pay_sched_b.Past_Due_Bucket3_B := ROUND((l_pay_sched_temp.Number1 * l_invoice.To_Func_Rate)/l_invoice.Minimum_Accountable_Unit) * l_invoice.Minimum_Accountable_Unit;
3769 l_pay_sched_b.Prim_Past_Due_Bucket3 := ROUND((l_pay_sched_temp.Number1 * l_invoice.To_Prim_Rate)/g_primary_mau) * g_primary_mau;
3770 l_pay_sched_b.Sec_Past_Due_Bucket3 := ROUND((l_pay_sched_temp.Number1 * l_invoice.To_Sec_Rate)/g_secondary_mau) * g_secondary_mau;
3771
3772 l_ps_pdb1 := -1;
3773
3774 ELSE l_pay_sched_b.Past_Due_Bucket3 := 0;
3775 l_pay_sched_b.Past_Due_Bucket3_B := 0;
3776 l_pay_sched_b.Prim_Past_Due_Bucket3 := 0;
3777 l_pay_sched_b.Sec_Past_Due_Bucket3 := 0;
3778 END IF;
3779
3780 l_pay_sched_b.Fully_Paid_Date := NULL;
3781 l_pay_sched_b.Check_ID := NULL;
3782 l_pay_sched_b.Payment_Method := NULL;
3783 l_pay_sched_b.Last_Update_Date := sysdate;
3784 l_pay_sched_b.Last_Updated_By := g_fii_user_id;
3785 l_pay_sched_b.Creation_Date := sysdate;
3786 l_pay_sched_b.Created_By := l_pay_sched.Created_By;
3787 l_pay_sched_b.Last_Update_Login := g_fii_login_id;
3788 l_pay_sched_b.Check_Date := NULL;
3789
3790 l_ps_amount_remaining := l_ps_amount_remaining + l_pay_sched_b.Amount_Remaining;
3791 l_last_action_date := l_pay_sched_b.Action_Date;
3792
3793 IF l_invoice.Pay_Sched_B_Flag = 'N' AND l_supplier_merge_flag = 'Y' THEN
3794 Insert_Pay_Sched_B_Rec(l_pay_sched_b, 'Y');
3795 ELSE Insert_Pay_Sched_B_Rec(l_pay_sched_b, 'N');
3796 END IF;
3797
3798 IF l_ps_amount_remaining = 0 THEN
3799 l_timestamp2_tmp := DBMS_UTILITY.Get_Time - l_timestamp2_tmp;
3800 l_timestamp2 := l_timestamp2 + l_timestamp2_tmp;
3801
3802 l_timestamp4_tmp := DBMS_UTILITY.Get_Time;
3803
3804 g_state := 'Updating aging buckets memory structure(s) with wh/tax for Invoice ' || l_invoice.Invoice_ID || ', Payment Number ' || l_pay_sched.Payment_Num || ', Marker ' || l_pay_sched_temp_marker || '.';
3805
3806 IF l_inv_has_mult_ps = 'N' THEN
3807 l_aging_bkts_b.Time_ID := TO_NUMBER(TO_CHAR(l_pay_sched_b.Action_Date,'J'));
3808 l_aging_bkts_b.Period_Type_ID := 1;
3809 l_aging_bkts_b.Org_ID := l_invoice.Org_ID;
3810 l_aging_bkts_b.Supplier_ID := l_invoice.Supplier_ID;
3811 l_aging_bkts_b.Invoice_ID := l_invoice.Invoice_ID;
3812 l_aging_bkts_b.Action_Date := l_pay_sched_b.Action_Date;
3813 l_aging_bkts_b.Due_Bucket1_Cnt := l_ps_db1;
3814 l_aging_bkts_b.Due_Bucket2_Cnt := l_ps_db2;
3815 l_aging_bkts_b.Due_Bucket3_Cnt := l_ps_db3;
3816 l_aging_bkts_b.Past_Due_Bucket3_Cnt := l_ps_pdb3;
3817 l_aging_bkts_b.Past_Due_Bucket2_Cnt := l_ps_pdb2;
3818 l_aging_bkts_b.Past_Due_Bucket1_Cnt := l_ps_pdb1;
3819 l_aging_bkts_b.Last_Update_Date := sysdate;
3820 l_aging_bkts_b.Last_Updated_By := g_fii_user_id;
3821 l_aging_bkts_b.Creation_Date := sysdate;
3822 l_aging_bkts_b.Created_By := g_fii_user_id;
3823 l_aging_bkts_b.Last_Update_Login := g_fii_login_id;
3824 FII_AP_Aging_Bkts_B_MS(FII_AP_Aging_Bkts_B_MS.Count+1) := l_aging_bkts_b;
3825
3826 l_due_counts_b.Time_ID := TO_NUMBER(TO_CHAR(l_pay_sched_b.Action_Date,'J'));
3827 l_due_counts_b.Period_Type_ID := 1;
3828 l_due_counts_b.Org_ID := l_invoice.Org_ID;
3829 l_due_counts_b.Supplier_ID := l_invoice.Supplier_ID;
3830 l_due_counts_b.Invoice_ID := l_invoice.Invoice_ID;
3831 l_due_counts_b.Action_Date := l_pay_sched_b.Action_Date;
3832 l_due_counts_b.Due_Cnt := l_ps_db1 + l_ps_db2 + l_ps_db3;
3833 l_due_counts_b.Past_Due_Cnt := l_ps_pdb1 + l_ps_pdb2 + l_ps_pdb3;
3834 l_due_counts_b.Last_Update_Date := sysdate;
3835 l_due_counts_b.Last_Updated_By := g_fii_user_id;
3836 l_due_counts_b.Creation_Date := sysdate;
3837 l_due_counts_b.Created_By := g_fii_user_id;
3838 l_due_counts_b.Last_Update_Login := g_fii_login_id;
3839 FII_AP_Due_Counts_B_MS(FII_AP_Due_Counts_B_MS.Count+1) := l_due_counts_b;
3840
3841 ELSE
3842 BEGIN
3843 l_ps_aging := FII_AP_PS_Aging_MS(to_char(l_pay_sched_b.Action_Date, 'RRRR/MM/DD'));
3844
3845 l_ps_aging.Action_Date := l_ps_aging.Action_Date;
3846 l_ps_aging.Due_Bucket1 := l_ps_aging.Due_Bucket1 + l_ps_db1;
3847 l_ps_aging.Due_Bucket2 := l_ps_aging.Due_Bucket2 + l_ps_db2;
3848 l_ps_aging.Due_Bucket3 := l_ps_aging.Due_Bucket3 + l_ps_db3;
3849 l_ps_aging.Past_Due_Bucket3 := l_ps_aging.Past_Due_Bucket3 + l_ps_pdb3;
3850 l_ps_aging.Past_Due_Bucket2 := l_ps_aging.Past_Due_Bucket2 + l_ps_pdb2;
3851 l_ps_aging.Past_Due_Bucket1 := l_ps_aging.Past_Due_Bucket1 + l_ps_pdb1;
3852 FII_AP_PS_Aging_MS(to_char(l_ps_aging.Action_Date, 'RRRR/MM/DD')) := l_ps_aging;
3853
3854 EXCEPTION
3855 WHEN NO_DATA_FOUND THEN
3856
3857 l_ps_aging.Action_Date := l_pay_sched_b.Action_Date;
3858 l_ps_aging.Due_Bucket1 := l_ps_db1;
3859 l_ps_aging.Due_Bucket2 := l_ps_db2;
3860 l_ps_aging.Due_Bucket3 := l_ps_db3;
3861 l_ps_aging.Past_Due_Bucket3 := l_ps_pdb3;
3862 l_ps_aging.Past_Due_Bucket2 := l_ps_pdb2;
3863 l_ps_aging.Past_Due_Bucket1 := l_ps_pdb1;
3864 FII_AP_PS_Aging_MS(to_char(l_ps_aging.Action_Date, 'RRRR/MM/DD')) := l_ps_aging;
3865
3866 WHEN OTHERS THEN
3867 FII_UTIL.put_line('Error occured while inserting wh/tax record into FII_AP_Aging_MS.');
3868 RAISE;
3869 END;
3870 END IF; --IF l_inv_has_mult_ps = 'N' THEN
3871
3872 l_timestamp4_tmp := DBMS_UTILITY.Get_Time - l_timestamp4_tmp;
3873 l_timestamp4 := l_timestamp4 + l_timestamp4_tmp;
3874
3875 l_timestamp2_tmp := DBMS_UTILITY.Get_Time - l_timestamp2_tmp;
3876
3877 END IF; --IF l_ps_amount_remaining = 0 THEN
3878 ELSE --l_invoice.Invoice_Type = 'PREPAYMENT'
3879 l_ps_amount_remaining := l_ps_amount_remaining + ROUND(l_pay_sched_temp.Number1 / l_invoice.Minimum_Accountable_Unit) * l_invoice.Minimum_Accountable_Unit;
3880 END IF;
3881
3882 l_pay_sched_temp_marker := FII_AP_Pay_Sched_Temp_MS.Next(l_pay_sched_temp_marker);
3883
3884 END IF; --l_pay_sched_temp.Action = ... THEN ...
3885
3886
3887 END;
3888
3889 END LOOP; --End of FII_AP_Pay_Sched_Temp_MS Loop.
3890
3891 l_timestamp2_tmp := DBMS_UTILITY.Get_Time - l_timestamp2_tmp;
3892 l_timestamp2 := l_timestamp2 + l_timestamp2_tmp;
3893
3894 ELSIF l_invoice.Pay_Sched_B_Flag = 'N' AND l_invoice.Invoice_B_Flag = 'Y' THEN
3895
3896 l_timestamp3_tmp := DBMS_UTILITY.Get_Time;
3897
3898 g_state := 'Invoice has Pay_Sched_B_Flag = ''N'' so advance prepayment applied marker for Invoice ' || l_invoice.Invoice_ID || ', Payment Number ' || l_pay_sched.Payment_Num || '.';
3899 WHILE l_prepay_applied_marker IS NOT NULL
3900 AND FII_AP_Prepay_Applied_MS(l_prepay_applied_marker).Invoice_ID = l_invoice.Invoice_ID LOOP
3901 l_prepay_applied := FII_AP_Prepay_Applied_MS(l_prepay_applied_marker);
3902
3903 l_inv_f_paid_date := GREATEST(l_inv_f_paid_date, TRUNC(l_prepay_applied.Creation_Date));
3904 l_inv_f_paid_amt := l_inv_f_paid_amt + l_prepay_applied.Amount;
3905
3906 l_prepay_applied_marker := FII_AP_Prepay_Applied_MS.Next(l_prepay_applied_marker);
3907 END LOOP;
3908
3909 l_timestamp3_tmp := DBMS_UTILITY.Get_Time - l_timestamp3_tmp;
3910 l_timestamp3 := l_timestamp3 + l_timestamp3_tmp;
3911
3912 END IF; --l_invoice.Pay_Sched_B_Flag = 'Y' THEN Loop through FII_AP_Pay_Sched_Temp_MS.
3913
3914
3915 l_pay_sched_marker := FII_AP_Pay_Sched_MS.Next(l_pay_sched_marker);
3916 END;
3917 END LOOP; --End of Payment Schedules Loop.
3918
3919
3920 WHILE l_prepay_applied_marker IS NOT NULL
3921 AND FII_AP_Prepay_Applied_MS(l_prepay_applied_marker).Invoice_ID <= l_invoice.Invoice_ID LOOP
3922 if g_debug_flag = 'Y' then
3923 fii_util.put_line('WARNING: Not all prepayment applied to invoice ' || l_invoice.Invoice_ID || ' have been allocated.');
3924 end if;
3925 l_prepay_applied_marker := FII_AP_Prepay_Applied_MS.Next(l_prepay_applied_marker);
3926 END LOOP;
3927
3928 ---------------- BEGIN INSERTING INTO FII_AP_INVOICE_B Memory Structures --------------
3929 g_state := 'Inserting invoice for Invoice ' || l_invoice.Invoice_ID || '.';
3930 IF l_invoice.Invoice_B_Flag = 'Y' THEN
3931 l_timestamp3_tmp := DBMS_UTILITY.Get_Time;
3932
3933 l_invoice_b.Org_ID := l_invoice.Org_ID;
3934 l_invoice_b.Supplier_ID := l_invoice.Supplier_ID;
3935 l_invoice_b.Invoice_ID := l_invoice.Invoice_ID;
3936 l_invoice_b.Invoice_Type := l_invoice.Invoice_Type;
3937 l_invoice_b.Invoice_Number := l_invoice.Invoice_Number;
3938 l_invoice_b.Invoice_Date := l_invoice.Invoice_Date;
3939 l_invoice_b.Invoice_Amount := l_invoice.Invoice_Amount;
3940 l_invoice_b.Base_Amount := ROUND((l_invoice.Invoice_Amount * l_invoice.To_Func_Rate)
3941 / l_invoice.Functional_MAU) * l_invoice.Functional_MAU;
3942 l_invoice_b.Prim_Amount := ROUND((l_invoice.Invoice_Amount * l_invoice.To_Prim_Rate)
3943 / g_primary_mau) * g_primary_mau;
3944 l_invoice_b.Sec_Amount := ROUND((l_invoice.Invoice_Amount * l_invoice.To_Sec_Rate)
3945 / g_secondary_mau) * g_secondary_mau;
3946 l_invoice_b.Invoice_Currency_Code := l_invoice.Invoice_Currency_Code;
3947 l_invoice_b.Base_Currency_Code := l_invoice.Base_Currency_Code;
3948 l_invoice_b.Entered_Date := l_invoice.Entered_Date;
3949 l_invoice_b.Payment_Currency_Code := l_invoice.Payment_Currency_Code;
3950 IF l_invoice.Payment_Status_Flag = 'Y' THEN
3951 l_invoice_b.Fully_Paid_Date := l_inv_f_paid_date;
3952 ELSE l_invoice_B.Fully_Paid_Date := NULL;
3953 END IF;
3954 l_invoice_b.Terms_ID := l_invoice.Terms_ID;
3955 l_invoice_b.Source := l_invoice.Source;
3956 l_invoice_b.E_Invoices_Flag := l_invoice.E_Invoices_Flag;
3957 l_invoice_b.Cancel_Flag := l_invoice.Cancel_Flag;
3958 l_invoice_b.Cancel_Date := l_invoice.Cancel_Date;
3959 l_invoice_b.Dist_Count := l_invoice.Dist_Count;
3960 l_invoice_b.Due_Date := TRUNC(l_inv_due_date);
3961 l_invoice_b.Discount_Offered := l_inv_disc_avail;
3962 l_invoice_b.Discount_Offered_B := ROUND((l_inv_disc_avail * l_invoice.To_Func_Rate)
3963 / l_invoice.Functional_MAU) * l_invoice.Functional_MAU;
3964 l_invoice_b.Prim_Discount_Offered := ROUND((l_inv_disc_avail * l_invoice.To_Prim_Rate)
3965 / g_primary_mau) * g_primary_mau;
3966 l_invoice_b.Sec_Discount_Offered := ROUND((l_inv_disc_avail * l_invoice.To_Sec_Rate)
3967 / g_secondary_mau) * g_secondary_mau;
3968 l_invoice_b.Last_Update_Date := sysdate;
3969 l_invoice_b.Last_Updated_By := g_fii_user_id;
3970 l_invoice_b.Creation_Date := sysdate;
3971 l_invoice_b.Created_By := l_invoice.Created_By;
3972 l_invoice_b.Last_Update_Login := g_fii_login_id;
3973 l_invoice_b.Exchange_Date := l_invoice.Exchange_Date;
3974 l_invoice_b.Exchange_Rate := l_invoice.Exchange_Rate;
3975 l_invoice_b.Exchange_Rate_Type := l_invoice.Exchange_Rate_Type;
3976 l_invoice_b.Payment_Status_Flag := l_invoice.Payment_Status_Flag;
3977 l_invoice_b.Payment_Cross_Rate := l_invoice.Payment_Cross_Rate;
3978 IF l_invoice.Payment_Status_Flag = 'Y' THEN
3979 l_invoice_b.Fully_Paid_Amount := l_inv_f_paid_amt;
3980 ELSE l_invoice_b.Fully_Paid_Amount := NULL;
3981 END IF;
3982 l_invoice_b.Fully_Paid_Amount_B := ROUND((l_invoice_b.Fully_Paid_Amount * l_invoice.To_Func_Rate)
3983 / l_invoice.Functional_MAU) * l_invoice.Functional_MAU;
3984 l_invoice_b.Prim_Fully_Paid_Amount := ROUND((l_invoice_b.Fully_Paid_Amount * l_invoice.To_Prim_Rate)
3985 / g_primary_mau) * g_primary_mau;
3986 l_invoice_b.Sec_Fully_Paid_Amount := ROUND((l_invoice_b.Fully_Paid_Amount * l_invoice.To_Sec_Rate)
3987 / g_secondary_mau) * g_secondary_mau;
3988
3989 Insert_Invoice_B_Rec(l_invoice_b);
3990
3991 l_timestamp3_tmp := DBMS_UTILITY.Get_Time - l_timestamp3_tmp;
3992 l_timestamp3 := l_timestamp3 + l_timestamp3_tmp;
3993
3994 END IF; --IF l_invoice.Invoice_B_Flag = 'Y' THEN
3995 ---------------- END INSERTING INTO FII_AP_INVOICE_B Memory Structures --------------
3996
3997 ----------------- BEGIN INSERTING INTO FII_AP_AGING_BKTS_B_MS AND FII_AP_DUE_COUNTS_B ------------------
3998
3999 l_timestamp4_tmp := DBMS_UTILITY.Get_Time;
4000
4001 IF (l_invoice.Pay_Sched_B_Flag = 'Y' OR l_supplier_merge_flag = 'Y')
4002 AND l_inv_has_mult_ps = 'Y' THEN
4003
4004 g_state := 'Inserting aging records into FII_AP_Aging_Bkts_B_MS and FII_AP_Due_Counts_B_MS for Invoice ' || l_invoice.Invoice_ID || ' with multiple payment schedules.';
4005
4006 l_ps_aging_marker := FII_AP_PS_Aging_MS.First;
4007 WHILE l_ps_aging_marker IS NOT NULL LOOP
4008 g_state := 'Looping FII_AP_PS_Aging_MS for Invoice ' || l_invoice.Invoice_ID || ', Marker ' || l_ps_aging_marker || '.';
4009
4010 l_ps_aging := FII_AP_PS_Aging_MS(l_ps_aging_marker);
4011
4012 IF l_inv_db1 = 0 AND l_ps_aging.Due_Bucket1 > 0 THEN
4013 l_aging_bkts_b.Due_Bucket1_Cnt := 1;
4014 ELSE l_aging_bkts_b.Due_Bucket1_Cnt := 0;
4015 END IF;
4016 l_inv_db1 := l_inv_db1 + l_ps_aging.Due_Bucket1;
4017 IF l_inv_db1 = 0 AND l_ps_aging.Due_Bucket1 < 0 THEN
4018 l_aging_bkts_b.Due_Bucket1_Cnt := -1;
4019 END IF;
4020
4021 IF l_inv_db2 = 0 AND l_ps_aging.Due_Bucket2 > 0 THEN
4022 l_aging_bkts_b.Due_Bucket2_Cnt := 1;
4023 ELSE l_aging_bkts_b.Due_Bucket2_Cnt := 0;
4024 END IF;
4025 l_inv_db2 := l_inv_db2 + l_ps_aging.Due_Bucket2;
4026 IF l_inv_db2 = 0 AND l_ps_aging.Due_Bucket2 < 0 THEN
4027 l_aging_bkts_b.Due_Bucket2_Cnt := -1;
4028 END IF;
4029
4030 IF l_inv_db3 = 0 AND l_ps_aging.Due_Bucket3 > 0 THEN
4031 l_aging_bkts_b.Due_Bucket3_Cnt := 1;
4032 ELSE l_aging_bkts_b.Due_Bucket3_Cnt := 0;
4033 END IF;
4034 l_inv_db3 := l_inv_db3 + l_ps_aging.Due_Bucket3;
4035 IF l_inv_db3 = 0 AND l_ps_aging.Due_Bucket3 < 0 THEN
4036 l_aging_bkts_b.Due_Bucket3_Cnt := -1;
4037 END IF;
4038
4039 IF l_inv_pdb3 = 0 AND l_ps_aging.Past_Due_Bucket3 > 0 THEN
4040 l_aging_bkts_b.Past_Due_Bucket3_Cnt := 1;
4041 ELSE l_aging_bkts_b.Past_Due_Bucket3_Cnt := 0;
4042 END IF;
4043 l_inv_pdb3 := l_inv_pdb3 + l_ps_aging.Past_Due_Bucket3;
4044 IF l_inv_pdb3 = 0 AND l_ps_aging.Past_Due_Bucket3 < 0 THEN
4045 l_aging_bkts_b.Past_Due_Bucket3_Cnt := -1;
4046 END IF;
4047
4048 IF l_inv_pdb2 = 0 AND l_ps_aging.Past_Due_Bucket2 > 0 THEN
4049 l_aging_bkts_b.Past_Due_Bucket2_Cnt := 1;
4050 ELSE l_aging_bkts_b.Past_Due_Bucket2_Cnt := 0;
4051 END IF;
4052 l_inv_pdb2 := l_inv_pdb2 + l_ps_aging.Past_Due_Bucket2;
4053 IF l_inv_pdb2 = 0 AND l_ps_aging.Past_Due_Bucket2 < 0 THEN
4054 l_aging_bkts_b.Past_Due_Bucket2_Cnt := -1;
4055 END IF;
4056
4057 IF l_inv_pdb1 = 0 AND l_ps_aging.Past_Due_Bucket1 > 0 THEN
4058 l_aging_bkts_b.Past_Due_Bucket1_Cnt := 1;
4059 ELSE l_aging_bkts_b.Past_Due_Bucket1_Cnt := 0;
4060 END IF;
4061 l_inv_pdb1 := l_inv_pdb1 + l_ps_aging.Past_Due_Bucket1;
4062 IF l_inv_pdb1 = 0 AND l_ps_aging.Past_Due_Bucket1 < 0 THEN
4063 l_aging_bkts_b.Past_Due_Bucket1_Cnt := -1;
4064 END IF;
4065
4066 IF l_aging_bkts_b.Due_Bucket1_Cnt <> 0 OR
4067 l_aging_bkts_b.Due_Bucket2_Cnt <> 0 OR
4068 l_aging_bkts_b.Due_Bucket3_Cnt <> 0 OR
4069 l_aging_bkts_b.Past_Due_Bucket3_Cnt <> 0 OR
4070 l_aging_bkts_b.Past_Due_Bucket2_Cnt <> 0 OR
4071 l_aging_bkts_b.Past_Due_Bucket1_Cnt <> 0 THEN --Insert into FII_AP_AGING_BKTS_B_MS.
4072
4073 g_state := 'Inserting aging record in FII_AP_Aging_Bkts_B_MS for Invoice ' || l_invoice.Invoice_ID || ', Marker ' || l_ps_aging_marker || '.';
4074
4075 l_aging_bkts_b.Time_ID := TO_NUMBER(TO_CHAR(l_ps_aging.Action_Date,'J'));
4076 l_aging_bkts_b.Period_Type_ID := 1;
4077 l_aging_bkts_b.Org_ID := l_invoice.Org_ID;
4078 l_aging_bkts_b.Supplier_ID := l_invoice.Supplier_ID;
4079 l_aging_bkts_b.Invoice_ID := l_invoice.Invoice_ID;
4080 l_aging_bkts_b.Action_Date := l_ps_aging.Action_Date;
4081 l_aging_bkts_b.Last_Update_Date := sysdate;
4082 l_aging_bkts_b.Last_Updated_By := g_fii_user_id;
4083 l_aging_bkts_b.Creation_Date := sysdate;
4084 l_aging_bkts_b.Created_By := g_fii_user_id;
4085 l_aging_bkts_b.Last_Update_Login := g_fii_login_id;
4086 FII_AP_Aging_Bkts_B_MS(FII_AP_Aging_Bkts_B_MS.Count+1) := l_aging_bkts_b;
4087 END IF;
4088
4089 IF l_inv_due = 0 AND l_ps_aging.Due_Bucket1 + l_ps_aging.Due_Bucket2 + l_ps_aging.Due_Bucket3 > 0 THEN
4090 l_due_counts_b.Due_Cnt := 1;
4091 ELSE l_due_counts_b.Due_Cnt := 0;
4092 END IF;
4093 l_inv_due := l_inv_due + l_ps_aging.Due_Bucket1 + l_ps_aging.Due_Bucket2 + l_ps_aging.Due_Bucket3;
4094 IF l_inv_due = 0 AND l_ps_aging.Due_Bucket1 + l_ps_aging.Due_Bucket2 + l_ps_aging.Due_Bucket3 < 0 THEN
4095 l_due_counts_b.Due_Cnt := -1;
4096 END IF;
4097
4098 IF l_inv_past_due = 0 AND l_ps_aging.Past_Due_Bucket1
4099 + l_ps_aging.Past_Due_Bucket2
4100 + l_ps_aging.Past_Due_Bucket3 > 0 THEN
4101 l_due_counts_b.Past_Due_Cnt := 1;
4102 ELSE l_due_counts_b.Past_Due_Cnt := 0;
4103 END IF;
4104 l_inv_past_due := l_inv_past_due + l_ps_aging.Past_Due_Bucket1
4105 + l_ps_aging.Past_Due_Bucket2
4106 + l_ps_aging.Past_Due_Bucket3;
4107 IF l_inv_past_due = 0 AND l_ps_aging.Past_Due_Bucket1
4108 + l_ps_aging.Past_Due_Bucket2
4109 + l_ps_aging.Past_Due_Bucket3 < 0 THEN
4110 l_due_counts_b.Past_Due_Cnt := -1;
4111 END IF;
4112
4113 IF l_due_counts_b.Due_Cnt <> 0 OR
4114 l_due_counts_b.Past_Due_Cnt <> 0 THEN --Insert into FII_AP_DUE_COUNTS_B_MS.
4115 g_state := 'Inserting aging record in FII_AP_Due_Counts_B_MS for Invoice ' || l_invoice.Invoice_ID || ', Marker ' || l_ps_aging_marker || '.';
4116
4117 l_due_counts_b.Time_ID := TO_NUMBER(TO_CHAR(l_ps_aging.Action_Date,'J'));
4118 l_due_counts_b.Period_Type_ID := 1;
4119 l_due_counts_b.Org_ID := l_invoice.Org_ID;
4120 l_due_counts_b.Supplier_ID := l_invoice.Supplier_ID;
4121 l_due_counts_b.Invoice_ID := l_invoice.Invoice_ID;
4122 l_due_counts_b.Action_Date := l_ps_aging.Action_Date;
4123 l_due_counts_b.Last_Update_Date := sysdate;
4124 l_due_counts_b.Last_Updated_By := g_fii_user_id;
4125 l_due_counts_b.Creation_Date := sysdate;
4126 l_due_counts_b.Created_By := g_fii_user_id;
4127 l_due_counts_b.Last_Update_Login := g_fii_login_id;
4128 FII_AP_Due_Counts_B_MS(FII_AP_Due_Counts_B_MS.Count+1) := l_due_counts_b;
4129 END IF;
4130
4131 l_ps_aging_marker := FII_AP_PS_Aging_MS.Next(l_ps_aging_marker);
4132 END LOOP; --End of FII_AP_PS_Aging_MS Loop.
4133 END IF; --IF l_invoice.Pay_Sched_B_Flag = 'Y' THEN
4134
4135 l_timestamp4_tmp := DBMS_UTILITY.Get_Time - l_timestamp4_tmp;
4136 l_timestamp4 := l_timestamp4 + l_timestamp4_tmp;
4137 ------------------ END INSERTING INTO FII_AP_AGING_BKTS_B_MS AND FII_AP_DUE_COUNTS_B -------------------
4138
4139 END;
4140 END LOOP; --End of Invoices Loop.
4141
4142 --If there are remaining records not processed from existing base summary tables, they must be deleted.
4143 INSERT_DELETED_REC(NULL, NULL);
4144
4145 --Print out time breakdown for each table.
4146 if g_debug_flag = 'Y' then
4147 FII_UTIL.put_line('The time taken to populate the memory structures for FII_AP_Pay_Sched_B is: ' || to_char(l_timestamp2/100) || ' seconds.');
4148 FII_UTIL.put_line('The time taken to populate the memory structures for FII_AP_Invoice_B is: ' || to_char(l_timestamp3/100) || ' seconds.');
4149 FII_UTIL.put_line('The time taken to populate FII_AP_Aging_Bkts_B_MS and FII_AP_Due_Counts_B_MS is: ' || to_char(l_timestamp4/100) || ' seconds.');
4150 end if;
4151
4152
4153 --Populate Tables from Memory Structures.
4154 POPULATE_TABLES_FROM_MS;
4155
4156 --Update, Insert, or Delete Records into FII_AP_Pay_Sched_B.
4157 MAINTAIN_PAY_SCHED_B;
4158
4159 --Update, Insert, or Delete Records into FII_AP_Invoice_B.
4160 MAINTAIN_INVOICE_B;
4161
4162
4163 g_state := 'Updating Supplier_ID in FII_AP_AGING_BKTS_B';
4164 UPDATE FII_AP_AGING_BKTS_B AB
4165 SET Supplier_ID = (SELECT AI.Supplier_ID
4166 FROM FII_AP_Invoice_B AI
4167 WHERE AI.Invoice_ID = AB.Invoice_ID)
4168 WHERE AB.Invoice_ID IN (SELECT Key_Value1_Num
4169 FROM FII_AP_DBI_LOG_T
4170 WHERE Table_Name = 'AP_INVOICES'
4171 AND Operation_Flag = 'U');
4172
4173 g_state := 'Updating Supplier_ID in FII_AP_DUE_COUNTS_B';
4174 UPDATE FII_AP_DUE_COUNTS_B DC
4175 SET Supplier_ID = (SELECT AI.Supplier_ID
4176 FROM FII_AP_Invoice_B AI
4177 WHERE AI.Invoice_ID = DC.Invoice_ID)
4178 WHERE DC.Invoice_ID IN (SELECT Key_Value1_Num
4179 FROM FII_AP_DBI_LOG_T
4180 WHERE Table_Name = 'AP_INVOICES'
4181 AND Operation_Flag = 'U');
4182
4183
4184
4185 EXCEPTION
4186 WHEN OTHERS THEN
4187 g_errbuf:=sqlerrm;
4188 g_retcode:= -1;
4189 g_exception_msg := g_retcode || ':' || g_errbuf;
4190 FII_UTIL.put_line('Error occured while ' || g_state);
4191 FII_UTIL.put_line(g_exception_msg);
4192 RAISE;
4193 END POPULATE_INV_PAY_SCHED_SUM;
4194
4195
4196 -- ------------------------------------------------------------
4197 -- Public Functions and Procedures
4198 -- ------------------------------------------------------------
4199
4200 -- Procedure
4201 -- Collect()
4202 -- Purpose
4203 -- This Collect routine Handles all functions involved in the AP summarization
4204 -- and populating FII AP summary tables .
4205
4206 -----------------------------------------------------------
4207 -- PROCEDURE COLLECT
4208 -----------------------------------------------------------
4209 Procedure Collect(Errbuf IN OUT NOCOPY VARCHAR2,
4210 Retcode IN OUT NOCOPY VARCHAR2
4211 ) IS
4212
4213 l_dir VARCHAR2(400);
4214 l_start_date DATE := NULL;
4215 l_end_date DATE := NULL;
4216 l_period_from DATE := NULL;
4217 l_period_to DATE := NULL;
4218
4219 l_start_date_temp DATE := NULL;
4220
4221 BEGIN
4222 g_state := 'Inside the procedure COLLECT';
4223 if g_debug_flag = 'Y' then
4224 FII_UTIL.put_line(g_state);
4225 end if;
4226
4227 Retcode := 0;
4228
4229 ------------------------------------------------------
4230 -- Set default directory in case if the profile option
4231 -- BIS_DEBUG_LOG_DIRECTORY is not set up
4232 ------------------------------------------------------
4233 l_dir:='/sqlcom/log';
4234
4235 ----------------------------------------------------------------
4236 -- FII_UTIL.initialize will get profile options FII_DEBUG_MODE
4237 -- and BIS_DEBUG_LOG_DIRECTORY and set up the directory where
4238 -- the log files and output files are written to
4239 ----------------------------------------------------------------
4240 FII_UTIL.initialize('FII_AP_INV_SUM_INC.log','FII_AP_INV_SUM_INC.out',l_dir, 'FII_AP_INV_SUM_INC');
4241
4242 -------------------------------------------------------------
4243 -- Check if FII: DBI Payables Operations Implementation profile
4244 -- is turned on. If yes, continue, otherwise, error out. User
4245 -- need to turn on this profile option before running this program
4246 ---------------------------------------------------------------
4247 IF g_oper_imp_prof_flag = 'N' THEN
4248 g_state := 'Checking Implementation profile option';
4249 FII_MESSAGE.write_log(
4250 msg_name => 'FII_AP_DBI_OPER_IMP',
4251 token_num => 0);
4252 g_retcode := -2;
4253 g_errbuf := 'FII: DBI Payables Operations Implementation profile option is not turned on';
4254 RAISE G_IMP_NOT_SET;
4255 END IF;
4256
4257
4258 g_state := 'Calling BIS_COLLECTION_UTILITIES.setup';
4259 IF(NOT BIS_COLLECTION_UTILITIES.setup('FII_AP_INV_SUM_INC')) THEN
4260 raise_application_error(-20000, errbuf);
4261 return;
4262 END IF;
4263
4264 ------------------------------------------------------------
4265 --Get timestamps used to maintain ap_dbi_log.
4266 --g_timestamp1 - current timestamp.
4267 --g_timestamp2 - last Payables Operation/Expenses load.
4268 --g_timestamp3 - last Payables Expenses load, if implemented.
4269 --g_timestamp4 - last Payables Operation load.
4270 -------------------------------------------------------------
4271 g_state := 'Defining timestamps to maintain ap_dbi_log.';
4272 IF g_debug_flag = 'Y' then
4273 FII_UTIL.put_line('');
4274 FII_UTIL.put_line(g_state);
4275 fii_util.put_line('');
4276 END IF;
4277
4278 g_timestamp1 := BIS_COLLECTION_UTILITIES.G_Start_Date;
4279
4280 BIS_COLLECTION_UTILITIES.get_last_refresh_dates('FII_AP_INV_SUM_INIT',
4281 l_start_date, l_end_date,
4282 l_period_from, l_period_to);
4283
4284 g_start_date := NVL(l_period_from, BIS_COMMON_PARAMETERS.Get_Global_Start_Date);
4285
4286 BIS_COLLECTION_UTILITIES.get_last_refresh_dates('FII_AP_INV_SUM_INC',
4287 l_start_date_temp, l_end_date,
4288 l_period_from, l_period_to);
4289
4290 l_start_date := GREATEST(NVL(l_start_date, BIS_COMMON_PARAMETERS.Get_Global_Start_Date),
4291 NVL(l_start_date_temp, BIS_COMMON_PARAMETERS.Get_Global_Start_Date));
4292
4293 g_timestamp2 := l_start_date;
4294 g_timestamp4 := l_start_date;
4295
4296 IF g_exp_imp_prof_flag = 'Y' THEN
4297
4298 BIS_COLLECTION_UTILITIES.get_last_refresh_dates('FII_AP_INV_DISTRIBUTIONS_B_L',
4299 l_start_date, l_end_date,
4300 l_period_from, l_period_to);
4301
4302 BIS_COLLECTION_UTILITIES.get_last_refresh_dates('FII_AP_INV_DISTRIBUTIONS_B_I',
4303 l_start_date_temp, l_end_date,
4304 l_period_from, l_period_to);
4305
4306 l_start_date := GREATEST(NVL(l_start_date, BIS_COMMON_PARAMETERS.Get_Global_Start_Date),
4307 NVL(l_start_date_temp, BIS_COMMON_PARAMETERS.Get_Global_Start_Date));
4308
4309 g_timestamp3 := l_start_date;
4310 g_timestamp2 := GREATEST(g_timestamp2, g_timestamp3);
4311 END IF;
4312
4313 g_last_start_date := TRUNC(g_timestamp4);
4314
4315 g_act_part1 := MOD(TO_NUMBER(TO_CHAR(TRUNC(g_timestamp1), 'J')), 32);
4316 g_act_part2 := MOD(TO_NUMBER(TO_CHAR(TRUNC(g_timestamp1+1), 'J')), 32);
4317
4318 g_old_act_part1 := MOD(TO_NUMBER(TO_CHAR(TRUNC(g_timestamp2), 'J')), 32);
4319 g_old_act_part2 := MOD(TO_NUMBER(TO_CHAR(TRUNC(g_timestamp2+1), 'J')), 32);
4320
4321 if g_debug_flag = 'Y' then
4322 FII_UTIL.put_line('Start date is: ' || g_start_date);
4323 FII_UTIL.put_line('Last load included invoices to date ' || g_last_start_date);
4324
4325 FII_UTIL.put_line('Current Load Timestamp is: ' || to_char(g_timestamp1, 'YYYY/MM/DD HH24:MI:SS'));
4326 FII_UTIL.put_line('Previous Payables Load Timestamp is: ' || to_char(g_timestamp2, 'YYYY/MM/DD HH24:MI:SS'));
4327 FII_UTIL.put_line('Previous Payables Expenses Load Timestamp is: ' || to_char(g_timestamp3, 'YYYY/MM/DD HH24:MI:SS'));
4328 FII_UTIL.put_line('Previous Payables Operations Load Timestamp is: ' || to_char(g_timestamp4, 'YYYY/MM/DD HH24:MI:SS'));
4329 end if;
4330
4331 IF g_timestamp4 + 30 < g_timestamp1 THEN
4332 g_errbuf := fnd_message.get_string('FII', 'FII_AP_RUN_INIT');
4333 RAISE G_RUN_INIT;
4334 END IF;
4335
4336
4337 if g_debug_flag = 'Y' then
4338 FII_UTIL.put_line('-------------------------------------------------');
4339 FII_UTIL.put_line('Calling the Init procedure to initialize the global variables');
4340 FII_UTIL.put_line('-------------------------------------------------');
4341 end if;
4342
4343 INIT;
4344
4345
4346 g_state := 'Truncating temp tables used to populate base tables';
4347 TRUNCATE_TABLE('FII_AP_PS_RATES_TEMP');
4348 TRUNCATE_TABLE('FII_AP_FUNC_RATES_TEMP');
4349 -- TRUNCATE_TABLE('FII_AP_PAY_SCHED_TEMP');
4350 -- TRUNCATE_TABLE('FII_AP_PAY_SCHED_ID');
4351 -- TRUNCATE_TABLE('FII_AP_WH_TAX_T');
4352 -- TRUNCATE_TABLE('FII_AP_PREPAY_T');
4353
4354 TRUNCATE_TABLE('FII_AP_DBI_LOG_T');
4355 TRUNCATE_TABLE('FII_AP_INVOICE_IDS');
4356
4357 INSERT into FII_AP_DBI_LOG_T(Key_Value1_Num,
4358 Key_Value2_Num,
4359 Table_Name,
4360 Operation_Flag,
4361 Creation_Date,
4362 Created_By,
4363 Last_Update_Date,
4364 Last_Updated_By,
4365 Last_Update_Login)
4366 SELECT Key_Value1_Num,
4367 Key_Value2_Num,
4368 Table_Name,
4369 Operation_Flag,
4370 sysdate Creation_Date,
4371 g_fii_user_id Created_By,
4372 sysdate Last_Update_Date,
4373 g_fii_user_id Last_Updated_By,
4374 g_fii_login_id Last_Update_Login
4375 FROM (SELECT Key_Value1 Key_Value1_Num,
4376 Key_Value2 Key_Value2_Num,
4377 Table_Name,
4378 Operation_Flag
4379 FROM AP_DBI_LOG
4380 WHERE Creation_Date >= g_timestamp2
4381 AND Creation_Date < g_timestamp1
4382 UNION
4383 SELECT Key_Value1_ID Key_Value1_Num,
4384 Key_Value2_ID Key_Value2_Num,
4385 Table_Name,
4386 Operation_Flag
4387 FROM FII_AP_DBI_Log_PS_T)
4388 GROUP BY Key_Value1_Num, Key_Value2_Num, Table_Name, Operation_Flag;
4389
4390 FND_STATS.GATHER_TABLE_STATS(OWNNAME => 'FII', TABNAME => 'FII_AP_DBI_LOG_T');
4391
4392 COMMIT;
4393
4394
4395 g_state := 'Inserting records into the FII_AP_INVOICE_IDS table';
4396 if g_debug_flag = 'Y' then
4397 FII_UTIL.put_line('');
4398 FII_UTIL.put_line(g_state);
4399 FII_UTIL.start_timer;
4400 FII_UTIL.put_line('');
4401 end if;
4402
4403 INSERT INTO FII_AP_Invoice_IDS
4404 (Invoice_ID,
4405 Invoice_B_Flag,
4406 Pay_Sched_B_Flag,
4407 Get_Rate_Flag,
4408 Delete_Inv_Flag,
4409 Last_Update_Date,
4410 Last_Updated_By,
4411 Creation_Date,
4412 Created_By,
4413 Last_Update_Login)
4414 SELECT INVIDS.Invoice_ID,
4415 CASE WHEN MAX(DECODE(Rank, 1, 1, 0)) = 1 THEN 'Y' ELSE 'N' END Invoice_B_Flag,
4416 CASE WHEN MAX(DECODE(Rank, 2, 1, 0)) = 1 THEN 'Y' ELSE 'N' END Pay_Sched_B_Flag,
4417 CASE WHEN MAX(DECODE(Rank,1, DECODE(Operation_Flag, 'D', 0, 1), 0)) = 1 OR MAX(DECODE(Rank, 2, 1, 0)) = 1
4418 THEN 'Y' ELSE 'N' END Get_Rate_Flag,
4419 CASE WHEN MAX(CASE WHEN Rank = 1
4420 AND Table_Name = 'AP_INVOICES'
4421 AND Operation_Flag = 'D' THEN 1 ELSE 0 END) = 1
4422 THEN 'Y' ELSE 'N' END Delete_Inv_Flag,
4423 sysdate Last_Update_Date,
4424 g_fii_user_id Last_Updated_By,
4425 sysdate Creation_Date,
4426 g_fii_user_id Created_By,
4427 g_fii_login_id Last_Update_Login
4428 FROM (SELECT Key_Value1_Num Invoice_ID,
4429 1 Rank,
4430 Table_Name,
4431 Operation_Flag
4432 FROM FII_AP_DBI_LOG_T
4433 WHERE Table_Name IN ('AP_INVOICES', 'AP_HOLDS', 'AP_PAYMENT_SCHEDULES',
4434 'AP_INVOICE_DISTRIBUTIONS')
4435 UNION
4436 SELECT Invoice_ID,
4437 2 Rank,
4438 Table_Name,
4439 Operation_Flag
4440 FROM (
4441 SELECT Key_Value1_Num Invoice_ID,
4442 Table_Name,
4443 Operation_Flag
4444 FROM FII_AP_DBI_LOG_T
4445 WHERE Table_Name = 'AP_PAYMENT_SCHEDULES'
4446 UNION
4447 SELECT LOG.Key_Value1_Num Invoice_ID,
4448 LOG.Table_Name Table_Name,
4449 LOG.Operation_Flag Operation_Flag
4450 FROM FII_AP_DBI_LOG_T LOG, AP_Invoice_Distributions_All AID
4451 WHERE LOG.Table_Name = 'AP_INVOICE_DISTRIBUTIONS'
4452 AND LOG.Key_Value2_Num = AID.Invoice_Distribution_ID
4453 AND AID.Line_Type_Lookup_Code IN ('PREPAY', 'AWT', 'NONREC_TAX', 'REC_TAX')
4454 UNION
4455 SELECT AIP.Invoice_ID Invoice_ID,
4456 Table_Name,
4457 Operation_Flag
4458 FROM FII_AP_DBI_LOG_T LOG, AP_Invoice_Payments_All AIP
4459 WHERE Table_Name = 'AP_INVOICE_PAYMENTS'
4460 AND LOG.Key_Value1_Num = AIP.Invoice_Payment_ID
4461 UNION
4462 SELECT PS.Invoice_ID Invoice_ID,
4463 'OTHER' Table_Name,
4464 'U' Operation_Flag
4465 FROM AP_Payment_Schedules_All PS
4466 WHERE Payment_Status_Flag IN ('N', 'P')
4467 AND ((g_last_start_date <= TRUNC(PS.Discount_Date)
4468 AND TRUNC(PS.Discount_Date) < g_sysdate)
4469 OR (g_last_start_date <= TRUNC(PS.Second_Discount_Date)
4470 AND TRUNC(PS.Second_Discount_Date) < g_sysdate)
4471 OR (g_last_start_date <= TRUNC(PS.Third_Discount_Date)
4472 AND TRUNC(PS.Third_Discount_Date) < g_sysdate)
4473 OR (g_last_start_date <= (TRUNC(PS.Due_Date) - g_due_bucket2 - 1)
4474 AND (TRUNC(PS.Due_Date) - g_due_bucket2 - 1) < g_sysdate)
4475 OR (g_last_start_date <= (TRUNC(PS.Due_Date) - g_due_bucket3 - 1)
4476 AND (TRUNC(PS.Due_Date) - g_due_bucket3 - 1) < g_sysdate)
4477 OR (g_last_start_date <= TRUNC(PS.Due_Date)
4478 AND TRUNC(PS.Due_Date) < g_sysdate)
4479 OR (g_last_start_date <= (TRUNC(PS.Due_Date) + g_past_bucket3)
4480 AND (TRUNC(PS.Due_Date) + g_past_bucket3) < g_sysdate)
4481 OR (g_last_start_date <= (TRUNC(PS.Due_Date) + g_past_bucket2)
4482 AND (TRUNC(PS.Due_Date) + g_past_bucket2) < g_sysdate)))) INVIDS
4483 GROUP BY INVIDS.Invoice_ID;
4484
4485 /* Commenting this code as per performance bug review
4486 Bug 4943180. Don't find any functional reason, why we should join
4487 to AP_INVOICES_ALL table here. Only join here between AP_INVOICES_ALL
4488 and INVIDS is on invoice_id and that is a outer join. All other
4489 whereclauses doesn't do much in that situation */
4490
4491
4492 /*,
4493 AP_Invoices_All AI
4494 WHERE INVIDS.Invoice_ID = AI.Invoice_ID (+)
4495 AND (AI.Invoice_Type_Lookup_Code IS NULL OR AI.Invoice_Type_Lookup_Code <> 'EXPENSE REPORT')
4496 AND (AI.Invoice_Amount IS NULL OR AI.Invoice_Amount <> 0 OR (AI.Invoice_Amount = 0 AND AI.Cancelled_Date IS NOT NULL))
4497 AND (AI.Creation_Date IS NULL OR TRUNC(AI.Creation_Date) >= g_start_date)*/
4498
4499
4500
4501 FND_STATS.GATHER_TABLE_STATS(OWNNAME => 'FII', TABNAME => 'FII_AP_INVOICE_IDS');
4502
4503
4504 if g_debug_flag = 'Y' then
4505 FII_UTIL.put_line('-------------------------------------------------');
4506 FII_UTIL.put_line('Calling the Insert_Rates procedure to insert the missing rate info');
4507 FII_UTIL.put_line('-------------------------------------------------');
4508 end if;
4509
4510 INSERT_RATES;
4511
4512 if g_debug_flag = 'Y' then
4513 FII_UTIL.put_line('-------------------------------------------------');
4514 FII_UTIL.put_line('Calling the Verify_Missing_Rates procedure');
4515 FII_UTIL.put_line('-------------------------------------------------');
4516 end if;
4517
4518 IF (VERIFY_MISSING_RATES = -1) THEN
4519 g_retcode := -1;
4520 g_errbuf := fnd_message.get_string('FII', 'FII_MISS_EXCH_RATE_FOUND');
4521 RAISE G_MISSING_RATES;
4522
4523
4524 -----------------------------------------------------------------------
4525 -- If there are no missing exchange rate records, then we will insert
4526 -- records into the summary tables
4527 -----------------------------------------------------------------------
4528 ELSE
4529
4530 if g_debug_flag = 'Y' then
4531 FII_UTIL.put_line('-------------------------------------------------');
4532 FII_UTIL.put_line('Calling procedure DELETE_SUMMARY');
4533 FII_UTIL.put_line('-------------------------------------------------');
4534 end if;
4535
4536 DELETE_SUMMARY;
4537 g_retcode := 0;
4538
4539
4540 if g_debug_flag = 'Y' then
4541 FII_UTIL.put_line('-------------------------------------------------');
4542 FII_UTIL.put_line('Calling procedure POPULATE_INV_PAY_SCHED_SUM');
4543 FII_UTIL.put_line('-------------------------------------------------');
4544 end if;
4545
4546 POPULATE_INV_PAY_SCHED_SUM;
4547 g_retcode := 0;
4548
4549
4550 if g_debug_flag = 'Y' then
4551 FII_UTIL.put_line('-------------------------------------------------');
4552 FII_UTIL.put_line('Calling procedure POPULATE_HOLDS_SUM');
4553 FII_UTIL.put_line('-------------------------------------------------');
4554 end if;
4555
4556 POPULATE_HOLDS_SUM;
4557 g_retcode := 0;
4558
4559
4560 if g_debug_flag = 'Y' then
4561 FII_UTIL.put_line('-------------------------------------------------');
4562 FII_UTIL.put_line('Calling procedure POPULATE_HOLD_HISTORY');
4563 FII_UTIL.put_line('-------------------------------------------------');
4564 end if;
4565
4566 POPULATE_HOLD_HISTORY;
4567 g_retcode := 0;
4568
4569 FOR i IN 0..31 LOOP --i represents the partition of ap_dbi_log.
4570
4571 IF g_timestamp3 + 30 >= g_timestamp1 AND g_exp_imp_prof_flag = 'Y' THEN --Copy records into Expense log table.
4572
4573 g_state := 'Copying records from partition ' || i || ' into FII_AP_DBI_LOG_EXP_T.';
4574 if g_debug_flag = 'Y' then
4575 fii_util.put_line(g_state);
4576 end if;
4577
4578
4579 INSERT INTO FII_AP_DBI_LOG_EXP_T(
4580 Table_Name,
4581 Operation_Flag,
4582 Key_Value1_ID,
4583 Key_Value2_ID,
4584 Created_By,
4585 Last_Updated_By,
4586 Last_Update_Login,
4587 Creation_Date,
4588 Last_Update_Date)
4589 SELECT Table_Name,
4590 Operation_Flag,
4591 Key_Value1,
4592 Key_Value2,
4593 Created_By,
4594 Last_Updated_By,
4595 Last_Update_Login,
4596 Creation_Date,
4597 Last_Update_Date
4598 FROM AP_DBI_LOG
4599 WHERE Partition_ID = i
4600 AND Creation_Date >= g_timestamp2
4601 AND Creation_Date < g_timestamp1;
4602 END IF;
4603
4604 IF NOT (i = g_act_part1 OR i = g_act_part2) THEN --This is a non-active partition.
4605 EXECUTE IMMEDIATE 'ALTER TABLE ' || g_ap_schema || '.AP_DBI_LOG TRUNCATE PARTITION P' || to_char(i);
4606 END IF;
4607
4608 END LOOP;
4609
4610 TRUNCATE_TABLE('FII_AP_DBI_LOG_PS_T');
4611
4612 g_state := 'Truncating temp tables after used to populate base tables';
4613 -- TRUNCATE_TABLE('FII_AP_PAY_SCHED_TEMP');
4614 -- TRUNCATE_TABLE('FII_AP_PAY_SCHED_ID);
4615 -- TRUNCATE_TABLE('FII_AP_WH_TAX_T');
4616 -- TRUNCATE_TABLE('FII_AP_PREPAY_T');
4617
4618
4619 END IF;
4620
4621 COMMIT;
4622
4623 if g_debug_flag = 'Y' then
4624 FII_UTIL.put_line('return code is ' || retcode);
4625 end if;
4626 Retcode := g_retcode;
4627
4628 g_state := 'Calling BIS_COLLECTION_UTILITIES.wrapup';
4629 BIS_COLLECTION_UTILITIES.wrapup(
4630 p_status => TRUE,
4631 p_period_from => l_period_from,
4632 p_period_to => g_timestamp1);
4633
4634
4635 EXCEPTION
4636 WHEN OTHERS THEN
4637 g_errbuf:=g_errbuf;
4638 g_retcode:= -1;
4639 retcode:=g_retcode;
4640 g_exception_msg := g_retcode || ':' || g_errbuf;
4641 FII_UTIL.put_line('Error occured while ' || g_state);
4642 FII_UTIL.put_line(g_exception_msg);
4643
4644 END;
4645
4646 END FII_AP_INV_SUM_INC;