DBA Data[Home] [Help]

PACKAGE BODY: APPS.FV_YE_CLOSE

Source


1 PACKAGE BODY Fv_Ye_Close AS
2 --$Header: FVXYECPB.pls 120.65 2010/12/15 16:36:47 amaddula ship $
3     --  ======================================================================
4     --                  Variable Naming Conventions
5     --  ======================================================================
6     --  1. Input/Output Parameter global variables
7     --     have the format                                   "vp_<Variable Name>"
8     --  2. Other Global Variables have the format            "vg_<Variable_Name>"
9     --  3. Procedure Level local variables have
10     --     the format                                        "vl_<Variable_Name>"
11     --  4. PL/SQL Table variables have                       "vt_<Variable_Name>"
12     --  5. User Defined Exceptions have                      "e_<Exception_Name>"
13     --  6. Variable Cursors have                             "vc_<Variable_Name>"
14     --  ======================================================================
15     --                          Parameter Global Variable Declarations
16     --  ======================================================================
17 
18    g_module_name VARCHAR2(100) ;
19     vp_errbuf           VARCHAR2(1000)                          ;
20     vp_retcode          NUMBER                             ;
21     vp_post_to_gl   VARCHAR2(1)                             ;
22     vp_mode VARCHAR2(1)                             ;
23     vp_timeframe	Fv_Treasury_Symbols.time_frame%TYPE	;
24     vp_fundgroup	Fv_Treasury_Symbols.fund_group_code%TYPE;
25     vp_trsymbol		Fv_Treasury_Symbols.treasury_symbol%TYPE;
26     vp_closing_fyr 	Gl_Periods.period_year%TYPE		;
27     --year end process
28     vp_closing_num Gl_Periods.period_num%TYPE		;
29 
30     --  ======================================================================
31     --                           Other Global Variable Declarations
32     --  ======================================================================
33 
34     vg_sob_id		Gl_Sets_Of_Books.set_of_books_id%TYPE;
35     vg_coa_id		Gl_Sets_Of_Books.chart_of_accounts_id%TYPE;
36     vg_currency		Gl_Sets_Of_Books.currency_code%TYPE;
37     vg_start_date       Gl_Periods.start_date%TYPE;
38     vg_end_date         Gl_Periods.end_date%TYPE;
39     vg_closing_period 	Gl_Period_Statuses.period_name%TYPE;
40     vg_coy_fyr	 	Gl_Periods.period_year%TYPE;
41     vg_coy_start_date   Gl_Periods.start_date%TYPE;
42     vg_coy_period 	Gl_Period_Statuses.period_name%TYPE;
43     vg_bal_segment      Fnd_Id_Flex_Segments.application_column_name%TYPE;
44     vg_acct_segment     Fnd_Id_Flex_Segments.application_column_name%TYPE;
45     vg_acct_segnum 	NUMBER(4);
46     vg_bal_seg_val_opt_code gl_ledgers_public_v.bal_seg_value_option_code%TYPE;
47     vg_trsymbol         Fv_Treasury_Symbols.treasury_symbol%TYPE;
48     vg_trsymbol_id      Fv_Treasury_Symbols.treasury_symbol_id%TYPE;
49     vg_fund_value	Fv_Fund_Parameters.fund_value%TYPE;
50     vg_group_id         Fv_Ye_Groups.group_id%TYPE;
51     vg_seq_id           Fv_Ye_Group_Sequences.sequence_id%TYPE;
52     vg_seq              Fv_Ye_Group_Sequences.SEQUENCE%TYPE;
53     vp_closing_method 	Fv_Ye_Groups.closing_method%TYPE		;
54     vg_acct_flag        Fv_Ye_Sequence_Accounts.account_flag%TYPE;
55     vg_from_acct        Fv_Ye_Sequence_Accounts.from_account%TYPE;
56     vg_child_acct       Fv_Ye_Sequence_Accounts.from_account%TYPE;
57     vg_to_acct          Fv_Ye_Sequence_Accounts.to_account%TYPE;
58      vg_requisition     Fv_Ye_Sequence_Accounts.requisition%TYPE;
59      vg_closing_method  fv_ye_groups.closing_method%TYPE;
60     -- Bug 10399298
61     treasury_closing_method fv_fund_parameters.close_requisitions%TYPE;
62     vg_balance_read_flag  Fv_Ye_Seq_Bal_Temp.balance_read_flag%TYPE;
63     vg_bal_seq_amt 	NUMBER;
64     vg_gl_bal_amt 	NUMBER;
65     vg_coy_dr 		NUMBER;
66     vg_coy_cr 		NUMBER;
67     vt_segments		Fnd_Flex_Ext.SegmentArray;
68     vg_jrnl_group_id	NUMBER;
69     vg_interface_run_id	NUMBER;
70 
71     e_error      	EXCEPTION;
72     e_invalid      	EXCEPTION;
73 
74     vg_fundgroup	Fv_Treasury_Symbols.fund_group_code%TYPE;
75     vg_acct_val_set_id  Fnd_Flex_Values.flex_value_set_id%TYPE;
76     vg_num_segs		NUMBER;
77     vg_factsi_attr_exists VARCHAR2(1) ;
78     vg_factsi_bal_cnt   NUMBER;
79     vg_factsi_attribute Fv_System_Parameters.factsi_journal_attribute%TYPE;
80 
81     vg_public_law_attribute    fv_system_parameters.factsii_pub_law_code_attribute%TYPE;
82     vg_advance_type_attribute  fv_system_parameters.factsii_advance_type_attribute%TYPE;
83     vg_trf_dept_id_attribute   fv_system_parameters.factsii_tr_dept_id_attribute%TYPE;
84     vg_trf_main_acct_attribute fv_system_parameters.factsii_tr_main_acct_attribute%TYPE;
85 
86     vg_facts_attributes_setup  BOOLEAN ;
87 
88     vg_closing_period_num      Gl_Period_Statuses.period_num%TYPE;
89 ---------------------------------------------------------------------------------
90 ----------------------------------------------------------------
91   PROCEDURE insert_gl_interface_record(l_amount_dr IN NUMBER,
92                                        l_amount_cr IN NUMBER,
93                                        l_reference_1 IN VARCHAR2,
94                                        l_period_name IN VARCHAR2,
95                                        l_trading_partner IN VARCHAR2,
96 				       l_public_law_code IN VARCHAR2 DEFAULT NULL,
97 				       l_advance_type    IN VARCHAR2 DEFAULT NULL,
98 				       l_trf_dept_id     IN VARCHAR2 DEFAULT NULL,
99 				       l_trf_main_acct   IN VARCHAR2 DEFAULT NULL);
100 
101 -- ------------------------------------------------------------------
102 --                      Procedure Main
103 -- ------------------------------------------------------------------
104 -- Main procedure that is called from the Year End Closing Process
105 -- request set. This procedure calls all the subsequent procedures in
106 -- the Year End Closing process.
107 -- ------------------------------------------------------------------
108 PROCEDURE Main( errbuf                 OUT NOCOPY VARCHAR2,
109     retcode                            OUT NOCOPY NUMBER,
110     ledger_id			                     NUMBER,
111     closing_method                     VARCHAR2,
112     time_frame                         VARCHAR2,
113     fund_group                         VARCHAR2,
114     treasury_symbol                    VARCHAR2,
115     closing_fyr                        NUMBER,
116     closing_period                     VARCHAR2,
117     mode_value                         VARCHAR2,
118     post_gl_enable                     VARCHAR2,
119     post_to_gl                     VARCHAR2) is
120     l_module_name                      VARCHAR2(200) ;
121 BEGIN
122  l_module_name   :=  g_module_name || 'Main ';
123 
124  vg_sob_id := LEDGER_ID;
125 
126  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
127  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'START YEAR END CLOSING PROCESS.....');
128  END IF;
129 
130    -- Assign initial values
131    vp_retcode := 0;
132    vp_errbuf  := NULL;
133 
134    -- Load the parameter global variables
135    vp_timeframe   	 := time_frame;
136    vp_fundgroup   	 := fund_group;
137    vp_trsymbol   	   := treasury_symbol;
138    vp_closing_fyr    := closing_fyr;
139    vp_post_to_gl     := post_to_gl;
140    vp_mode           := mode_value;
141    vp_closing_method := closing_method;
142    vg_closing_period  := closing_period;
143 
144      select period_num   into vp_closing_num
145       from gl_period_statuses
146       where application_id = 101
147       and set_of_books_id =  vg_sob_id
148       and period_name = closing_period
149       and period_year = closing_fyr;
150 
151  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
152  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'THE PARAMETERS PASSED TO THE YEAR END CLOSING PROCESS ARE: '||
153   		'Post to GL = '||vp_post_to_gl);
154    END IF;
155  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
156  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'CLOSING METHOD = ' ||vp_closing_method ||'TIME FRAME = '||VP_TIMEFRAME||
157    		', Fund Group = '||vp_fundgroup);
158    END IF;
159  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
160  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'TREASURY SYMBOL = '||VP_TRSYMBOL||
161    		', Closing Fiscal Year = '||TO_CHAR(vp_closing_fyr));
162    END IF;
163 
164     IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
165  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'TREASURY SYMBOL = '||VP_TRSYMBOL||
166    		', Closing Period Number = '||TO_CHAR(vp_closing_num));
167    END IF;
168 
169    -- Get the Sob, Coa and Currency Code
170  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
171  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'GETTING THE SET OF BOOKS,CHART OF ACCOUNTS AND CURRENCY CODE');
172  END IF;
173    Get_Required_Parameters;
174 
175    IF (vp_retcode = 0) THEN
176       -- Get the Start Date, End Date and Last Period for the Closing Fyr
177  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
178  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'GETTING THE START DATE, END DATE AND LAST PERIOD '||
179 				'of the Closing Fiscal Year');
180                  END IF;
181       Get_Closing_Fyr_Details;
182    END IF;
183 
184    IF (vp_retcode = 0) THEN
185       -- Check if Dynamic Insertion is on
186  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
187  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'CHECKING IF DYNAMIC INSERTION IS ON.');
188  END IF;
189       Chk_Dynamic_Insertion;
190    END IF;
191 
192    IF (vp_retcode = 0) THEN
193       -- Get the balancing and the natural account segments
194  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
195  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'GETTING THE BALANCING AND THE NATURAL ACCOUNT SEGMENTS.');
196  END IF;
197       Get_Balance_Account_Segments;
198    END IF;
199 
200    IF (vp_retcode = 0) THEN
201       -- Check if there are any parent account values for the To Account
202  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
203  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'CHECKING THE TO ACCOUNT VALUES IN THE SETUP FORM.....');
204  END IF;
205       Chk_To_Accounts;
206    END IF;
207 
208    IF (vp_retcode = 0) THEN
209       -- Purging the Fv_Ye_Seq_Bal_Temp Table
210  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
211  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'PURGING THE FV_YE_SEQ_BAL_TEMP TABLE.');
212  END IF;
213       Purge_Bal_Temp_Table;
214    END IF;
215 
216    IF (vp_retcode = 0) THEN
217       -- Checking for the Year End Parameters
218  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
219  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'CHECKING FOR THE YEAR END PARAMETERS.');
220  END IF;
221       Check_Year_End_Parameters;
222    END IF;
223 
224    IF (vp_retcode = 0) THEN
225       -- Checking for the data in GL
226  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
227  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'CHECKING FOR THE DATA IN General Ledger.');
228  END IF;
229       Check_Gl_Data;
230    END IF;
231 
232     IF (vp_retcode = 0) THEN
233         if (vp_mode='F' ) then
234           -- Populating the GL_Interface table when MODE is F
235           -- Process D
236             IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
237             FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'POPULATING THE GL_INTERFACE TABLE .');
238             END IF;
239             Populate_Gl_Interface;
240         END IF;
241     END IF;
242 
243    IF (vp_retcode = 0) THEN
244     -- Submitting the Execution Report
245        IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
246        FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'SUBMITTING THE EXECUTION REPORT.');
247        END IF;
248       Submit_Report;
249    END IF;
250 
251    IF vp_retcode <> 0 THEN
252         -- Check for errors
253         errbuf := vp_errbuf;
254         retcode := vp_retcode;
255         ROLLBACK;
256     ELSE
257       -- If public law code and other attributes are not set up
258       -- on the system parameters form, end with a warning.
259       IF NOT vg_facts_attributes_setup
260          THEN
261            retcode := 1;
262            errbuf := 'Year End Closing Process completed with warning because the Public Law, Advance,
263                       AND Transfer attribute COLUMNS are NOT established ON Define SYSTEM Parameters FORM.';
264             FV_UTILITY.LOG_MESG(FND_LOG.LEVEL_ERROR, l_module_name,'Year End Closing Process completed with warning because the Public Law, Advance,
265                       AND Transfer attribute COLUMNS are NOT established ON Define SYSTEM Parameters FORM.');
266         ELSE
267 	   retcode := 0;
268 	   errbuf  := '** Year End Closing Process completed successfully **';
269       END IF;
270       COMMIT;
271    END IF;
272 
273  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
274  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'ENDING THE YEAR END CLOSING PROCESS ......');
275  END IF;
276 
277 EXCEPTION
278    WHEN OTHERS THEN
279 	ROLLBACK;
280         errbuf := '** Year End Closing Process Failed ** '||SQLERRM;
281         retcode := 2;
282         IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
283            FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_UNEXPECTED, l_module_name,
284                          'When Others Exception ' || errbuf );
285         END IF;
286 
287 END Main;
288 
289 -- ------------------------------------------------------------------
290 --                      Procedure Get_Required_Parameters
291 -- ------------------------------------------------------------------
292 -- Get_Required_Parameters procedure is called from Main procedure.
293 -- It gets the sob, coa and the currency code. It also checks for
294 -- the FACTSI Journal Trading Partner attribute for FACTS I processing.
295 -- ------------------------------------------------------------------
296 PROCEDURE Get_Required_Parameters IS
297   l_module_name         VARCHAR2(200) ;
298 BEGIN
299     l_module_name  :=  g_module_name ||
300                       ' Get_Required_Parameters';
301 
302    -- Get the Sob
303 /*   vg_sob_id := TO_NUMBER(Fnd_Profile.Value('GL_SET_OF_BKS_ID'));
304    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
305  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   SET OF BOOKS ID = '||TO_CHAR(VG_SOB_ID));
306    END IF;
307 
308    -- Get the Coa
309    vg_coa_id :=  Sys_Context('FV_CONTEXT','CHART_OF_ACCOUNTS_ID');
310    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
311  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   CHART OF ACCOUNTS ID = '||TO_CHAR(VG_COA_ID));
312    END IF;
313 
314    -- Get the Currency code
315    BEGIN
316         SELECT currency_code
317         INTO vg_currency
318         FROM gl_sets_of_books
319         WHERE set_of_books_id = vg_sob_id;
320 
321    	IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
322  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   CURRENCY CODE = '||VG_CURRENCY);
323    	END IF;
324    EXCEPTION
325         WHEN NO_DATA_FOUND THEN
326             vp_errbuf := 'Error in Get_Required_Parameters:'||
327 	                ' Currency Code is not defined';
328             vp_retcode := 1;
329             RETURN;
330    END;
331 */
332 -- Get if  bal seg value option is enabled  for the ledger
333 --  BSV's are not always assigned to ledgers. Therefore we should not
334 --  enforce BSV assignemnt if there is no BSV flex value set
335 --  is assigned to a ledger.
336 -- Get the COA AND  Currency code
337    BEGIN
338         SELECT currency_code ,
339                 chart_of_accounts_id ,
340                 BAL_SEG_VALUE_OPTION_CODE
341         INTO vg_currency ,
342                 vg_coa_id,
343                 vg_bal_seg_val_opt_code
344         FROM     gl_ledgers_public_v
345       WHERE ledger_id = vg_sob_id;
346 
347 
348         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
349 FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT,
350                          l_module_name,
351                 '   CHART OF ACCOUNTS ID = '||TO_CHAR(VG_COA_ID));
352  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT,
353                  l_module_name,
354                 '   CURRENCY CODE = '||VG_CURRENCY);
355 FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT,
356                  l_module_name,
357                 '   BALANCE SEGMENT OPTION CODE = '|| vg_bal_seg_val_opt_code);
358         END IF;
359    EXCEPTION
360         WHEN NO_DATA_FOUND THEN
361             vp_errbuf := 'Error in Get_Required_Parameters:'||
362                         ' Currency Code and Chart of Accounts are not defined';
363             vp_retcode := 1;
364             RETURN;
365   END;
366 
367 
368 
369    BEGIN
370         SELECT factsi_journal_attribute,
371                factsii_pub_law_code_attribute,
372 	       factsii_advance_type_attribute,
373                factsii_tr_dept_id_attribute,
374 	       factsii_tr_main_acct_attribute
375         INTO   vg_factsi_attribute,
376                vg_public_law_attribute,
377                vg_advance_type_attribute,
378                vg_trf_dept_id_attribute,
379                vg_trf_main_acct_attribute
380         FROM   Fv_System_Parameters;
381 
382         IF (vg_factsi_attribute IS NULL) THEN
383  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
384  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   BALANCES WILL NOT BE CLOSED BY '||
385 
386                         'the FACTS I F/N and trading partner attributes since the '||
387                         'FACTS I Journal Trading Partner field is not populated in '||
388                         'the Define Federal System Parameters window.');
389                          END IF;
390  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
391  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   TO CLOSE BY FACTS I F/N AND '||
392                          'trading partner attributes, delete the journal entries '||
393                         'created by this process, if any, enter the attribute in '||
394                         'the FACTS I Journal Trading Partner field of the Define '||
395                         'Federal System Parameters window, and rerun the Year End '||
396                         'Close Program.');
397                         END IF;
398 	     vg_factsi_attr_exists := 'N';
399         ELSE
400  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
401  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   FACTS I JOURNAL TRADING PARTNER ATTRIBUTE IS '||
402 
403 					vg_factsi_attribute);
404                  END IF;
405 	     vg_factsi_attr_exists := 'Y';
406         END IF;
407 
408         -- Set the global variable to false if public law code and other parameters
409         -- are not setup in the define system parameters form.
410         IF (vg_public_law_attribute IS NULL OR
411             vg_advance_type_attribute IS NULL OR
412             vg_trf_dept_id_attribute IS NULL OR
413             vg_trf_main_acct_attribute IS NULL)
414           THEN
415             vg_facts_attributes_setup := FALSE;
416          ELSE
417             vg_facts_attributes_setup := TRUE;
418         END IF;
419 
420    EXCEPTION
421         WHEN OTHERS THEN
422             vp_errbuf := 'Error in Get_Required_Parameters:'||
423 	                ' While determining the FACTS I Journal Attribute.';
424             vp_retcode := 2;
425    END;
426 
427 EXCEPTION
428      WHEN OTHERS THEN
429             vp_retcode := 2 ;
430             vp_errbuf  := SQLERRM||' -- Error in Get_Required_Parameters procedure.' ;
431             IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
432                FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_UNEXPECTED, l_module_name,
433                          'When Others Exception ' || vp_errbuf );
434             END IF;
435             RETURN ;
436 END Get_Required_Parameters;
437 
438 
439 -- ------------------------------------------------------------------
440 --                      Procedure Get_Closing_Fyr_Details
441 -- ------------------------------------------------------------------
442 -- Get_Closing_Fyr_Details procedure is called from Main procedure.
443 -- It gets the start_date,end_date,last_period of the closing fyr.
444 -- It also checks to see if there are any records for the last period
445 -- of the closing year in Fv_Facts1_Period_Balances_v for
446 -- FACTS I processing.
447 -- ------------------------------------------------------------------
448 PROCEDURE Get_Closing_Fyr_Details IS
449  l_module_name         VARCHAR2(200) ;
450 
451 BEGIN
452    l_module_name   :=  g_module_name ||
453                       ' Get_Closing_Fyr_Details';
454 
455    -- Get the Start Date and the End Date of the Closing fiscal year for the chosen closing period
456    BEGIN
457 	SELECT MIN(start_date), MAX(end_date)
458 	INTO vg_start_date, vg_end_date
459 	FROM gl_periods glp, gl_sets_of_books gsob
460 	WHERE glp.period_year = vp_closing_fyr
461 	AND glp.period_set_name = gsob.period_set_name
462 	AND gsob.chart_of_accounts_id = vg_coa_id
463 	AND gsob.set_of_books_id = vg_sob_id
464   and glp.period_num = vp_closing_num;
465 
466 	IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
467  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   START DATE OF THE CLOSING FISCAL YEAR = '
468 				||TO_CHAR(vg_start_date));
469 	END IF;
470 	IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
471  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   END DATE OF THE CLOSING FISCAL YEAR = '
472 				||TO_CHAR(vg_end_date));
473 	END IF;
474   vg_closing_period_num := vp_closing_num;
475 
476    EXCEPTION
477 	WHEN OTHERS THEN
478             vp_retcode := 2 ;
479             vp_errbuf  := SQLERRM  ||' -- Error in Get_Closing_Fyr_Details '||
480 		'procedure,while getting the start/end date of closing fiscal year.';
481             RETURN ;
482    END;
483 
484   BEGIN
485 
486         SELECT COUNT(*)
487         INTO vg_factsi_bal_cnt
488         FROM Fv_Facts1_Run
489         WHERE period_num = vg_closing_period_num
490 	AND set_of_books_id = vg_sob_id
491 	AND fiscal_year = vp_closing_fyr
492   and period_num = vp_closing_num;
493 
494         IF (vg_factsi_bal_cnt = 0) THEN
495  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
496  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   BALANCES WILL NOT BE CLOSED BY '||
497                         'the FACTS I F/N and trading partner attributes since there '||
498                         'are no balances in Fv_Facts1_Run table for '||
499                         'the period '||vg_closing_period);
500                          END IF;
501  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
502  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   TO CLOSE BY FACTS I F/N AND '||
503                         'trading partner attributes, delete the journal entries '||
504                         'created by this process, if any, run the FACTS I Interface '||
505                         'program with all edit checks passed by period '||
506                         vg_closing_period||' and rerun the Year End Close Program.');
507                          END IF;
508         ELSE
509  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
510  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   BALANCES MAY EXIST FOR FACTS I '||
511                         'for the period '||vg_closing_period);
512                          END IF;
513         END IF;
514    EXCEPTION
515         WHEN OTHERS THEN
516             vp_errbuf := 'Error in Get_Closing_Fyr_Details:'||
517                         ' While determining whether balances exist for FACTS I. ';
518             vp_retcode := 2;
519    END;
520 EXCEPTION
521      WHEN OTHERS THEN
522         vp_errbuf := SQLERRM;
523         IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
524            FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_UNEXPECTED, l_module_name,
525                          'When Others Exception ' || vp_errbuf );
526         END IF;
527         RAISE;
528 
529 END Get_Closing_Fyr_Details;
530 
531 
532 -- ------------------------------------------------------------------
533 --                      Procedure Chk_Dynamic_Insertion
534 -- ------------------------------------------------------------------
535 -- Chk_Dynamic_Insertion procedure is called from Main procedure.
536 -- It checks if dynamic insertion is turned on.
537 -- ------------------------------------------------------------------
538 PROCEDURE Chk_Dynamic_Insertion IS
539         l_module_name         VARCHAR2(200)  ;
540         e_nodynamic_insert  EXCEPTION;
541         vl_dyn_ins_flag  Fnd_Id_Flexs.dynamic_inserts_feasible_flag%TYPE;
542 BEGIN
543     l_module_name :=  g_module_name
544                            || ' Chk_Dynamic_Insertion';
545 
546   SELECT dynamic_inserts_feasible_flag
547   INTO vl_dyn_ins_flag
548   FROM Fnd_Id_Flexs
549   WHERE application_id = 101
550   AND  id_flex_code    = 'GL#';
551 
552   IF (vl_dyn_ins_flag = 'N') THEN
553    RAISE e_nodynamic_insert;
554   END IF;
555 
556 EXCEPTION
557         WHEN e_nodynamic_insert THEN
558           vp_retcode := 1;
559           vp_errbuf  := 'Error in Chk_Dynamic_Insertion:Dynamic Inserts '||
560 		'Feasible Flag is not set to Yes.';
561           RETURN;
562         WHEN OTHERS THEN
563           vp_retcode := 2;
564           vp_errbuf  := SQLERRM ||' -- Error in Chk_Dyanmic_Insertionprocedure.';
565           IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
566            FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_UNEXPECTED, l_module_name,
567                          'When Others Exception ' || vp_errbuf );
568           END IF;
569           RETURN;
570 END Chk_Dynamic_Insertion;
571 
572 -- ------------------------------------------------------------------
573 --                      Procedure Get_Balance_Account_Segments
574 -- ------------------------------------------------------------------
575 -- Get_Balance_Account_Segments procedure is called from Main procedure.
576 -- It gets the balancing and natural account segments, and the
577 -- natural accounting segment number.
578 -- ------------------------------------------------------------------
579 PROCEDURE Get_Balance_Account_Segments IS
580 vl_errcode BOOLEAN;
581            l_module_name         VARCHAR2(200)  ;
582 CURSOR flex_fields IS
583   SELECT application_column_name
584   FROM   fnd_id_flex_segments
585   WHERE  id_flex_code = 'GL#'
586   AND    id_flex_num = vg_coa_id
587   ORDER BY segment_num;
588 
589 l_n_segments   NUMBER(4) := 0;
590 vl_acct_segnum number(4);
591 l_column_name  fnd_id_flex_segments.application_column_name%TYPE;
592 BEGIN
593 
594        l_module_name :=  g_module_name ||
595                                         'Get_Balance_Account_Segments ';
596   fv_utility.get_segment_col_names
597   (
598     chart_of_accounts_id	=> vg_coa_id,
599 		acct_seg_name		      => vg_acct_segment,
600 		balance_seg_name	    => vg_bal_segment,
601 		error_code		        => vl_errcode,
602 		error_message		      => vp_errbuf
603   );
604 
605   IF (vl_errcode) THEN
606     vp_retcode := 2 ;
607     IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
608       FV_UTILITY.LOG_MESG(FND_LOG.LEVEL_UNEXPECTED, l_module_name,
609     'Call fv_utility.get_segment_col_names' || vp_errbuf );
610     END IF;
611     RETURN;
612   END IF;
613 
614  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
615  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   BALANCING SEGMENT IS '||VG_BAL_SEGMENT);
616  END IF;
617  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
618  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   NATURAL ACCOUNTING SEGMENT IS '||VG_ACCT_SEGMENT);
619  END IF;
620 
621      -- Get the Account segment number
622      FOR flex_fields_rec IN flex_fields
623      LOOP
624 
625        l_n_segments := l_n_segments + 1;
626        l_column_name := flex_fields_rec.application_column_name;
627 
628        --Get the natural account segment column position in array
629        IF (l_column_name = vg_acct_segment) THEN
630           vl_acct_segnum := l_n_segments;
631        END IF;
632      END LOOP;
633 
634      vg_acct_segnum := vl_acct_segnum;
635 
636    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
637  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   NATURAL ACCOUNTING SEGMENT NUMBER IS '	||TO_CHAR(vg_acct_segnum));
638    END IF;
639 
640    -- Get the Account Flex Value set ID
641    BEGIN
642 	SELECT flex_value_set_id
643 	INTO vg_acct_val_set_id
644 	FROM Fnd_Id_Flex_Segments
645 	WHERE application_column_name = vg_acct_segment
646 	AND application_id = 101
647 	AND id_flex_code = 'GL#'
648 	AND id_flex_num = vg_coa_id
649 	AND enabled_flag = 'Y';
650    EXCEPTION
651 	WHEN OTHERS THEN
652 null;
653      --       vp_retcode := 2 ;
654      --       vp_errbuf  := SQLERRM  ||' -- Error in Get_Balance_Account_Segments '||
655      --		'procedure,while getting the Account Flex Value Set Id .';
656             RETURN ;
657 
658    END;
659    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
660  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   ACCOUNT FLEX VALUE SET ID IS '	||TO_CHAR(vg_acct_val_set_id));
661    END IF;
662 
663    -- Get the Number of segments in the chart of accounts
664    BEGIN
665 	SELECT COUNT(*)
666 	INTO vg_num_segs
667 	FROM Fnd_Id_Flex_Segments
668 	WHERE application_id = 101
669 	AND id_flex_code = 'GL#'
670 	AND id_flex_num = vg_coa_id
671 	AND enabled_flag = 'Y';
672    EXCEPTION
673 	WHEN OTHERS THEN
674             vp_retcode := 2 ;
675             vp_errbuf  := SQLERRM  ||' -- Error in Get_Balance_Account_Segments '||
676 		'procedure,while getting the number of segments .';
677             RETURN ;
678    END;
679    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
680  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   NUMBER OF SEGMENTS ARE '  ||TO_CHAR(vg_num_segs));
681    END IF;
682 EXCEPTION
683      WHEN OTHERS THEN
684         vp_retcode := 2 ;
685         vp_errbuf  := SQLERRM  ||' -- Error in Get_Balance_Account_Segments
686 		PROCEDURE.' ;
687         IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
688            FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_UNEXPECTED, l_module_name,
689                          'When Others Exception ' || vp_errbuf );
690         END IF;
691 
692         RETURN ;
693 END Get_Balance_Account_Segments;
694 
695 -- ------------------------------------------------------------------
696 --                      Procedure Chk_To_Accounts
697 -- ------------------------------------------------------------------
698 -- Chk_To_Accounts procedure is called from Main procedure.
699 -- It checks if any of the To accounts are parent accounts.
700 -- ------------------------------------------------------------------
701 PROCEDURE Chk_To_Accounts IS
702    CURSOR get_toaccts_cur IS
703 	SELECT DISTINCT to_account
704 	FROM Fv_Ye_Sequence_Accounts
705 	WHERE set_of_books_id = vg_sob_id
706 	ORDER BY to_account;
707 
708    vl_parent_flag VARCHAR2(1) ;
709    vl_acct Fnd_Flex_Values_Vl.flex_value%TYPE;
710 
711    CURSOR get_parentflag_cur IS
712 	SELECT summary_flag
713 	FROM Fnd_Flex_Values_Vl
714 	WHERE flex_value_set_id = vg_acct_val_set_id
715 	AND flex_value = vl_acct;
716 
717   l_module_name         VARCHAR2(200)  ;
718 
719 
720 BEGIN
721 
722   l_module_name   :=  g_module_name || ' Chk_To_Accounts ';
723   vl_parent_flag  := 'N';
724 
725 
726  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
727  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   IN CHK_TO_ACCOUNTS PROCEDURE');
728  END IF;
729 
730    FOR vc_getaccts IN get_toaccts_cur LOOP
731 	vl_acct := vc_getaccts.to_account;
732 
733 	FOR vc_getparent IN get_parentflag_cur LOOP
734 	   IF (vc_getparent.summary_flag = 'Y') THEN
735 		vp_retcode := 2;
736 		vp_errbuf := 'Parent accounts have been defined for the '||
737 		    'To Account on the Year End Closing Setup form. Please '||
738 		    'define only child accounts for the To Account.';
739 		RETURN;
740 	   END IF;
741 	END LOOP;
742    END LOOP;
743 EXCEPTION
744      WHEN OTHERS THEN
745         vp_retcode := 2 ;
746         vp_errbuf  := SQLERRM  ||' -- Error in Chk_To_Accounts procedure.' ;
747         IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
748            FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_UNEXPECTED, l_module_name,
749                          'When Others Exception ' || vp_errbuf );
750         END IF;
751         RETURN ;
752 END Chk_To_Accounts;
753 
754 -- ------------------------------------------------------------------
755 --                      Procedure Purge_Bal_Temp_Table
756 -- ------------------------------------------------------------------
757 -- Purge_Bal_Temp_Table procedure is called from Main procedure.
758 -- It deletes from the Temp table.
759 -- ------------------------------------------------------------------
760 PROCEDURE Purge_Bal_Temp_Table IS
761              l_module_name      VARCHAR2(200)  ;
762 BEGIN
763 
764      l_module_name  :=  g_module_name ||'Purge_Bal_Temp_Table ';
765 
766      DELETE FROM Fv_Ye_Seq_Bal_Temp WHERE set_of_books_id = vg_sob_id;
767 
768      COMMIT;
769 EXCEPTION
770      WHEN OTHERS THEN
771         vp_retcode := 2 ;
772         vp_errbuf  := SQLERRM  ||' -- Error in Purge_Bal_Temp_Table procedure.' ;
773         IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
774            FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_UNEXPECTED, l_module_name,
775                          'When Others Exception ' || vp_errbuf );
776         END IF;
777 
778         RETURN ;
779 END Purge_Bal_Temp_Table;
780 
781 -- ------------------------------------------------------------------
782 --                      Procedure Check_Gl_Data
783 -- ------------------------------------------------------------------
784 -- Check_Gl_Data procedure is called from Main procedure.
785 -- It checks if there are any records in the Temp table.
786 -- ------------------------------------------------------------------
787 PROCEDURE Check_Gl_Data IS
788    vl_reccnt NUMBER;
789    l_module_name   VARCHAR2(200) ;
790    e_no_gldata EXCEPTION;
791 
792 BEGIN
793 
794     l_module_name  :=  g_module_name || 'Check_Gl_Data';
795 
796 
797      SELECT COUNT(*)
798      INTO vl_reccnt
799      FROM Fv_Ye_Seq_Bal_Temp
800      WHERE set_of_books_id = vg_sob_id;
801 
802      IF (vl_reccnt = 0) THEN
803 	RAISE e_no_gldata;
804      END IF;
805 EXCEPTION
806      WHEN e_no_gldata THEN
807 	vp_retcode := 1;
808         vp_errbuf := 'Year End Closing Process has successfully completed,'||
809 		' but there was no data found in General Ledger, for the Year '||
810 		'End account definitions. Journal Import has not been submitted.';
811 
812      WHEN OTHERS THEN
813         vp_retcode := 2 ;
814         vp_errbuf  := SQLERRM  ||' -- Error in Check_Gl_Date procedure.' ;
815         IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
816            FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_UNEXPECTED, l_module_name,
817                          'When Others Exception ' || vp_errbuf );
818         END IF;
819         RETURN ;
820 END Check_Gl_Data;
821 
822 -- ------------------------------------------------------------------
823 --                      Procedure Check_Year_End_Parameters
824 -- ------------------------------------------------------------------
825 -- Check_Year_End_Parameters procedure is called from Main procedure.
826 -- It checks what are the input parameters passed to the Year End
827 -- Process, specifically whether Trsymbol, timeframe and fundgroup
828 -- are provided as input parameters.Based on the parameters provided
829 -- it derives the others and then calls Get_Year_End_Record procedure.
830 -- ------------------------------------------------------------------
831 PROCEDURE Check_Year_End_Parameters
832         IS
833    TYPE t_checkpara IS REF CURSOR;
834    vc_checkpara t_checkpara;
835 
836    vl_trsymbol	Fv_Treasury_Symbols.treasury_symbol%TYPE;
837    vl_timeframe	Fv_Treasury_Symbols.time_frame%TYPE	;
838    vl_fundgroup	Fv_Treasury_Symbols.fund_group_code%TYPE;
839    vl_exp_date	Fv_Treasury_Symbols.expiration_date%TYPE;
840    vl_can_date	Fv_Treasury_Symbols.cancellation_date%TYPE;
841    vl_rec_found_flag  VARCHAR2(1) ;
842    vl_fundgroup_temp	Fv_Treasury_Symbols.fund_group_code%TYPE;
843    l_module_name         VARCHAR2(200)  ;
844 
845 BEGIN
846 
847    l_module_name    :=  g_module_name ||  'Check_Year_End_Parameters  ';
848     vl_rec_found_flag := 'N';
849 
850 
851 
852    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
853  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   IN CHECK_YEAR_END_PARAMETERS PROCEDURE '||
854 	'with the following Parameters passed to the process:');
855    END IF;
856    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
857  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,' CLOSING_METHOD = '|| vp_closing_method ||' TREASURY SYMBOL = '||VP_TRSYMBOL||
858 			', Fund Group Code = '||vp_fundgroup||
859    			', Time Frame = '||vp_timeframe);
860    END IF;
861 
862 -- check if all fund_values are valid for the General Ledger
863 
864 Check_bal_seg_value( vp_fundgroup,
865                      vp_timeframe,
866                      vp_trsymbol   ,
867                      vg_sob_id,
868                      vg_end_date ) ;
869 
870 
871    IF (vp_trsymbol IS NOT NULL ) THEN
872 	IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
873  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   CASE1: WHEN TREASURY SYMBOL PARAMETER IS PROVIDED.');
874 	END IF;
875 
876 	OPEN vc_checkpara FOR
877 	    'SELECT time_frame,fund_group_code,
878 		   expiration_date,cancellation_date
879 	    FROM Fv_Treasury_Symbols
880 	    WHERE treasury_symbol = :trsymbol
881 	    AND set_of_books_id   = :sob'
882 	USING vp_trsymbol,vg_sob_id;
883 
884 	FETCH vc_checkpara INTO vl_timeframe, vl_fundgroup,
885 		vl_exp_date, vl_can_date;
886 
887 	IF ((vl_exp_date > vg_end_date) AND (vl_can_date > vg_end_date)
888 	  AND (vl_timeframe NOT IN ('M','X'))) THEN --CGAC
889         	vp_retcode := 1 ;
890         	vp_errbuf  := 'The Treasury Symbol '||vp_trsymbol
891 			||' is neither Expired nor Cancelled nor a Multi-Year'||
892 			' or a No-Year Symbol.';
893 		vp_errbuf := vp_errbuf || ' Year End Processing is not '||
894 			'done for this Treasury Symbol. ';
895 
896 		IF vc_checkpara%ISOPEN THEN
897 		   CLOSE vc_checkpara;
898 		END IF;
899         	RETURN ;
900 	ELSE
901 		-- Process A
902 		Get_Year_End_Record(vp_trsymbol,vl_fundgroup,vl_timeframe);
903 		IF (vp_retcode <> 0) THEN
904 		   RAISE e_error;
905 		END IF;
906 	END IF;
907 
908 	CLOSE vc_checkpara;
909 
910    ELSIF (vp_fundgroup IS NOT NULL) THEN  -- vp_trsymbol
911 	IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
912  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   CASE2: WHEN FUND GROUP CODE PARAMETER IS PROVIDED.');
913 	END IF;
914 
915         -- IF timeframe is one year, then only the treasury symbols which are
916  	-- either expired or cancelled are selected for processsing. For multi-year
917 	-- and no-year timeframes, the unexpired treasury symbols also need to be
918 	-- processed. Bug 2527452.
919 	IF (vp_timeframe = 'A') THEN   	-- timeframe 1 --CGAC
920 		OPEN vc_checkpara FOR
921 		   'SELECT treasury_symbol
922 		    FROM Fv_Treasury_symbols
923 		    WHERE set_of_books_id = :sob
924 		    AND time_frame = :timeframe
925 		    AND fund_group_code = :fundgroup
926 		    AND ((expiration_date <= :end_date)
927 				OR (cancellation_date <= :end_date))
928     		    ORDER BY treasury_symbol'
929 		USING vg_sob_id,
930                       vp_timeframe,
931                       vp_fundgroup,
932                       vg_end_date,
933                       vg_end_date;
934 
935   ELSIF vp_timeframe='ALL' THEN
936     OPEN vc_checkpara FOR
937 		   'SELECT treasury_symbol,fund_group_code
938 		    FROM Fv_Treasury_symbols
939 		    WHERE set_of_books_id = :sob_id
940 		    AND ORDER BY treasury_symbol'
941 		USING vg_sob_id;
942 
943 	ELSE					-- timeframe 1
944 		OPEN vc_checkpara FOR
945 		   'SELECT treasury_symbol
946 		    FROM Fv_Treasury_symbols
947 		    WHERE set_of_books_id = :sob_id
948 		    AND time_frame = :timeframe
949 		    AND fund_group_code = :fundgroup
950     		    ORDER BY treasury_symbol'
951 		USING vg_sob_id,vp_timeframe,vp_fundgroup;
952 	END IF;					-- timeframe 1
953    ELSE  -- vp_trsymbol
954 	IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
955  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   CASE3: WHEN ONLY THE TIME FRAME PARAMETER IS PROVIDED.');
956 	END IF;
957 
958         -- IF timeframe is one year, then only the treasury symbols which are
959  	-- either expired or cancelled are selected for processsing. For multi-year
960 	-- and no-year timeframes, the unexpired treasury symbols also need to be
961 	-- processed. Bug 2527452.
962 	IF (vp_timeframe = 'A') THEN   	-- timeframe 2 --CGAC
963 		OPEN vc_checkpara FOR
964 		   'SELECT treasury_symbol,fund_group_code
965 		    FROM Fv_Treasury_symbols
966 		    WHERE set_of_books_id = :sob_id
967 		    AND time_frame = :timeframe
968 		    AND ((expiration_date <= :end_date)
969 			OR (cancellation_date <= :end_date))
970     		    ORDER BY treasury_symbol'
971 		USING vg_sob_id,vp_timeframe,vg_end_date,vg_end_date;
972   ELSIF vp_timeframe='ALL' THEN
973 
974     OPEN vc_checkpara FOR
975 		   'SELECT treasury_symbol,fund_group_code, time_frame
976 		    FROM Fv_Treasury_symbols
977 		    WHERE set_of_books_id = :sob_id
978 		    ORDER BY treasury_symbol'
979 		USING vg_sob_id;
980 	ELSE					-- timeframe 2
981 		OPEN vc_checkpara FOR
982 		   'SELECT treasury_symbol,fund_group_code
983 		    FROM Fv_Treasury_symbols
984 		    WHERE set_of_books_id = :sob_id
985 		    AND time_frame = :timeframe
986     		    ORDER BY treasury_symbol'
987 		USING vg_sob_id,vp_timeframe;
988 	END IF;					-- timeframe 2
989 
990    END IF; -- vp_trsymbol
991 
992 
993    IF (vp_trsymbol IS NULL) THEN  -- vp_trsymbol NULL
994 	LOOP
995      vl_timeframe := vp_timeframe;
996 	   IF (vp_fundgroup IS NOT NULL) THEN
997 	   	FETCH vc_checkpara INTO vl_trsymbol;
998 	   ELSIF vp_timeframe='ALL' THEN
999       FETCH vc_checkpara INTO vl_trsymbol, vl_fundgroup, vl_timeframe;
1000      ELSE
1001       FETCH vc_checkpara INTO vl_trsymbol, vl_fundgroup;
1002 	   END IF;
1003 
1004 
1005 	   IF vc_checkpara%FOUND THEN
1006 		vl_rec_found_flag := 'Y';
1007 
1008 		IF (vp_fundgroup IS NULL) THEN
1009 		    vl_fundgroup_temp := vl_fundgroup;
1010 		ELSE
1011 		    vl_fundgroup_temp := vp_fundgroup;
1012 		END IF;
1013 
1014 		-- Process A
1015 		Get_Year_End_Record(vl_trsymbol,vl_fundgroup_temp,vl_timeframe);
1016 
1017 		IF (vp_retcode <> 0) THEN
1018 		   RAISE e_error;
1019 		END IF;
1020 	   ELSE
1021 		IF (vl_rec_found_flag = 'N') THEN
1022 		    vp_retcode := 1;
1023 		    IF (vp_fundgroup IS NOT NULL) THEN
1024 		       vp_errbuf  := 'No Treasury Symbols found for '||
1025 			    'the given Appropriation Group '||vp_fundgroup||
1026 			    ' and the given Appropriation Time Frame '||vp_timeframe;
1027 		    ELSE
1028 		       vp_errbuf  := 'No Treasury Symbols found for the '||
1029 				'given Appropriation Time Frame '||vp_timeframe;
1030 		    END IF;
1031 		    RETURN;
1032 		ELSE
1033 		    EXIT;
1034 		END IF; -- vl_rec_found_flag
1035 	   END IF; -- vc_checkpara
1036 	END LOOP;
1037 
1038 	CLOSE vc_checkpara;
1039 
1040    END IF;  -- vp_trsymbol NULL
1041 
1042 EXCEPTION
1043    WHEN e_error THEN
1044         IF vc_checkpara%ISOPEN THEN
1045 	      CLOSE vc_checkpara;
1046         END IF;
1047 	RETURN;
1048 
1049    WHEN OTHERS THEN
1050         vp_retcode := 2 ;
1051         vp_errbuf  := SQLERRM  ||' -- Error in Check_Year_End_Parameters procedure.' ;
1052         IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1053            FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_UNEXPECTED, l_module_name,
1054                          'When Others Exception ' || vp_errbuf );
1055         END IF;
1056 
1057         RETURN ;
1058 END Check_Year_End_Parameters;
1059 
1060 -- ------------------------------------------------------------------
1061 --                      Procedure Get_Year_End_Record
1062 -- ------------------------------------------------------------------
1063 -- Get_Year_End_Record procedure is called from
1064 -- Check_Year_End_Parameters procedure.
1065 -- It gets the treasury_symbol_id and then the group_id from
1066 -- fv_ye_groups table. And then calls the Get_Fund_Value procedure.
1067 -- ------------------------------------------------------------------
1068 PROCEDURE Get_Year_End_Record(trsymbol	VARCHAR2,
1069 			      fundgroup VARCHAR2,
1070 			      timeframe VARCHAR2 ) IS
1071    CURSOR get_trsymid_cur IS
1072 	SELECT treasury_symbol_id
1073 	FROM Fv_Treasury_Symbols
1074 	WHERE treasury_symbol = trsymbol
1075 	AND set_of_books_id = vg_sob_id;
1076 
1077    TYPE t_getgroupid IS REF CURSOR;
1078    vc_groupid t_getgroupid;
1079     l_module_name         VARCHAR2(200)  ;
1080 
1081 BEGIN
1082 
1083    l_module_name  :=  g_module_name || 'Get_Year_End_Record ';
1084 
1085 
1086 
1087 
1088  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
1089  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'     ******************************************************');
1090  END IF;
1091  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
1092  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'     IN GET_YEAR_END_RECORD PROCEDURE,'||
1093 
1094 		'processing the following:');
1095          END IF;
1096  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
1097  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'     TREASURY SYMBOL: '||TRSYMBOL||' FUND GROUP: '||
1098 
1099 		fundgroup||' Time Frame: '||timeframe);
1100          END IF;
1101 
1102    -- Assign the input parameter trsymbol to vg_trsymbol, so that this can be
1103    -- used in the Log messages.
1104    vg_trsymbol := trsymbol;
1105    vg_fundgroup := fundgroup;
1106 
1107    -- Get the Treasury Symbol ID
1108    OPEN get_trsymid_cur;
1109    FETCH get_trsymid_cur INTO vg_trsymbol_id;
1110    CLOSE get_trsymid_cur;
1111    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1112  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'     PROCESSING THE TREASURY_SYMBOL_ID '||
1113 			TO_CHAR(vg_trsymbol_id));
1114    END IF;
1115 
1116    OPEN vc_groupid FOR
1117      'SELECT group_id
1118       FROM Fv_Ye_Groups
1119       WHERE treasury_symbol_id = :trsymbol_id
1120       AND fund_group_code = :fundgroup
1121       AND fund_time_frame = :timeframe
1122       AND set_of_books_id = :sob_id
1123       AND closing_method  = :closing_method'
1124    USING vg_trsymbol_id,fundgroup,timeframe,vg_sob_id, vp_closing_method;
1125 
1126    FETCH vc_groupid INTO vg_group_id;
1127 
1128    IF vc_groupid%FOUND THEN  --vc_groupid(1)
1129       IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1130  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'     GROUP ID AND CLOSING METHOD FOUND FOR TIMEFRAME '||TIMEFRAME||
1131 		' and Fund Group '||fundgroup||' and Treasury Symbol '||
1132 		trsymbol||' is '||TO_CHAR(vg_group_id)|| ' '||vp_closing_method);
1133       END IF;
1134 
1135    ELSE  --vc_groupid(1)
1136       CLOSE vc_groupid;
1137 
1138       -- Looking for group_id for timeframe and fundgroup parameters
1139       OPEN vc_groupid FOR
1140        'SELECT group_id
1141         FROM Fv_Ye_Groups
1142         WHERE treasury_symbol_id IS NULL
1143         AND fund_group_code = :fundgroup
1144         AND fund_time_frame = :timeframe
1145         AND set_of_books_id = :sob_id
1146         AND closing_method  = :closing_method'
1147       USING fundgroup,timeframe,vg_sob_id, vp_closing_method;
1148 
1149       FETCH vc_groupid INTO vg_group_id;
1150 
1151       IF vc_groupid%FOUND THEN  --vc_groupid(2)
1152          IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1153  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'     GROUP ID AND CLOSING METHOD FOUND FOR TIME FRAME '||TIMEFRAME||
1154 		' and Fund Group '||fundgroup||' is '||TO_CHAR(vg_group_id)|| ' '||vp_closing_method);
1155          END IF;
1156 
1157       ELSE  --vc_groupid(2)
1158          CLOSE vc_groupid;
1159 
1160          -- Looking for group_id for just the timeframe parameter
1161          OPEN vc_groupid FOR
1162     	  'SELECT group_id
1163            FROM Fv_Ye_Groups
1164            WHERE treasury_symbol_id IS NULL
1165            AND fund_group_code IS NULL
1166            AND fund_time_frame = :timeframe
1167            AND set_of_books_id = :sob_id
1168            AND closing_method  = :closing_method'
1169 	 USING timeframe,vg_sob_id, vp_closing_method;
1170 
1171          FETCH vc_groupid INTO vg_group_id;
1172 
1173          IF vc_groupid%FOUND THEN  --vc_groupid(3)
1174             IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1175  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'     GROUP ID AND CLOSING METHOD FOUND FOR THE TIME FRAME '||TIMEFRAME||
1176 			' is '||TO_CHAR(vg_group_id)|| ' '||vp_closing_method);
1177             END IF;
1178 
1179 	 ELSE  --vc_groupid(3)
1180 	    CLOSE vc_groupid;
1181 
1182  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
1183  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'     YEAR END CLOSE RECORD IS NOT DEFINED '||
1184 
1185 			'for any of the combination of :');
1186              END IF;
1187  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
1188  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'     TIMEFRAME: '||TIMEFRAME||
1189 
1190 			', Fund Group: '||fundgroup||', Treasury Symbol: '||trsymbol||' Closing Method: '||vp_closing_method);
1191         END IF;
1192  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
1193  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'     PROCESSING THE NEXT TREASURY SYMBOL....');
1194  END IF;
1195 
1196 	    -- Process the next treasury symbol
1197 	    RETURN;
1198 	 END IF;  --vc_groupid(3)
1199       END IF; --vc_groupid(2)
1200    END IF; --vc_groupid(1)
1201 
1202    CLOSE vc_groupid;
1203 
1204    Get_Fund_Value;
1205 
1206    IF (vp_retcode <> 0) THEN
1207 	RAISE e_error;
1208    END IF;
1209 
1210 EXCEPTION
1211    WHEN e_error THEN
1212         IF vc_groupid%ISOPEN THEN
1213 	      CLOSE vc_groupid;
1214         END IF;
1215 	RETURN;
1216 
1217    WHEN OTHERS THEN
1218         IF vc_groupid%ISOPEN THEN
1219 	      CLOSE vc_groupid;
1220         END IF;
1221         vp_retcode := 2 ;
1222         vp_errbuf  := SQLERRM  ||' -- Error in Get_Year_End_Record procedure.' ;
1223         IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1224            FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_UNEXPECTED, l_module_name,
1225                          'When Others Exception ' || vp_errbuf );
1226         END IF;
1227 
1228         RETURN ;
1229 END Get_Year_End_Record;
1230 
1231 -- ------------------------------------------------------------------
1232 --                      Procedure Get_Fund_Value
1233 -- ------------------------------------------------------------------
1234 -- Get_Fund_Value procedure is called from Get_Year_End_Record procedure.
1235 -- It gets all the fund values for the Trsymbol that is processed.
1236 -- It then calls Determine_Acct_Flag procedure. If journal import is 'Y' then,
1237 -- it calls the Update_Closing_Status procedure.
1238 -- ------------------------------------------------------------------
1239 PROCEDURE Get_Fund_Value IS
1240 
1241    CURSOR get_fund_cur IS
1242 	SELECT fund_value
1243 	FROM Fv_Fund_Parameters
1244 	WHERE treasury_symbol_id = vg_trsymbol_id
1245 	AND set_of_books_id = vg_sob_id;
1246 
1247    vl_rec_found_flag VARCHAR2(1) ;
1248   l_module_name         VARCHAR2(200);
1249 
1250 BEGIN
1251    vl_rec_found_flag  := 'N';
1252 
1253    l_module_name          :=  g_module_name ||'Get_Fund_Value ';
1254  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
1255  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'       IN GET_FUND_VALUE PROC WITH TREASURY SYMBOL ID '||
1256 
1257 				TO_CHAR(vg_trsymbol_id));
1258                  END IF;
1259   OPEN get_fund_cur;
1260   LOOP
1261     FETCH get_fund_cur INTO vg_fund_value;
1262  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
1263  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'       --------------------------------------------------');
1264  END IF;
1265 
1266     IF get_fund_cur%FOUND THEN   -- get_fund_cur%found
1267  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
1268  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'       PROCESSING THE FUND '||VG_FUND_VALUE||
1269 
1270 		' for the Treasury Symbol '||vg_trsymbol);
1271          END IF;
1272 
1273 	vl_rec_found_flag := 'Y';
1274 
1275 	-- Process B
1276 	Determine_Acct_Flag;
1277 
1278 	IF (vp_retcode <> 0) THEN
1279 	   RAISE e_error;
1280 	END IF;
1281 
1282 	-- Process C
1283   if (vp_mode='F') then
1284 	   Update_Closing_Status;
1285 
1286 	   IF (vp_retcode <> 0) THEN
1287 	     RAISE e_error;
1288 	   END IF;
1289 	END IF;
1290 
1291     ELSE    -- get_fund_cur%found
1292 	IF (vl_rec_found_flag = 'N') THEN
1293 	   IF (vp_trsymbol IS NOT NULL) THEN
1294  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
1295  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'       NO FUND VALUE FOUND FOR THE TREASURY SYMBOL '
1296 
1297 				||vg_trsymbol);
1298                  END IF;
1299 	      vp_retcode := 1;
1300 	      vp_errbuf := 'No Fund Value found for the Treasury Symbol '||
1301 				vg_trsymbol;
1302 	   ELSE
1303  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
1304  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'       NO FUND VALUE FOUND FOR THE TREASURY SYMBOL '
1305 				||vg_trsymbol);
1306                  END IF;
1307 	   END IF;
1308 	   RETURN;
1309         ELSE
1310 	   EXIT;
1311 	END IF;
1312     END IF; -- get_fund_cur%found
1313 
1314   END LOOP;
1315   CLOSE get_fund_cur;
1316 
1317 EXCEPTION
1318    WHEN e_error THEN
1319         IF get_fund_cur%ISOPEN THEN
1320 	      CLOSE get_fund_cur;
1321         END IF;
1322 	RETURN;
1323 
1324    WHEN OTHERS THEN
1325         IF get_fund_cur%ISOPEN THEN
1326 	      CLOSE get_fund_cur;
1327         END IF;
1328         vp_retcode := 2 ;
1329         vp_errbuf  := SQLERRM  ||' -- Error in Get_Fund_Value procedure.' ;
1330         IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1331            FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_UNEXPECTED, l_module_name,
1332                          'When Others Exception ' || vp_errbuf );
1333         END IF;
1334 
1335         RETURN ;
1336 
1337 END Get_Fund_Value;
1338 
1339 -- ------------------------------------------------------------------
1340 --                      Procedure Determine_Acct_Flag
1341 -- ------------------------------------------------------------------
1342 -- Determine_Acct_Flag procedure is called from Get_Fund_Value procedure.
1343 -- It determines whether the fund is expired,canceled or carryover.
1344 -- It then calls the Get_Year_End_SeqAcct_Info procedure.
1345 -- ------------------------------------------------------------------
1346 PROCEDURE Determine_Acct_Flag IS
1347    CURSOR acctflag_cur IS
1348 	SELECT fts.expiration_date,
1349 	       fts.cancellation_date,
1350 	       fts.time_frame
1351 	FROM Fv_Treasury_Symbols fts, Fv_Fund_Parameters ffp
1352 	WHERE fts.treasury_symbol_id = vg_trsymbol_id
1353 	AND fts.treasury_symbol_id = ffp.treasury_symbol_id
1354 	AND ffp.fund_value = vg_fund_value
1355 	AND fts.treasury_symbol_id = ffp.treasury_symbol_id
1356 	AND fts.set_of_books_id = vg_sob_id
1357 	AND ffp.set_of_books_id = fts.set_of_books_id;
1358 
1359   vl_exp_date Fv_Treasury_Symbols.expiration_date%TYPE;
1360   vl_can_date Fv_Treasury_Symbols.cancellation_date%TYPE;
1361   vl_timeframe Fv_Treasury_Symbols.time_frame%TYPE;
1362   vl_status_flag VARCHAR2(1);
1363   l_module_name         VARCHAR2(200) ;
1364 BEGIN
1365 
1366    l_module_name :=  g_module_name || 'Determine_Acct_Flag '   ;
1367 
1368  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
1369  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'         IN THE DETERMINE_ACCT_FLAG PROCEDURE:WITH TREASURY '||
1370 
1371 		'Symbol = '||vg_trsymbol||' and Fund Value = '||vg_fund_value);
1372          END IF;
1373 
1374    -- Get the expiration and cancellation date for the treasury symbol
1375    OPEN acctflag_cur;
1376    FETCH acctflag_cur INTO vl_exp_date,vl_can_date,vl_timeframe;
1377    CLOSE acctflag_cur;
1378 
1379    -- Determing whether the fund is expired, cancelled or unexpired
1380    IF ((vl_exp_date <= vg_end_date) AND (vl_can_date <= vg_end_date)) THEN
1381 	IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1382  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'         FUND IS BOTH EXPIRED AND CANCELLED...');
1383 	END IF;
1384 	-- Set status flag to B(both expired and cancelled)
1385 	vl_status_flag := 'B';
1386    ELSIF ((vl_exp_date <= vg_end_date) AND (vl_can_date > vg_end_date)) THEN
1387 	IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1388  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'         FUND IS EXPIRED BUT NOT CANCELLED...');
1389 	END IF;
1390 	-- Set status flag to E(expired)
1391 	vl_status_flag := 'E';
1392    ELSIF ((vl_exp_date > vg_end_date) AND (vl_can_date <= vg_end_date)) THEN
1393 	IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1394  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'         FUND IS CANCELLED BUT NOT EXPIRED...');
1395 	END IF;
1396 	-- Set status flag to C(cancelled)
1397 	vl_status_flag := 'C';
1398    ELSIF (vl_timeframe IN ('X','M')) THEN --CGAC
1399 	IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1400  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'         FUND IS UNEXPIRED...');
1401 	END IF;
1402 	-- Set status flag to U(unexpired)
1403 	vl_status_flag := 'U';
1404    END IF;
1405    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1406  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'         VL_STATUS_FLAG '||VL_STATUS_FLAG);
1407    END IF;
1408 
1409    -- Based on status flag, set vg_acct_flag and call Get_Year_End_SeqAcct_Info proc
1410    IF (vl_status_flag = 'B') THEN
1411 	-- Process all expired records first and then Cancelled records
1412         FOR i IN 1..2 LOOP
1413 		SELECT DECODE(i,1,'Expired',2,'Canceled')
1414 		INTO vg_acct_flag
1415 		FROM DUAL;
1416   		IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1417  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'         VG_ACCT_FLAG '||VG_ACCT_FLAG);
1418   		END IF;
1419 
1420   		-- Get the Sequence Information
1421 		Get_Year_End_SeqAcct_Info;
1422 
1423   		IF (vp_retcode <> 0) THEN
1424            		RAISE e_error;
1425   		END IF;
1426 	END LOOP;
1427    ELSE
1428 	SELECT DECODE(vl_status_flag,'E','Expired','C','Canceled','U','Unexpired')
1429 	INTO vg_acct_flag
1430 	FROM DUAL;
1431  	 IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1432  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'         VG_ACCT_FLAG '||VG_ACCT_FLAG);
1433  	 END IF;
1434 
1435   	-- Get the Sequence Information
1436 	Get_Year_End_SeqAcct_Info;
1437 
1438   	IF (vp_retcode <> 0) THEN
1439        		RAISE e_error;
1440   	END IF;
1441    END IF;
1442 
1443 EXCEPTION
1444    WHEN e_error THEN
1445 	RETURN;
1446 
1447    WHEN OTHERS THEN
1448         vp_retcode := 2 ;
1449         vp_errbuf  := SQLERRM  ||' -- Error in Detemine_Acct_Flag procedure.' ;
1450         IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1451                FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_UNEXPECTED, l_module_name,
1452                          'When Others Exception ' || vp_errbuf );
1453         END IF;
1454 
1455         RETURN ;
1456 END Determine_Acct_Flag;
1457 
1458 -- ------------------------------------------------------------------
1459 --                      Procedure Get_Year_End_SeqAcct_Info
1460 -- ------------------------------------------------------------------
1461 -- Get_Year_End_SeqAcct_Info procedure is called from Determine_Acct_Flag
1462 -- procedure. It gets the sequences, and for each sequence it gets the
1463 -- account entries and processes them.It then calls the procedure
1464 -- Determine_Child_Accounts for each account entry.
1465 -- ------------------------------------------------------------------
1466 PROCEDURE Get_Year_End_SeqAcct_Info IS
1467 
1468    CURSOR get_seq_cur IS
1469 	SELECT sequence_id,SEQUENCE
1470 	FROM Fv_Ye_Group_Sequences
1471 	WHERE group_id = vg_group_id
1472 	AND set_of_books_id = vg_sob_id
1473 	ORDER BY SEQUENCE;
1474 
1475    CURSOR get_acct_cur IS
1476 	SELECT from_account,to_account, requisition
1477 	FROM Fv_Ye_Sequence_Accounts
1478 	WHERE sequence_id = vg_seq_id
1479 	AND account_flag = vg_acct_flag
1480 	AND set_of_books_id = vg_sob_id
1481   ORDER BY order_by_ctr;
1482 
1483    CURSOR get_count_cur IS
1484 	SELECT COUNT(*)
1485 	FROM Fv_Ye_Sequence_Accounts
1486 	WHERE sequence_id = vg_seq_id
1487 	AND set_of_books_id = vg_sob_id;
1488 
1489    vl_seqrec_flag VARCHAR2(1) ;
1490    vl_acctrec_flag VARCHAR2(1) ;
1491    vl_cnt NUMBER ;
1492    l_module_name         VARCHAR2(200)  ;
1493 
1494 BEGIN
1495 
1496   l_module_name :=  g_module_name || '  Get_Year_End_SeqAcct_Info ';
1497   vl_seqrec_flag  := 'N';
1498   vl_acctrec_flag :=  'N';
1499   vl_cnt := 0;
1500 
1501 
1502 
1503  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
1504  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'           IN THE GET_YEAR_END_SEQACCT_INFO PROCEDURE...');
1505  END IF;
1506 
1507    OPEN get_seq_cur;
1508    LOOP						-- getseq loop
1509       FETCH get_seq_cur INTO vg_seq_id, vg_seq;
1510 
1511       IF get_seq_cur%FOUND THEN 		-- get_seq_cur
1512         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1513  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'             PROCESSING SEQUENCE '||TO_CHAR(VG_SEQ)||
1514 			' and sequence_id '||TO_CHAR(vg_seq_id));
1515        FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,' Treasury Symbol is '||vg_trsymbol );
1516         END IF;
1517 
1518 	vl_seqrec_flag := 'Y';
1519 
1520 
1521   select closing_method into vg_closing_method from fv_ye_groups where group_id = vg_group_id
1522   AND set_of_books_id = vg_sob_id  ;
1523 
1524   --Process this year end record only if closing method of year end record matched closing method of process
1525   IF vg_closing_method = vp_closing_method THEN
1526 
1527   /*SELECT close_requisitions into treasury_closing_method
1528   FROM  fv_treasury_symbols
1529   WHERE treasury_symbol = vg_trsymbol and set_of_books_id = vg_sob_id;*/
1530 
1531   -- Bug 10399298: Pick close_requisitions from fv_fund_parameters instead of fv_treasury_symbols
1532   SELECT fund.close_requisitions into treasury_closing_method
1533   FROM  fv_treasury_symbols tas, fv_fund_parameters fund
1534   WHERE tas.treasury_symbol = vg_trsymbol and tas.set_of_books_id = vg_sob_id
1535   AND fund.treasury_symbol_id = tas.treasury_symbol_id
1536   AND fund.fund_value = vg_fund_value;
1537 
1538 
1539 	OPEN get_acct_cur;
1540 	LOOP					-- getacct loop
1541      FETCH get_acct_cur INTO vg_from_acct,vg_to_acct,vg_requisition;
1542      IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1543         FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,' Closing method is  '||
1544         'flag:'||vg_closing_method||', treasury_closing_method:'||treasury_closing_method || 'vg_acct_flag '||vg_acct_flag);
1545      END IF;
1546 
1547 	  IF get_acct_cur%FOUND THEN 		-- get_acct_cur
1548 
1549       --Close the accounts (i)if requisition checkbox is checked and only if the closing method of the treasury symbol matches
1550       --the closing method of year end record  or (ii)if requisition checkbox is not checked
1551       -- Bug 9322307
1552       IF  (vg_requisition = 'Y' and  treasury_closing_method is not null and vg_closing_method = treasury_closing_method) or (vg_requisition = 'N' or vg_requisition is null)   THEN
1553 
1554                    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1555        FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'             PROCESSING THE RECORD WITH ACCOUNT '||
1556           'flag:'||vg_acct_flag||', From Account:'||vg_from_acct
1557           ||', To Account:'|| vg_to_acct);
1558                    END IF;
1559 
1560              vl_acctrec_flag := 'Y';
1561 
1562              -- Call Determine_Child_Accounts;
1563              Determine_Child_Accounts;
1564 
1565                IF (vp_retcode <> 0) THEN
1566                   RAISE e_error;
1567                END IF;
1568        END IF;            -- ENDS if vg_requisition = 'Y' and vg_closing_method = treasury_closing_method then
1569 
1570 	  ELSE  				-- get_acct_cur
1571 	     IF (vl_acctrec_flag = 'N') THEN
1572           OPEN get_count_cur;
1573           FETCH get_count_cur INTO vl_cnt;
1574           CLOSE get_count_cur;
1575 
1576           IF (vl_cnt > 0) THEN
1577                IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
1578                FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'             NO ACCOUNT INFORMATION FOUND '||
1579                     'with '||vg_acct_flag||' appropriation status for '||
1580                     'the Sequence '||TO_CHAR(vg_seq));
1581                            END IF;
1582           ELSE
1583                IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
1584                FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'             NO ACCOUNT INFORMATION FOUND '||
1585                     'for the Sequence '||TO_CHAR(vg_seq));
1586                            END IF;
1587           END IF;
1588       ELSE
1589           IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1590        FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,
1591        '             PROCESSING IS DONE FOR THE SEQUENCE '
1592             ||TO_CHAR(vg_seq));
1593           END IF;
1594      END IF;
1595      EXIT ;
1596    END IF; 				-- get_acct_cur
1597 
1598 	END LOOP;    				-- getacct loop
1599 	CLOSE get_acct_cur;
1600   END IF;           -- IF vg_closing_method = vp_closing_method THEN
1601       ELSE 					-- get_seq_cur
1602 
1603 	IF (vl_seqrec_flag = 'N') THEN
1604  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
1605  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'           NO SEQUENCES FOUND FOR THE GROUP ID '
1606 			||TO_CHAR(vg_group_id));
1607              END IF;
1608 	   RETURN;
1609 	ELSE
1610  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
1611  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'             PROCESSING IS DONE FOR THE GROUP ID '
1612 
1613 			||TO_CHAR(vg_group_id));
1614              END IF;
1615 	   EXIT;
1616 	END IF;
1617 
1618 
1619       END IF; 					-- get_seq_cur
1620    END LOOP;   					-- getseq loop
1621    CLOSE get_seq_cur;
1622 
1623 EXCEPTION
1624    WHEN e_error THEN
1625 	IF get_acct_cur%ISOPEN THEN
1626 	   CLOSE get_acct_cur;
1627 	END IF;
1628 	RETURN;
1629 
1630    WHEN OTHERS THEN
1631         vp_retcode := 2 ;
1632         vp_errbuf  := SQLERRM  ||' -- Error in Get_Year_End_SeqAcct_Info procedure.' ;
1633         IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1634                FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_UNEXPECTED, l_module_name,
1635                          'When Others Exception ' || vp_errbuf );
1636         END IF;
1637         RETURN ;
1638 
1639 END Get_Year_End_SeqAcct_Info;
1640 
1641 
1642 -- ------------------------------------------------------------------
1643 --                      Procedure Determine_Child_Accounts
1644 -- ------------------------------------------------------------------
1645 -- Determine_Child_Accounts procedure is called from Get_Year_End_SeqAcct_Info
1646 -- procedure. For a record with year_entry= Closing, this procedure
1647 -- gets the balance_read_flag from the Temp table, and then calls
1648 -- Get_Balances procedure. For a record with year_entry = Carryover,
1649 -- it calculates the balances from the previous entry, and then
1650 -- calls the procedure Determine_DrCr.
1651 -- ------------------------------------------------------------------
1652 PROCEDURE Determine_Child_Accounts IS
1653     vl_parent_cnt NUMBER;
1654     vl_child_low Fnd_Flex_Values_Vl.flex_value%TYPE;
1655     vl_child_high Fnd_Flex_Values_Vl.flex_value%TYPE;
1656 
1657     TYPE t_getbal_cnt IS REF CURSOR;
1658     vc_getbal_cnt t_getbal_cnt;
1659     vl_select VARCHAR2(2000);
1660     vl_bal_cnt NUMBER;
1661 
1662     CURSOR get_hierarchies_cur IS
1663       SELECT child_flex_value_low, child_flex_value_high
1664       FROM Fnd_Flex_Value_Hierarchies
1665       WHERE parent_flex_value = vg_from_acct
1666       AND flex_value_set_id = vg_acct_val_set_id;
1667 
1668     CURSOR get_child_values_cur IS
1669       SELECT flex_value
1670       FROM Fnd_Flex_Values_Vl
1671       WHERE flex_value_set_id = vg_acct_val_set_id
1672       AND flex_value BETWEEN vl_child_low AND vl_child_high
1673       ORDER BY flex_value;
1674 
1675   l_module_name         VARCHAR2(200) ;
1676 
1677 BEGIN
1678 
1679  l_module_name  :=  g_module_name || 'Determine_Child_Accounts ';
1680 
1681 
1682  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
1683  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'               IN DETERMINE_CHILD_ACCOUNTS PROCEDURE...');
1684  END IF;
1685 
1686      BEGIN
1687 	-- Check to see if the from account is a parent
1688 	SELECT COUNT(*)
1689 	INTO vl_parent_cnt
1690 	FROM Fnd_Flex_Values_Vl
1691      	WHERE flex_value_set_id = vg_acct_val_set_id
1692      	AND summary_flag = 'Y'
1693     	AND flex_value = vg_from_acct;
1694 
1695      EXCEPTION
1696 	WHEN OTHERS THEN
1697 	   vp_retcode := 2;
1698 	   vp_errbuf  := SQLERRM || '-- Error in Determine_Child_Accounts procedure,'||
1699 				 'while deriving the balance_read_flag.';
1700 	   RETURN;
1701      END;
1702 
1703      IF (vl_parent_cnt = 0) THEN  	-- parent_cnt
1704        	--  the from account is not a parent
1705         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1706  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'               FROM ACCOUNT IS NOT A PARENT');
1707         END IF;
1708        	vg_child_acct := vg_from_acct;
1709 
1710  	-- Call Determine_Balance_Read_Flag procedure
1711 	Determine_Balance_Read_Flag;
1712 
1713      	IF (vp_retcode <> 0) THEN
1714 		RAISE e_error;
1715      	END IF;
1716         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1717  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'               BALANCE_READ_FLAG IS '||
1718 			vg_balance_read_flag);
1719         END IF;
1720 
1721      	-- Call Get_Balances procedure to get balances for the from account
1722      	Get_Balances;
1723 
1724      	IF (vp_retcode <> 0) THEN
1725 		RAISE e_error;
1726      	END IF;
1727      ELSE	  			-- parent_cnt
1728       	--  the from account is a parent
1729         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1730  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'               FROM ACCOUNT IS A PARENT');
1731         END IF;
1732 
1733 	IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1734  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'               CHECKING TO SEE IF THE PARENT HAS '||
1735 		'any balances.');
1736 	END IF;
1737 
1738 	vl_select := 'SELECT COUNT(*)
1739                    FROM Gl_Balances glb,Gl_Code_Combinations gcc
1740                    WHERE glb.code_combination_id = gcc.code_combination_id
1741                    AND gcc.'||vg_bal_segment||' = :fund_value'||
1742                    ' AND gcc.'||vg_acct_segment|| ' = :from_acct'||
1743                    ' AND gcc.summary_flag = '||''''||'N'||''''||
1744                    ' AND gcc.template_id IS NULL
1745                      AND glb.actual_flag = '||''''||'A'||''''||
1746                    ' AND glb.ledger_id = :sob
1747                    AND gcc.chart_of_accounts_id = :coa
1748                    AND glb.period_year = :closing_fyr
1749                    AND glb.period_name = :closing_period
1750 		   AND glb.currency_code = :currency';
1751 
1752         -- Open thru' native dynamic sql
1753 	EXECUTE IMMEDIATE vl_select INTO vl_bal_cnt USING
1754 		vg_fund_value,vg_from_acct,vg_sob_id,
1755 		vg_coa_id,vp_closing_fyr,vg_closing_period,vg_currency;
1756 
1757 	IF (vl_bal_cnt > 0) THEN		-- bal_check
1758            IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1759  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'               PARENT ACCOUNT HAS BALANCES IN '||
1760 		'General Ledger. This is the scenario, when a child account '||
1761 		'has later been defined as a parent account.Getting the balances.');
1762            END IF;
1763 
1764 	   vg_child_acct := vg_from_acct;
1765            IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1766  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'               PROCESSING THE ACCT:'||
1767                         vg_child_acct);
1768            END IF;
1769 
1770            -- Call Process_Acct procedure
1771 	   Process_Acct;
1772 
1773 	   IF (vp_retcode <> 0) THEN
1774                     RAISE e_error;
1775            END IF;
1776 
1777 	ELSE					-- bal_check
1778      IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1779     FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'               PARENT ACCOUNT HAS NO BALANCES IN '||
1780     'General Ledger.');
1781      END IF;
1782 	END IF;					-- bal_check
1783 
1784         -- For each child hierarchy range, get low and high value
1785      	FOR vc_hierarchies IN get_hierarchies_cur LOOP -- Hierarchies
1786             vl_child_low := vc_hierarchies.child_flex_value_low;
1787             vl_child_high := vc_hierarchies.child_flex_value_high;
1788 	    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1789  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'               PROCESSING HIERARCHY WITH LOW: '||
1790 		 vl_child_low||' and high: '||vl_child_high);
1791 	    END IF;
1792 
1793             -- For each child hierarchy, find the child values
1794             FOR vc_children IN get_child_values_cur LOOP  -- children
1795 		--  set the child account
1796       	 	vg_child_acct := vc_children.flex_value;
1797 	        IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1798  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'               PROCESSING THE CHILD VALUE: '||
1799 			vg_child_acct);
1800 	        END IF;
1801 
1802      		-- Call Process_Acct procedure
1803      		Process_Acct;
1804 
1805      		IF (vp_retcode <> 0) THEN
1806 			RAISE e_error;
1807      		END IF;
1808 
1809             END LOOP;  					-- children
1810        END LOOP;  					-- Hierarchies
1811     END IF;				-- parent_cnt
1812 
1813 EXCEPTION
1814    WHEN e_error THEN
1815      RETURN;
1816 
1817    WHEN OTHERS THEN
1818         vp_retcode := 2 ;
1819         vp_errbuf  := SQLERRM  ||' -- Error in Determine_Child_Accounts procedure.' ;
1820         IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1821                FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_UNEXPECTED, l_module_name,
1822                          'When Others Exception ' || vp_errbuf );
1823         END IF;
1824         RETURN ;
1825 
1826 END Determine_Child_Accounts;
1827 
1828 -- ------------------------------------------------------------------
1829 --                      Procedure Process_Acct
1830 -- ------------------------------------------------------------------
1831 -- Process_Acct procedure is called from
1832 -- Determine_Child_Accounts procedure. This procedure calls the
1833 -- Determine_Balance_Read_Flag and Get_Balances procedures.
1834 -- ------------------------------------------------------------------
1835 PROCEDURE Process_Acct IS
1836 l_module_name         VARCHAR2(200) ;
1837 
1838 BEGIN
1839   l_module_name  :=  g_module_name || 'Process_Acct ';
1840     -- Call Determine_Balance_Read_Flag procedure
1841     Determine_Balance_Read_Flag;
1842 
1843     IF (vp_retcode <> 0) THEN
1844            RAISE e_error;
1845     END IF;
1846     IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1847  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'               BALANCE_READ_FLAG IS '||
1848                         vg_balance_read_flag);
1849     END IF;
1850 
1851     -- Call Get_Balances procedure to get balances for the from account
1852     Get_Balances;
1853 
1854     IF (vp_retcode <> 0) THEN
1855            RAISE e_error;
1856     END IF;
1857 
1858 EXCEPTION
1859    WHEN e_error THEN
1860      RETURN;
1861 
1862    WHEN OTHERS THEN
1863         vp_retcode := 2 ;
1864         vp_errbuf  := SQLERRM  ||' -- Error in Process_Acct procedure.' ;
1865         IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1866                FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_UNEXPECTED, l_module_name,
1867                          'When Others Exception ' || vp_errbuf );
1868         END IF;
1869        RETURN ;
1870 END Process_Acct;
1871 
1872 -- ------------------------------------------------------------------
1873 --                      Procedure Determine_Balance_Read_Flag
1874 -- ------------------------------------------------------------------
1875 -- Determine_Balance_Read_Flag procedure is called from
1876 -- Process_Acct procedure. This procedure determines the
1877 -- balance_read_flag from the Temp table.
1878 -- ------------------------------------------------------------------
1879 PROCEDURE Determine_Balance_Read_Flag IS
1880 l_module_name         VARCHAR2(200) ;
1881 BEGIN
1882 
1883 
1884        l_module_name  :=  g_module_name ||
1885 			'Determine_Balance_Read_Flag ';
1886 	vg_balance_read_flag := 'N';
1887 
1888 	SELECT DISTINCT balance_read_flag
1889 	INTO vg_balance_read_flag
1890 	FROM Fv_Ye_Seq_Bal_Temp
1891 	WHERE account_seg = vg_child_acct
1892 	AND balance_seg = vg_fund_value
1893 	AND set_of_books_id = vg_sob_id
1894 	AND fiscal_year = vp_closing_fyr
1895 	AND balance_read_flag = 'Y'
1896 	AND group_id = vg_group_id;
1897 
1898 EXCEPTION
1899 	WHEN NO_DATA_FOUND THEN
1900 	   vg_balance_read_flag := 'N';
1901 	WHEN OTHERS THEN
1902 	   vp_retcode := 2;
1903            vp_errbuf  := SQLERRM  ||
1904 		' -- Error in Determine_Balance_Read_Flag procedure.' ;
1905        IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1906                FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_UNEXPECTED, l_module_name,
1907                          'When Others Exception ' || vp_errbuf );
1908        END IF;
1909 	   RETURN;
1910 END Determine_Balance_Read_Flag;
1911 
1912 -- ------------------------------------------------------------------
1913 --                      Procedure Get_Balances
1914 -- ------------------------------------------------------------------
1915 -- Get_Balances procedure is called from Process_Acct
1916 -- procedure. It gets the balances from Gl_Balances , and handles
1917 -- the different scenarios and then calls Determine_DrCr procedure.
1918 -- ------------------------------------------------------------------
1919 PROCEDURE Get_Balances IS
1920    vl_rec_found_flag VARCHAR2(1) ;
1921 
1922    TYPE t_getbal IS REF CURSOR;
1923    vc_getbal t_getbal;
1924    vl_select VARCHAR2(2000);
1925 
1926    vl_ccid Gl_Code_Combinations.code_combination_id%TYPE;
1927 
1928    TYPE t_ccidtable IS TABLE OF Gl_Code_Combinations.code_combination_id%TYPE
1929 	INDEX BY BINARY_INTEGER;
1930    vt_ccid 	t_ccidtable;
1931    i	   	BINARY_INTEGER ;
1932    vl_ccid_cnt 	NUMBER;
1933    vl_exists    VARCHAR2(1) ;
1934 
1935    CURSOR get_sumtemp_cur IS
1936 	SELECT NVL(SUM(bal_seq_amt),0) amt,code_combination_id
1937 	FROM Fv_Ye_Seq_Bal_Temp
1938 	WHERE account_seg = vg_child_acct
1939 	AND balance_seg = vg_fund_value
1940 	AND set_of_books_id = vg_sob_id
1941 	AND group_id = vg_group_id
1942 	AND fiscal_year = vp_closing_fyr
1943 	AND balance_read_flag = 'N'
1944 	GROUP BY code_combination_id;
1945 
1946    CURSOR get_sumtemp_seqcur IS
1947 	SELECT NVL(SUM(bal_seq_amt),0) amt,code_combination_id
1948 	FROM Fv_Ye_Seq_Bal_Temp
1949 	WHERE account_seg = vg_child_acct
1950 	AND balance_seg = vg_fund_value
1951 	AND set_of_books_id = vg_sob_id
1952 	AND group_id = vg_group_id
1953 	AND fiscal_year = vp_closing_fyr
1954 	AND balance_read_flag = 'Y'
1955 	AND SEQUENCE IN (SELECT MAX(SEQUENCE)
1956 			FROM Fv_Ye_Seq_Bal_Temp g
1957 			WHERE g.account_seg = vg_from_acct
1958 			AND g.balance_seg = vg_fund_value
1959 			AND g.set_of_books_id = vg_sob_id
1960 			AND g.group_id = vg_group_id
1961 			AND g.balance_read_flag = 'Y')
1962 	GROUP BY code_combination_id;
1963 
1964    CURSOR get_addccid_cur IS
1965 	SELECT NVL(SUM(bal_seq_amt),0) amt,code_combination_id
1966 	FROM Fv_Ye_Seq_Bal_Temp
1967 	WHERE account_seg = vg_child_acct
1968 	AND balance_seg = vg_fund_value
1969 	AND set_of_books_id = vg_sob_id
1970 	AND group_id = vg_group_id
1971 	AND fiscal_year = vp_closing_fyr
1972 	AND balance_read_flag = 'N'
1973 	AND SEQUENCE < vg_seq
1974 	GROUP BY code_combination_id;
1975 
1976     l_module_name         VARCHAR2(200) ;
1977 
1978 BEGIN
1979     l_module_name  :=  g_module_name ||
1980                                 ' Get_Balances ';
1981      vl_rec_found_flag  := 'N';
1982      i      := 1;
1983      vl_exists  := 'N';
1984  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
1985  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'               IN THE GET_BALANCES PROCEDURE, '||
1986 
1987 	 'processing the account '||vg_child_acct||
1988          ' with balance_read_flag = '||vg_balance_read_flag);
1989  END IF;
1990    -- Purge the Pl/Sql table
1991    vt_ccid.DELETE;
1992 
1993    /* If there are no records defined in the Fv_Ye_Seq_Bal_Temp table *
1994     * for the fund and the from acct within the group that is being   *
1995     * processed. This is the scenario when vg_balance_read_flag = N   */
1996    IF (vg_balance_read_flag = 'N') THEN         -- vg_balance_read_flag
1997       IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1998  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'               CASE: WHEN BALANCE_READ_FLAG = N');
1999       END IF;
2000 
2001       vl_select := 'SELECT glb.code_combination_id,
2002 		   NVL(SUM(NVL(begin_balance_dr,0) + NVL(period_net_dr,0)) -
2003 		   SUM(NVL(begin_balance_cr,0) + NVL(period_net_cr,0)),0)
2004 		   FROM Gl_Balances glb,Gl_Code_Combinations gcc
2005 		   WHERE glb.code_combination_id = gcc.code_combination_id
2006 		   AND gcc.'||vg_bal_segment|| ' = :fund_value'||
2007 		   ' AND gcc.'||vg_acct_segment|| ' = :child_acct'||
2008 		   ' AND gcc.summary_flag = '||''''||'N'||''''||
2009 		   ' AND gcc.template_id IS NULL
2010 		     AND glb.actual_flag = '||''''||'A'||''''||
2011 		   ' AND glb.ledger_id = :sob
2012 		   AND gcc.chart_of_accounts_id = :coa
2013 		   AND glb.period_year = :closing_fyr
2014 		   AND glb.period_name = :closing_period
2015 		   AND glb.currency_code = :currency
2016 		   GROUP BY glb.code_combination_id ';
2017 
2018  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,vl_select);
2019       -- Open thru' native dynamic sql
2020       OPEN vc_getbal FOR vl_select USING vg_fund_value,
2021                                          vg_child_acct,
2022 	                        	 vg_sob_id,
2023                                          vg_coa_id,
2024                                          vp_closing_fyr,
2025                                          vg_closing_period,
2026                                          vg_currency;
2027 
2028       -- Fetch the records
2029       LOOP  					-- loop for balances
2030         vg_gl_bal_amt := 0;
2031 
2032 	FETCH vc_getbal INTO vl_ccid,vg_gl_bal_amt;
2033 
2034         IF (vc_getbal%FOUND) THEN		-- vc_getbal found
2035 	    vl_rec_found_flag := 'Y';
2036 
2037 	    vg_bal_seq_amt := 0;
2038 	    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2039  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'               PROCESSING THE CCID '
2040 			||TO_CHAR(vl_ccid)||
2041 			' and GL balance amt(vg_gl_bal_amt) is '
2042 			||TO_CHAR(vg_gl_bal_amt));
2043 	    END IF;
2044 
2045 	    BEGIN
2046 		SELECT NVL(SUM(bal_seq_amt),0)
2047 		INTO vg_bal_seq_amt
2048 		FROM Fv_Ye_Seq_Bal_Temp
2049 		WHERE account_seg = vg_child_acct
2050 		AND balance_seg   = vg_fund_value
2051 		AND set_of_books_id = vg_sob_id
2052 		AND group_id = vg_group_id
2053 		AND code_combination_id = vl_ccid
2054 		AND fiscal_year = vp_closing_fyr
2055 		AND balance_read_flag = 'N';
2056 
2057 	    EXCEPTION
2058 		WHEN NO_DATA_FOUND THEN
2059 		   vg_bal_seq_amt := 0;
2060 	    END;
2061 	    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2062  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'               AMOUNT FROM TEMP TABLE, '||
2063                      'for the ccid being processed is ' ||TO_CHAR(vg_bal_seq_amt));
2064 	    END IF;
2065 
2066 	    -- set the balance_read_flag
2067 	    vg_balance_read_flag := 'Y';
2068 
2069 	    -- Sum the amt from the gl_balances and the temp table.
2070 	    vg_bal_seq_amt := vg_bal_seq_amt + vg_gl_bal_amt;
2071             IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2072  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'               TOTAL AMOUNT IS '||
2073                         TO_CHAR(vg_bal_seq_amt));
2074             END IF;
2075 	    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2076  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'               CALLING DETERMINE_DRCR PROC.'||
2077 				'Case 1D');
2078 	    END IF;
2079 	    -- Call Determine_DrCr procedure
2080 	    -- Case 1D:
2081 	    Determine_DrCr(vl_ccid);
2082 
2083 	    IF (vp_retcode <> 0) THEN
2084 		RAISE e_error;
2085 	    END IF;
2086 
2087 	    -- put the ccid into the pl/sql table
2088 	    vt_ccid(i) := vl_ccid;
2089 	    i := i + 1;
2090 
2091  	ELSE 					-- vc_getbal found
2092        	   /* Case when no balances are found */
2093 	   /* this else is if vc_getbal not found	      */
2094            /*this code in else part is necessary to handle the*
2095             *following situation:say group_id 1 has two seq's *
2096             *say 10 and 20. Sequence 10 has EXP CY 4700 4650  *
2097             *and EXP CY 4610 4650. Sequence 20 has EXP CY 4650*
2098             *4800. In this situation to get all the balances  *
2099             *from the temp table,for 4650 when we are         *
2100             *processing the 4650 account for sequence 20, we  *
2101             *need to consider the sum for the to accounts 4650*
2102             * for sequence 10 in the temp table.              */
2103 
2104  	   IF (vl_rec_found_flag = 'Y') THEN		-- vl_rec_found_flag
2105 		EXIT;
2106 	   ELSE					-- vl_rec_found_flag
2107 	        IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2108  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'               NO BALANCES FOUND IN General Ledger.'||
2109 			'Looking for balances in the Temp table');
2110 	        END IF;
2111 		vg_bal_seq_amt := 0;
2112 
2113 		FOR vc_getsumtemp IN get_sumtemp_cur LOOP -- getsum loop
2114 	            IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2115  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'               FOUND BALANCES '||
2116 					'in Temp Table.');
2117 	            END IF;
2118 
2119 	            -- put the ccid into the pl/sql table
2120 	            vt_ccid(i) := vc_getsumtemp.code_combination_id;
2121 	            i := i + 1;
2122 
2123 		    -- Get the amt from the temp table
2124 		    vg_bal_seq_amt := vc_getsumtemp.amt;
2125 		    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2126  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'               AMOUNT FROM TEMP TABLE '||
2127 				'is '|| TO_CHAR(vg_bal_seq_amt));
2128 		    END IF;
2129 
2130 		    -- Set the balance_read_flag
2131 		    vg_balance_read_flag := 'Y';
2132 
2133 	    	    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2134  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'               CALLING DETERMINE_DRCR'||
2135 				' proc. Case 2D');
2136 	    	    END IF;
2137 	    	    -- Call Determine_DrCr procedure
2138 	    	    -- Case 2D:
2139 	    	    Determine_DrCr(vc_getsumtemp.code_combination_id);
2140 
2141 	    	    IF (vp_retcode <> 0) THEN
2142 			    RAISE e_error;
2143 	    	    END IF;
2144 		END LOOP;				-- getsum loop
2145 		EXIT;
2146 	   END IF;				-- vl_rec_found_flag
2147  	END IF; 				-- vc_getbal found
2148 
2149       END LOOP;					-- loop for balances
2150 
2151       -- Get the count of ccids in pl/sql table
2152       vl_ccid_cnt := vt_ccid.COUNT;
2153       IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2154  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'               THE NUMBER OF CCIDS PROCESSED FROM '||
2155 			'gl_balances for the from acct is '||TO_CHAR(vl_ccid_cnt));
2156       END IF;
2157 
2158       /* The below code is needed to handle the following scenrio: *
2159        * The sequence are defined as follows: Group id 1 has seq's *
2160        * 10 and 20. Seq 10 has Exp 4610 4450, Exp 4700 4450. Seq 20*
2161        * has Exp 4450 4650. In this scenario, say acct 461002 with *
2162        * ccid 30608 has $1145 which has been moved to 4450 with    *
2163        * ccid 34650 based on the first entry of the seq 10. There  *
2164        * was also another ccid 28822 with amt $19M which was moved *
2165        * to 4450.Now when processing seq 20, for 4450 we find an   *
2166        * amt $15M with ccid 28822.When the Ye process runs, it is  *
2167        * just picking up the amount from gl,plus the amt from temp *
2168        * table only for ccid 28822. The below code is necessary to *
2169        * this scenario, where the money in the ccid 34650 for acct *
2170        * 4450 should also be moved to acct 4650.                   */
2171 
2172       FOR vc_addccid IN get_addccid_cur LOOP		-- additional ccid
2173 	vl_ccid := vc_addccid.code_combination_id;
2174 	IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2175  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'               PROCESSING THE ADDITIONAL CCID '||
2176 			TO_CHAR(vl_ccid));
2177 	END IF;
2178 
2179 	FOR j IN 1..vl_ccid_cnt LOOP
2180 		IF (vt_ccid(j) = vl_ccid) THEN
2181 			vl_exists := 'Y';
2182 			EXIT;
2183 		ELSE
2184 			vl_exists := 'N';
2185 		END IF;
2186         END LOOP;
2187 
2188 	IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2189  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'               VL_EXISTS = '||VL_EXISTS);
2190 	END IF;
2191 
2192 	IF (vl_exists = 'N') THEN
2193 		    -- Get the amt from the temp table
2194 		    vg_bal_seq_amt := vc_addccid.amt;
2195 		    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2196  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'               AMOUNT FROM TEMP TABLE '||
2197 				'is '|| TO_CHAR(vg_bal_seq_amt)||
2198 				' for the additional ccid '||TO_CHAR(vl_ccid));
2199 		    END IF;
2200 
2201 		    -- Set the balance_read_flag
2202 		    vg_balance_read_flag := 'Y';
2203 
2204 	    	    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2205  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'               CALLING DETERMINE_DRCR'||
2206 				' proc. Case 4D');
2207 	    	    END IF;
2208 	    	    -- Call Determine_DrCr procedure
2209 	    	    -- Case 4D:
2210 	    	    Determine_DrCr(vl_ccid);
2211 
2212 	    	    IF (vp_retcode <> 0) THEN
2213 			    RAISE e_error;
2214 	    	    END IF;
2215 	END IF;
2216 
2217       END LOOP;						-- additional ccid
2218 
2219    ELSE   					-- vg_balance_read_flag
2220       IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2221  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'               CASE: WHEN BALANCE_READ_FLAG = Y');
2222       END IF;
2223 
2224       FOR vc_getsumseq IN get_sumtemp_seqcur LOOP -- getsumseq loop
2225     	-- Get the amt from the temp table
2226         vg_bal_seq_amt := vc_getsumseq.amt;
2227 
2228 	-- Set the balance_read_flag
2229 	vg_balance_read_flag := 'Y';
2230 
2231 	IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2232  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'               CALLING DETERMINE_DRCR PROC.'||
2233 				'Case 3D');
2234 	END IF;
2235 	-- Call Determine_DrCr procedure
2236 	-- Case 3D:
2237 	Determine_DrCr(vc_getsumseq.code_combination_id);
2238 
2239 	IF (vp_retcode <> 0) THEN
2240 	    RAISE e_error;
2241 	END IF;
2242       END LOOP;					-- getsumseq loop
2243 
2244    END IF;					-- vg_balance_read_flag
2245 
2246 EXCEPTION
2247    WHEN e_error THEN
2248 	IF vc_getbal%ISOPEN THEN
2249 	   CLOSE vc_getbal;
2250 	END IF;
2251 	RETURN;
2252 
2253    WHEN OTHERS THEN
2254         vp_retcode := 2 ;
2255         vp_errbuf  := SQLERRM  ||' -- Error in Get_Balances procedure.' ;
2256        IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2257                FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_UNEXPECTED, l_module_name,
2258                          'When Others Exception ' || vp_errbuf );
2259        END IF;
2260     RETURN;
2261 END Get_Balances;
2262 
2263 -- ------------------------------------------------------------------
2264 --                      Procedure Determine_DrCr
2265 -- ------------------------------------------------------------------
2266 -- Determine_DrCr procedure is called from Get_Balances procedure.
2267 -- This determines the debit and credit flag, and then calls the
2268 -- Get_Segment_Values procedure, and then calls Insert_Balances.
2269 -- ------------------------------------------------------------------
2270 PROCEDURE Determine_DrCr(ccid NUMBER) IS
2271    vl_dbt_flag VARCHAR2(1);
2272    vl_crt_flag VARCHAR2(1);
2273 
2274    vl_acct 	    Fv_Ye_Sequence_Accounts.from_account%TYPE;
2275    vl_remaining_bal NUMBER;
2276    vl_drcr_flag     VARCHAR2(1);
2277    vl_read_flag     VARCHAR2(1);
2278    vl_ccid	    Gl_Code_Combinations.code_combination_id%TYPE;
2279    vl_processing_type Fv_Ye_Seq_Bal_Temp.processing_type%TYPE;
2280    vl_acct_combi     VARCHAR2(2000);
2281    vl_delimeter      VARCHAR2(1);
2282    v_cross_val_msg   VARCHAR2(2000);
2283    l_ccid_select varchar2(2048);
2284    l_cursor_id     INTEGER;
2285    l_counter       NUMBER;
2286    l_ignore    INTEGER;
2287 
2288 
2289   CURSOR flex_cursor
2290   (
2291     c_coa_id NUMBER
2292   ) IS
2293   SELECT fifs.application_column_name
2294     FROM fnd_id_flex_segments fifs
2295    WHERE fifs.application_id = 101
2296      AND fifs.id_flex_code = 'GL#'
2297      AND fifs.id_flex_num = c_coa_id
2298      AND fifs.enabled_flag = 'Y'
2299    ORDER by fifs.segment_num;
2300    l_module_name         VARCHAR2(200)  ;
2301 BEGIN
2302 
2303 l_module_name  :=  g_module_name ||'Determine_DrCr ';
2304 
2305 
2306 
2307 
2308  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
2309  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'                 IN DETERMINE_DRCR PROCEDURE,'||
2310 
2311 		' processing ccid '||TO_CHAR(ccid));
2312          END IF;
2313     -- Determine the debit and credit flag
2314     -- debit flag is used for the from_acct
2315     -- credit flag is used for the to_acct
2316     IF (vg_bal_seq_amt > 0) THEN
2317 	vl_dbt_flag := 'C';
2318 	vl_crt_flag := 'D';
2319     ELSE
2320 	vl_dbt_flag := 'D';
2321 	vl_crt_flag := 'C';
2322     END IF;
2323 
2324     -- Get the Segment Values for the ccid
2325     Get_Segment_Values(ccid);
2326 
2327     IF (vp_retcode <> 0) THEN
2328 	RAISE e_error;
2329     END IF;
2330 
2331     FOR i IN 1..2 LOOP
2332 	IF (i = 1) THEN
2333 	   -- When this procedure is called from Case 1D, this step is
2334 	   -- redundant, but when called from Case 2D , this is required.
2335 	   -- Overlaying the Natural Acct segment with the child Acct
2336 	   vt_segments(vg_acct_segnum) := vg_child_acct;
2337 	   vl_acct := vg_child_acct;
2338 	   vl_remaining_bal := 0;
2339 	   vl_ccid := ccid;
2340 
2341 	   -- Determine the Processing Type(FACTSI or FACTSII or none)
2342            Determine_Processing_Type(vl_processing_type);
2343 
2344            IF (vp_retcode <> 0) THEN
2345 	       RAISE e_error;
2346            END IF;
2347 	ELSE
2348 	   -- This step is required for all the Cases.
2349 	   -- Overlaying the Natural Acct segment with the To Acct
2350 	   vt_segments(vg_acct_segnum) := vg_to_acct;
2351 	   vl_acct := vg_to_acct;
2352 	   vl_remaining_bal := vg_bal_seq_amt;
2353 	   vl_processing_type := 0;
2354 
2355     	   IF NOT Fnd_Flex_Ext.Get_Combination_Id('SQLGL', 'GL#',
2356 					vg_coa_id, SYSDATE, vg_num_segs,
2357 					vt_segments, vl_ccid) THEN
2358 		IF (vl_remaining_bal <> 0) THEN
2359 			RAISE e_invalid;
2360 		ELSE
2361                vl_ccid := NULL;
2362                l_ccid_select := 'SELECT code_combination_id
2363                                  FROM gl_code_combinations gcc
2364                                 WHERE gcc.chart_of_accounts_id = :coa_id ';
2365                FOR flex_rec IN flex_cursor (vg_coa_id) LOOP
2366                  l_ccid_select := l_ccid_select ||
2367                                   ' and gcc.'||
2368                                   flex_rec.application_column_name||
2369                                   ' = :c_'||
2370                                   flex_rec.application_column_name;
2371                END LOOP;
2372 
2373                l_cursor_id := dbms_sql.open_cursor;
2374                dbms_sql.parse(l_cursor_id, l_ccid_select, dbms_sql.v7);
2375                dbms_sql.define_column(l_cursor_id, 1, vl_ccid);
2376                dbms_sql.bind_variable(l_cursor_id, ':coa_id', vg_coa_id);
2377 
2378                l_counter := 0;
2379                FOR flex_rec IN flex_cursor (vg_coa_id) LOOP
2380                  l_counter := l_counter + 1;
2381                  dbms_sql.bind_variable(l_cursor_id, 'c_'||flex_rec.application_column_name, vt_segments(l_counter));
2382                END LOOP;
2383 
2384                l_ignore := dbms_sql.execute_and_fetch(l_cursor_id);
2385                dbms_sql.column_value(l_cursor_id, 1, vl_ccid);
2386                dbms_sql.close_cursor (l_cursor_id);
2387                IF (vl_ccid IS NULL) THEN
2388  		FV_UTILITY.LOG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'No CCID Exists for the following Combination');
2389                 l_counter := 0;
2390                 FOR flex_rec IN flex_cursor (vg_coa_id) LOOP
2391                   l_counter := l_counter + 1;
2392  		  FV_UTILITY.LOG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,flex_rec.application_column_name||'='|| vt_segments(l_counter));
2393                 END LOOP;
2394  		FV_UTILITY.LOG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'Please Create the CCID');
2395 		RAISE e_invalid;
2396 		END IF;
2397 		END IF;
2398 	   END IF;
2399 
2400 	END IF;
2401 
2402 	BEGIN
2403 	   SELECT DECODE(i,1,vl_dbt_flag,vl_crt_flag)
2404 	   INTO vl_drcr_flag
2405 	   FROM DUAL;
2406 
2407 	   SELECT DECODE(i,1,vg_balance_read_flag,'N')
2408 	   INTO vl_read_flag
2409 	   FROM DUAL;
2410 
2411 	EXCEPTION
2412 	   WHEN OTHERS THEN
2413         	vp_retcode := 2 ;
2414         	vp_errbuf  := SQLERRM  ||' -- Error in Determine_DrCr procedure,'||
2415 			'while deriving the vl_drcr_flag and vl_read_flag.' ;
2416 		RETURN;
2417 	END;
2418 
2419 
2420 -- Insert Null values for the Remaining Segments
2421 
2422    FOR i in vt_segments.count+1..30
2423    LOOP
2424         vt_segments(i) := NULL;
2425    END LOOP;
2426 
2427 
2428 	-- Call the Insert_Balances procedure.
2429 	Insert_Balances(
2430 		vl_ccid,
2431 		vl_acct,
2432 		vg_bal_seq_amt,
2433 		vl_drcr_flag,
2434 		vl_read_flag,
2435 		vl_remaining_bal,
2436 		vl_processing_type,
2437 		vt_segments);
2438 
2439     	IF (vp_retcode <> 0) THEN
2440 		RAISE e_error;
2441     	END IF;
2442     END LOOP;
2443 
2444 EXCEPTION
2445    WHEN e_error THEN
2446 	RETURN;
2447 
2448    WHEN e_invalid THEN
2449       vp_retcode := 2;
2450       v_cross_val_msg :=  fnd_flex_ext.get_message;
2451       vl_delimeter := fnd_flex_ext.get_delimiter('SQLGL', 'GL#',vg_coa_id) ;
2452       vl_acct_combi := fnd_flex_ext.concatenate_segments(vg_num_segs,
2453 				vt_segments, vl_delimeter);
2454 
2455       vp_errbuf := 'The '||'"'||'To Account combination :'|| vl_acct_combi||'"'
2456 		    ||' violates Cross-Validation/Security rule ' ||
2457                     '"'|| v_cross_val_msg ||'".';
2458 
2459  -- vp_errbuf := 'Unable to determine the CCID of the To Account combination,'||
2460 --		'possibly due to a Cross-Validation/Security rule violation.';
2461 	RETURN;
2462 
2463    WHEN OTHERS THEN
2464         vp_retcode := 2 ;
2465         vp_errbuf  := SQLERRM  ||' -- Error in Determine_DrCr procedure.' ;
2466 
2467        IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2468                FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_UNEXPECTED, l_module_name,
2469                          'When Others Exception ' || vp_errbuf );
2470        END IF;
2471      RETURN;
2472 
2473 END Determine_DrCr;
2474 
2475 -- ------------------------------------------------------------------
2476 --                      Procedure Get_Segment_Values
2477 -- ------------------------------------------------------------------
2478 -- Get_Segment_Values procedure is called from Determine_DrCr procedure.
2479 -- This proc gets all the segments for the ccid passed.
2480 -- ------------------------------------------------------------------
2481 PROCEDURE Get_Segment_Values(ccid NUMBER) IS
2482    vl_segment_value VARCHAR2(25);
2483    vl_num_segs		NUMBER;
2484    l_module_name         VARCHAR2(200);
2485 BEGIN
2486 
2487   l_module_name  :=  g_module_name ||
2488                                           'Get_Segment_Values ';
2489 
2490  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
2491  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'                   IN GET_SEGMENT_VALUES PROCEDURE,'||
2492 
2493 		'determing the segments for the ccid '||TO_CHAR(ccid));
2494          END IF;
2495 
2496 
2497    IF NOT fnd_flex_ext.get_segments('SQLGL','GL#',vg_coa_id,ccid,vl_num_segs,
2498                 vt_segments) THEN
2499         raise e_invalid;
2500    END IF;
2501 
2502 EXCEPTION
2503    WHEN e_invalid THEN
2504       vp_retcode := 2;
2505       vp_errbuf := 'Error in Get_Segment_Values - Unable to
2506 		determine the segments for the CCID '||TO_CHAR(ccid);
2507       RETURN;
2508 
2509    WHEN OTHERS THEN
2510       vp_retcode := 2 ;
2511       vp_errbuf  := SQLERRM  ||' -- Error in Get_Segment_Values procedure.' ;
2512        IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2513                FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_UNEXPECTED, l_module_name,
2514                          'When Others Exception ' || vp_errbuf );
2515        END IF;
2516 
2517       RETURN ;
2518 
2519 END Get_Segment_Values;
2520 
2521 -- ------------------------------------------------------------------
2522 --                      Procedure Determine_Processing_Type
2523 -- ------------------------------------------------------------------
2524 -- Determine_Processing_Type  procedure is called from Determine_DrCr procedure.
2525 -- This proc determines if the Year end process needs to close the
2526 -- balances at the FACTSI or FACTSII attribute level.
2527 -- ------------------------------------------------------------------
2528 PROCEDURE Determine_Processing_Type(p_type OUT NOCOPY NUMBER) IS
2529 
2530    CURSOR get_attrcnt_csr(p_acct VARCHAR2) IS
2531 	SELECT COUNT(*)
2532 	FROM Fv_Facts_Attributes
2533 	WHERE set_of_books_id = vg_sob_id
2534 	AND facts_acct_number = p_acct;
2535 
2536    CURSOR get_attributes_csr(p_acct VARCHAR2) IS
2537 	SELECT public_law_code,
2538                advance_flag,
2539                transfer_flag,
2540                govt_non_govt
2541 	FROM Fv_Facts_Attributes
2542 	WHERE set_of_books_id = vg_sob_id
2543 	AND facts_acct_number = p_acct;
2544 
2545    CURSOR get_parent_csr IS
2546 	SELECT parent_flex_value
2547 	FROM Fnd_Flex_Value_Norm_Hierarchy
2548 	WHERE flex_value_set_id = vg_acct_val_set_id
2549 	AND vg_child_acct BETWEEN child_flex_value_low AND child_flex_value_high
2550 	ORDER BY parent_flex_value;
2551 
2552    vl_plcode	Fv_Facts_Attributes.public_law_code%TYPE;
2553    vl_advflag	Fv_Facts_Attributes.advance_flag%TYPE;
2554    vl_transflag	Fv_Facts_Attributes.transfer_flag%TYPE;
2555    vl_govtflag	Fv_Facts_Attributes.govt_non_govt%TYPE;
2556    vl_found_flag VARCHAR2(1) ;
2557    vl_cnt       NUMBER;
2558    vl_process_type VARCHAR2(10);
2559    vl_parent    Fnd_Flex_Value_Hierarchies.parent_flex_value%TYPE;
2560 
2561    l_module_name         VARCHAR2(200) ;
2562 
2563 BEGIN
2564 
2565 l_module_name :=  g_module_name ||
2566                                       'Determine_Processing_Type ';
2567 vl_found_flag := 'N';
2568 
2569 
2570 
2571  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
2572  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'                   IN DETERMINE_PROCESSING_TYPE PROCEDURE'||
2573 		' with acct '||vg_child_acct);
2574          END IF;
2575 
2576    OPEN get_attrcnt_csr(vg_child_acct);
2577    FETCH get_attrcnt_csr INTO vl_cnt;
2578    CLOSE get_attrcnt_csr;
2579 
2580    IF (vl_cnt = 1) THEN				-- child cnt
2581       -- Case when the processing acct has attributes in Facts Attributes table
2582  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
2583  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'                   CASE: WHEN PROCESSING ACCT IS IN '||
2584 		'Facts Attributes Table');
2585          END IF;
2586       OPEN get_attributes_csr(vg_child_acct);
2587       FETCH get_attributes_csr INTO
2588 	  vl_plcode,vl_advflag,vl_transflag,vl_govtflag;
2589       CLOSE get_attributes_csr;
2590 
2591       vl_found_flag := 'Y';
2592    ELSIF (vl_cnt = 0) THEN			-- child cnt
2593       -- Case when the child acct has no attributes in Facts Attributes table,
2594       -- hence looking for the parent.
2595  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
2596  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'                   CASE: WHEN PROCESSING ACCT IS NOT IN '||
2597 		'Facts Attributes Table, hence looking for the parent');
2598          END IF;
2599       vl_cnt := 0;
2600       FOR vc_parent IN get_parent_csr LOOP
2601         vl_parent := vc_parent.parent_flex_value;
2602  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
2603  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'                   PROCESSING PARENT '||VL_PARENT);
2604  END IF;
2605 
2606 	OPEN get_attrcnt_csr(vl_parent);
2607         FETCH get_attrcnt_csr INTO vl_cnt;
2608         CLOSE get_attrcnt_csr;
2609 
2610 	IF (vl_cnt = 1) THEN			-- parent cnt
2611 	   IF (vl_found_flag = 'N') THEN	-- found flag
2612 		-- Case when the parent has attributes, the first parent.
2613       		OPEN get_attributes_csr(vl_parent);
2614    	   	FETCH get_attributes_csr INTO
2615 	  		vl_plcode,vl_advflag,vl_transflag,vl_govtflag;
2616       		CLOSE get_attributes_csr;
2617 
2618       		vl_found_flag := 'Y';
2619  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
2620  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'                   CASE: WHEN PARENT '||
2621 				'has attributes in FACTS Table');
2622                  END IF;
2623 	   ELSE					-- found flag
2624 		-- Case when more than one parent is in the Facts Attributes table.
2625 		-- In this case, the processing type should be 0,since we do not
2626 		-- know which acct to consider for getting the attributes.
2627  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
2628  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'                   CASE: WHEN MORE THAN ONE '||
2629 				'parent has attributes in FACTS table');
2630                  END IF;
2631       		vl_found_flag := 'N';
2632 		EXIT;
2633  	   END IF;				-- found flag
2634 	END IF;					-- parent cnt
2635       END LOOP;
2636 
2637    END IF;					-- child cnt
2638 
2639    IF (vl_found_flag = 'Y') THEN
2640       -- Found attributes either for the processing acct or it's parent.
2641       IF ((vl_plcode = 'Y') OR (vl_advflag = 'Y') OR
2642 	   (vl_transflag = 'Y') ) THEN
2643    	   p_type := 2;
2644       ELSIF( (vl_govtflag IN ('F','Y')) AND (vg_factsi_attr_exists = 'Y')) THEN
2645 	   p_type := 1;
2646       ELSE
2647 	   p_type := 0;
2648       END IF;
2649    ELSE
2650      -- No attributes found for the processing acct or it's parent.
2651       p_type := 0;
2652    END IF;
2653 
2654    IF (p_type = 2) THEN
2655 	vl_process_type := 'FACTS II';
2656    ELSIF (p_type = 1) THEN
2657 	vl_process_type := 'FACTS I';
2658    ELSE
2659 	vl_process_type := 'Regular';
2660    END IF;
2661  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
2662  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'                   PROCESSING BY '||VL_PROCESS_TYPE);
2663  END IF;
2664 
2665 EXCEPTION
2666    WHEN OTHERS THEN
2667       vp_retcode := 2 ;
2668       vp_errbuf  := SQLERRM  ||' -- Error in Determine_Processing_Type procedure.' ;
2669        IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2670                FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_UNEXPECTED, l_module_name,
2671                          'When Others Exception ' || vp_errbuf );
2672        END IF;
2673 
2674       RETURN ;
2675 END Determine_Processing_Type;
2676 
2677 -- ------------------------------------------------------------------
2678 --                      Procedure Insert_Balances
2679 -- ------------------------------------------------------------------
2680 -- Insert_Balances procedure is called from Determine_DrCr procedure.
2681 -- This proc inserts into the Fv_Ye_Seq_Bal_Temp table.
2682 -- ------------------------------------------------------------------
2683 PROCEDURE Insert_Balances(ccid 		NUMBER,
2684 			  acct 		VARCHAR2,
2685 			  bal_amt 	NUMBER,
2686 			  dr_cr		VARCHAR2,
2687 			  read_flag 	VARCHAR2,
2688 			  remaining_bal NUMBER,
2689 			  processing_type NUMBER,
2690 			  segs		Fnd_Flex_Ext.SegmentArray) IS
2691 
2692 CURSOR flex_fields IS
2693   SELECT application_column_name
2694   FROM   fnd_id_flex_segments
2695   WHERE  id_flex_code = 'GL#'
2696   AND    id_flex_num = vg_coa_id
2697   AND  enabled_flag = 'Y'
2698   ORDER BY segment_num;
2699 
2700    vl_report_seq    NUMBER;
2701    vl_period_dr     NUMBER;
2702    vl_period_cr     NUMBER;
2703    l_module_name    VARCHAR2(200) ;
2704    vl_segments      Fnd_Flex_Ext.SegmentArray;
2705    vl_segnum        NUMBER;
2706    l_column_name    fnd_id_flex_segments.application_column_name%TYPE;
2707    l_n_segments     NUMBER ;
2708 
2709 BEGIN
2710     l_module_name   :=  g_module_name || 'Insert_Balances ';
2711    -- Get the period net dr, period net cr
2712    BEGIN
2713       SELECT DECODE(dr_cr,'D',ABS(bal_amt),0)
2714       INTO vl_period_dr
2715       FROM DUAL;
2716 
2717       SELECT DECODE(dr_cr,'D',0,ABS(bal_amt))
2718       INTO vl_period_cr
2719       FROM DUAL;
2720    EXCEPTION
2721       WHEN OTHERS THEN
2722        	vp_retcode := 2 ;
2723        	vp_errbuf  := SQLERRM  ||' -- Error in Insert_Balances procedure,'||
2724 		'while deriving the period_net_dr and period_net_cr.' ;
2725 	RETURN;
2726 
2727    END;
2728  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
2729  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'                     IN INSERT_BALANCES PROCEDURE,'||
2730 		'inserting the following:');
2731          END IF;
2732  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
2733  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'                     CCID:'||TO_CHAR(CCID)||' ACCT:'||ACCT||
2734 		' balance read flag: '||read_flag);
2735          END IF;
2736  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
2737  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'                     PERIOD NET DR:'||TO_CHAR(VL_PERIOD_DR)||
2738 		' period net cr:'|| TO_CHAR(vl_period_cr)||
2739 		' remaining balance:'||TO_CHAR(remaining_bal) );
2740          END IF;
2741 
2742    -- Get the report sequence
2743    BEGIN
2744       SELECT Fv_Ye_Seq_Bal_Temp_S.NEXTVAL
2745       INTO vl_report_seq
2746       FROM DUAL;
2747    EXCEPTION
2748       WHEN OTHERS THEN
2749        	vp_retcode := 2 ;
2750        	vp_errbuf  := SQLERRM  ||' -- Error in Determine_DrCr procedure,'||
2751 		'while deriving the vl_report_seq.' ;
2752 	RETURN;
2753    END;
2754 
2755 
2756   --  map the segment values to the right segments
2757 
2758   -- Insert Null values for the Segments initially
2759 
2760    FOR i in 1..30
2761    LOOP
2762         vl_segments(i) := NULL;
2763    END LOOP;
2764 
2765   l_n_segments := 0;
2766 
2767   FOR flex_fields_rec IN flex_fields
2768   LOOP
2769 
2770     l_n_segments  := l_n_segments + 1;
2771     l_column_name := flex_fields_rec.application_column_name;
2772     vl_segnum     := SUBSTR(l_column_name,8) ;
2773     vl_segments(vl_segnum) := segs(l_n_segments);
2774 
2775   END LOOP;
2776 
2777 
2778 
2779    -- Insert into the Temp table.
2780    INSERT INTO Fv_Ye_Seq_Bal_Temp(
2781 	code_combination_id,
2782         group_id,
2783         SEQUENCE,
2784         account_seg,
2785         balance_seg,
2786         period_net_dr,
2787         period_net_cr,
2788         bal_seq_amt,
2789         period_name,
2790         currency_code,
2791         fiscal_year,
2792         balance_read_flag,
2793         set_of_books_id,
2794 	treasury_symbol_id,
2795 	account_flag,
2796 	report_sequence,
2797 	processing_type,
2798         segment1,segment2,segment3,segment4,segment5,
2799         segment6,segment7,segment8,segment9,segment10,
2800         segment11,segment12,segment13,segment14,
2801         segment15,segment16,segment17,segment18,
2802         segment19,segment20,segment21,segment22,
2803         segment23,segment24,segment25,segment26,
2804         segment27,segment28,segment29,segment30)
2805    VALUES
2806 	(ccid,
2807 	vg_group_id,
2808 	vg_seq,
2809 	acct,
2810 	vg_fund_value,
2811 	vl_period_dr,
2812 	vl_period_cr,
2813 	remaining_bal,
2814 	vg_closing_period,
2815 	vg_currency,
2816 	vp_closing_fyr,
2817 	read_flag,
2818 	vg_sob_id,
2819 	vg_trsymbol_id,
2820 	vg_acct_flag,
2821 	vl_report_seq,
2822 	processing_type,
2823 vl_segments(1),vl_segments(2),vl_segments(3),vl_segments(4),vl_segments(5),
2824 vl_segments(6),vl_segments(7),vl_segments(8),vl_segments(9),vl_segments(10),
2825 vl_segments(11),vl_segments(12),vl_segments(13),vl_segments(14),vl_segments(15),
2826 vl_segments(16),vl_segments(17),vl_segments(18),vl_segments(19),vl_segments(20),
2827 vl_segments(21),vl_segments(22),vl_segments(23),vl_segments(24),vl_segments(25),
2828 vl_segments(26),vl_segments(27),vl_segments(28),vl_segments(29),vl_segments(30));
2829 EXCEPTION
2830    WHEN OTHERS THEN
2831       vp_retcode := 2 ;
2832       vp_errbuf  := SQLERRM  ||' -- Error in Insert_Balances procedure.' ;
2833        IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2834                FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_UNEXPECTED, l_module_name,
2835                          'When Others Exception ' || vp_errbuf );
2836        END IF;
2837 
2838       RETURN ;
2839 
2840 END Insert_Balances;
2841 
2842 -- ------------------------------------------------------------------
2843 --                      Procedure Update_Closing_Status
2844 -- ------------------------------------------------------------------
2845 -- Update_Closing_Status procedure is called from Get_Fund_Value procedure.
2846 -- When submit journal import is Y, this proc closes all the pending
2847 -- requisitions, if any exists,for the fund that is being processed.
2848 -- ------------------------------------------------------------------
2849 PROCEDURE Update_Closing_Status IS
2850 
2851    CURSOR get_closereq_cur IS
2852 	SELECT ffp.close_requisitions
2853    	FROM fv_fund_parameters ffp, fv_treasury_symbols fts
2854    	WHERE fts.treasury_symbol = vg_trsymbol
2855    	AND ffp.fund_value = vg_fund_value
2856    	AND ffp.treasury_symbol_id = fts.treasury_symbol_id
2857    	AND ffp.set_of_books_id = vg_sob_id
2858     AND fts.close_requisitions = vp_closing_method;
2859 
2860    -- Variable declarations for Native Dynamic SQL
2861    TYPE t_refcur IS REF CURSOR;
2862    vl_dist_retcur  t_refcur;
2863    vl_dist_select  VARCHAR2(2000);
2864 
2865    vl_rec_found_flag   	VARCHAR2(1) ;
2866    vl_close_req   	Fv_Fund_Parameters.close_requisitions%TYPE;
2867    vl_distr_id      	Po_Req_Distributions_All.distribution_id%TYPE;
2868    vl_line_id       	Po_Req_Distributions_All.requisition_line_id%TYPE;
2869    vl_req_num       	Po_Requisition_Headers_All.segment1%TYPE;
2870    vl_prev_line_id  	Po_Req_Distributions_All.requisition_line_id%TYPE ;
2871    vl_prt_line_id  	Po_Req_Distributions_All.requisition_line_id%TYPE ;
2872    vl_ctr 		NUMBER ;
2873    vl_index		BINARY_INTEGER;
2874    vl_no_of_rows	NUMBER;
2875    vl_last_row		NUMBER;
2876    vl_lines_count	NUMBER;
2877    vl_header_id     	Po_Requisition_Headers_All.requisition_header_id%TYPE;
2878    vl_prev_header_id    Po_Requisition_Headers_All.requisition_header_id%TYPE ;
2879    vl_prt_hdr_id     	Po_Requisition_Headers_All.requisition_header_id%TYPE;
2880    vl_head_ctr      	NUMBER ;
2881 
2882    TYPE t_lines_table IS TABLE OF NUMBER
2883         INDEX BY BINARY_INTEGER;
2884    vt_lines         t_lines_table;
2885 
2886    TYPE t_headers_table IS TABLE OF NUMBER
2887         INDEX BY BINARY_INTEGER;
2888    vt_headers       t_headers_table;
2889 
2890    CURSOR get_lcount_cur IS
2891 	SELECT COUNT(*)
2892 	FROM Po_Req_Distributions_All
2893 	WHERE requisition_line_id = vt_lines(vl_index)
2894 	AND gl_closed_date IS NULL;
2895 
2896    CURSOR get_header_cur IS
2897 	SELECT DISTINCT requisition_header_id
2898 	FROM Po_Requisition_Lines_All
2899 	WHERE requisition_line_id = vt_lines(vl_index);
2900 
2901    CURSOR get_hcount_cur IS
2902 	SELECT COUNT(*)
2903 	FROM Po_Requisition_Lines_All
2904 	WHERE requisition_header_id = vt_headers(vl_index)
2905 	AND (closed_code <> 'FINALLY CLOSED' OR closed_code IS NULL);
2906 	--AND NVL(closed_code, 'XXX') <> 'FINALLY CLOSED';
2907 
2908    l_module_name         VARCHAR2(200)  ;
2909 
2910 BEGIN
2911     l_module_name  := g_module_name || 'Update_Closing_Status  ';
2912     vl_rec_found_flag  := 'N';
2913     vl_prev_line_id   := 0;
2914     vl_ctr  := 0;
2915     vl_prev_header_id := 0;
2916     vl_head_ctr := 0;
2917 
2918  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
2919  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'       IN THE UPDATE_CLOSING_STATUS PROCEDURE.....');
2920  END IF;
2921 
2922    -- Get the close requisition
2923    OPEN get_closereq_cur;
2924    FETCH get_closereq_cur INTO vl_close_req;
2925    CLOSE get_closereq_cur;
2926 
2927  /* IF (vl_close_req = 'N') THEN				-- vl_close_req
2928  	IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2929  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'       CLOSE REQUISITIONS = P');
2930 	END IF;
2931 	RETURN;
2932    ELSE							-- vl_close_req*/
2933    	IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2934  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'       CLOSE REQUISITIONS = ' || vl_close_req );
2935 	END IF;
2936 
2937    IF (vl_close_req = vp_closing_method)  THEN
2938 
2939         -- Build the select statement to get the distribution details
2940 	vl_dist_select := 'SELECT po.distribution_id,
2941          		   po.requisition_line_id, ph.segment1
2942           		FROM Po_Req_Distributions_All po, gl_code_combinations gcc,
2943 		           Po_Requisition_Lines_All pl, Po_Requisition_Headers_All ph
2944           		WHERE po.gl_closed_date IS NULL
2945           		AND gcc.code_combination_id = po.code_combination_id
2946           		AND gcc.chart_of_accounts_id = :coa
2947           		AND po.set_of_books_id = :sob
2948           		AND gcc.'||vg_bal_segment|| ' = :fund_value'||
2949 			' AND ph.authorization_status = '||''''||'APPROVED'||''''||
2950 			' AND po.requisition_line_id = pl.requisition_line_id
2951 			AND pl.requisition_header_id = ph.requisition_header_id
2952 			AND pl.line_location_id IS NULL
2953 			AND po.gl_encumbered_date <= :end_date' ;
2954 	--Fv_Utility.Debug_Mesg(vl_dist_select);
2955 
2956 	-- Open the ref cursor
2957 	OPEN vl_dist_retcur FOR vl_dist_select USING vg_coa_id,vg_sob_id,
2958 			vg_fund_value,vg_end_date;
2959 	LOOP						-- distrdetails loop
2960 	   FETCH vl_dist_retcur INTO vl_distr_id, vl_line_id,vl_req_num;
2961 
2962 	   IF vl_dist_retcur%FOUND THEN		-- details found
2963 	        IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2964  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'       PROCESSING THE REQUISITION NUMBER '||
2965 			vl_req_num||' with requisition line id '
2966 			||TO_CHAR(vl_line_id)||' and the distribution id '
2967 			||TO_CHAR(vl_distr_id) );
2968 	        END IF;
2969 		vl_rec_found_flag := 'Y';
2970 
2971 	        -- If vl_prev_line_id = vl_line_id, then this is the scenario
2972 		-- when for the same requisition line we have multiple distributions.
2973 		-- In this case,just go ahead and update the Po_Req_Distributions_All table
2974 		-- for the new distribution_id,without inseritng into the table.
2975 		IF (vl_prev_line_id <> vl_line_id) THEN  -- vl_prev_line_id
2976 		    -- insert into vt_lines table
2977 		    vt_lines(vl_ctr) := vl_line_id;
2978 		    vl_ctr := vl_ctr + 1;
2979 
2980 		    -- Copy the vl_line_id to vl_prev_line_id
2981 		    vl_prev_line_id  := vl_line_id;
2982 
2983 		END IF;					-- vl_prev_line_id
2984 
2985 	        -- Update the Po_Req_Distributions_All table
2986 	        UPDATE Po_Req_Distributions_All
2987 	        SET gl_closed_date = vg_end_date
2988 	        WHERE distribution_id = vl_distr_id;
2989 		IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2990  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'       CLOSED THE DISTRIBUTION WITH '||
2991 				'distribution_id '||TO_CHAR(vl_distr_id));
2992 		END IF;
2993 
2994 	   ELSE						-- details found
2995 	        IF (vl_rec_found_flag = 'Y') THEN
2996 		    EXIT;
2997 	        ELSE
2998 		    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2999  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'       NO REQUISITIONS FOUND TO '||
3000 			'be processed, where the balancing segment matches '||
3001 			'the fund value '|| vg_fund_value);
3002 		    END IF;
3003 		    RETURN;
3004 	        END IF;
3005 	   END IF;					-- details found
3006 	END LOOP;					-- distrdetails loop
3007 	CLOSE vl_dist_retcur;
3008    END IF;						-- vl_close_req
3009 
3010    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3011  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'       BEGININNING PROCESSING FOR THE LINES....');
3012    END IF;
3013    vl_no_of_rows := vt_lines.COUNT;
3014    vl_last_row   := vt_lines.LAST;
3015    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3016  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'       NUMBER OF ROWS:'|| TO_CHAR(VL_NO_OF_ROWS)||
3017 		' Last Row: '||TO_CHAR(vl_Last_row));
3018    END IF;
3019 
3020    IF (vl_no_of_rows <> 0) THEN				-- vl_no_of_rows lines
3021       vl_index := vt_lines.FIRST;
3022 
3023       LOOP						-- vl_index
3024 	-- Get the Line count
3025 	OPEN get_lcount_cur;
3026 	FETCH get_lcount_cur INTO vl_lines_count;
3027 	CLOSE get_lcount_cur;
3028         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3029  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'       VL_LINES_COUNT IS '||TO_CHAR(VL_LINES_COUNT));
3030         END IF;
3031 
3032 	IF (vl_lines_count = 0) THEN			-- vl_lines_count
3033 	     -- Update the Po_Requisition_Lines_All table
3034 	     UPDATE Po_Requisition_Lines_All
3035 	     SET closed_code = 'FINALLY CLOSED'
3036 	     WHERE requisition_line_id = vt_lines(vl_index);
3037 
3038 	     vl_prt_line_id := vt_lines(vl_index);
3039              IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3040  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'       CLOSED THE LINE WITH REQUISITION_LINE_ID '||
3041 			TO_CHAR(vl_prt_line_id));
3042              END IF;
3043 
3044 	     OPEN get_header_cur;
3045 	     FETCH get_header_cur INTO vl_header_id;
3046 	     CLOSE get_header_cur;
3047 
3048 	     IF (vl_prev_header_id <> vl_header_id) THEN
3049 		   -- insert into the headers table
3050 		   vt_headers(vl_head_ctr) := vl_header_id;
3051 		   vl_head_ctr := vl_head_ctr + 1;
3052 
3053 		   -- assign the vl_header_id to vl_prev_header_id
3054 		   vl_prev_header_id := vl_header_id;
3055 	     END IF;
3056 	END IF;						-- vl_lines_count
3057 
3058 	IF (vl_index = vl_last_row) THEN
3059 	     EXIT;
3060 	END IF;
3061 	vl_index := vl_index + 1;
3062       END LOOP;						-- vl_index
3063 
3064    ELSE							-- vl_no_of_rows lines
3065       IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3066  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'       NO REQUISITION LINES FOUND TO BE PROCESSED....');
3067       END IF;
3068       RETURN;
3069    END IF;						-- vl_no_of_rows lines
3070    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3071  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'       ENDING PROCESSING FOR THE LINES....');
3072    END IF;
3073 
3074    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3075  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'       BEGINNING PROCESSING FOR THE HEADERS....');
3076    END IF;
3077    vl_no_of_rows := vt_headers.COUNT;
3078    vl_last_row   := vt_headers.LAST;
3079    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3080  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'       NUMBER OF ROWS:'|| TO_CHAR(VL_NO_OF_ROWS)||
3081 		' Last Row: '||TO_CHAR(vl_Last_row));
3082    END IF;
3083 
3084    IF (vl_no_of_rows <> 0) THEN				-- vl_no_of_rows headers
3085       vl_index := vt_headers.FIRST;
3086 
3087       LOOP						-- headers loop
3088 	-- Get the Header count
3089 	OPEN get_hcount_cur;
3090 	FETCH get_hcount_cur INTO vl_lines_count;
3091 	CLOSE get_hcount_cur;
3092         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3093  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'       VL_LINES_COUNT(HDR) IS '||
3094 		TO_CHAR(vl_lines_count));
3095         END IF;
3096 
3097 	IF (vl_lines_count = 0) THEN			-- vl_lines_count header
3098 	     -- Update the Po_Requisition_Headers_All table
3099 	     UPDATE Po_Requisition_Headers_All
3100 	     SET closed_code = 'FINALLY CLOSED'
3101 	     WHERE requisition_header_id = vt_headers(vl_index);
3102 
3103 	     vl_prt_hdr_id := vt_headers(vl_index);
3104             -- IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3105  --FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,
3106  --'       CLOSED THE HEADER WITH '|| 'requisition_header_id '|| TO_CHAR(vl_prt_hdr_id));
3107   --           END IF;
3108 	END IF;						-- vl_lines_count header
3109 
3110 	IF (vl_index = vl_last_row) THEN
3111 	     EXIT;
3112 	END IF;
3113 	vl_index := vl_index + 1;
3114       END LOOP;						-- headers loop
3115    ELSE							-- vl_no_of_rows headers
3116       IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3117  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'       NO REQUISITION HEADERS FOUND TO BE PROCESSED....');
3118       END IF;
3119    END IF;						-- vl_no_of_rows headers
3120    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3121  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'       ENDING PROCESSING FOR THE HEADERS....');
3122    END IF;
3123 
3124    vt_lines.DELETE;
3125    vt_headers.DELETE;
3126 EXCEPTION
3127    WHEN OTHERS THEN
3128       vp_retcode := 2 ;
3129       vp_errbuf  := SQLERRM  ||' -- Error in Update_Closing_Status procedure.' ;
3130        IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3131                FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_UNEXPECTED, l_module_name,
3132                          'When Others Exception ' || vp_errbuf );
3133        END IF;
3134      RETURN ;
3135 END Update_Closing_Status;
3136 
3137 -- ------------------------------------------------------------------
3138 --                      Procedure Populate_Gl_Interface
3139 -- ------------------------------------------------------------------
3140 -- Populate_Gl_Interface procedure is called from Main procedure.
3141 -- When submit_journal_import =Y, this proc inserts records in gl_interface
3142 -- table, from the temp table and runs the journal import program.
3143 -- ------------------------------------------------------------------
3144 PROCEDURE Populate_Gl_Interface IS
3145    vl_req_id       NUMBER;
3146    vl_call_status  BOOLEAN;
3147    vl_rphase       VARCHAR2(30);
3148    vl_rstatus      VARCHAR2(30);
3149    vl_dphase       VARCHAR2(30);
3150    vl_dstatus      VARCHAR2(30);
3151    vl_message      VARCHAR2(240);
3152    vl_period_name  VARCHAR2(50);
3153   vl_reference_1   VARCHAR2(280);
3154   vl_running_amount         NUMBER;
3155   vl_amount         NUMBER;
3156   vl_amount_dr         NUMBER;
3157   vl_amount_cr         NUMBER;
3158   vl_ccid              NUMBER(15);
3159   vl_ccid_cnt 	   NUMBER;
3160   vl_ptype   	   Fv_Ye_Seq_Bal_Temp.processing_type%TYPE;
3161   vl_factsi_amount NUMBER;
3162   vl_factsi_tempamt NUMBER;
3163   vl_trading_partner Fv_Facts1_Period_Balances_v.eliminations_dept%TYPE;
3164 
3165   vl_stmt  	   VARCHAR2(5000);
3166   vl_line_amount   NUMBER;
3167   vl_attribute_cols  VARCHAR2(2500);
3168   vl_dummy_cols  VARCHAR2(100);
3169   vl_group_by_clause VARCHAR2(1024);
3170 
3171   vl_public_law_code VARCHAR2(150);
3172   vl_advance_type    VARCHAR2(150);
3173   vl_trf_dept_id     VARCHAR2(150);
3174   vl_trf_main_acct   VARCHAR2(150);
3175 
3176   c_gl_line_cur      INTEGER;
3177   vl_fetch_lines     INTEGER;
3178   vl_exec_cur	     INTEGER;
3179   vl_column_num	     NUMBER;
3180   vl_gl_source       VARCHAR2(1024) ;
3181   posting_run_id     NUMBER;
3182   L_ledger_id         gl_ledgers.LEDGER_ID%type;
3183   interface_Ctrl_no  NUMBER;
3184   l_je_batch_id gl_je_batches.je_batch_id%TYPE;
3185   single_led_id  NUMBER;
3186   dummy          NUMBER;
3187 
3188    CURSOR journal_entries_cur IS
3189 	SELECT
3190 	       code_combination_id,
3191 		account_seg,
3192 		balance_seg,
3193 		segment1,segment2,segment3,segment4,segment5,
3194 		segment6,segment7,segment8,segment9,segment10,
3195 	 	segment11,segment12,segment13,segment14,
3196                 segment15,segment16,segment17,segment18,
3197                 segment19,segment20,segment21,segment22,
3198                 segment23,segment24,segment25,segment26,
3199                 segment27,segment28,segment29,segment30,
3200                 period_net_dr,
3201                 period_net_cr,
3202 		period_name ,
3203                 balance_read_flag,
3204 		processing_type
3205      	FROM Fv_Ye_Seq_Bal_Temp
3206         WHERE period_net_dr + period_net_cr > 0
3207         AND set_of_books_id = vg_sob_id
3208         ORDER BY report_sequence;
3209 
3210 	CURSOR ccid_cnt_csr IS
3211 		SELECT COUNT(*),SUM(NVL(amount,0))
3212 		FROM Fv_Facts1_Period_Balances_v
3213 		WHERE set_of_books_id = vg_sob_id
3214 		AND period_num <= vg_closing_period_num
3215 		AND period_year = vp_closing_fyr
3216 		AND ccid = vl_ccid;
3217 
3218 
3219 	CURSOR factsi_bal_csr IS
3220 		SELECT SUM(NVL(amount,0)) amount,eliminations_dept,g_ng_indicator
3221 		FROM Fv_Facts1_Period_Balances_v
3222 		WHERE set_of_books_id = vg_sob_id
3223 		AND period_num <= vg_closing_period_num
3224 		AND period_year = vp_closing_fyr
3225 		AND ccid = vl_ccid
3226 		GROUP BY eliminations_dept,g_ng_indicator;
3227 
3228   CURSOR CHK_SINGLE_LEDGER_CUR IS
3229       SELECT max(JEH.ledger_id)
3230       FROM   GL_JE_HEADERS JEH
3231       WHERE  JEH.je_batch_id = l_je_batch_id
3232       GROUP BY JEH.je_batch_id
3233       HAVING count(distinct JEH.ledger_id) = 1;
3234 
3235    CURSOR CHK_ALC_EXISTS_CUR IS
3236       SELECT 1
3237       FROM   GL_JE_HEADERS JEH
3238       WHERE  JEH.je_batch_id = l_je_batch_id
3239       AND    JEH.actual_flag <> 'B'
3240       AND    JEH.reversed_je_header_id IS NULL
3241       AND EXISTS
3242           (SELECT 1
3243            FROM   GL_LEDGER_RELATIONSHIPS LRL
3244            WHERE  LRL.source_ledger_id = JEH.ledger_id
3245            AND    LRL.target_ledger_category_code = 'ALC'
3246            AND    LRL.relationship_type_code IN ('JOURNAL', 'SUBLEDGER')
3247            AND    LRL.application_id = 101
3248            AND    LRL.relationship_enabled_flag = 'Y'
3249            AND    JEH.je_source NOT IN
3250             (SELECT INC.je_source_name
3251              FROM   GL_JE_INCLUSION_RULES INC
3252              WHERE  INC.je_rule_set_id =
3253                       LRL.gl_je_conversion_set_id
3254              AND    INC.je_source_name = JEH.je_source
3255              AND    INC.je_category_name = 'Other'
3256              AND    INC.include_flag = 'N'
3257              AND    INC.user_updatable_flag = 'N'));
3258 
3259        l_module_name         VARCHAR2(200) ;
3260 BEGIN
3261        l_module_name  := g_module_name ||
3262                            'Populate_Gl_Interface ';
3263 
3264     vl_gl_source  := '(''Budgetary Transaction'',''Year End Close'', ''Manual'')';
3265 
3266  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
3267  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   IN POPULATE_GL_INTERFACE PROCEDURE....');
3268  END IF;
3269 
3270    -- Get the interface_run_id
3271    vg_interface_run_id := Gl_Interface_Control_Pkg.Get_Unique_Run_Id;
3272 
3273    -- Get the journal group_id
3274    SELECT Gl_Interface_Control_S.NEXTVAL
3275    INTO vg_jrnl_group_id
3276    FROM DUAL;
3277 
3278    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3279  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   INTERFACE RUN ID: '||TO_CHAR(VG_INTERFACE_RUN_ID));
3280  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   JOURNAL GROUP ID: '||TO_CHAR(VG_JRNL_GROUP_ID));
3281    END IF;
3282 
3283    --Insert a control record in gl_interface_control for gl_import to work
3284    INSERT INTO Gl_Interface_Control
3285         (je_source_name,
3286         status,
3287         interface_run_id,
3288         group_id,
3289         set_of_books_id)
3290    VALUES ('Year End Close',
3291         'S',
3292         vg_interface_run_id,
3293         vg_jrnl_group_id,
3294         vg_sob_id);
3295 
3296    FOR vc_journals IN journal_entries_cur
3297    LOOP		-- journal_entries loop
3298      vl_ptype := vc_journals.processing_type;
3299      vl_trading_partner := NULL;
3300      vl_ccid := vc_journals.code_combination_id;
3301      vl_period_name := vc_journals.period_name;
3302      vl_reference_1 := NULL;
3303      vt_segments(1) := vc_journals.segment1;
3304      vt_segments(2) := vc_journals.segment2;
3305      vt_segments(3) := vc_journals.segment3;
3306      vt_segments(4) := vc_journals.segment4;
3307      vt_segments(5) := vc_journals.segment5;
3308      vt_segments(6) := vc_journals.segment6;
3309      vt_segments(7) := vc_journals.segment7;
3310      vt_segments(8) := vc_journals.segment8;
3311      vt_segments(9) := vc_journals.segment9;
3312      vt_segments(10) := vc_journals.segment10;
3313      vt_segments(11) := vc_journals.segment11;
3314      vt_segments(12) := vc_journals.segment12;
3315      vt_segments(13) := vc_journals.segment13;
3316      vt_segments(14) := vc_journals.segment14;
3317      vt_segments(15) := vc_journals.segment15;
3318      vt_segments(16) := vc_journals.segment16;
3319      vt_segments(17) := vc_journals.segment17;
3320      vt_segments(18) := vc_journals.segment18;
3321      vt_segments(19) := vc_journals.segment19;
3322      vt_segments(20) := vc_journals.segment20;
3323      vt_segments(21) := vc_journals.segment21;
3324      vt_segments(22) := vc_journals.segment22;
3325      vt_segments(23) := vc_journals.segment23;
3326      vt_segments(24) := vc_journals.segment24;
3327      vt_segments(25) := vc_journals.segment25;
3328      vt_segments(26) := vc_journals.segment26;
3329      vt_segments(27) := vc_journals.segment27;
3330      vt_segments(28) := vc_journals.segment28;
3331      vt_segments(29) := vc_journals.segment29;
3332      vt_segments(30) := vc_journals.segment30;
3333 
3334      vl_line_amount  := 0;
3335 
3336 
3337      IF (vc_journals.balance_read_flag = 'N') THEN	-- balance_read_flag
3338      IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3339  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'PROCESSING TO ACCOUNT ' || VC_JOURNALS.ACCOUNT_SEG);
3340     END IF;
3341         Insert_Gl_Interface_Record(vc_journals.period_net_dr,
3342                        vc_journals.period_net_cr, vl_reference_1,
3343 		       vl_period_name,vl_trading_partner);
3344 
3345      ELSE						-- balance_read_flag
3346 	-- If it is a from account, then check which processing to be done.
3347     IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3348  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'PROCESSING FROM ACCOUNT: ' || VC_JOURNALS.ACCOUNT_SEG||
3349 			' CCID: '||vl_ccid);
3350             END IF;
3351 
3352        IF (vl_ptype = 1) THEN		-- vl_ptype
3353 	  -- FACTS I processing
3354 	  -- Check if the attribute exits and there are balances in the Facts table
3355  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
3356  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'FACTS I PROCESSING');
3357  END IF;
3358 
3359           vl_amount := (NVL(vc_journals.period_net_cr,0)
3360 				- NVL(vc_journals.period_net_dr,0) );
3361  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
3362  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'AMOUNT TO BE MATCHED ' || VL_AMOUNT);
3363  END IF;
3364 
3365 	  IF ((vg_factsi_attr_exists = 'Y')
3366 			AND (vg_factsi_bal_cnt > 0)) THEN 	-- facts attr
3367  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
3368  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'FACTS I ATTRIBUTE EXISTS AND THERE ARE '||
3369 			'balances in FACTS table.');
3370              END IF;
3371 
3372 		OPEN ccid_cnt_csr;
3373 		FETCH ccid_cnt_csr INTO vl_ccid_cnt,vl_factsi_amount;
3374 		CLOSE ccid_cnt_csr;
3375 
3376 		IF (vl_ccid_cnt = 0) THEN			-- ccid cnt
3377 		   -- ccid does not exist in facts table
3378  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
3379  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'BALANCES WILL NOT BE CLOSED BY '||
3380 
3381                         'the FACTS I F/N and trading partner attributes for the '||
3382                         'code combination id '||vl_ccid||', since the code '||
3383 			'combination id does not exist in Fv_Facts1_Period_Balances_v.');
3384                          END IF;
3385  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
3386  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'TO CLOSE BY FACTS I F/N AND '||
3387 
3388                         'trading partner attributes for this code combination id, '||
3389 			'delete the journal entries created by this process, '||
3390 			'if any, run the FACTS I Interface Program with all edit '||
3391                         'checks passed by period '||vg_closing_period||
3392                         'and rerun the Year End Close Program.');
3393  END IF;
3394                    Insert_Gl_Interface_Record(vc_journals.period_net_dr,
3395                        vc_journals.period_net_cr, vl_reference_1,
3396 		       vl_period_name,vl_trading_partner);
3397 		ELSE						-- ccid cnt
3398 		  -- ccid exists in facts table
3399 		  IF (vl_amount <> vl_factsi_amount) THEN	-- amt matching
3400 		      -- amount from year end table does not match with amt from
3401 		      -- facts table.
3402  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
3403  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'BALANCES WILL NOT BE CLOSED BY '||
3404                         'the FACTS I F/N and trading partner attributes for the '||
3405                         'code combination id '||vl_ccid||', since the balances '||
3406 			'in GL does not equal to the balances in '||
3407 			'Fv_Facts1_Period_Balances_v.');
3408              END IF;
3409  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
3410  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'TO CLOSE BY FACTS I F/N AND '||    'trading partner attributes for this code combination id, '||
3411 			'delete the journal entries created by this process, '||
3412 			'if any, run the FACTS I Interface Program with all edit '||
3413                         'checks passed by period '||vg_closing_period||
3414                         'and rerun the Year End Close Program.');
3415                          END IF;
3416 
3417                       Insert_Gl_Interface_Record(vc_journals.period_net_dr,
3418                           vc_journals.period_net_cr, vl_reference_1,
3419 			  vl_period_name,vl_trading_partner);
3420 		  ELSE						-- amt matching
3421 		      -- amount from year end table matches with amt from
3422 		      -- facts table.
3423  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
3424  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'AMOUNT MATCHED');
3425  END IF;
3426 		      FOR vc_factsi IN factsi_bal_csr LOOP		-- bal loop
3427 			 vl_factsi_tempamt := vc_factsi.amount;
3428 			 IF (vl_factsi_tempamt > 0) THEN
3429 				vl_amount_dr := 0;
3430 				vl_amount_cr := vl_factsi_tempamt;
3431 			 ELSE
3432 				vl_amount_dr := (-1) * vl_factsi_tempamt;
3433 				vl_amount_cr := 0;
3434 			 END IF;
3435 
3436 			 vl_trading_partner := vc_factsi.eliminations_dept;
3437 
3438                          Insert_Gl_Interface_Record(vl_amount_dr,vl_amount_cr,
3439                               vl_reference_1,vl_period_name,vl_trading_partner);
3440 		      END LOOP;						-- bal loop
3441 
3442 		  END IF;					-- amt matching
3443 
3444 		END IF;						-- ccid cnt
3445 
3446 	  ELSE 							-- facts attr
3447  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
3448  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,' EITHER FACTS I ATTRIBUTE DOES NOT EXISTS '||
3449 			'or there are no balances in FACTS table.');
3450              END IF;
3451 	    Insert_Gl_Interface_Record(vc_journals.period_net_dr,
3452 			vc_journals.period_net_cr, vl_reference_1,
3453 			vl_period_name,vl_trading_partner);
3454 	  END IF; 						-- facts attr
3455 
3456        ELSIF (vl_ptype = 2) THEN		-- vl_ptype
3457 	  -- FACTS II processing
3458           fv_utility.log_mesg('FACTS II processing');
3459 
3460           vl_amount := (NVL(vc_journals.period_net_dr,0)
3461 				- NVL(vc_journals.period_net_cr,0) );
3462 
3463           -- POPULATE REFERENCE_1 column for all budgetary_transaction ccid
3464           vl_running_amount := 0;
3465 
3466 	---------------------------------------------------------------------------------------
3467 	vl_attribute_cols := NULL;
3468 	vl_dummy_cols     := NULL;
3469 
3470 	-- Populate attribute columns for FACTS II records
3471 	-- Build the attribute columns clause
3472 
3473         IF vg_public_law_attribute IS NOT NULL
3474           THEN
3475            vl_attribute_cols := vl_attribute_cols||', NVL(b.public_law_code, l.'||vg_public_law_attribute||') ';
3476    	END IF;
3477 
3478         IF vg_advance_type_attribute IS NOT NULL
3479           THEN
3480            vl_attribute_cols := vl_attribute_cols||', NVL(b.advance_type, l.'||vg_advance_type_attribute||') ';
3481         END IF;
3482 
3483         IF vg_trf_dept_id_attribute IS NOT NULL
3484           THEN
3485            vl_attribute_cols := vl_attribute_cols||', NVL(b.dept_id, l.'||vg_trf_dept_id_attribute||') ';
3486         END IF;
3487 
3488         IF vg_trf_main_acct_attribute IS NOT NULL
3489           THEN
3490            vl_attribute_cols  := vl_attribute_cols||', NVL(b.main_account, l.'|| vg_trf_main_acct_attribute ||') ';
3491         END IF;
3492 
3493 	IF vl_attribute_cols IS NOT NULL THEN
3494 	  vl_group_by_clause := ' GROUP BY ' || SUBSTR(vl_attribute_cols, 2);
3495 	END IF;
3496 	---------------------------------------------------------------------------------------
3497 	BEGIN
3498            c_gl_line_cur := DBMS_SQL.OPEN_CURSOR  ;
3499          EXCEPTION
3500          WHEN OTHERS THEN
3501             vp_retcode := 2;
3502             vp_errbuf  := SQLERRM||
3503 			  ' Open cursor error in Populate_Gl_Interface procedure.';
3504             RETURN;
3505         END ;
3506 
3507 vl_stmt :=
3508 ' SELECT MAX(Fv_Ye_Carryforward.Convert_To_Num (l.reference_1)) reference_1 ,
3509                      SUM( NVL(entered_dr, 0) - NVL(entered_cr,0) ) line_amount ' ||
3510                      vl_attribute_cols ||
3511             ' FROM  gl_je_lines   l , fv_be_trx_dtls B, gl_je_headers h
3512               WHERE l.code_combination_id = :ccid
3513               AND l.je_header_id = h.je_header_id
3514               AND  NVL(h.je_from_sla_flag, ''N'') IN (''N'',''U'')
3515 -- AND l.gl_sl_link_id is null
3516               AND  EXISTS (SELECT 1
3517                            FROM   gl_period_statuses glp
3518                            WHERE  glp.application_id = 101
3519                            AND    glp.set_of_books_id = :sob_id
3520                            AND    glp.ledger_id = :sob_id
3521                            AND    glp.period_year = :closing_fyr
3522                            AND    glp.period_name = l.period_name)
3523               AND  NVL(l.reference_1, ''-99'')  = TO_CHAR(b.transaction_id (+))
3524               AND l.status = :je_status
3525               AND b.set_of_books_id(+) = :sob_id
3526               AND h.ledger_id = :sob_id
3527               AND b.set_of_books_id = h.ledger_id
3528               '|| vl_group_by_clause ||
3529 ' UNION
3530 SELECT MAX(xdl.SOURCE_DISTRIBUTION_ID_NUM_1) reference_1 ,
3531 SUM( NVL(xl.entered_dr, 0) - NVL(xl.entered_cr,0) ) line_amount '
3532 ||vl_attribute_cols ||
3533 ' FROM  fv_be_trx_dtls B, xla_ae_lines xl , xla_distribution_links xdl,
3534 gl_je_lines   l,  gl_je_headers h, gl_import_references gli
3535 WHERE  xl.code_combination_id = :ccid
3536 AND  xl.ae_header_id = xdl.ae_header_id
3537 AND  xl.ae_line_num = xdl.ae_line_num
3538 AND  xl.gl_sl_link_id = gli.gl_sl_link_id
3539 and gli.je_batch_id = h.je_batch_id
3540 and gli.je_header_id = h.je_header_id
3541 and gli.je_line_num = l.je_line_num
3542 AND  NVL(h.je_from_sla_flag, ''N'') = ''Y''
3543 --l.gl_sl_link_id is not null
3544 AND  l.je_header_id = h.je_header_id
3545 AND  EXISTS (SELECT 1
3546 FROM  gl_period_statuses glp
3547 WHERE  glp.application_id = 101
3548 AND  glp.set_of_books_id = :sob_id
3549 AND  glp.period_year = :closing_fyr
3550 AND   glp.period_name = l.period_name)
3551 AND   NVL(xdl.SOURCE_DISTRIBUTION_ID_NUM_1, '||''''||'-99'||''''||')
3552 = b.transaction_id (+)
3553 AND   l.status = :je_status
3554 AND   h.ledger_id = :sob_id
3555 AND   b.set_of_books_id = h.LEDGER_id'
3556 ||vl_group_by_clause;
3557 
3558 
3559 
3560     	BEGIN
3561         	dbms_sql.parse(c_gl_line_cur, vl_stmt, DBMS_SQL.V7) ;
3562       	  EXCEPTION
3563           WHEN OTHERS THEN
3564             vp_retcode := 2;
3565             vp_errbuf  := SQLERRM||
3566                           ' Parse cursor error in Populate_Gl_Interface procedure.';
3567               FV_UTILITY.LOG_MESG(FND_LOG.LEVEL_UNEXPECTED,l_module_name, vp_errbuf) ;
3568             RETURN;
3569     	END ;
3570 
3571         -- Bind the variables
3572         dbms_sql.bind_variable(c_gl_line_cur,':ccid', vl_ccid);
3573         dbms_sql.bind_variable(c_gl_line_cur,':sob_id', vg_sob_id);
3574         dbms_sql.bind_variable(c_gl_line_cur,':closing_fyr', vp_closing_fyr);
3575         dbms_sql.bind_variable(c_gl_line_cur,':je_status', 'P');
3576         dbms_sql.bind_variable(c_gl_line_cur,':sob_id', vg_sob_id);
3577 
3578         dbms_sql.define_column(c_gl_line_cur, 1, vl_reference_1, 280);
3579         dbms_sql.define_column(c_gl_line_cur, 2, vl_line_amount);
3580 
3581 	vl_column_num := 3;
3582 
3583 	IF vg_public_law_attribute IS NOT NULL THEN
3584            dbms_sql.define_column(c_gl_line_cur, vl_column_num, vl_public_law_code, 150);
3585 	   vl_column_num := vl_column_num + 1;
3586 	END IF;
3587 
3588 	IF vg_advance_type_attribute IS NOT NULL THEN
3589            dbms_sql.define_column(c_gl_line_cur, vl_column_num, vl_advance_type, 150);
3590 	   vl_column_num := vl_column_num + 1;
3591 	END IF;
3592 
3593 	IF vg_trf_dept_id_attribute IS NOT NULL THEN
3594            dbms_sql.define_column(c_gl_line_cur, vl_column_num, vl_trf_dept_id, 150);
3595 	   vl_column_num := vl_column_num + 1;
3596            dbms_sql.define_column(c_gl_line_cur, vl_column_num, vl_trf_main_acct, 150);
3597 	END IF;
3598 
3599      	BEGIN
3600         	vl_exec_cur := dbms_sql.EXECUTE(c_gl_line_cur);
3601       	 EXCEPTION
3602             WHEN OTHERS THEN
3603             vp_retcode := 2 ;
3604             vp_errbuf  := SQLERRM||
3605                           ' Execute cursor error in Populate_Gl_Interface procedure.';
3606               FV_UTILITY.LOG_MESG(FND_LOG.LEVEL_UNEXPECTED,l_module_name, vp_errbuf) ;
3607         END ;
3608 
3609         LOOP
3610 
3611 	     vl_public_law_code := NULL;
3612 	     vl_advance_type    := NULL;
3613 	     vl_trf_dept_id     := NULL;
3614 	     vl_trf_main_acct   := NULL;
3615 
3616 	     IF dbms_sql.fetch_rows(c_gl_line_cur) = 0 THEN
3617                 EXIT;
3618               ELSE
3619 
3620                 dbms_sql.column_value(c_gl_line_cur, 1, vl_reference_1);
3621                 dbms_sql.column_value(c_gl_line_cur, 2, vl_line_amount);
3622 
3623 	        vl_column_num := 3;
3624 
3625               	IF vg_public_law_attribute IS NOT NULL THEN
3626                  	dbms_sql.column_value(c_gl_line_cur, vl_column_num, vl_public_law_code);
3627 	   		vl_column_num := vl_column_num + 1;
3628               	END IF;
3629 
3630               	IF vg_advance_type_attribute IS NOT NULL THEN
3631                  	dbms_sql.column_value(c_gl_line_cur, vl_column_num, vl_advance_type);
3632 	   		vl_column_num := vl_column_num + 1;
3633               	END IF;
3634 
3635               	IF vg_trf_dept_id_attribute IS NOT NULL THEN
3636                  	dbms_sql.column_value(c_gl_line_cur, vl_column_num, vl_trf_dept_id);
3637 	   	 	vl_column_num := vl_column_num + 1;
3638                  	dbms_sql.column_value(c_gl_line_cur, vl_column_num, vl_trf_main_acct);
3639               	END IF;
3640 
3641                 -- vl_reference_1 := gl_record.reference_1;
3642                 IF vl_line_amount <> 0 THEN  -- consider only non zero balance lines
3643                 IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3644  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,' LINE AMOUNT ' || VL_LINE_AMOUNT);
3645             END IF;
3646                     vl_running_amount := vl_running_amount + vl_line_amount;
3647 
3648                     vl_amount_dr := 0;
3649                     vl_amount_cr := 0;
3650 
3651                     IF vl_line_amount > 0 THEN
3652                          vl_amount_cr := ABS(vl_line_amount);
3653                      ELSE
3654                          vl_amount_dr := ABS(vl_line_amount);
3655                     END IF;
3656 
3657                    Insert_gl_interface_record(vl_amount_dr,vl_amount_cr,vl_reference_1,
3658                                   vl_period_name,vl_trading_partner, vl_public_law_code,
3659 				  vl_advance_type, vl_trf_dept_id, vl_trf_main_acct);
3660                 END IF;
3661 	     END IF;
3662         END LOOP;
3663 
3664           BEGIN
3665                 dbms_sql.close_cursor(c_gl_line_cur);
3666            EXCEPTION
3667                 WHEN OTHERS THEN
3668                     vp_retcode := SQLCODE ;
3669                     VP_ERRBUF  := SQLERRM ;
3670                       FV_UTILITY.LOG_MESG(FND_LOG.LEVEL_UNEXPECTED,l_module_name, vp_errbuf) ;
3671                     RETURN ;
3672           END ;
3673 
3674           IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3675  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'AMOUNT MATCHED ' || VL_RUNNING_AMOUNT);
3676 END IF;
3677 
3678          FOR facts2_ending_balance_rec IN (SELECT ffeb.ending_balance_cr,
3679                                                    ffeb.ending_balance_dr,
3680                                                    ffeb.transfer_dept_id,
3681                                                    ffeb.public_law,
3682                                                    ffeb.advance_flag,
3683                                                    ffeb.transfer_main_acct
3684                                               FROM fv_factsii_ending_balances ffeb
3685                                              WHERE ffeb.set_of_books_id = vg_sob_id
3686                                                AND ffeb.fiscal_year = vp_closing_fyr-1
3687                                                AND ffeb.ccid = vl_ccid) LOOP
3688 
3689             vl_running_amount := vl_running_amount + NVL(facts2_ending_balance_rec.ending_balance_dr, 0) - NVL(facts2_ending_balance_rec.ending_balance_cr, 0);
3690             Insert_gl_interface_record(facts2_ending_balance_rec.ending_balance_cr,facts2_ending_balance_rec.ending_balance_dr,
3691                                        NULL,
3692                                        vl_period_name,vl_trading_partner,
3693                                        facts2_ending_balance_rec.public_law,
3694                                        facts2_ending_balance_rec.advance_flag,
3695                                        facts2_ending_balance_rec.transfer_dept_id,
3696                                        facts2_ending_balance_rec.transfer_main_acct);
3697           END LOOP;
3698 
3699 
3700                   vl_amount_dr := 0;
3701                   vl_amount_cr := 0;
3702 
3703 	  IF ABS(vl_amount) <> ABS(vl_running_amount) THEN
3704 	    -- Bug 4546827
3705             -- IF (vl_amount < 0) THEN
3706 
3707             IF (vl_amount + vl_running_amount < 0) THEN
3708                 vl_amount_cr := ABS(vl_amount + vl_running_amount);
3709                 IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3710  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'DIFFERENCE CR AMOUNT ADDED  ' || VL_AMOUNT_CR);
3711 END IF;
3712              ELSE
3713                  vl_amount_dr := ABS(vl_amount + vl_running_amount);
3714                  IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3715  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'DIFFERENCE DR AMOUNT ADDED  ' || VL_AMOUNT_DR);
3716 END IF;
3717              END IF;
3718             -- Bug 7150443. Added vl_public_law_code to the call below.
3719             -- Reverted the change made for above.
3720             Insert_gl_interface_record(vl_amount_dr , vl_amount_cr, NULL,
3721 				       vl_period_name,vl_trading_partner);
3722           END IF;
3723     ELSE					-- vl_ptype
3724        Insert_Gl_Interface_Record(vc_journals.period_net_dr,
3725 			vc_journals.period_net_cr, vl_reference_1,
3726 			vl_period_name,vl_trading_partner);
3727 
3728     END IF;					-- vl_ptype
3729   END IF;					-- balance_read_flag
3730 END LOOP;						-- journal_entries loop
3731 
3732 
3733    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3734  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   AFTER INSERTING INTO GL_INTERFACE....');
3735    END IF;
3736 
3737    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3738  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   CALLING THE JOURNAL IMPORT PROGRAM....');
3739    END IF;
3740    -- Submit a Concurrent request to invoke journal import
3741 
3742    vl_req_id := FND_REQUEST.SUBMIT_REQUEST('SQLGL',
3743                                     'GLLEZL',
3744                                      '',
3745                                      '',
3746                                      FALSE,
3747                                      TO_CHAR(vg_interface_run_id),
3748                                      TO_CHAR(vg_sob_id),
3749                                      'N', '', '', 'N', 'W');
3750 
3751    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3752  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   THE REQUEST_ID IS '||VL_REQ_ID);
3753    END IF;
3754 
3755    -- if concurrent request submission failed then abort process
3756    IF (vl_req_id = 0) THEN
3757         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3758  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   JOURNAL IMPORT REQUEST NOT SUBMITTED.');
3759         END IF;
3760         vp_errbuf := 'Cannot submit journal import program';
3761         vp_retcode := 1;
3762         ROLLBACK;
3763         RETURN;
3764    ELSE
3765         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3766  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   JOURNAL IMPORT REQUEST SUBMITTED SUCCESSFULLY.');
3767         END IF;
3768         COMMIT;
3769    END IF;
3770 
3771    -- Check status of completed concurrent program
3772    -- and if complete exit
3773    vl_call_status := Fnd_Concurrent.Wait_For_Request(
3774                 vl_req_id, 20, 0, vl_rphase, vl_rstatus,
3775                 vl_dphase, vl_dstatus, vl_message);
3776 
3777    IF (vl_call_status = FALSE) THEN
3778         vp_errbuf := 'Cannot wait for the status of journal import';
3779         vp_retcode := 1;
3780    END IF;
3781 
3782    --code to call Posting:Single Ledger program
3783    -- Submit a Concurrent request to invoke journal post
3784    FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   THE vp_retcode IS '||vp_retcode);
3785    IF (vp_post_to_gl='Y' and vp_retcode <> 1) then
3786 begin
3787 
3788 select je_batch_id into l_je_batch_id from gl_je_batches where group_id = vg_jrnl_group_id ;
3789 
3790 
3791 
3792  Update gl_je_batches
3793 set status = 'S', posting_run_id = je_batch_id  where je_batch_id = l_je_batch_id;
3794 
3795   IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3796     FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'    Batch ID IS '||l_je_batch_id);
3797   END IF;
3798 
3799 
3800   -- Set single_ledger_id to the journal ledger id if the batch
3801   -- has journals only for a single ledger which has no enabled
3802   -- journal or subledger RCs.
3803   OPEN CHK_SINGLE_LEDGER_CUR;
3804   FETCH CHK_SINGLE_LEDGER_CUR INTO single_led_id;
3805   IF CHK_SINGLE_LEDGER_CUR%NOTFOUND THEN
3806     single_led_id := -99;
3807   END IF;
3808   CLOSE CHK_SINGLE_LEDGER_CUR;
3809 
3810   IF (single_led_id <> -99) THEN
3811       OPEN CHK_ALC_EXISTS_CUR;
3812       FETCH CHK_ALC_EXISTS_CUR INTO dummy;
3813       IF CHK_ALC_EXISTS_CUR%FOUND THEN
3814         single_led_id := -99;
3815       END IF;
3816       CLOSE CHK_ALC_EXISTS_CUR;
3817     END IF;
3818 
3819   IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3820     FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   Single Ledger ID is '||single_led_id);
3821   END IF;
3822 
3823   IF (single_led_id = -99) THEN
3824     vl_req_id := Fnd_Request.submit_request(
3825     application => 'SQLGL'
3826     , program => 'GLPPOSS'
3827     , description => ''
3828     , sub_request => FALSE
3829     , argument1 => TO_CHAR(single_led_id)
3830     , argument2 => TO_CHAR(fnd_profile.value('GL_ACCESS_SET_ID'))
3831     , argument3 => vg_coa_id
3832     , argument4 => l_je_batch_id
3833     , argument5 => chr(0));
3834 
3835   ELSE
3836     vl_req_id := Fnd_Request.submit_request(
3837     application => 'SQLGL'
3838     , program => 'GLPPOSS'
3839     , description => ''
3840     , sub_request => FALSE
3841     , argument1 => TO_CHAR(single_led_id)
3842     , argument2 => TO_CHAR(fnd_profile.value('GL_ACCESS_SET_ID'))
3843     , argument3 => vg_coa_id
3844     , argument4 => l_je_batch_id
3845     , argument5 => chr(0));
3846   END IF;
3847 
3848    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3849  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'   THE REQUEST_ID IS '||VL_REQ_ID);
3850    END IF;
3851 
3852    -- if concurrent request submission failed then abort process
3853    IF (vl_req_id = 0) THEN
3854         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3855  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'  POSTING: SINGLE JOURNAL REQUEST NOT SUBMITTED.');
3856         END IF;
3857         vp_errbuf := 'Cannot submit posting: single journal program';
3858         vp_retcode := 1;
3859         ROLLBACK;
3860         RETURN;
3861    ELSE
3862         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3863  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'    POSTING: SINGLE JOURNAL REQUEST SUBMITTED SUCCESSFULLY.');
3864         END IF;
3865         COMMIT;
3866    END IF;
3867 
3868    -- Check status of completed concurrent program
3869    -- and if complete exit
3870    vl_call_status := Fnd_Concurrent.Wait_For_Request(
3871                 vl_req_id, 20, 0, vl_rphase, vl_rstatus,
3872                 vl_dphase, vl_dstatus, vl_message);
3873 
3874    IF (vl_call_status = FALSE) THEN
3875         vp_errbuf := 'Cannot wait for the status of posting: single ledger';
3876         vp_retcode := 1;
3877    END IF;
3878    exception
3879    when no_Data_found then
3880    null;
3881    when others then
3882    null;
3883    end;
3884    END IF; -- end IF (vp_journal_import='Y') then
3885 
3886 
3887    -- Clean up gl_interface table
3888    Cleanup_Gl_Interface;
3889 
3890    IF (vp_retcode <> 0) THEN
3891 	RETURN;
3892    END IF;
3893 
3894 EXCEPTION
3895    WHEN OTHERS THEN
3896 	vp_retcode := 2;
3897 	vp_errbuf  := SQLERRM || '--Error in Populate_Gl_Interface procedure.';
3898        IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3899                FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_UNEXPECTED, l_module_name,
3900                          'When Others Exception ' || vp_errbuf );
3901        END IF;
3902 	RETURN;
3903 END Populate_Gl_Interface;
3904 
3905 -- ------------------------------------------------------------------
3906 --                      Procedure Cleanup_Gl_Interface
3907 -- ------------------------------------------------------------------
3908 -- Cleanup_Gl_Interface procedure is called from Populate_Gl_interface
3909 -- procedure. This cleans up the gl_interface table.
3910 -- ------------------------------------------------------------------
3911 PROCEDURE Cleanup_Gl_Interface IS
3912  l_module_name         VARCHAR2(200) ;
3913 BEGIN
3914 
3915   l_module_name :=  g_module_name || 'Cleanup_Gl_Interface ';
3916 
3917  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
3918  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'     IN THE CLEANUP_GL_INTERFACE PROCEDURE....');
3919  END IF;
3920 
3921    -- Delete from Gl_Interface table
3922    DELETE FROM Gl_Interface
3923    WHERE user_je_source_name = 'Year End Close'
3924    AND ledger_id = vg_sob_id
3925    AND group_id = vg_jrnl_group_id;
3926 
3927 EXCEPTION
3928    WHEN OTHERS THEN
3929 	vp_retcode := 2;
3930 	vp_errbuf  := SQLERRM || '--Error in Cleanup_Gl_Interface procedure.';
3931        IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3932                FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_UNEXPECTED, l_module_name,
3933                          'When Others Exception ' || vp_errbuf );
3934        END IF;
3935 
3936 	RETURN;
3937 END Cleanup_Gl_Interface;
3938 
3939 -- ------------------------------------------------------------------
3940 --                      Procedure Submit_Report
3941 -- ------------------------------------------------------------------
3942 -- Submit_Report procedure is called from Main procedure.
3943 -- This procedure submits the execution report.
3944 -- ------------------------------------------------------------------
3945 PROCEDURE Submit_Report IS
3946    vl_req_id  NUMBER;
3947    vl_call_status  BOOLEAN;
3948    vl_rphase       VARCHAR2(30);
3949    vl_rstatus      VARCHAR2(30);
3950    vl_dphase       VARCHAR2(30);
3951    vl_dstatus      VARCHAR2(30);
3952    vl_message      VARCHAR2(240);
3953   l_module_name         VARCHAR2(200) ;
3954 
3955 BEGIN
3956    l_module_name  :=  g_module_name || 'Submit_Report ';
3957 
3958    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3959  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'     IN THE SUBMIT_REPORT PROCEDURE....');
3960    END IF;
3961 
3962    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3963     FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'Parameters: LEDGER_ID: '||vg_sob_id || ', CLOSING_METHOD: '
3964     ||vp_closing_method||', APPROPRIATION_TIME_FRAME: '||vp_timeframe||
3965     ', APPROPRIATION_GROUP: '||vp_fundgroup ||', TREASURY_SYMBOL: '||vp_trsymbol||', CLOSING_FYR: '||
3966     vp_closing_fyr ||', CLOSING_PERIOD: '||vp_closing_num||', MODE: '||vp_mode||', POST_IN_GL: '||vp_post_to_gl);
3967    END IF;
3968    vl_req_id := Fnd_Request.Submit_Request('FV','FVXYECER','','',FALSE,
3969                                 vg_sob_id,vp_closing_method,vp_timeframe,
3970                                 vp_fundgroup,vp_trsymbol,vp_closing_fyr,
3971                                 vp_closing_num,vp_mode,vp_post_to_gl);
3972 
3973    IF (vl_req_id = 0) THEN
3974 	vp_retcode := 2;
3975 	vp_errbuf  := 'Error in Submit_Report procedure while submitting the '||
3976 			' Year End Execution Report';
3977 	RETURN;
3978    ELSE
3979 	COMMIT;
3980         IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3981  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT, l_module_name,'     YEAR END EXECUTION REPORT IS SUCCESSFULLY '||
3982 			'submitted.....');
3983         END IF;
3984    END IF;
3985 
3986    -- Check status of completed concurrent program
3987    -- and if complete exit
3988    vl_call_status := Fnd_Concurrent.Wait_For_Request(
3989                 vl_req_id, 20, 0, vl_rphase, vl_rstatus,
3990                 vl_dphase, vl_dstatus, vl_message);
3991 
3992    IF (vl_call_status = FALSE) THEN
3993         vp_errbuf := 'Cannot wait for the status of Year End Execution Report';
3994         vp_retcode := 1;
3995 	RETURN;
3996    END IF;
3997 
3998 EXCEPTION
3999    WHEN OTHERS THEN
4000         vp_retcode := 2;
4001         vp_errbuf  := SQLERRM || '--Error in Submit_Report procedure.';
4002         RETURN;
4003 END Submit_Report;
4004 ---------------------------------------------------------------
4005   PROCEDURE insert_gl_interface_record(l_amount_dr IN NUMBER,
4006                                        l_amount_cr IN NUMBER,
4007                                        l_reference_1 IN VARCHAR2,
4008                                        l_period_name IN VARCHAR2,
4009 				       l_trading_partner IN VARCHAR2,
4010 				       l_public_law_code IN VARCHAR2,
4011 				       l_advance_type IN VARCHAR2,
4012 				       l_trf_dept_id IN VARCHAR2,
4013 				       l_trf_main_acct IN VARCHAR2)
4014 
4015  IS
4016 
4017    TYPE attribtable IS TABLE OF gl_je_lines.attribute1%TYPE
4018       INDEX BY BINARY_INTEGER;
4019    vl_attribtable   attribtable ;
4020 
4021   vl_str VARCHAR2(3000);
4022   l_module_name         VARCHAR2(200) ;
4023   BEGIN
4024      l_module_name   :=  g_module_name || 'insert_gl_interface_record ';
4025 
4026        FOR i IN 1..20
4027         LOOP
4028           vl_attribtable(i) := NULL;
4029 	END LOOP;
4030 
4031        IF vg_factsi_attribute IS NOT NULL THEN
4032           vl_attribtable(SUBSTR(vg_factsi_attribute, 10)) := l_trading_partner;
4033        END IF;
4034 
4035        IF vg_public_law_attribute IS NOT NULL THEN
4036           vl_attribtable(SUBSTR(vg_public_law_attribute, 10)) := l_public_law_code;
4037        END IF;
4038 
4039        IF vg_advance_type_attribute IS NOT NULL THEN
4040           vl_attribtable(SUBSTR(vg_advance_type_attribute, 10)) := l_advance_type;
4041        END IF;
4042 
4043        IF vg_trf_dept_id_attribute IS NOT NULL THEN
4044           vl_attribtable(SUBSTR(vg_trf_dept_id_attribute, 10))   := l_trf_dept_id;
4045           vl_attribtable(SUBSTR(vg_trf_main_acct_attribute, 10)) := l_trf_main_acct;
4046        END IF;
4047 
4048    vl_str := 'INSERT INTO Gl_Interface
4049 	       (
4050 		status, ledger_id, accounting_date, currency_code,
4051 		date_created, created_by, actual_flag, user_je_category_name,
4052 		user_je_source_name, entered_dr, entered_cr, group_id,
4053 		period_name, chart_of_accounts_id,
4054                 segment1,segment2,segment3,
4055 		segment4,segment5,segment6,
4056 		segment7,segment8,segment9,
4057 		segment10,segment11,segment12,
4058 		segment13,segment14,segment15,
4059 		segment16,segment17,segment18,
4060                 segment19,segment20,segment21,
4061 		segment22,segment23,segment24,
4062 		segment25,segment26,segment27,
4063 		segment28,segment29,segment30,
4064 		reference21,context,
4065 	        attribute1, attribute2, attribute3, attribute4, attribute5,
4066 		attribute6, attribute7, attribute8, attribute9, attribute10,
4067 		attribute11, attribute12, attribute13, attribute14, attribute15,
4068 		attribute16, attribute17, attribute18, attribute19, attribute20
4069 	       )
4070 	   VALUES
4071 	       (
4072 		:status, :sob_id, :end_date, :currency,
4073 		:current_date, :user_id, :actual_flag, :user_je_category,
4074 		:user_je_source, :amount_dr, :amount_cr, :jrnl_group_id,
4075 		:period_name, :coa_id,
4076                 :vt_segments_1,:vt_segments_2,:vt_segments_3,
4077                 :vt_segments_4,:vt_segments_5,:vt_segments_6,
4078                 :vt_segments_7,:vt_segments_8,:vt_segments_9,
4079 		:vt_segments_10, :vt_segments_11,:vt_segments_12,
4080 		:vt_segments_13, :vt_segments_14,:vt_segments_15,
4081 		:vt_segments_16, :vt_segments_17,:vt_segments_18,
4082 		:vt_segments_19, :vt_segments_20, :vt_segments_21,
4083 		:vt_segments_22,:vt_segments_23, :vt_segments_24,
4084 		:vt_segments_25,:vt_segments_26, :vt_segments_27,
4085 		:vt_segments_28,:vt_segments_29, :vt_segments_30,
4086 		:reference_1,:context,
4087 		:attribute1, :attribute2, :attribute3, :attribute4, :attribute5,
4088 		:attribute6, :attribute7, :attribute8, :attribute9, :attribute10,
4089 		:attribute11, :attribute12, :attribute13, :attribute14, :attribute15,
4090 		:attribute16, :attribute17, :attribute18, :attribute19, :attribute20
4091 	       ) ' ;
4092 
4093     EXECUTE IMMEDIATE vl_str USING
4094 		'NEW', vg_sob_id, vg_end_date, vg_currency,
4095 		SYSDATE, Fnd_Global.user_id, 'A', 'Year End Close',
4096 		'Year End Close', l_amount_dr, l_amount_cr, vg_jrnl_group_id,
4097 		l_period_name, vg_coa_id,
4098                 vt_segments(1),vt_segments(2),vt_segments(3),
4099                 vt_segments(4),vt_segments(5),vt_segments(6),
4100                 vt_segments(7),vt_segments(8),vt_segments(9),
4101 		vt_segments(10),
4102                 vt_segments(11),vt_segments(12),vt_segments(13),
4103                 vt_segments(14),vt_segments(15),vt_segments(16),
4104                 vt_segments(17),vt_segments(18),vt_segments(19),
4105 		vt_segments(20),
4106                 vt_segments(21),vt_segments(22),vt_segments(23),
4107                 vt_segments(24),vt_segments(25),vt_segments(26),
4108                 vt_segments(27),vt_segments(28),vt_segments(29),
4109 		vt_segments(30),
4110 		l_reference_1,'Global Data Elements',
4111 		vl_attribtable(1), vl_attribtable(2), vl_attribtable(3),
4112 		vl_attribtable(4), vl_attribtable(5), vl_attribtable(6),
4113 		vl_attribtable(7), vl_attribtable(8), vl_attribtable(9),
4114 		vl_attribtable(10), vl_attribtable(11), vl_attribtable(12),
4115 	        vl_attribtable(13), vl_attribtable(14), vl_attribtable(15),
4116 		vl_attribtable(16), vl_attribtable(17), vl_attribtable(18),
4117 		vl_attribtable(19), vl_attribtable(20);
4118 
4119 
4120 
4121 EXCEPTION
4122    WHEN OTHERS THEN
4123         vp_retcode := 2;
4124         vp_errbuf  := SQLERRM || '--Error in Insert_Gl_Interface_Record procedure.';
4125        IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4126                FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_UNEXPECTED, l_module_name,
4127                          'When Others Exception ' || vp_errbuf );
4128        END IF;
4129 END insert_gl_interface_record;
4130 -----------------------------------------------------------------------------
4131 -- ------------------------------------------------------------------
4132 --              Procedure Check_bal_seg_value
4133 -- ------------------------------------------------------------------
4134 --  BSV's are not always assigned to ledgers. Therefore we should not
4135 --  enforce BSV assignemnt if there is no BSV flex value set
4136 --  is assigned to a ledger.
4137 --  IF bal_seg_value_option_code column value in GL_LEDGER table is
4138 --  'A' that means all BSV's are valid. If the column is 'I',
4139 --   then some BSV's are valid.
4140 --  ------------------------------------------------------------------
4141 
4142 PROCEDURE Check_bal_seg_value( vp_fund_grp VARCHAR2,
4143                                    vp_time_frame VARCHAR,
4144                                  vp_tsymbol_id VARCHAR  ,
4145                                 vp_sob_id NUMBER ,
4146                                vp_end_date DATE )
4147         IS
4148 TYPE v_fund_val_blk IS TABLE OF fv_fund_parameters.fund_value%TYPE
4149  index by binary_integer;
4150 
4151 V_fund_blk_tbl  v_fund_val_blk;
4152 l_select_stmt varchar2(2500);
4153 l_module_name         VARCHAR2(200)  ;
4154    vl_valid_value     VARCHAR2(1);
4155 Type v_ref_cursor is  REF CURSOR;
4156 v_fund_val_cursor  v_ref_cursor;
4157 vl_invalid_fund varchar2(1);
4158 BEGIN
4159   l_module_name    :=  g_module_name ||  'Check_bal_seg_value  ';
4160 vl_invalid_fund := 'Y';
4161   IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4162  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT,
4163                          l_module_name,
4164                         '   IN CHECK_BAL_SEG_VALUE PROCEDURE '||
4165         'with the following Parameters passed to the process:');
4166    END IF;
4167    IF ( FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4168  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT,
4169                          l_module_name,
4170                 '   FUND GROUP= '||VP_FUND_GRP);
4171  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT,
4172                          l_module_name,
4173                         '   TIME FRAME= '||VP_TIME_FRAME);
4174  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT,
4175                         l_module_name,
4176                 '   TREASURY SYMBOL ID= '||VP_TSYMBOL_ID);
4177  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT,
4178                  l_module_name,
4179                 '   SET OF BOOKS ID= '||VP_SOB_ID);
4180  FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_STATEMENT,
4181                          l_module_name,
4182                         '   END DATE= '||VP_END_DATE);
4183    END IF;
4184 
4185 L_select_stmt :=  '  SELECT ffp.fund_value
4186       FROM fv_fund_parameters ffp,
4187                Fv_Ye_Groups fyg ,
4188                fv_treasury_symbols fts
4189     WHERE  fyg.fund_group_code    = fts.fund_group_code
4190          AND   fts.time_frame         = fyg.fund_time_frame
4191          AND   fts.treasury_symbol_id = fyg.treasury_symbol_id
4192          AND   fts.treasury_symbol_id = ffp.treasury_symbol_id
4193          AND   fyg.fund_group_code    = NVL(:fundgroup, fyg.fund_group_code)
4194          AND   fyg.fund_time_frame    = NVL(decode(:timeframe,''ALL'',fyg.fund_time_frame,:timeframe), fyg.fund_time_frame)
4195          AND   fyg.treasury_symbol = NVL(:TSYMBOLID, fyg.treasury_symbol_id)
4196          AND   fts.set_of_books_id    = :sob_id
4197          AND   fts.set_of_books_id    = fyg.set_of_books_id
4198                AND   fts.set_of_books_id    = ffp.set_of_books_id
4199                AND ((fts.expiration_date <= :end_date)
4200                         OR (fts.cancellation_date <= :end_date))';
4201 
4202 EXECUTE IMMEDIATE L_SELECT_STMT BULK COLLECT INTO v_fund_blk_tbl
4203 USING vp_fund_grp,
4204         vp_time_frame,
4205         vp_time_frame,
4206         vp_tsymbol_id ,
4207         vp_sob_id,
4208         vp_end_date,
4209          vp_end_date;
4210 
4211 FOR I in  1 .. v_fund_blk_tbl.count
4212 LOOP
4213 BEGIN
4214       SELECT  'N'
4215       INTO    vl_invalid_fund
4216       FROM    gl_ledger_segment_values glsv
4217       WHERE   glsv.ledger_id = vp_sob_id
4218        AND     glsv.segment_type_code (+) = 'B'
4219       AND     NVL(glsv.status_code (+), 'X') <> 'I'
4220       AND     NVL(glsv.start_date (+),TO_DATE('1950/01/01','YYYY/MM/DD'))
4221                <= NVL(sysdate,TO_DATE('9999/12/31','YYYY/MM/DD'))
4222       AND     NVL(glsv.end_date (+),TO_DATE('9999/12/31','YYYY/MM/DD'))
4223                >= NVL(sysdate, TO_DATE('1950/01/01','YYYY/MM/DD'))
4224       AND     glsv.segment_value (+)  = v_fund_blk_tbl(i);
4225 
4226 EXCEPTION
4227    WHEN NO_DATA_FOUND THEN
4228       IF vl_invalid_fund = 'Y' THEN
4229 FV_UTILITY.LOG_MESG('The  below fund values are not valid balance  segment
4230 values for the Ledger:');
4231   End if;
4232         vl_invalid_fund := 'W' ;
4233         FV_UTILITY.LOG_MESG('');
4234          FV_UTILITY.LOG_MESG(v_fund_blk_tbl(i));
4235 END;
4236 END LOOP;
4237 EXCEPTION
4238    WHEN OTHERS THEN
4239         vp_retcode := 2 ;
4240         vp_errbuf  := SQLERRM  ||' -- Error in Check Check_bal_seg_value procedure.' ;
4241         IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4242            FV_UTILITY.DEBUG_MESG(FND_LOG.LEVEL_UNEXPECTED,
4243                                  l_module_name,
4244                          'When Others Exception ' || vp_errbuf );
4245         END IF;
4246         RETURN ;
4247 END Check_bal_seg_value;
4248 
4249 BEGIN
4250   g_module_name  := 'fv.plsql.Fv_Ye_Close.';
4251  vg_factsi_attr_exists := 'N';
4252  vp_retcode := 0   ;
4253 
4254 
4255 END Fv_Ye_Close;
4256