DBA Data[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;