DBA Data[Home] [Help]

PACKAGE BODY: APPS.XTR_REPLICATE_BANK_BALANCES

Source


1 PACKAGE BODY XTR_REPLICATE_BANK_BALANCES AS
2 /* |  $Header: xtrbbalb.pls 120.20.12020000.2 2013/01/17 06:25:21 rtumati ship $ | */
3 --
4 -- To replicate the data from CE tables to xtr_bank_balances table
5 --
6 --
7 -- Purpose: This package will insert/delete/update the bank balances
8 --  from CE tables to the xtr_bank_balances table.
9 
10 -- replicate_bank_account is the main procedure through which the
11 -- insert/delete/update procedures will be called.
12 --
13 --  -- MODIFICATION HISTORY
14 -- Person             Date                Comments
15 -- Eakta Aggarwal    19-May-2005           Created
16 -- ---------          ------          ----------------------------------
17 
18 
19 
20 PROCEDURE REPLICATE_BANK_BALANCE
21      ( p_balance_rec IN xtr_bank_balances%ROWTYPE,
22        p_action_flag IN VARCHAR2,
23        x_return_status   		OUT NOCOPY  	VARCHAR2,
24        x_msg_count			OUT NOCOPY 	NUMBER,
25        x_msg_data			OUT NOCOPY 	VARCHAR2)
26 IS
27 
28 CURSOR C_BALANCE_DETAILS IS
29     SELECT company_code,account_number,balance_date,statement_balance
30             ,balance_adjustment,balance_cflow,ce_bank_account_balance_id
31     FROM XTR_BANK_BALANCES
32     WHERE CE_BANK_ACCOUNT_BALANCE_ID = p_balance_rec.ce_bank_account_balance_id;
33 
34 
35 
36     l_balance_date_updated BOOLEAN;
37     l_balance_rec XTR_BANK_BALANCES%ROWTYPE;
38 
39 
40 BEGIN
41         l_balance_date_updated := FALSE;
42         FND_MSG_PUB.Initialize;
43         IF(p_action_flag in ('U','D')) THEN
44 
45             OPEN C_BALANCE_DETAILS;
46             FETCH C_BALANCE_DETAILS INTO l_balance_rec.company_code,l_balance_rec.account_number
47                                 ,l_balance_rec.balance_date,l_balance_rec.statement_balance,l_balance_rec.balance_adjustment
48                                 ,l_balance_rec.balance_cflow,l_balance_rec.ce_bank_account_balance_id;
49             CLOSE C_BALANCE_DETAILS;
50 
51 
52             IF(nvl(p_balance_rec.balance_date,sysdate) <> nvl(l_balance_rec.balance_date,sysdate)
53                 AND p_balance_rec.balance_date is not null AND l_balance_rec.balance_date is not null
54                 AND p_action_flag = 'U') THEN
55 
56                 l_balance_date_updated := TRUE;
57 
58             END IF;
59 
60         END IF;
61 
62 
63 
64 
65        IF(NOT l_balance_date_updated) THEN -- Balance date is not updated
66         IF (p_action_flag in ('I','U') )THEN
67             VALIDATE_BANK_BALANCE(
68                             p_balance_rec.company_code,
69                             p_balance_rec.account_number,
70                             p_balance_rec.balance_date,
71                             p_balance_rec.ce_bank_account_balance_id,
72                             p_balance_rec.statement_balance+p_balance_rec.balance_adjustment,
73                             p_balance_rec.balance_cflow,
74                             p_action_flag,
75                             x_return_status );
76         END IF;
77         IF (p_action_flag in ('D')) THEN
78             VALIDATE_BANK_BALANCE(
79                             l_balance_rec.company_code,
80                             l_balance_rec.account_number,
81                             l_balance_rec.balance_date,
82                             p_balance_rec.ce_bank_account_balance_id,
83                             l_balance_rec.statement_balance+l_balance_rec.balance_adjustment,
84                             l_balance_rec.balance_cflow,
85                             'D',
86                             x_return_status );
87         END IF;
88 
89 
90             IF  x_return_status = FND_API.G_RET_STS_SUCCESS  THEN
91 
92                 IF    p_action_flag = 'I'    THEN /* Insertion of a record */
93 
94                      INSERT_BANK_BALANCE ( p_balance_rec, x_return_status);
95 
96                 ELSIF   p_action_flag = 'U'   THEN   /* Updation of a balance */
97 
98                      UPDATE_BANK_BALANCE ( p_balance_rec, x_return_status);
99 
100                 ELSIF   p_action_flag = 'D'   THEN   /* Deletion of a balance */
101 
102                      DELETE_BANK_BALANCE( l_balance_rec, x_return_status);
103 
104                 ELSE
105                      x_return_status    := FND_API.G_RET_STS_ERROR;
106                     LOG_ERR_MSG('XTR_INV_PARAM','ACTION_FLAG');
107 
108                 END IF;
109 
110             END IF;
111 
112 
113         IF (p_action_flag in ('I','U') )THEN
114 
115             IF  x_return_status = FND_API.G_RET_STS_SUCCESS  THEN
116              UPDATE_BANK_ACCOUNT (  p_balance_rec.company_code,
117                                     p_balance_rec.account_number,
118                                     p_balance_rec.balance_date ,
119                                     p_action_flag ,
120                                     x_return_status );
121 
122             END IF;
123 
124        END IF;
125 
126        IF (p_action_flag in ('D') )THEN
127 
128             IF  x_return_status = FND_API.G_RET_STS_SUCCESS  THEN
129              UPDATE_BANK_ACCOUNT (  l_balance_rec.company_code,
130                                     l_balance_rec.account_number,
131                                     l_balance_rec.balance_date ,
132                                     'D' ,
133                                     x_return_status );
134 
135             END IF;
136 
137        END IF;
138 
139     ELSIF(l_balance_date_updated) THEN
140 
141             VALIDATE_BANK_BALANCE(
142                             p_balance_rec.company_code,
143                             p_balance_rec.account_number,
144                             p_balance_rec.balance_date,
145                             p_balance_rec.ce_bank_account_balance_id,
146                             p_balance_rec.statement_balance+p_balance_rec.balance_adjustment,
147                             p_balance_rec.balance_cflow,
148                             'D',
149                             x_return_status );
150             IF  x_return_status = FND_API.G_RET_STS_SUCCESS  THEN
151                 DELETE_BANK_BALANCE( p_balance_rec, x_return_status);
152             END IF;
153             IF  x_return_status = FND_API.G_RET_STS_SUCCESS  THEN
154              UPDATE_BANK_ACCOUNT (  p_balance_rec.company_code,
155                                     p_balance_rec.account_number,
156                                     p_balance_rec.balance_date ,
157                                     'D' ,
158                                     x_return_status );
159 
160             END IF;
161             IF  x_return_status = FND_API.G_RET_STS_SUCCESS  THEN
162                 VALIDATE_BANK_BALANCE(
163                             p_balance_rec.company_code,
164                             p_balance_rec.account_number,
165                             p_balance_rec.balance_date,
166                             p_balance_rec.ce_bank_account_balance_id,
167                             p_balance_rec.statement_balance+p_balance_rec.balance_adjustment,
168                             p_balance_rec.balance_cflow,
169                             'I',
170                             x_return_status );
171             END IF;
172             IF  x_return_status = FND_API.G_RET_STS_SUCCESS  THEN
173                 INSERT_BANK_BALANCE( p_balance_rec, x_return_status);
174             END IF;
175             IF  x_return_status = FND_API.G_RET_STS_SUCCESS  THEN
176              UPDATE_BANK_ACCOUNT (  p_balance_rec.company_code,
177                                     p_balance_rec.account_number,
178                                     p_balance_rec.balance_date ,
179                                     'I',
180                                     x_return_status );
181 
182             END IF;
183 
184 
185         END IF;
186 
187     FND_MSG_PUB.Count_And_Get -- Returns the error message if there is only 1 error
188     (   p_count         =>      x_msg_count     ,
189         p_data          =>      x_msg_data
190     );
191 
192 
193 EXCEPTION
194 
195       WHEN others THEN
196           x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
197           LOG_ERR_MSG ('XTR_UNEXP_ERROR',SQLERRM(SQLCODE));
198 
199       FND_MSG_PUB.Count_And_Get -- Returns the error message if there is only 1 error
200     (   p_count         =>      x_msg_count     ,
201         p_data          =>      x_msg_data
202     );
203 
204 END REPLICATE_BANK_BALANCE;
205 
206 PROCEDURE REPLICATE_BANK_BALANCE
207      ( p_ce_bank_account_balance_id	IN	XTR_BANK_BALANCES.ce_bank_account_balance_id%TYPE,
208        p_company_code	IN	XTR_BANK_BALANCES.company_code%TYPE,
209        p_account_number	IN	XTR_BANK_BALANCES.account_number%TYPE,
210        p_balance_date	IN	XTR_BANK_BALANCES.balance_date%TYPE,
211        p_ledger_balance	IN	CE_BANK_ACCT_BALANCES.ledger_balance%TYPE,
212        p_available_balance	IN	CE_BANK_ACCT_BALANCES.available_balance%TYPE,
213        p_interest_calculated_balance	IN	CE_BANK_ACCT_BALANCES.value_dated_balance%TYPE,
214        p_one_day_float	IN	XTR_BANK_BALANCES.one_day_float%TYPE,
215        p_two_day_float	IN	XTR_BANK_BALANCES.two_day_float%TYPE,
216        p_action_flag IN varchar2,
217        x_return_status   	OUT NOCOPY  VARCHAR2,
218        x_msg_count			OUT NOCOPY 	NUMBER,
219        x_msg_data			OUT NOCOPY 	VARCHAR2) IS
220 
221  l_xtr_bank_balances_rec  XTR_BANK_BALANCES%ROWTYPE;
222  l_bank_account_id  CE_BANK_ACCT_USES_ALL.BANK_ACCOUNT_ID%TYPE;
223  l_cashpool_id      CE_CASHPOOLS.CASHPOOL_ID%TYPE;
224  l_conc_account_id  CE_CASHPOOL_SUB_ACCTS.ACCOUNT_ID%TYPE;
225 
226 
227       cursor c_bank_account_id is
228            select bank_account_id from ce_bank_acct_uses_all
229            where bank_account_id = (select bank_account_id from
230                                     ce_bank_acct_balances
231                                     where bank_acct_balance_id =
232                                     p_ce_bank_account_balance_id)
233            and xtr_use_enable_flag = 'Y';
234 
235 
236       cursor c_conc_cashpool_id is
237            select sub.cashpool_id, sub.account_id
238            from  ce_bank_acct_uses_all acct
239 	       , ce_Cashpool_sub_accts sub
240 	   where acct.bank_account_id = sub.account_id
241            and acct.xtr_use_enable_flag = 'Y'
242 	   and sub.type = 'CONC'
243            and cashpool_id = (select subacct.cashpool_id
244 	                      from ce_cashpool_sub_accts  subacct
245                                    , ce_cashpools pool
246    			      where account_id = l_bank_account_id
247                               and subacct.cashpool_id = pool.cashpool_id
248 		              and pool.type = 'NOTIONAL' );
249 
250 
251 BEGIN
252 
253         l_xtr_bank_balances_rec.ce_bank_account_balance_id	:=	p_ce_bank_account_balance_id;
254 	l_xtr_bank_balances_rec.company_code	:=	p_company_code;
255 	l_xtr_bank_balances_rec.account_number	:=	p_account_number;
256 	l_xtr_bank_balances_rec.balance_date	:=	p_balance_date;
257 	l_xtr_bank_balances_rec.statement_balance	:=	nvl(p_ledger_balance,0);
258 	l_xtr_bank_balances_rec.balance_adjustment	:=	(nvl(p_interest_calculated_balance,0) - nvl(p_ledger_balance,0));
259 	l_xtr_bank_balances_rec.balance_cflow	:=	nvl(p_available_balance,0);
260 	l_xtr_bank_balances_rec.one_day_float	:=	p_one_day_float;
261 	l_xtr_bank_balances_rec.two_day_float	:=	p_two_day_float;
262 
263 
264          -- added for notional bank accounts
265 
266       open c_bank_account_id;
267       fetch c_bank_account_id into l_bank_account_id;
268 
269       if c_bank_account_id%found  then
270 
271     	      REPLICATE_BANK_BALANCE( l_xtr_bank_balances_rec,p_action_flag
272                             ,x_return_status,x_msg_count,x_msg_data);
273 
274 
275      else
276 
277           open c_conc_cashpool_id;
278           fetch c_conc_cashpool_id into l_cashpool_id, l_conc_account_id;
279           if c_conc_cashpool_id%found then
280                 close c_conc_cashpool_id;
281                 xtr_account_bal_maint_p.maintain_setoffs(p_company_code,
282                                                             l_cashpool_id,
283                                                             l_conc_account_id,
284                                                             p_balance_date);
285 
286           else
287               close c_conc_cashpool_id;
288               x_return_status := FND_API.G_RET_STS_SUCCESS;
289 
290           end if;
291 
292 
293      end if;
294 
295      close c_bank_account_id;
296 
297 
298 
299     EXCEPTION
300 
301       WHEN others THEN
302           x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
303           LOG_ERR_MSG ('XTR_UNEXP_ERROR',SQLERRM(SQLCODE));
304 
305       FND_MSG_PUB.Count_And_Get -- Returns the error message if there is only 1 error
306     (   p_count         =>      x_msg_count     ,
307         p_data          =>      x_msg_data
308     );
309 
310 END REPLICATE_BANK_BALANCE;
311 
312 
313 
314 
315 PROCEDURE INSERT_BANK_BALANCE
316      ( p_balance_rec IN xtr_bank_balances%ROWTYPE,
317        x_return_status   	 IN	OUT NOCOPY  	VARCHAR2
318      )
319 IS
320 
321 l_prv_date  XTR_BANK_BALANCES.balance_date%TYPE;
322 l_prv_rate  XTR_BANK_BALANCES.interest_rate%TYPE;
323 l_prv_bal   XTR_BANK_BALANCES.balance_cflow%TYPE;
324 l_int_bf    XTR_BANK_BALANCES.ACCUM_INT_CFWD%TYPE;
325 l_prv_accrual_int XTR_BANK_BALANCES.accrual_interest%TYPE;
326 l_prv_day_count_type  XTR_BANK_BALANCES.day_count_type%TYPE;
327 l_prv_rounding_type   XTR_BANK_BALANCES.rounding_type%TYPE;
328 
329 
330 l_ccy   xtr_bank_accounts.currency%TYPE;
331 l_portfolio_code  xtr_bank_accounts.portfolio_code%TYPE;
332 l_bank_code  xtr_bank_accounts.bank_code%TYPE;
333 l_yr_type  xtr_bank_accounts.year_calc_type%TYPE;
334 l_rounding_type   xtr_bank_accounts.rounding_type%TYPE;
335 l_day_count_type  xtr_bank_accounts.day_count_type%TYPE;
336 l_ce_bank_account_id    xtr_bank_accounts.ce_bank_account_id%TYPE;
337 
338 l_round_factor XTR_MASTER_CURRENCIES_V.ROUNDING_FACTOR%TYPE;
339 l_yr_basis  XTR_MASTER_CURRENCIES_V.YEAR_BASIS%TYPE;
340 l_hce_rate  XTR_MASTER_CURRENCIES_V.HCE_RATE%TYPE;
341 
342 l_prv_prv_day_count_type XTR_BANK_BALANCES.day_count_type%TYPE;
343 l_oldest_date  XTR_BANK_BALANCES.balance_date%TYPE;
344 
345 l_first_trans_flag  VARCHAR2(1);
346 l_invest_limit_code ce_bank_acct_uses_all.investment_limit_code%TYPE;
347 l_fund_limit_code ce_bank_acct_uses_all.funding_limit_code%TYPE;
348 
349 
350 l_no_days NUMBER;
351 
352 
353 l_int_cf    NUMBER;
354 l_interest  NUMBER;
355 l_original_amount NUMBER;
356 l_accrual_int NUMBER;
357 l_new_rate  NUMBER;
358 
359 
360  -- Get the details of the latest balance for a bank account
361 CURSOR PREV_DETAILS IS
362    SELECT a.BALANCE_DATE,NVL(a.STATEMENT_BALANCE,0)+NVL(a.BALANCE_ADJUSTMENT,0),a.ACCUM_INT_CFWD,
363           a.INTEREST_RATE,a.accrual_interest,
364           a.rounding_type, day_count_type
365    FROM XTR_BANK_BALANCES a
366    WHERE a.ACCOUNT_NUMBER = p_balance_rec.account_number
367    AND   a.COMPANY_CODE = p_balance_rec.company_code
368    AND   a.BALANCE_DATE = (SELECT max(b.BALANCE_DATE)
369                            FROM XTR_BANK_BALANCES b
370                            WHERE b.ACCOUNT_NUMBER = p_balance_rec.account_number
371 			               AND   b.COMPANY_CODE   = p_balance_rec.company_code);
372 
373 
374 -- Check whether the bank account exist in the xtr_bank_accounts table
375 CURSOR BANK_ACCT_DETAILS IS
376   SELECT CURRENCY,PORTFOLIO_CODE,BANK_CODE,nvl(YEAR_CALC_TYPE,'ACTUAL/ACTUAL') year_calc_type,rounding_type, day_count_type,ce_bank_account_id
377   FROM XTR_BANK_ACCOUNTS
378   WHERE ACCOUNT_NUMBER = p_balance_rec.account_number
379   AND   PARTY_CODE     = p_balance_rec.company_code;
380 --
381 
382 -- Get the details of the rounding factor for the currency
383 CURSOR CURRENCY_RNDING IS
384   SELECT ROUNDING_FACTOR,YEAR_BASIS,HCE_RATE
385   FROM  XTR_MASTER_CURRENCIES_V
386   WHERE CURRENCY = l_ccy;
387 
388 
389 
390 -- Getting the limit code
391 CURSOR GET_LIM_CODE is
392   select investment_limit_code, funding_limit_code
393   from ce_bank_acct_uses_all
394   where bank_account_id in ( select bank_account_id from
395                ce_bank_acct_balances
396               where bank_acct_balance_id = p_balance_rec.ce_bank_account_balance_id
397               );
398 
399 
400 -- Getting the oldest balacne date for that bank account
401 CURSOR oldest_date IS
402     SELECT MIN(a.balance_date)
403     FROM   xtr_bank_balances a
404     WHERE a.account_number = p_balance_rec.account_number
405     AND a.COMPANY_CODE = p_balance_rec.company_code;
406 
407 
408 CURSOR PRV_PRV_DETAILS IS
409     SELECT a.day_count_type
410     FROM xtr_bank_balances a
411     WHERE  a.account_number = p_balance_rec.account_number
412     AND a.COMPANY_CODE = p_balance_rec.company_code
413     AND a.balance_date = (SELECT max(b.BALANCE_DATE)
414                            FROM XTR_BANK_BALANCES b
415                            WHERE b.ACCOUNT_NUMBER = p_balance_rec.account_number
416 			               AND   b.COMPANY_CODE   = p_balance_rec.company_code
417 			               AND   b.balance_date < l_prv_date);
418 
419 
420 
421 
422 
423 BEGIN
424    -- x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
425     x_return_status := FND_API.G_RET_STS_SUCCESS;
426     OPEN PREV_DETAILS;
427     FETCH PREV_DETAILS INTO l_prv_date,l_prv_bal,l_int_bf,l_prv_rate,l_prv_accrual_int,
428                             l_prv_rounding_type, l_prv_day_count_type;
429     IF  PREV_DETAILS%NOTFOUND THEN
430         l_prv_date := trunc(p_balance_rec.balance_date);
431         l_prv_bal  := 0;
432         l_prv_rate := 0;
433         l_int_bf   := 0;
434         l_no_days  := 0;
435         l_prv_accrual_int := 0;
436         l_prv_rounding_type := NULL;
437         l_prv_day_count_type := NULL;
438     END IF;
439     CLOSE PREV_DETAILS;
440 
441 
442     OPEN BANK_ACCT_DETAILS;
443     FETCH BANK_ACCT_DETAILS INTO l_ccy,l_portfolio_code,l_bank_code,
444                            l_yr_type, l_rounding_type, l_day_count_type,l_ce_bank_account_id;
445     IF  BANK_ACCT_DETAILS%FOUND THEN
446     CLOSE BANK_ACCT_DETAILS;
447 
448         OPEN CURRENCY_RNDING;
449         FETCH CURRENCY_RNDING INTO l_round_factor,l_yr_basis,l_hce_rate;
450         CLOSE CURRENCY_RNDING;
451 
452 -- bug 4870347
453       open GET_LIM_CODE;
454        FETCH GET_LIM_CODE INTO l_invest_limit_code, l_fund_limit_code;
455        IF GET_LIM_CODE%NOTFOUND  THEN
456           l_invest_limit_code := NULL;
457           l_fund_limit_code := NULL;
458         END IF;
459      	CLOSE GET_LIM_CODE;
460 
461        OPEN oldest_date;
462        FETCH oldest_date INTO l_oldest_date;
463        CLOSE oldest_date;
464        --
465        IF trunc(l_prv_date) <  trunc(p_balance_rec.balance_date) THEN
466 
467   	            OPEN prv_prv_details;
468                 FETCH prv_prv_details INTO l_prv_prv_day_count_type;
469                 CLOSE prv_prv_details;
470                 IF (l_prv_day_count_type ='B' AND l_prv_date = l_oldest_date)
471 	               OR (l_prv_prv_day_count_type ='F' AND l_prv_day_count_type ='B' ) THEN
472 	                 l_first_trans_flag :='Y';
473         	    ELSE
474 	                 l_first_trans_flag :=NULL;
475 	            END IF;
476 
477 	            XTR_CALC_P.CALC_DAYS_RUN(trunc(l_prv_date),
478 			           trunc(p_balance_rec.balance_date),
479 				       l_yr_type,
480 			    	   l_no_days,
481 				       l_yr_basis,
482 				       NULL,
483 				       l_prv_day_count_type,
484 				       l_first_trans_flag);
485 
486 
487 	           IF l_prv_date <> l_oldest_date AND
488 	           ((Nvl(l_prv_prv_day_count_type,l_prv_day_count_type) ='L' AND l_prv_day_count_type ='F')
489 	           OR (Nvl(l_prv_prv_day_count_type,l_prv_day_count_type) ='B' AND l_prv_day_count_type ='F'))
490 	           THEN
491 	                 l_no_days := l_no_days -1;
492 	           END IF;
493 
494        ELSE
495               l_no_days :=0;
496               l_yr_basis :=365;
497        END IF;
498 
499      /* Commented the below line in R12. Interest is calculated using CE API
500        l_interest := xtr_fps2_p.interest_round(l_prv_bal * l_prv_rate / 100 * l_no_days
501 						     / l_yr_basis,l_round_factor,l_prv_rounding_type); */
502     -- Added the below line R12 Bug 4593594
503         CE_INTEREST_CALC.int_cal_xtr( trunc(l_prv_date),
504             trunc(p_balance_rec.balance_date),
505             l_ce_bank_account_id,
506             l_prv_rate,
507             'TREASURY',
508             l_interest );
509 
510 
511        l_original_amount := l_int_bf + nvl(l_interest,0);
512        l_int_cf := l_original_amount;
513 
514        l_accrual_int :=nvl(l_prv_accrual_int,0) + nvl(l_interest,0);
515 
516 
517 /*
518        XTR_ACCOUNT_BAL_MAINT_P.FIND_INT_RATE(p_balance_rec.account_number
519                             , p_balance_rec.statement_balance
520                             , p_balance_rec.company_code
521                             , l_bank_code
522                             , l_ccy
523                             , p_balance_rec.balance_date
524                             , l_new_rate);
525 */
526         l_new_rate := CE_INTEREST_CALC.GET_INTEREST_RATE(l_ce_bank_account_id,p_balance_rec.balance_date, (NVL(p_balance_rec.STATEMENT_BALANCE,0)+NVL(p_balance_rec.BALANCE_ADJUSTMENT,0)) ,l_new_rate);
527         IF l_new_rate IS NULL THEN
528             l_new_rate := 0;
529         END IF;
530 
531         INSERT INTO XTR_BANK_BALANCES
532         ( company_code
533          ,account_number
534          ,balance_date
535          ,no_of_days
536          ,statement_balance
537          ,balance_adjustment
538          ,balance_cflow
539          ,accum_int_bfwd
540          ,interest
541          ,interest_rate
542          ,interest_settled
543          ,interest_settled_hce
544          ,accum_int_cfwd
545          ,limit_code
546          ,created_on
547          ,created_by
548          ,accrual_interest
549          ,rounding_type
550          ,day_count_type
551          ,original_amount
552          ,one_day_float
553          ,two_day_float
554          ,ce_bank_account_balance_id)
555           VALUES
556         ( p_balance_rec.company_code
557          ,p_balance_rec.account_number
558          ,p_balance_rec.balance_date
559          ,l_no_days
560          ,p_balance_rec.statement_balance
561          ,p_balance_rec.balance_adjustment
562          ,p_balance_rec.balance_cflow
563          ,l_int_bf
564          ,nvl(l_interest,0)
565          ,l_new_rate
566          ,0
567          ,0
568          ,l_int_cf
569          ,decode(sign(nvl(p_balance_rec.statement_balance,0)), -1,l_fund_limit_code,l_invest_limit_code)
570          ,sysdate
571          ,fnd_global.user_id
572          ,l_accrual_int
573          ,l_rounding_type
574          ,l_day_count_type
575          ,l_original_amount
576          ,p_balance_rec.one_day_float
577          ,p_balance_rec.two_day_float
578          ,p_balance_rec.ce_bank_account_balance_id);
579 
580    ELSE
581         CLOSE BANK_ACCT_DETAILS;
582         LOG_ERR_MSG('XTR_INV_PARAM', p_balance_rec.ce_bank_account_balance_id);
583         x_return_status := FND_API.G_RET_STS_ERROR;
584 
585    END IF;
586 
587 EXCEPTION
588 
589           WHEN others THEN
590           x_return_status    := FND_API.G_RET_STS_UNEXP_ERROR;
591           LOG_ERR_MSG('XTR_UNEXP_ERROR',SQLERRM(SQLCODE));
592 
593 END INSERT_BANK_BALANCE ;
594 
595 
596 
597 
598 PROCEDURE UPDATE_BANK_BALANCE
599      ( p_balance_rec IN xtr_bank_balances%ROWTYPE,
600        x_return_status   	IN	OUT NOCOPY  	VARCHAR2
601        )
602 IS
603 
604 CURSOR c_chk_lock IS
605 SELECT ce_bank_account_balance_id
606 FROM  xtr_bank_balances
607 WHERE  company_code = p_balance_rec.company_code
608        AND  account_number = p_balance_rec.account_number
609        AND  ce_bank_account_balance_id = p_balance_rec.ce_bank_account_balance_id
610 FOR UPDATE NOWAIT;
611 
612 
613 l_ce_bank_acct_bal_id  xtr_bank_balances.ce_bank_account_balance_id%TYPE;
614 
615 
616 BEGIN
617       --x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
618       x_return_status := FND_API.G_RET_STS_SUCCESS;
619       OPEN c_chk_lock;
620       FETCH c_chk_lock INTO  l_ce_bank_acct_bal_id;
621       IF c_chk_lock%FOUND THEN
622 
623       CLOSE c_chk_lock;
624 
625       UPDATE xtr_bank_balances SET
626               statement_balance = nvl(p_balance_rec.statement_balance,0)
627              ,balance_cflow = nvl(p_balance_rec.balance_cflow,0)
628              ,one_day_float = nvl(p_balance_rec.one_day_float,0)
629              ,two_day_float = nvl(p_balance_rec.two_day_float,0)
630              ,balance_adjustment = p_balance_rec.balance_adjustment
631              ,balance_date = p_balance_rec.balance_date
632              ,updated_by = fnd_global.user_id
633              ,updated_on = sysdate
634        WHERE  company_code = p_balance_rec.company_code
635        AND  account_number = p_balance_rec.account_number
636        AND  ce_bank_account_balance_id = p_balance_rec.ce_bank_account_balance_id;
637 
638       ELSE
639       CLOSE c_chk_lock;
640       END IF;
641 
642 
643     EXCEPTION
644         WHEN app_exceptions.RECORD_LOCK_EXCEPTION THEN
645             IF C_CHK_LOCK%ISOPEN THEN
646                 CLOSE C_CHK_LOCK;
647             END IF;
648             LOG_ERR_MSG('CHK_LOCK');
649             x_return_status := FND_API.G_RET_STS_ERROR;
650         WHEN others THEN
651           x_return_status    := FND_API.G_RET_STS_UNEXP_ERROR;
652           LOG_ERR_MSG('XTR_UNEXP_ERROR',SQLERRM(SQLCODE));
653 
654 END UPDATE_BANK_BALANCE;
655 
656 
657 
658 PROCEDURE DELETE_BANK_BALANCE
659      ( p_balance_rec IN xtr_bank_balances%ROWTYPE,
660        x_return_status   	  IN OUT NOCOPY  	VARCHAR2
661        )
662 IS
663 
664 l_cross_ref  xtr_party_info.cross_ref_to_other_party%TYPE;
665 l_exists   VARCHAR2(1);
666 l_ce_bank_acct_bal_id  xtr_bank_balances.ce_bank_account_balance_id%TYPE;
667 l_ccy xtr_bank_accounts.currency%TYPE;
668 
669 -- Finding the subsidiary for the company
670 CURSOR C_CROSS_REF IS
671    SELECT CROSS_REF_TO_OTHER_PARTY
672    FROM   XTR_PARTIES_V
673    WHERE  PARTY_CODE = p_balance_rec.company_code;
674 
675 
676 -- Finding the currency for the account number and company combination
677 CURSOR C_CURRENCY IS
678   SELECT CURRENCY
679   FROM  XTR_BANK_ACCOUNTS
680   WHERE PARTY_CODE = P_BALANCE_REC.COMPANY_CODE
681   AND ACCOUNT_NUMBER = P_BALANCE_REC.ACCOUNT_NUMBER;
682 
683 
684  -- Checking whether the row exists in the DDA table
685 CURSOR C_BAL_SETTLED IS
686    SELECT 'Y'
687    FROM xtr_deal_date_amounts
688    WHERE DEAL_TYPE   = 'CA'
689    AND  AMOUNT_TYPE  = 'INTSET'
690    AND  ACCOUNT_NO   = p_balance_rec.account_number
691    AND  CURRENCY     = l_ccy
692    AND  COMPANY_CODE = nvl(l_cross_ref,p_balance_rec.company_code)
693    AND  AMOUNT_DATE  = p_balance_rec.balance_date;
694 
695 -- Checking the lock on the xtr_bank_balances table
696 CURSOR c_chk_acct_lock IS
697    SELECT ce_bank_account_balance_id
698    FROM  xtr_bank_balances
699    WHERE  company_code = p_balance_rec.company_code
700    AND  account_number = p_balance_rec.account_number
701    AND  ce_bank_account_balance_id = p_balance_rec.ce_bank_account_balance_id
702    FOR UPDATE NOWAIT;
703 
704 -- Checking the lock on the xtr_deal_date_amounts table
705 CURSOR c_chk_dda_lock IS
706    SELECT ce_bank_account_balance_id
707    FROM  xtr_bank_balances
708    WHERE  company_code = p_balance_rec.company_code
709    AND  account_number = p_balance_rec.account_number
710    AND  ce_bank_account_balance_id = p_balance_rec.ce_bank_account_balance_id
711    FOR UPDATE NOWAIT;
712 
713 
714 BEGIN
715       --x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
716       x_return_status := FND_API.G_RET_STS_SUCCESS;
717       OPEN c_chk_acct_lock;
718       FETCH c_chk_acct_lock INTO  l_ce_bank_acct_bal_id;
719       IF c_chk_acct_lock%FOUND THEN
720 
721             CLOSE c_chk_acct_lock;
722 
723             OPEN C_CROSS_REF;
724             FETCH C_CROSS_REF INTO l_cross_ref;
725             CLOSE C_CROSS_REF;
726 
727             DELETE FROM XTR_BANK_BALANCES
728             WHERE company_code = p_balance_rec.company_code
729             AND account_number = p_balance_rec.account_number
730             AND balance_date = p_balance_rec.balance_date
731             AND ce_bank_account_balance_id = p_balance_rec.ce_bank_account_balance_id;
732 
733 
734       ELSE
735             CLOSE c_chk_acct_lock;
736 
737       END IF;
738 
739       OPEN C_CURRENCY;
740       FETCH C_CURRENCY INTO l_ccy;
741       CLOSE C_CURRENCY;
742 
743       OPEN C_bal_settled;
744       FETCH C_bal_settled INTO l_exists;
745 
746       OPEN c_chk_dda_lock;
747       FETCH c_chk_dda_lock INTO  l_ce_bank_acct_bal_id;
748       IF c_chk_dda_lock%FOUND THEN
749 
750             CLOSE c_chk_dda_lock;
751 
752             IF c_bal_settled%FOUND THEN
753 
754                  DELETE FROM XTR_DEAL_DATE_AMOUNTS_V
755                       WHERE DEAL_TYPE   = 'CA'
756                       AND  AMOUNT_TYPE  = 'INTSET'
757                       AND  ACCOUNT_NO   = p_balance_rec.account_number
758                       AND  CURRENCY     = l_ccy
759                       AND  COMPANY_CODE = nvl(l_cross_ref,p_balance_rec.company_code)
760                       AND  AMOUNT_DATE  = p_balance_rec.balance_date;
761 
762             END IF;
763             CLOSE c_bal_settled;
764       ELSE
765             CLOSE c_chk_dda_lock;
766 
767       END IF;
768 
769 
770 EXCEPTION
771         WHEN app_exceptions.RECORD_LOCK_EXCEPTION THEN
772 
773              IF C_CHK_acct_LOCK%ISOPEN THEN
774                 CLOSE C_CHK_acct_LOCK;
775              END IF;
776 
777              IF C_CHK_DDA_LOCK%ISOPEN THEN
778                 CLOSE C_CHK_DDA_LOCK;
779              END IF;
780 
781              LOG_ERR_MSG('CHK_LOCK');
782              x_return_status := FND_API.G_RET_STS_ERROR;
783 
784 
785         WHEN others THEN
786 
787            LOG_ERR_MSG('XTR_UNEXP_ERROR',SQLERRM(SQLCODE));
788            x_return_status    := FND_API.G_RET_STS_UNEXP_ERROR;
789 
790 END DELETE_BANK_BALANCE;
791 
792 
793 
794 PROCEDURE VALIDATE_BANK_BALANCE
795      ( p_company_code IN xtr_bank_balances.company_code%TYPE,
796        p_account_number IN xtr_bank_balances.account_number%TYPE,
797        p_balance_date IN xtr_bank_balances.balance_date%TYPE,
798        p_ce_bank_account_balance_id IN xtr_bank_balances.ce_bank_account_balance_id%TYPE DEFAULT NULL,
799        p_interest_calc_balance IN NUMBER,
800        p_available_balance IN NUMBER,
801        p_action_flag IN VARCHAR2,
802        x_return_status   		OUT NOCOPY  	VARCHAR2
803        )
804 IS
805 
806 l_portfolio_code     xtr_bank_accounts.portfolio_code%TYPE;
807 l_currency           xtr_bank_accounts.currency%TYPE;
808 l_bank_code     xtr_bank_accounts.bank_code%TYPE;
809 l_result        BOOLEAN;
810 l_duplicate     NUMBER;
811 l_return_error  VARCHAR2(30);
812 l_authorised    VARCHAR2(1);
813 l_ce_bank_account_id xtr_bank_accounts.ce_bank_account_id%TYPE ;
814 l_int_schedule_id ce_bank_accounts.interest_schedule_id%TYPE ;
815 l_pricing_model  xtr_bank_accounts.pricing_model%TYPE;
816 
817 
818 -- Check whether the portfolio code exists for the bank account for which balacnes
819 -- are to be entered
820 CURSOR C_PORTFOLIO IS
821    SELECT PORTFOLIO_CODE, CURRENCY , BANK_CODE, PRICING_MODEL,
822 	  ce_bank_account_id		/* Bug 5346243 */
823    FROM  xtr_bank_accounts
824    WHERE ACCOUNT_NUMBER = p_account_number
825    AND   PARTY_CODE     = p_company_code;
826 
827 
828 -- Check whether the balance does not already exist for
829 CURSOR C_DUPLICATE_DATE IS
830   SELECT 1
831    FROM  XTR_BANK_BALANCES_V A,
832          XTR_BANK_ACCOUNTS_V B
833    WHERE A.BALANCE_DATE   = p_balance_date
834    AND   A.ACCOUNT_NUMBER = B.ACCOUNT_NUMBER
835    AND   A.COMPANY_CODE   = B.PARTY_CODE
836    AND   B.CURRENCY       = l_currency
837    AND   B.ACCOUNT_NUMBER = p_account_number
838    AND   B.BANK_CODE      = l_bank_code
839    AND   B.PARTY_CODE     = p_company_code;
840 
841 
842 cursor c_pm_authorized is
843    select 1
844    from   xtr_price_models_v
845    where  deal_type = 'CA'
846    and    code = l_pricing_model
847    and    authorized = 'Y';
848 
849 /* Bug 5346243 */
850 
851 Cursor c_int_schedule ( l_ce_bank_account_id Number ) Is
852 Select interest_schedule_id
853 From   ce_bank_accounts
854 Where  bank_account_id = l_ce_bank_account_id ;
855 
856 
857 
858 BEGIN
859 
860 x_return_status := FND_API.G_RET_STS_SUCCESS;
861 
862 OPEN c_portfolio;
863 FETCH c_portfolio INTO l_portfolio_code, l_currency,l_bank_code, l_pricing_model, l_ce_bank_account_id ;
864 
865 -- Validation at the time of insertion/updation of the record
866 
867 
868        IF   p_action_flag IN ( 'I' , 'U') THEN
869 
870              IF   p_action_flag  =  'I' AND  (l_portfolio_code Is null)  THEN
871  --  Checking whether the portfolio code exists for the bank account
872                     x_return_status := FND_API.G_RET_STS_ERROR;
873                     LOG_ERR_MSG ( 'XTR_PORTFOLIO');
874              END IF;
875 
876 CLOSE c_portfolio;
877 
878  --  Checking whether the balance date is greater than sysdate
879                IF p_balance_date > sysdate THEN
880                   x_return_status := FND_API.G_RET_STS_ERROR;
881                   LOG_ERR_MSG ( 'XTR_104');
882                END IF;
883 
884  -- Checking whether an interest schedule is assigned to the bank account
885  /* Bug 5346243 */
886 		Open	c_int_schedule(l_ce_bank_account_id) ;
887 		fetch	c_int_schedule into l_int_schedule_id ;
888 		close	c_int_schedule ;
889 
890 		If l_int_schedule_id is Null Then
891 			x_return_status := FND_API.G_RET_STS_ERROR;
892 			LOG_ERR_MSG ( 'CE_NO_SCHED_BANK_ACCT');
893 		End If ;
894 
895  -- Checking whether the pricing model is authorised
896     If l_pricing_model Is Not Null Then
897               OPEN c_pm_authorized;
898               FETCH c_pm_authorized into l_authorised;
899               if c_pm_authorized%NOTFOUND then
900                   x_return_status := FND_API.G_RET_STS_ERROR;
901                   LOG_ERR_MSG ( 'XTR_INV_PRICING_MODEL');
902               end if;
903               close c_pm_authorized;
904     End If ;
905 
906  -- Checking the balance does not exist for the date being entered by the user
907               OPEN c_duplicate_date;
908               FETCH c_duplicate_date INTO l_duplicate;
909               IF c_duplicate_date%FOUND AND p_action_flag = 'I' THEN
910                   x_return_status := FND_API.G_RET_STS_ERROR;
911                   LOG_ERR_MSG ( 'XTR_1237');
912               END IF;
913               CLOSE c_duplicate_date;
914 -- Checking for interest includes/ interest rounding
915               IF ((NOT CHK_ROUNDING_CHANGE ( p_company_code ,p_account_number ,p_balance_date )) AND p_interest_calc_balance IS NOT NULL) THEN
916                   x_return_status := FND_API.G_RET_STS_ERROR;
917                   LOG_ERR_MSG ( 'XTR_TYPES_CHANGED');
918               END IF;
919 
920 -- Checking for revaluations
921 
922               l_return_error := chk_reval( p_company_code,
923                                       p_account_number,
924                                       l_currency,
925                                       p_balance_date,
926                                       p_ce_bank_account_balance_id,
927                                       p_available_balance,
928                                       p_action_flag,
929                                       'E');
930 
931 
932                IF nvl(l_return_error, 'XXX') = 'XTR_CA_REVAL_DONE' THEN
933                       x_return_status := FND_API.G_RET_STS_ERROR;
934                        LOG_ERR_MSG ( 'XTR_CA_REVAL_DONE');
935                ELSIF nvl(l_return_error, 'XXX') = 'XTR_REVAL_ACCRL_DATE' THEN
936                       x_return_status := FND_API.G_RET_STS_ERROR;
937                        LOG_ERR_MSG ( 'XTR_REVAL_ACCRL_DATE',p_balance_date);
938                ELSIF nvl(l_return_error, 'XXX') = 'XTR_BANK_REVAL_DONE' THEN
939                       x_return_status := FND_API.G_RET_STS_ERROR;
940                        LOG_ERR_MSG ( 'XTR_BANK_REVAL_DONE',p_balance_date);
941                END IF;
942 
943 
944  -- Checking for accruals
945 
946               l_return_error := chk_accrual( p_company_code,
947                                       p_account_number,
948                                       l_currency,
949                                       p_balance_date,
950                                       p_ce_bank_account_balance_id,
951                                       p_interest_calc_balance,
952                                       p_action_flag,
953                                       'E');
954 
955                IF nvl(l_return_error, 'XXX') = 'XTR_BANK_ACCRLS_EXIST' THEN
956                       x_return_status := FND_API.G_RET_STS_ERROR;
957                        LOG_ERR_MSG ( 'XTR_BANK_ACCRLS_EXIST',p_balance_date);
958 
959                ELSIF nvl(l_return_error, 'XXX') = 'XTR_REVAL_ACCRL_DATE' THEN
960                       x_return_status := FND_API.G_RET_STS_ERROR;
961                        LOG_ERR_MSG ( 'XTR_REVAL_ACCRL_DATE',p_balance_date);
962                END IF;
963 
964        ELSIF  p_action_flag = 'D'  THEN
965 
966               CLOSE c_portfolio;
967 
968 
969                -- Checking for interest includes/ interest rounding
970 
971               IF ((NOT CHK_ROUNDING_CHANGE( p_company_code ,p_account_number ,p_balance_date )) AND p_interest_calc_balance IS NOT NULL) THEN
972                   x_return_status := FND_API.G_RET_STS_ERROR;
973                   LOG_ERR_MSG ( 'XTR_CHANGED_DAYCOUNT_ROUND');
974               END IF;
975 
976               -- Checking for revaluations
977               l_return_error := chk_reval( p_company_code,
978                                       p_account_number,
979                                       l_currency,
980                                       p_balance_date,
981                                       p_ce_bank_account_balance_id,
982                                       p_available_balance,
983                                       'D',
984                                       'E');
985 
986                IF nvl(l_return_error, 'XXX') = 'XTR_ACCT_DELETE' THEN
987                       x_return_status := FND_API.G_RET_STS_ERROR;
988                        LOG_ERR_MSG ( 'XTR_ACCT_DELETE');
989                END IF;
990 
991 
992               -- Checking for accruals
993               l_return_error := chk_accrual( p_company_code,
994                                       p_account_number,
995                                       l_currency,
996                                       p_balance_date,
997                                       p_ce_bank_account_balance_id,
998                                       p_interest_calc_balance,
999                                       'D',
1000                                       'E');
1001 
1002                IF nvl(l_return_error, 'XXX') = 'XTR_DEAL_ACCRLS_EXIST' THEN
1003                       x_return_status := FND_API.G_RET_STS_ERROR;
1004                       LOG_ERR_MSG ( 'XTR_DEAL_ACCRLS_EXIST',p_balance_date);
1005                END IF;
1006 
1007        END IF ;  --  p_action_flag
1008 
1009 EXCEPTION
1010   WHEN others THEN
1011 
1012            LOG_ERR_MSG('XTR_UNEXP_ERROR',SQLERRM(SQLCODE));
1013            x_return_status    := FND_API.G_RET_STS_UNEXP_ERROR;
1014 
1015 END VALIDATE_BANK_BALANCE;
1016 
1017 
1018 PROCEDURE VALIDATE_BANK_BALANCE
1019     ( p_company_code IN xtr_bank_balances.company_code%TYPE,
1020       p_account_number IN xtr_bank_balances.account_number%TYPE,
1021       p_balance_date IN xtr_bank_balances.balance_date%TYPE,
1022       p_ce_bank_account_balance_id IN xtr_bank_balances.ce_bank_account_balance_id%TYPE default null,
1023       p_interest_calc_balance IN NUMBER,
1024       p_available_balance in NUMBER,
1025       p_action_flag IN VARCHAR2,
1026       x_return_status   		OUT NOCOPY  	VARCHAR2,
1027       x_msg_count			OUT NOCOPY 	NUMBER,
1028       x_msg_data			OUT NOCOPY 	VARCHAR2) IS
1029 
1030 CURSOR C_BALANCE_DETAILS IS
1031     SELECT company_code,account_number,balance_date,statement_balance
1032             ,balance_adjustment,balance_cflow,ce_bank_account_balance_id
1033     FROM XTR_BANK_BALANCES
1034     WHERE CE_BANK_ACCOUNT_BALANCE_ID = p_ce_bank_account_balance_id;
1035 
1036 
1037     l_balance_date_updated BOOLEAN;
1038     l_balance_rec XTR_BANK_BALANCES%ROWTYPE;
1039 
1040 BEGIN
1041 
1042         x_return_status := FND_API.G_RET_STS_SUCCESS;
1043         l_balance_date_updated := FALSE;
1044         FND_MSG_PUB.Initialize;
1045         IF(p_action_flag in ('U','D')) THEN
1046 
1047             OPEN C_BALANCE_DETAILS;
1048             FETCH C_BALANCE_DETAILS INTO l_balance_rec.company_code,l_balance_rec.account_number
1049                                 ,l_balance_rec.balance_date,l_balance_rec.statement_balance,l_balance_rec.balance_adjustment
1050                                 ,l_balance_rec.balance_cflow,l_balance_rec.ce_bank_account_balance_id;
1051             CLOSE C_BALANCE_DETAILS;
1052 
1053 
1054             IF(nvl(p_balance_date,sysdate) <> nvl(l_balance_rec.balance_date,sysdate)
1055                 AND p_balance_date is not null AND l_balance_rec.balance_date is not null
1056                 AND p_action_flag = 'U') THEN
1057 
1058                 l_balance_date_updated := TRUE;
1059 
1060             END IF;
1061 
1062         END IF;
1063 
1064         IF(NOT l_balance_date_updated) THEN -- Balance date is not updated
1065           IF (p_action_flag in ('I','U') )THEN
1066             VALIDATE_BANK_BALANCE(
1067                             p_company_code,
1068                             p_account_number,
1069                             p_balance_date,
1070                             p_ce_bank_account_balance_id,
1071                             p_interest_calc_balance,
1072                             p_available_balance,
1073                             p_action_flag,
1074                             x_return_status );
1075         END IF;
1076         IF (p_action_flag in ('D')) THEN
1077             VALIDATE_BANK_BALANCE(
1078                             l_balance_rec.company_code,
1079                             l_balance_rec.account_number,
1080                             l_balance_rec.balance_date,
1081                             p_ce_bank_account_balance_id,
1082                             l_balance_rec.statement_balance+l_balance_rec.balance_adjustment,
1083                             l_balance_rec.balance_cflow,
1084                             'D',
1085                             x_return_status );
1086         END IF;
1087 
1088     ELSIF(l_balance_date_updated) THEN
1089 
1090               VALIDATE_BANK_BALANCE(
1091                             p_company_code,
1092                             p_account_number,
1093                             p_balance_date,
1094                             p_ce_bank_account_balance_id,
1095                             p_interest_calc_balance,
1096                             p_available_balance,
1097                             'D',
1098                             x_return_status );
1099 
1100               IF  x_return_status = FND_API.G_RET_STS_SUCCESS  THEN
1101                 VALIDATE_BANK_BALANCE(
1102                             p_company_code,
1103                             p_account_number,
1104                             p_balance_date,
1105                             p_ce_bank_account_balance_id,
1106                             p_interest_calc_balance,
1107                             p_available_balance,
1108                             'I',
1109                             x_return_status );
1110             END IF;
1111 
1112 
1113     END IF;
1114 
1115     FND_MSG_PUB.Count_And_Get -- Returns the error message if there is only 1 error
1116     (   p_count         =>      x_msg_count     ,
1117         p_data          =>      x_msg_data
1118     );
1119 
1120 
1121 EXCEPTION
1122 
1123       WHEN others THEN
1124           x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1125           LOG_ERR_MSG ('XTR_UNEXP_ERROR',SQLERRM(SQLCODE));
1126 
1127       FND_MSG_PUB.Count_And_Get -- Returns the error message if there is only 1 error
1128     (   p_count         =>      x_msg_count     ,
1129         p_data          =>      x_msg_data
1130     );
1131 
1132 END VALIDATE_BANK_BALANCE;
1133 
1134 
1135 
1136 
1137 FUNCTION CHK_ACCRUAL ( p_company_code IN xtr_bank_balances.company_code%TYPE
1138                         , p_account_number IN xtr_bank_balances.account_number%TYPE
1139                         , p_currency IN xtr_bank_accounts.currency%TYPE
1140                         , p_balance_date IN xtr_bank_balances.balance_date%TYPE
1141                         , p_ce_bank_account_balance_id IN xtr_bank_balances.ce_bank_account_balance_id%TYPE DEFAULT NULL
1142                         , p_interest_calc_balance IN NUMBER
1143                         , p_action_flag IN VARCHAR2
1144                         , p_val_type IN VARCHAR2)
1145                         RETURN VARCHAR2
1146 IS
1147 
1148 l__val_type varchar2(1);
1149 l_error VARCHAR2(50);
1150 l_accrual_deal_date   DATE;
1151 l_accrual_batch_date  DATE;
1152 l_interest_calc_balance NUMBER;
1153 
1154 -- Check whether the accruals have been run for that particular deal
1155 CURSOR c_accrl_deal  IS
1156    SELECT max(period_to)
1157    FROM
1158           xtr_bank_balances bb, xtr_bank_accounts ba,
1159           xtr_deal_date_amounts dd, xtr_accrls_amort aa
1160    WHERE bb.company_code   = p_company_code
1161    AND   bb.account_number = p_account_number
1162    AND 	 bb.company_code   = ba.party_code
1163    AND   bb.account_number = ba.account_number
1164    AND   ba.currency       = p_currency
1165    AND 	 bb.company_code   = dd.company_code
1166    AND   bb.account_number = dd.account_no
1167    AND   ba.currency       = dd.currency
1168    AND   dd.deal_number    = aa.deal_no;
1169 
1170 -- Check whether the accruals have been run for period greater than the
1171 -- balance date entered by the user
1172 CURSOR c_accrl_comp IS
1173    SELECT max(period_end)
1174    FROM
1175           xtr_batches b, xtr_batch_events e
1176    WHERE  b.company_code = p_company_code
1177    AND   b.batch_id     = e.batch_id
1178    AND   e.event_code   = 'ACCRUAL'
1179    AND   b.period_end   >=p_balance_date;
1180 
1181 
1182 -- Getting the interest calc amount from the database for the updated record
1183 CURSOR c_accrl_amount IS
1184    SELECT BALANCE_ADJUSTMENT + STATEMENT_BALANCE
1185    FROM
1186          xtr_bank_balances bb
1187    WHERE
1188 	     bb.company_code   = p_company_code
1189    AND   bb.account_number = p_account_number
1190    AND   ce_bank_account_balance_id = p_ce_bank_account_balance_id;
1191 
1192 
1193 
1194 BEGIN
1195      IF p_action_flag  IN ('D','U') THEN
1196 
1197          OPEN  c_accrl_deal;
1198          FETCH c_accrl_deal INTO l_accrual_deal_date;
1199          CLOSE c_accrl_deal;
1200 
1201          IF l_accrual_deal_date IS NOT NULL AND l_accrual_deal_date >= p_balance_date THEN
1202 
1203                 IF p_action_flag = 'U' THEN
1204 
1205                     OPEN  c_accrl_amount;
1206                     FETCH c_accrl_amount INTO l_interest_calc_balance;
1207                     CLOSE c_accrl_amount;
1208 
1209                     IF l_interest_calc_balance <> p_interest_calc_balance
1210                         AND p_val_type = 'E' THEN
1211                           l_error := 'XTR_DEAL_ACCRLS_EXIST';
1212 
1213                     END IF;
1214 
1215                 ELSIF p_action_flag = 'D' AND p_val_type = 'E'THEN
1216                      	  l_error := 'XTR_DEAL_ACCRLS_EXIST';
1217 	            END IF;
1218          END IF;
1219     ELSIF (p_action_flag = 'I'  AND nvl(p_interest_calc_balance,0) <> 0) THEN
1220             OPEN  c_accrl_deal;
1221             FETCH c_accrl_deal INTO l_accrual_deal_date;
1222             CLOSE c_accrl_deal;
1223             IF l_accrual_deal_date IS NULL THEN
1224                    OPEN  c_accrl_comp;
1225                    FETCH c_accrl_comp INTO l_accrual_batch_date;
1226              	   CLOSE c_accrl_comp;
1227 
1228                    IF l_accrual_batch_date IS NOT NULL
1229                           AND l_accrual_batch_date >= p_balance_date AND p_val_type = 'W' THEN
1230                            l_error := 'XTR_DEALS_BEFORE_ACCRUAL'; -- Warning message
1231 
1232                    END IF;
1233             ELSIF l_accrual_deal_date IS NOT NULL
1234                          AND l_accrual_deal_date >= p_balance_date AND p_val_type = 'E' THEN
1235 
1236                           l_error := 'XTR_DEALS_ACCRLS_EXIST';
1237 
1238             END IF;
1239 
1240 
1241     END IF; -- p_action_flag
1242 RETURN l_error;
1243 END CHK_ACCRUAL;
1244 
1245 
1246 
1247 -- This function checks whether the revaluations have been run at the time of
1248 -- insertion/updation/deletion
1249 
1250 FUNCTION    CHK_REVAL ( p_company_code IN xtr_bank_balances.company_code%TYPE
1251                         , p_account_number IN xtr_bank_balances.account_number%TYPE
1252                         , p_currency IN xtr_bank_accounts.currency%TYPE
1253                         , p_balance_date IN xtr_bank_balances.balance_date%TYPE
1254                         , p_ce_bank_account_balance_id IN xtr_bank_balances.ce_bank_account_balance_id%TYPE DEFAULT NULL
1255                         , p_balance_cflow IN xtr_bank_balances.balance_cflow%TYPE
1256                         , p_action_flag IN VARCHAR2
1257                         , p_val_type IN VARCHAR2 )
1258                         RETURN VARCHAR2
1259 IS
1260 
1261 l_error VARCHAR2(50);
1262 l_reval_deal_date   DATE;
1263 l_reval_batch_date  DATE;
1264 l_reval_delete_date DATE;
1265 l_balance_cflow  xtr_bank_balances.balance_cflow%TYPE;
1266 
1267 
1268 -- Check whether the revaluations have been run for period greater than the
1269 -- balance date entered by the user
1270 CURSOR c_reval_comp IS
1271    SELECT max(period_end)
1272    FROM
1273          xtr_batches b,xtr_batch_events e
1274    WHERE
1275          b.company_code = p_company_code
1276    AND   b.batch_id     = e.batch_id
1277    AND   e.event_code   = 'REVAL'
1278    AND   b.period_end  >= p_balance_date;
1279 
1280 
1281 CURSOR c_deal_delete IS
1282    SELECT max(bb.balance_date)
1283    FROM
1284          xtr_bank_balances bb,xtr_bank_accounts ba
1285    WHERE
1286 	 bb.company_code   = p_company_code
1287    AND   bb.account_number = p_account_number
1288    AND 	 bb.company_code   = ba.party_code
1289    AND   bb.account_number = ba.account_number
1290    AND   ba.currency       = p_currency
1291    AND   bb.first_batch_id IS NOT NULL;
1292 
1293 
1294 -- Check whether the revaluations have been run for that particular deal
1295 CURSOR c_reval_deal IS
1296    SELECT max(period_to)
1297    FROM
1298          xtr_bank_balances bb,xtr_bank_accounts ba,
1299          xtr_revaluation_details rd
1300    WHERE
1301 	     bb.company_code   = p_company_code
1302    AND   bb.account_number = p_account_number
1303    AND 	 bb.company_code   = ba.party_code
1304    AND   bb.account_number = ba.account_number
1305    AND   ba.currency       = p_currency
1306    AND   bb.account_number = rd.account_no
1307    AND   rd.deal_type      = 'CA';
1308 
1309 -- Getting the cashflow amount from the database for the updated record
1310 CURSOR c_reval_amount IS
1311    SELECT BALANCE_CFLOW
1312    FROM
1313          xtr_bank_balances bb
1314    WHERE
1315 	     bb.company_code   = p_company_code
1316    AND   bb.account_number = p_account_number
1317    AND   ce_bank_account_balance_id = p_ce_bank_account_balance_id;
1318 
1319 
1320 
1321 BEGIN
1322   -- checking at time of updation of balance
1323    IF p_action_flag = 'U' THEN
1324 
1325        OPEN   c_reval_deal;
1326 	   FETCH  c_reval_deal INTO l_reval_deal_date;
1327        CLOSE  c_reval_deal;
1328 
1329        IF l_reval_deal_date IS NOT NULL AND l_reval_deal_date >= p_balance_date THEN
1330            -- checks whether the changed amount is same as the database amount
1331             OPEN   c_reval_amount;
1332 	        FETCH  c_reval_amount INTO l_balance_cflow;
1333             CLOSE  c_reval_amount;
1334             IF (l_balance_cflow <> p_balance_cflow AND p_val_type = 'E')THEN
1335                   l_error := 'XTR_DEAL_REVAL_DONE';
1336             END IF;
1337 
1338         END IF;
1339 
1340    -- checking at time deletion of balance
1341    ELSIF p_action_flag = 'D' THEN
1342 
1343        OPEN  c_deal_delete ;
1344        FETCH c_deal_delete  INTO l_reval_delete_date;
1345        CLOSE c_deal_delete ;
1346 
1347        IF l_reval_delete_date IS NOT NULL AND l_reval_delete_date >= p_BALANCE_DATE
1348            AND p_val_type = 'E'THEN
1349 	       l_error :='XTR_ACCT_DELETE';
1350 	   END IF;
1351 
1352    -- checking at time insertion of balance
1353    -- Added the condition for checking balance not 0
1354    ELSIF (p_action_flag = 'I' AND nvl(p_balance_cflow,0) <> 0) THEN
1355 
1356        OPEN  c_reval_deal;
1357        FETCH c_reval_deal INTO l_reval_deal_date;
1358        CLOSE c_reval_deal;
1359        IF l_reval_deal_date IS NULL THEN
1360            OPEN  c_reval_comp;
1361            FETCH c_reval_comp INTO l_reval_batch_date;
1362            CLOSE c_reval_comp;
1363 
1364            IF l_reval_batch_date IS NOT NULL AND l_reval_batch_date >= p_balance_date
1365               AND p_val_type = 'W' THEN
1366                  l_error := 'XTR_DEALS_BEFORE_REVAL'; -- warning message
1367            END IF;
1368 
1369        ELSIF l_reval_deal_date IS NOT NULL AND l_reval_deal_date >= p_balance_date
1370              AND p_val_type = 'E' THEN
1371               l_error := 'XTR_CA_REVAL_DONE';
1372 
1373        END IF;
1374 
1375   END IF;  --  p_action_flag
1376 
1377 RETURN l_error;
1378 
1379 END CHK_REVAL;
1380 
1381 
1382 
1383 PROCEDURE UPDATE_BANK_ACCOUNT
1384      ( p_company_code IN xtr_bank_balances.company_code%TYPE,
1385        p_account_number IN xtr_bank_balances.account_number%TYPE,
1386        p_balance_date IN xtr_bank_balances.balance_date%TYPE,
1387        p_action_flag IN VARCHAR2,
1388        x_return_status   OUT NOCOPY  	VARCHAR2
1389        )
1390 IS
1391 
1392 l_ccy   xtr_bank_accounts.currency%TYPE;
1393 l_portfolio_code  xtr_bank_accounts.portfolio_code%TYPE;
1394 l_bank_code  xtr_bank_accounts.bank_code%TYPE;
1395 l_cross_ref  xtr_party_info.cross_ref_to_other_party%TYPE;
1396 l_bal_exists  VARCHAR2(10);
1397 l_dummy_num   VARCHAR2(1);
1398 l_bal_date    xtr_bank_balances.balance_date%TYPE;
1399 l_accum_int_cfwd  xtr_bank_balances.accum_int_cfwd%TYPE;
1400 
1401 CURSOR C_SUBSIDIARY IS
1402    SELECT CROSS_REF_TO_OTHER_PARTY
1403    FROM   XTR_PARTIES_V
1404    WHERE  PARTY_CODE = p_company_code;
1405 
1406 
1407 CURSOR C_ACCT_DETAILS IS
1408   SELECT CURRENCY,PORTFOLIO_CODE,BANK_CODE
1409   FROM XTR_BANK_ACCOUNTS
1410   WHERE ACCOUNT_NUMBER = p_account_number
1411   AND   PARTY_CODE     = p_company_code;
1412 
1413 -- To check whether the 'BAL' row exists in DDA table
1414 CURSOR C_BAL_EXISTS IS
1415   SELECT 'Y'
1416   FROM   XTR_DEAL_DATE_AMOUNTS_V
1417   WHERE  ACCOUNT_NO   = p_account_number
1418   AND    COMPANY_CODE = nvl(l_cross_ref,p_company_code)
1419   AND    CURRENCY     = l_ccy
1420   AND    AMOUNT_DATE  = p_balance_date
1421   AND    AMOUNT_TYPE  = 'BAL';
1422 
1423 -- To find the latest date which is less the than date for the user
1424 -- is deleting the balance
1425 
1426 CURSOR C_BAL_DATE IS
1427   SELECT max(BALANCE_DATE)
1428   FROM   XTR_BANK_BALANCES_V
1429   WHERE  ACCOUNT_NUMBER = p_account_number
1430   AND    COMPANY_CODE   = p_company_code
1431   AND    BALANCE_DATE   < p_balance_date;
1432 
1433 
1434 --
1435 CURSOR C_ACCUM_INT IS
1436  SELECT ACCUM_INT_CFWD
1437  FROM XTR_BANK_BALANCES
1438  WHERE ACCOUNT_NUMBER = P_ACCOUNT_NUMBER
1439  AND COMPANY_CODE = P_COMPANY_CODE
1440  AND BALANCE_DATE = (SELECT MAX(BALANCE_DATE) FROM
1441                     XTR_BANK_BALANCES
1442                     WHERE ACCOUNT_NUMBER = P_ACCOUNT_NUMBER
1443                     AND COMPANY_CODE = P_COMPANY_CODE);
1444 
1445 BEGIN
1446 
1447 x_return_status := FND_API.G_RET_STS_SUCCESS; -- Added Bug 4546183
1448 OPEN C_ACCT_DETAILS;
1449 FETCH C_ACCT_DETAILS INTO l_ccy,l_portfolio_code, l_bank_code;
1450 CLOSE C_ACCT_DETAILS;
1451 
1452 
1453 OPEN C_SUBSIDIARY;
1454 FETCH C_SUBSIDIARY INTO l_cross_ref;
1455 CLOSE C_SUBSIDIARY;
1456 
1457 
1458 OPEN C_ACCUM_INT;
1459 FETCH C_ACCUM_INT INTO L_ACCUM_INT_CFWD;
1460 IF l_accum_int_cfwd is null then
1461    l_accum_int_cfwd := 0 ;
1462 end if;
1463 CLOSE C_ACCUM_INT;
1464 
1465 IF p_action_flag = 'I' THEN
1466 
1467           XTR_ACCOUNT_BAL_MAINT_P.UPDATE_BANK_ACCTS(
1468                   p_account_number,
1469 			      l_ccy,
1470 				  l_bank_code,
1471 				  l_portfolio_code,
1472 				  l_cross_ref,
1473 				  p_company_code,
1474 				  p_balance_date,
1475 				  l_accum_int_cfwd,
1476 				  l_dummy_num
1477 			      );
1478 
1479 ELSIF p_action_flag = 'D' THEN
1480 
1481        OPEN C_BAL_EXISTS;
1482        FETCH C_BAL_EXISTS INTO l_bal_exists;
1483        IF C_BAL_EXISTS%FOUND THEN
1484             OPEN C_BAL_DATE;
1485             FETCH C_BAL_DATE INTO l_bal_date;
1486             CLOSE C_BAL_DATE;
1487        END IF;
1488        CLOSE C_BAL_EXISTS;
1489 
1490        XTR_ACCOUNT_BAL_MAINT_P.UPDATE_BANK_ACCTS(
1491                   p_account_number,
1492 			      l_ccy,
1493 				  l_bank_code,
1494 				  l_portfolio_code,
1495 				  l_cross_ref,
1496 				  p_company_code,
1497 				  nvl(l_bal_date, p_balance_date),
1498 				  l_accum_int_cfwd,
1499 				  l_dummy_num
1500 			      );
1501 
1502 ELSIF p_action_flag = 'U' THEN
1503 
1504        XTR_ACCOUNT_BAL_MAINT_P.UPDATE_BANK_ACCTS(
1505                   p_account_number,
1506 			      l_ccy,
1507 				  l_bank_code,
1508 				  l_portfolio_code,
1509 				  l_cross_ref,
1510 				  p_company_code,
1511 				  p_balance_date,
1512 				  l_accum_int_cfwd,
1513 				  l_dummy_num
1514 			      );
1515 
1516 END IF;
1517 
1518 END UPDATE_BANK_ACCOUNT;
1519 
1520 
1521 /*
1522   This FUNCTION will be called BY CE AT THE TIME WHEN THE balance page IS rendered
1523   TO ENABLE/DISABLE THE balance DATE
1524 
1525   THE same fuction will be also called FOR VALIDATION OF THE RECORD during
1526   insertion/updation/deletion
1527 
1528 */
1529 
1530 FUNCTION CHK_ROUNDING_CHANGE ( p_company_code IN xtr_bank_balances.company_code%TYPE,
1531                                p_account_number IN xtr_bank_balances.account_number%TYPE,
1532                                p_balance_date IN xtr_bank_balances.balance_date%TYPE)
1533                                RETURN BOOLEAN IS
1534 
1535  CURSOR c_chk_bal IS
1536   SELECT count(balance_date)
1537   FROM XTR_BANK_BALANCES  a
1538   WHERE a.ACCOUNT_NUMBER = p_account_number
1539   AND a.COMPANY_CODE = p_company_code;
1540 
1541 
1542  CURSOR c_chk_type IS
1543   SELECT COUNT(DISTINCT ROUNDING_TYPE||'-'||DAY_COUNT_TYPE)
1544   FROM XTR_BANK_BALANCES  a
1545   WHERE a.ACCOUNT_NUMBER = p_account_number
1546   AND a.COMPANY_CODE = p_company_code
1547   AND a.BALANCE_DATE >=  (SELECT max(balance_date)
1548 			FROM xtr_bank_balances b
1549 			WHERE b.account_number = p_account_number
1550 			AND b.company_code = p_company_code
1551 			AND b.balance_date < p_balance_date);
1552 
1553  l_chk_bal      NUMBER;
1554  l_count	NUMBER;
1555 BEGIN
1556 
1557  OPEN c_chk_bal;
1558  FETCH c_chk_bal INTO l_chk_bal;
1559  CLOSE c_chk_bal;
1560 
1561   IF l_chk_bal >= 1 THEN  -- Bug 5393641
1562      OPEN c_chk_type;
1563      FETCH c_chk_type INTO l_count;
1564      CLOSE c_chk_type;
1565 
1566      IF l_count <= 1 THEN
1567           RETURN(TRUE);
1568      ELSE
1569          RETURN(FALSE);
1570      END IF;
1571   ELSE
1572       RETURN(TRUE);
1573   END IF;
1574 
1575 END CHK_ROUNDING_CHANGE;
1576 
1577 
1578 
1579 /* This function will be called by CE when the one account- multiple balance
1580  * date page is rendered to enable/disable the balance date and delete button
1581 
1582 This will be also called by the validate_bank_balance procedure at the time of
1583 deletion of the record
1584 */
1585 
1586 FUNCTION CHK_INTEREST_SETTLED
1587         (  p_ce_bank_account_id IN xtr_bank_accounts.ce_bank_account_id%TYPE
1588            , p_balance_date IN xtr_bank_balances.balance_date%TYPE
1589         )return VARCHAR2 is
1590 
1591 l_return VARCHAR2(2);
1592 l_dummy   VARCHAR2(1);
1593 l_company_code XTR_BANK_ACCOUNTS.party_code%TYPE;
1594 l_account_number XTR_BANK_ACCOUNTS.account_number%TYPE;
1595 l_currency XTR_BANK_ACCOUNTS.currency%TYPE;
1596 
1597 
1598   CURSOR c_account_details IS
1599     SELECT party_code, account_number,currency
1600     FROM XTR_BANK_ACCOUNTS
1601     WHERE ce_bank_account_id = p_ce_bank_account_id;
1602 
1603   cursor INT_SETTLED is
1604   select 'Y'
1605     from XTR_DEAL_DATE_AMOUNTS_V
1606    where DEAL_TYPE    = 'CA'
1607      and AMOUNT_TYPE  = 'INTSET'
1608      and ACCOUNT_NO   = l_account_number
1609      and CURRENCY     = l_currency
1610      and COMPANY_CODE = l_company_code
1611      and AMOUNT_DATE  = p_balance_date
1612      and (Batch_Id IS NOT NULL or nvl(SETTLE, 'N') = 'Y');
1613 
1614 
1615 BEGIN
1616 
1617      l_return := 'Y';
1618 
1619      IF(p_ce_bank_account_id is not null and p_balance_date is not null) THEN
1620 
1621         OPEN c_account_details;
1622         FETCH c_account_details INTO l_company_code,l_account_number,l_currency;
1623         CLOSE c_account_details;
1624 
1625         open INT_SETTLED;
1626         fetch INT_SETTLED into l_dummy;
1627         if INT_SETTLED%FOUND then
1628             close INT_SETTLED;
1629             l_return := 'N';
1630         else
1631             close INT_SETTLED;
1632             l_return := 'Y';
1633         end if;
1634 
1635      END If;
1636 
1637 END CHK_INTEREST_SETTLED;
1638 
1639 
1640 
1641 
1642 -- This function will be called by CE at the time when the balabce page is rendered
1643 -- to enable/disable the available balance
1644 
1645 FUNCTION CHK_REVAL_ON_RENDER
1646                        ( p_company_code IN xtr_bank_balances.company_code%TYPE
1647                         , p_account_number IN xtr_bank_balances.account_number%TYPE
1648                         , p_currency IN xtr_bank_accounts.currency%TYPE
1649                         , p_balance_date IN xtr_bank_balances.balance_date%TYPE
1650                        )RETURN BOOLEAN
1651 IS
1652 
1653 l_reval_deal_date   DATE;
1654 l_reval_delete_date DATE;
1655 
1656 -- Check whether the revaluations have been run for that particular deal
1657 CURSOR c_reval_deal IS
1658    SELECT max(period_to)
1659    FROM
1660          xtr_bank_balances bb,xtr_bank_accounts ba,
1661          xtr_revaluation_details rd
1662    WHERE
1663 	     bb.company_code   = p_company_code
1664    AND   bb.account_number = p_account_number
1665    AND 	 bb.company_code   = ba.party_code
1666    AND   bb.account_number = ba.account_number
1667    AND   ba.currency       = p_currency
1668    AND   bb.account_number = rd.account_no
1669    AND   rd.deal_type      = 'CA';
1670 
1671 
1672 CURSOR c_deal_delete IS
1673    SELECT max(bb.balance_date)
1674    FROM
1675          xtr_bank_balances bb,xtr_bank_accounts ba
1676    WHERE
1677 	 bb.company_code   = p_company_code
1678    AND   bb.account_number = p_account_number
1679    AND 	 bb.company_code   = ba.party_code
1680    AND   bb.account_number = ba.account_number
1681    AND   ba.currency       = p_currency
1682    AND   bb.first_batch_id IS NOT NULL;
1683 
1684 BEGIN
1685 
1686       OPEN   c_reval_deal;
1687 	  FETCH  c_reval_deal INTO l_reval_deal_date;
1688       CLOSE  c_reval_deal;
1689 
1690       OPEN  c_deal_delete ;
1691       FETCH c_deal_delete  INTO l_reval_delete_date;
1692       CLOSE c_deal_delete ;
1693 
1694 
1695       IF (l_reval_deal_date IS NOT NULL AND l_reval_deal_date >= p_balance_date)
1696           OR ( l_reval_delete_date IS NOT NULL AND l_reval_delete_date >= p_BALANCE_DATE) THEN
1697            RETURN(FALSE);
1698       ELSE
1699            RETURN(TRUE);
1700       END IF;
1701 
1702 END CHK_REVAL_ON_RENDER;
1703 
1704 
1705 -- This function will be called by CE at the time when the balabce page is rendered
1706 -- to enable/disable the interest calculated balance
1707 FUNCTION CHK_ACCRUAL_ON_RENDER
1708                        ( p_company_code IN xtr_bank_balances.company_code%TYPE
1709                         , p_account_number IN xtr_bank_balances.account_number%TYPE
1710                         , p_currency IN xtr_bank_accounts.currency%TYPE
1711                         , p_balance_date IN xtr_bank_balances.balance_date%TYPE
1712                        )RETURN BOOLEAN
1713 IS
1714 
1715 l_accrual_deal_date   DATE;
1716 
1717 -- Check whether the accruals have been run for that particular deal
1718 CURSOR c_accrl_deal  IS
1719    SELECT max(period_to)
1720    FROM
1721           xtr_bank_balances bb, xtr_bank_accounts ba,
1722           xtr_deal_date_amounts dd, xtr_accrls_amort aa
1723    WHERE bb.company_code   = p_company_code
1724    AND   bb.account_number = p_account_number
1725    AND 	 bb.company_code   = ba.party_code
1726    AND   bb.account_number = ba.account_number
1727    AND   ba.currency       = p_currency
1728    AND 	 bb.company_code   = dd.company_code
1729    AND   bb.account_number = dd.account_no
1730    AND   ba.currency       = dd.currency
1731    AND   dd.deal_number    = aa.deal_no;
1732 
1733 
1734 
1735 BEGIN
1736 
1737 OPEN  c_accrl_deal;
1738       FETCH c_accrl_deal INTO l_accrual_deal_date;
1739       CLOSE c_accrl_deal;
1740 
1741       IF l_accrual_deal_date IS NOT NULL AND l_accrual_deal_date >= p_balance_date THEN
1742             RETURN(FALSE);
1743       ELSE
1744             RETURN(TRUE);
1745       END IF;
1746 
1747 END CHK_ACCRUAL_ON_RENDER;
1748 
1749 FUNCTION CHK_ACCRUAL_ON_RENDER
1750                        (  p_ce_bank_account_id IN xtr_bank_accounts.ce_bank_account_id%TYPE
1751                         , p_balance_date IN xtr_bank_balances.balance_date%TYPE
1752                        )return VARCHAR2 is
1753 l_return VARCHAR2(2);
1754 l_company_code XTR_BANK_ACCOUNTS.party_code%TYPE;
1755 l_account_number XTR_BANK_ACCOUNTS.account_number%TYPE;
1756 l_currency XTR_BANK_ACCOUNTS.currency%TYPE;
1757 CURSOR c_account_details IS
1758     SELECT party_code, account_number,currency
1759     FROM XTR_BANK_ACCOUNTS
1760     WHERE ce_bank_account_id = p_ce_bank_account_id;
1761 BEGIN
1762     l_return := 'Y';
1763   IF(p_ce_bank_account_id is not null and p_balance_date is not null) THEN
1764     OPEN c_account_details;
1765     FETCH c_account_details INTO l_company_code,l_account_number,l_currency;
1766     CLOSE c_account_details;
1767     IF( NOT CHK_ACCRUAL_ON_RENDER(l_company_code,l_account_number,l_currency,p_balance_date)) THEN
1768           l_return := 'N';
1769        END IF;
1770 
1771    END IF;
1772 
1773        RETURN l_return;
1774 END CHK_ACCRUAL_ON_RENDER;
1775 
1776 
1777 
1778 FUNCTION CHK_REVAL_ON_RENDER
1779                        (  p_ce_bank_account_id IN xtr_bank_accounts.ce_bank_account_id%TYPE
1780                         , p_balance_date IN xtr_bank_balances.balance_date%TYPE
1781                        )return VARCHAR2 is
1782 l_return VARCHAR2(2);
1783 l_company_code XTR_BANK_ACCOUNTS.party_code%TYPE;
1784 l_account_number XTR_BANK_ACCOUNTS.account_number%TYPE;
1785 l_currency XTR_BANK_ACCOUNTS.currency%TYPE;
1786 
1787 CURSOR c_account_details IS
1788     SELECT party_code, account_number,currency
1789     FROM XTR_BANK_ACCOUNTS
1790     WHERE ce_bank_account_id = p_ce_bank_account_id;
1791 
1792 BEGIN
1793     l_return := 'Y';
1794 
1795 IF(p_ce_bank_account_id is not null and p_balance_date is not null) THEN
1796     OPEN c_account_details;
1797     FETCH c_account_details INTO l_company_code,l_account_number,l_currency;
1798     CLOSE c_account_details;
1799     IF( NOT CHK_REVAL_ON_RENDER(l_company_code,l_account_number,l_currency,p_balance_date)) THEN
1800         l_return := 'N';
1801     END IF;
1802 END IF;
1803     RETURN l_return;
1804 END CHK_REVAL_ON_RENDER;
1805 
1806 
1807 
1808 
1809 PROCEDURE LOG_ERR_MSG
1810      (  p_error_code    IN  VARCHAR2,
1811         p_field_name    IN  VARCHAR2 DEFAULT NULL,
1812         p_balance_date  IN  xtr_bank_balances.balance_date%TYPE  DEFAULT NULL
1813      )
1814  IS
1815 
1816  BEGIN
1817 
1818         IF  p_error_code = 'XTR_PORTFOLIO' THEN
1819                FND_MESSAGE.Set_Name('XTR','XTR_2208');
1820                FND_MSG_PUB.ADD;
1821 
1822         ELSIF  p_error_code = 'XTR_INV_PRICING_MODEL' THEN
1823                FND_MESSAGE.Set_Name('XTR','XTR_INV_PRICING_MODEL');
1824                FND_MSG_PUB.ADD;
1825 
1826 	ELSIF  p_error_code = 'CE_NO_SCHED_BANK_ACCT' THEN
1827                FND_MESSAGE.Set_Name('CE','CE_NO_SCHED_BANK_ACCT');
1828                FND_MSG_PUB.ADD;
1829 
1830 
1831         ELSIF  p_error_code = 'XTR_REVAL_ACCRL_BANK' THEN
1832          /* warning has to be raised  will look into this later */
1833                FND_MESSAGE.Set_Name ('XTR', 'XTR_REVAL_ACCRL_BANK');
1834                FND_MESSAGE.Set_Token ('DATE',p_balance_date);
1835                 FND_MSG_PUB.ADD;
1836 
1837         ELSIF  p_error_code = 'XTR_BANK_ACCRLS_EXIST' THEN
1838                FND_MESSAGE.Set_Name ('XTR', 'XTR_BANK_ACCRLS_EXIST');
1839                FND_MESSAGE.Set_Token ('DATE',p_balance_date);
1840                FND_MSG_PUB.ADD;
1841 
1842         ELSIF  p_error_code = 'XTR_BANK_REVAL_DONE' THEN
1843                FND_MESSAGE.Set_Name ('XTR', 'XTR_BANK_REVAL_DONE');
1844                FND_MESSAGE.Set_Token ('DATE',p_balance_date);
1845                FND_MSG_PUB.ADD;
1846 
1847         ELSIF  p_error_code = 'XTR_ACCT_DELETE' THEN
1848                FND_MESSAGE.Set_Name ('XTR', 'XTR_ACCT_DELETE');
1849                FND_MSG_PUB.ADD;
1850 
1851          ELSIF  p_error_code = 'XTR_REVAL_ACCRL_DATE' THEN
1852           /* warning has to be raised  will look into this later */
1853                FND_MESSAGE.Set_Name ('XTR', 'XTR_REVAL_ACCRL_DATE');
1854                FND_MESSAGE.Set_Token ('DATE',p_balance_date);
1855                FND_MSG_PUB.ADD;
1856 
1857          ELSIF  p_error_code = 'XTR_CA_REVAL_DONE' THEN
1858                FND_MESSAGE.Set_Name ('XTR', 'XTR_CA_REVAL_DONE');
1859                FND_MSG_PUB.ADD;
1860 
1861           ELSIF  p_error_code = 'XTR_104' THEN
1862                 FND_MESSAGE.Set_Name ( 'XTR','XTR_104');
1863                 FND_MSG_PUB.ADD;
1864 
1865           ELSIF  p_error_code = 'XTR_1237' THEN
1866                 FND_MESSAGE.Set_Name ( 'XTR','XTR_1237');
1867                 FND_MSG_PUB.ADD;
1868 
1869           ELSIF p_error_code = 'XTR_UNEXP_ERROR' THEN
1870                 FND_MESSAGE.Set_Name('XTR','XTR_UNEXP_ERROR');
1871                 FND_MESSAGE.Set_Token('SQLCODE', p_field_name);
1872                 FND_MSG_PUB.ADD; -- Adds the error messages to the list.
1873 
1874            ELSIF p_error_code = 'CHK_LOCK' THEN
1875                FND_MESSAGE.Set_Name('XTR','XTR_1999');
1876                FND_MSG_PUB.ADD;
1877 
1878 
1879            ELSIF p_error_code = 'XTR_INV_PARAM' THEN
1880                FND_MESSAGE.Set_Name('XTR','XTR_INV_PARAM');
1881                 FND_MESSAGE.Set_Token('FIELD', p_field_name);
1882                FND_MSG_PUB.ADD;
1883 
1884            ELSIF p_error_code = 'XTR_TYPES_CHANGED' THEN
1885                FND_MESSAGE.Set_Name('XTR','XTR_TYPES_CHANGED');
1886                -- FND_MESSAGE.Set_Token('FIELD', p_field_name);
1887                FND_MSG_PUB.ADD;
1888 
1889            ELSIF p_error_code = 'XTR_CHANGED_DAYCOUNT_ROUND' THEN
1890                FND_MESSAGE.Set_Name('XTR', 'XTR_CHANGED_DAYCOUNT_ROUND');
1891              --  FND_MESSAGE.Set_Token('FIELD', p_field_name);
1892                FND_MSG_PUB.ADD;
1893 
1894 
1895 
1896 
1897         END IF;
1898 
1899 END LOG_ERR_MSG;
1900 
1901 
1902 /* This procedure updates the rounding_type and the day_count_type in the
1903 xtr_bank_balances IF THE same has been updated IN THE xtr_bank_accounts TABLE
1904 
1905 This will be called FORM xtr_replicate_bank_accounts API WHEN THE rounding TYPE/
1906 day_count_type has been updated IN THE interest schedules page OR THE
1907 schedule has been changed BY THE USER */
1908 
1909 
1910 PROCEDURE UPDATE_ROUNDING_DAYCOUNT
1911                    (p_ce_bank_account_id xtr_bank_accounts.ce_bank_account_id%TYPE
1912                     ,p_rounding_type  xtr_bank_accounts.rounding_type%TYPE
1913                     ,p_day_count_type xtr_bank_accounts.day_count_type%TYPE
1914                     ,x_return_status  OUT NOCOPY 	VARCHAR2
1915                     )
1916 
1917 IS
1918 
1919 l_old_rounding_type  xtr_bank_accounts.rounding_type%TYPE;
1920 l_old_day_count_type xtr_bank_accounts.day_count_type%TYPE;
1921 l_day_count_type xtr_bank_accounts.day_count_type%TYPE;
1922 l_party_code  xtr_bank_accounts.party_code%TYPE;
1923 l_account_number xtr_bank_accounts.account_number%TYPE;
1924 l_latest_date  DATE;
1925 l_oldest_date  DATE;
1926 l_acc_status  varchar2(20);
1927 l_batch_error varchar2(20);
1928 
1929 -- This cursor gets the existing rounding type/day count type from the
1930 -- xtr_bank_accounts table
1931 
1932 CURSOR c_old_types IS
1933   SELECT rounding_type, day_count_type, party_code, account_number
1934   FROM XTR_BANK_ACCOUNTS
1935   WHERE ce_bank_account_id = p_ce_bank_account_id;
1936 
1937 -- Gets the maximum balance date and the minimum balance date for that
1938 -- company and account
1939 CURSOR c_bal_date IS
1940   SELECT max(balance_date), min(balance_date)
1941   FROM XTR_BANK_BALANCES
1942   WHERE company_code = l_party_code
1943   AND account_number = l_account_number;
1944 
1945 -- Checking for record lock
1946 CURSOR c_chk_lock IS
1947 SELECT day_count_type
1948 FROM  xtr_bank_balances
1949 WHERE  company_code = l_party_code
1950        AND  account_number = l_account_number
1951 FOR UPDATE NOWAIT;
1952 
1953 
1954 
1955 BEGIN
1956 
1957 x_return_status := FND_API.G_RET_STS_SUCCESS;
1958 
1959     OPEN c_old_types;
1960     FETCH c_old_types INTO l_old_rounding_type, l_old_day_count_type,l_party_code,l_account_number;
1961     CLOSE c_old_types;
1962 
1963     IF l_old_rounding_type <> p_rounding_type
1964        OR l_old_day_count_type <> p_day_count_type THEN
1965 
1966             OPEN c_bal_date;
1967             FETCH c_bal_date INTO l_latest_date, l_oldest_date;
1968 
1969             IF c_bal_date%FOUND then
1970 
1971                  CLOSE c_bal_date;
1972 
1973                  l_batch_error := chk_int_override(l_party_code,l_account_number, l_oldest_date);
1974                  l_acc_status  := chk_accrual_int(l_party_code,l_account_number);
1975 
1976                  OPEN c_chk_lock;
1977                  FETCH c_chk_lock INTO  l_day_count_type;
1978                  IF c_chk_lock%FOUND THEN
1979 
1980                       CLOSE c_chk_lock;
1981 
1982                       IF l_batch_error IS NULL THEN
1983 
1984                           UPDATE xtr_bank_balances
1985                           SET rounding_type = p_rounding_type,
1986                     	  day_count_type = p_day_count_type
1987                           WHERE company_code =l_party_code
1988                           AND account_number = l_account_number;
1989 
1990                           UPDATE_BANK_ACCOUNT(l_party_code,
1991                                     l_account_number,
1992                                     l_oldest_date,
1993                                     'U' ,
1994                                     x_return_status );
1995 
1996 
1997 
1998                       ELSIF l_batch_error IS NOT NULL AND l_acc_status IS NOT NULL THEN
1999 
2000                           UPDATE xtr_bank_balances
2001                           SET rounding_type = p_rounding_type,
2002                      	  day_count_type = p_day_count_type
2003                           WHERE company_code =l_party_code
2004                           AND account_number = l_account_number
2005                           AND balance_date = l_latest_date;
2006 
2007                       END IF;     -- l_batch_error
2008 
2009                  ELSE
2010                       CLOSE c_chk_lock;
2011 
2012                  END IF;  -- c_chk_lock
2013 
2014             ELSE
2015 
2016                close c_bal_date;
2017 
2018             END IF; -- c_bal_date
2019 
2020     END IF;
2021 
2022 EXCEPTION
2023         WHEN app_exceptions.RECORD_LOCK_EXCEPTION THEN
2024             IF C_CHK_LOCK%ISOPEN THEN
2025                 CLOSE C_CHK_LOCK;
2026             END IF;
2027             LOG_ERR_MSG('CHK_LOCK');
2028             x_return_status := FND_API.G_RET_STS_ERROR;
2029         WHEN others THEN
2030           x_return_status    := FND_API.G_RET_STS_UNEXP_ERROR;
2031           LOG_ERR_MSG('XTR_UNEXP_ERROR',SQLERRM(SQLCODE));
2032 
2033 END UPDATE_ROUNDING_DAYCOUNT;
2034 
2035 
2036 
2037 FUNCTION CHK_INT_OVERRIDE (
2038             p_party_code xtr_bank_accounts.party_code%type
2039            ,p_account_number xtr_bank_accounts.account_number%type
2040            ,p_oldest_date DATE
2041            ) RETURN VARCHAR2 IS
2042 
2043 l_check_status	varchar2(1);
2044 l_batch_error varchar2(20);
2045 
2046 
2047 -- Settlement Check cursor
2048   cursor CHK_SETTLE is
2049     select 'Y'
2050     from xtr_bank_balances
2051     where account_number = p_ACCOUNT_NUMBER
2052     and nvl(interest_settled,0) <> 0;
2053 
2054 -- Accrual Check cursor
2055   cursor CHK_ACCRLS is
2056      select 'Y'
2057      from xtr_batches b, xtr_batch_events e
2058      where b.company_code = p_PARTY_CODE
2059      and b.batch_id = e.batch_id
2060      and e.event_code = 'ACCRUAL'
2061      and b.period_end > p_oldest_date;
2062 
2063 -- Journal Check cursor
2064   cursor CHK_JNLS is
2065       select 'Y'
2066       from xtr_batches b, xtr_batch_events e
2067       where b.company_code =p_PARTY_CODE
2068       and b.batch_id = e.batch_id
2069       and e.event_code = 'JRNLGN'
2070       and b.period_end > p_oldest_date;
2071 
2072 BEGIN
2073 
2074    l_check_status := 'N';
2075    l_batch_error := NULL;
2076 
2077    /* Check Settlement */
2078    Open CHK_SETTLE;
2079    fetch CHK_SETTLE into l_check_status;
2080    if CHK_SETTLE%FOUND then
2081       l_batch_error := 'SETTLE';
2082    end if;
2083    close CHK_SETTLE;
2084 
2085    IF l_batch_error is NULL then
2086     /* Check Accruals */
2087         open CHK_ACCRLS;
2088         fetch CHK_ACCRLS into l_check_status;
2089         if CHK_ACCRLS%FOUND then
2090               l_batch_error := 'ACCRUE';
2091         END IF;
2092         close CHK_ACCRLS;
2093    END IF;
2094 
2095    IF l_batch_error is NULL then
2096      /* Check Journals */
2097         open CHK_JNLS;
2098         fetch CHK_JNLS into l_check_status;
2099         if CHK_JNLS%FOUND then
2100               l_batch_error := 'JOURL';
2101         END IF;
2102         close CHK_JNLS;
2103 
2104    END IF;
2105 RETURN l_batch_error;
2106 END CHK_INT_OVERRIDE;
2107 
2108 
2109 
2110 FUNCTION  CHK_ACCRUAL_INT (
2111               p_party_code xtr_bank_accounts.party_code%type
2112              ,p_account_number xtr_bank_accounts.account_number%type
2113               )RETURN varchar2 IS
2114 
2115  l_acc_int	number;
2116  l_acc_status  varchar2(20);
2117 
2118  cursor CHK_ACC_INT is
2119    select accum_int_cfwd
2120      from xtr_bank_balances
2121     where account_number = p_ACCOUNT_NUMBER
2122       and company_code = p_PARTY_CODE
2123       and balance_date = (select max(balance_date)
2124                             from xtr_bank_balances
2125                             where account_number = p_Account_Number
2126                             and company_code = p_PARTY_CODE);
2127 
2128 BEGIN
2129   l_acc_status := null;
2130 
2131   open CHK_ACC_INT;
2132   fetch CHK_ACC_INT into l_acc_int;
2133 
2134   if CHK_ACC_INT%FOUND then
2135 
2136       if nvl(l_acc_int ,0) = 0 then
2137          	l_acc_status :='ZERO';
2138       end if;
2139 
2140   end if;
2141   close CHK_ACC_INT;
2142 RETURN l_acc_status;
2143 END CHK_ACCRUAL_INT;
2144 
2145 
2146 PROCEDURE CHK_ACCRUAL_REVAL_WARNINGS
2147                    (p_ce_bank_account_id IN xtr_bank_accounts.ce_bank_account_id%TYPE
2148                     ,p_balance_date IN xtr_bank_balances.balance_date%TYPE
2149                     ,p_ce_bank_account_balance_id IN xtr_bank_balances.ce_bank_account_balance_id%TYPE default null
2150                     ,p_interest_calc_balance IN NUMBER
2151                     ,p_balance_cflow IN xtr_bank_balances.balance_cflow%TYPE
2152                     ,p_action_flag IN VARCHAR2
2153                     ,x_return_status  OUT NOCOPY 	VARCHAR2
2154                     ,x_msg_count  OUT NOCOPY 	NUMBER
2155                     ,x_msg_data	 OUT NOCOPY 	VARCHAR2 )IS
2156 
2157 CURSOR c_bank_acct_details IS
2158     SELECT party_code,account_number,currency
2159     FROM XTR_BANK_ACCOUNTS
2160     WHERE ce_bank_account_id = p_ce_bank_account_id;
2161 
2162 l_company_code xtr_bank_accounts.party_code%TYPE;
2163 l_account_number xtr_bank_accounts.account_number%TYPE;
2164 l_currency xtr_bank_accounts.currency%TYPE;
2165 l_return_error VARCHAR2(30);
2166 
2167 BEGIN
2168     FND_MSG_PUB.Initialize;
2169 
2170     OPEN c_bank_acct_details;
2171     FETCH c_bank_acct_details INTO l_company_code,l_account_number,l_currency;
2172     IF c_bank_acct_details%FOUND THEN
2173         CLOSE c_bank_acct_details;
2174 
2175         l_return_error := chk_reval(  l_company_code,
2176                                       l_account_number,
2177                                       l_currency,
2178                                       p_balance_date,
2179                                       p_ce_bank_account_balance_id,
2180                                       p_balance_cflow,
2181                                       p_action_flag,
2182                                       'W');
2183         IF nvl(l_return_error, '$$$') = 'XTR_DEALS_BEFORE_REVAL' THEN
2184             x_return_status := FND_API.G_RET_STS_ERROR;
2185             LOG_ERR_MSG ( 'XTR_DEALS_BEFORE_REVAL',p_balance_date);
2186         END IF;
2187 
2188         l_return_error := chk_accrual(l_company_code,
2189                                       l_account_number,
2190                                       l_currency,
2191                                       p_balance_date,
2192                                       p_ce_bank_account_balance_id,
2193                                       p_interest_calc_balance,
2194                                       p_action_flag,
2195                                       'W');
2196 
2197         IF nvl(l_return_error, '$$$') = 'XTR_DEALS_BEFORE_ACCRUAL' THEN
2198             x_return_status := FND_API.G_RET_STS_ERROR;
2199             LOG_ERR_MSG ( 'XTR_DEALS_BEFORE_ACCRUAL',p_balance_date);
2200         END IF;
2201 
2202     ELSE
2203         CLOSE c_bank_acct_details;
2204          x_return_status    := FND_API.G_RET_STS_ERROR;
2205          LOG_ERR_MSG('XTR_INV_PARAM','ACTION_FLAG');
2206     END IF;
2207 
2208     FND_MSG_PUB.Count_And_Get -- Returns the error message if there is only 1 error
2209     (   p_count         =>      x_msg_count     ,
2210         p_data          =>      x_msg_data
2211     );
2212 
2213     EXCEPTION
2214 
2215           WHEN others THEN
2216           x_return_status    := FND_API.G_RET_STS_UNEXP_ERROR;
2217           LOG_ERR_MSG('XTR_UNEXP_ERROR',SQLERRM(SQLCODE));
2218           FND_MSG_PUB.Count_And_Get -- Returns the error message if there is only 1 error
2219             (   p_count         =>      x_msg_count     ,
2220                 p_data          =>      x_msg_data
2221             );
2222 
2223 END CHK_ACCRUAL_REVAL_WARNINGS;
2224 
2225 
2226 -- bug 	9742850 starts
2227 
2228 PROCEDURE VALIDATE_OD_LIMIT_BALANCE
2229       ( p_company_code IN xtr_bank_balances.company_code%TYPE,
2230         p_branch_id IN NUMBER,
2231         p_bank_accont_id IN NUMBER,
2232         p_ledger_balance IN NUMBER,
2233         x_return_status   OUT NOCOPY   VARCHAR2,
2234         x_msg_count OUT NOCOPY NUMBER,
2235         x_msg_data OUT NOCOPY VARCHAR2) IS
2236   p_bal number:=0;
2237  p_funding_limit_code ce_bank_acct_uses_all.funding_limit_code%type;
2238 
2239   BEGIN
2240 
2241       x_return_status := FND_API.G_RET_STS_SUCCESS;
2242 
2243  SELECT b.funding_limit_code into p_funding_limit_code
2244      FROM ce_bank_accounts a,
2245    ce_bank_acct_uses_all b
2246    WHERE a.bank_account_id=b.bank_account_id
2247    and a.bank_account_id= p_bank_accont_id
2248  AND b.xtr_use_enable_flag='Y';
2249 
2250       SELECT limit_amount into p_bal
2251          FROM xtr_counterparty_limits_v a ,
2252         xtr_limit_types_v b,
2253         xtr_pro_param c
2254         WHERE a.limit_code = p_funding_limit_code
2255       AND b.fx_invest_fund_type='OD'
2256       AND a.company_code = p_company_code
2257       AND a.limit_type= b.limit_type
2258       AND c.param_name='DISPLAY_LIMIT_WARNING' and c.param_value='Y'
2259       AND a.cparty_code IN
2260         (SELECT party_code FROM xtr_party_info WHERE ce_bank_branch_id =
2261   p_branch_id
2262         );
2263 
2264       if  (-(p_bal + p_ledger_balance))>0 then
2265         x_return_status := FND_API.G_RET_STS_ERROR;
2266        LOG_ERR_MSG ('CE_OD_LIMIT_FAIL_INFO');
2267       end if;
2268 
2269   EXCEPTION
2270 
2271         WHEN NO_DATA_FOUND THEN
2272         x_return_status := FND_API.G_RET_STS_SUCCESS;
2273         WHEN others THEN
2274             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2275             LOG_ERR_MSG ('XTR_UNEXP_ERROR',SQLERRM(SQLCODE));
2276 
2277         FND_MSG_PUB.Count_And_Get
2278        (   p_count         =>      x_msg_count     ,
2279           p_data          =>      x_msg_data
2280       );
2281 
2282   END VALIDATE_OD_LIMIT_BALANCE;
2283 
2284 -- bug 9742850 ends
2285 
2286 END XTR_REPLICATE_BANK_BALANCES;
2287