DBA Data[Home] [Help]

PACKAGE BODY: APPS.OZF_FUNDS_PVT

Source


1 PACKAGE BODY OZF_FUNDS_PVT AS
2 /* $Header: ozfvfunb.pls 120.31 2011/12/29 14:56:52 apyadav ship $ */
3 -----------------------------------------------------------
4 -- PACKAGE
5 --    OZF_Funds_PVT
6 --
7 -- PROCEDURES
8 --
9 --    Create_Fund
10 --    Delete_Fund
11 --    Lock_Fund
12 --    Update_Fund
13 --    Validate_Fund
14 --
15 --    Check_Fund_Req_Items
16 --    Check_Fund_Uk_Items
17 --    Check_Fund_Fk_Items
18 --    Check_Fund_Lookup_Items
19 --    Check_Fund_Flag_Items
20 --
21 --    Check_Fund_Items
22 --    Check_Fund_Record
23 --
24 --    Init_Fund_Rec
25 --    Complete_Fund_Rec
26 --    GET_DEFAULT_GL_INFO
27 -- HISTORY
28 --    02/02/2000  Shitij Vatsa  Create.
29 --    06/12/2000  Mumu Pande Made all fund record validation
30 --    06/13/2000  Mumu Pande Added all access calls
31 --    06/15/2000  Mumu Pande Added all amount validation and status_vaidation
32 --    07/06/2000  Mumu Pande Added accrual_type fund validations fo rR2
33 ---   07/06/2000  COMPLETE_DEFAULT_GL_INFO ADDED FOR R2 Requirements to get default GL info--- mpande
34 --    07/28/2000  Added MC Transactions calls ,added convert_currency calls ,added 3 procedures check_fund_type_vs_child
35 --                and check_fund_dates_vs_child and check_fund_amount_vs_child
36 --    08/03/2000  Commented out uniqueness validation on fund short_name
37 --    08/28/2001  mpande bug#1950117
38 --    10/11/2001  yzhao  bug#2020218 publish: child budget market eligibility and product eligibility not set
39 --    03/11/2003  feliu  added copy for accrual budget.
40 -- DESCRIPTION
41 -- Amount columns in Budgets
42 -- Original budget -- When you create a budget you enter this amount and update it when fund_status is DRAFT.
43 --    You cannot update this amount once the fund status is ACTIVE
44 -- Holdback Budget -- This is like putting aside some money which wont be calculated in your avalaible budget
45 -- Available budget-- This is always a calculated amount and the formula is
46 --    (OB (Original)-HB (Holback)) +(TI(Transfer in) - TO(Transfer out))
47 -- Total Budget -- This is always a calculated amount and the formula is
48 --    (AB (Available) + HB (Holback))
49 --    08/29/2000   mchang   insert org_id value into OZF_FUNDS_ALL_TL when creating a fund.
50 --    09/12/2000   mpande   added code to facilitate team and other user update access
51 --    09/26/2000   mpande   added code to facilitate user_status
52 --    11/30/2000   mpande   BUG#1494231
53 --------------major changes for 11.5.5----------------------------------------------------------------
54 --   1) All functionality related to statistical fund removed.
55 --   2) Added the five columns ,  start_period_name,  end_period_name,  accrual_quantity,
56 --       accrue_to_level_id,fund_calendar
57 --   3) Introduced new API check_fund-inter_entity
58 --   4) Removed some of the fund rules validations to package OZFFundRulesPvt (for clarity)
59 --   5) Removed all active fund transactions to package OZFFundRulesPvt
60 --   6) Added approval and other fully accrued fund related transactions
61 --   05/09/2001 MPande added   l_act_budget_rec.adjusted_flag ='N' when calling create_act_budget
62 --   06/22/2001 MPande Added code for business_ubit, threshold, country task
63 --   07/10/2001 Mpande bug#1875760
64 --   07/30/2001 Feliu  add accrual_rate, accrual_basis,country_id as required field for copy.
65 --   10/23/2001 Feliu  add recal_committed.
66 --   11/06/2001 mpande Updated for updating transfered in amount and not original budget for child fund
67 --                     Commented security group id
68 --                     Added validation for dated for fully accrued budget
69 --                     Added extra parameters in copy
70 ------------------------------------------------------------  ------------------------------- /
71 --   02/08/2002 Feliu  1)Added columns for rollup amount and procedure for updating rollup amount.
72 --                     for create, first create rollup amount, if parent_fund_id is not null
73 --                     call update_rollup_amount to update rollup amount for parent fund.
74 --                     for update, first update rollup amount. if parent_fund_id is not null,
75 --                     pass rollup diffence to update_rollup_amount for all parent fund.
76 --                     if parent_id is remove, then pass fund own rollup amount in negative and
77 --                     call update_rollup_amount for all_parent fund.
78 --                     2)Added update_funds_access procedure for updating parent fund access. If parent_fund_id is
79 --                     not null, call this procedure to create access for all parent fund. if parent_fund_id
80 --                     is removed, call this procedure to remove access for all parent fund. if parent_fund_id
81 --                     or fund owner has been changed, first remove access then create access for all
82 --                     parent funds.
83 --   03/11/2002        Modify rollup amount calculation.
84 --   6/11/2002  mpande Accrual Offer Original budget Updatoin Fixed
85 --   07/01/2002 feliu  Removed default g_universal_currency and added error message.
86 --   07/15/2002 yzhao  fix bug 2457199 UNABLE TO CREATE FULLY ACCRUED BUDGET DUE TO START DATE PROBLEM
87 --   11/06/2002 feliu  fix bug 2637445 OWNER OF CHILD BUDGET CAN REMOVE OWNER OF PARENT BUDGET FROM TEAM by setting
88 --                     owner_flag to 'Y' when adding access for parent budget owner.
89 --   11/06/2002 feliu  fix bug 2654263 CHILD LINE MISSING FROM TREE OVERVIEW by adding access during create budget.
90 --   03/13/2003 feliu  fix bug copy of accrual budget and market eligibility.
91 --   03/18/2003 yzhao  handle allocation activation on territory hiearchy of different owners - bypass workflow approval
92 --   06/03/2003 yzhao  fix bug 2984497 - TST1159.14 MASTER: BUDGET APPROVAL VALIDATION FAILS UPON APPROVAL IN WORKFLOW
93 --   11/07/2003 yzhao: fix bug 3238497 - allow fully accrual budget to go below 0
94 --   Wed Mar 10 2004:1/59 PM RSSHARMA Call raise_business_event on request approval.
95 --                                    This will raise a business event if the fund type is Quota
96 --   06-APR-2004 mkothari  Changed bussiness event param to oracle.apps.ozf.quota.QuotaApproval
97 --   20-Apr-2004 rimehrot Check fund amount should not be <= 0: bug fix 3580531
98 --   10-May-2004 feliu add business event for budget create, update, and approval.
99 --   09/09/2004 Ribha  Bug Fix 3498826. Validate for fund_number uniqueness modified. Validate for fund_name uniqueness removed.
100 --   12/28/2004 kdass  fix for 11.5.10 bug 4089720, when the fund is created from mass transfer, do not check for end date
101 --   01/04/2005 Ribha  Bug Fix 4087106 - Rollup holdback amount not updated when holdback amt updated manualy.
102 --   10/10/2005 kdass  R12 bug 4613689 - validate accrual budget's ledger and offer's org
103 --   10/26/2005 mkothari Forward port 11.5.10 Bug 4701105
104 --   11/09/2005 kdass  fixed bug 4618523
105 --   04-Feb-2006 asylvia fixed bug 5073532 . Duplicate Budget Number error .
106 --   27-Mar-2006 asylvia fixed bug 5107243 . Copy Budget doesnt copy all the fields .
107 --   06-APR-2006 kdass   fixed bug 5104398
108 --   19-Apr-2006 asylvia fixed bug 5169099 . Copy Activity of Accrual Budget to new Budget.
109 --   25-APR-2006 kdass   fixed bug 5176819 - Ledger is required field
110 --   26-APR-2006 asylvia fixed bug 5185302 . Remove copying end date to new budget .
111 --   08-OCT-2008 nirprasa fixed bug 7425189 - Use old conversion date for reconcile flow
112 --   12-JUN-2009 kdass    bug 8532055 - ADD EXCHANGE RATE DATE PARAM TO OZF_FUND_UTILIZED_PUB.CREATE_FUND_ADJUSTMENT API
113 --   03-MAY-2010 nepanda  bug 9616725 - not able to get the fund_id in subscription for ozf budget create business event
114 --   04/01/2011  muthsubr Fix for bug#8867381 - IDSM BATCH PAYMENT INITIALIZATION ERROR
115 --   04/01/2011  muthsubr Altered px_ozf_funds_new_rectype to px_ozf_funds_new_tbl for TPA Parallel Execution ER Bug#9614703.
116 --   13-DEC-2011 apyadav Bug 13360969 - COPY ACCRUAL BUDGET THROWING UNIQUE CONSTRAINT ERROR
117 --					Validating Budget before calling copy_offer_details to avoid savepoint never established error.
118 -- 29-DEC-2011	APYADAV	   Bug 13529250 - CLAIM SETTLEMENT FETCHER ERRORS, BUDGET AMOUNT MUST BE GREATER THAN 0
119 --					p_mode default NULL is added to be passed as 'SETTLE' while claim settlement to avoid budget amount validation
120    g_pkg_name    CONSTANT VARCHAR2(30) := 'OZF_Funds_PVT';
121    -- 08/14/2001 mpande updated for approval and object type
122    G_PARENT_APPROVAL_TYPE CONSTANT VARCHAR2(30) := 'BUDGET';
123    -- addded 08/14/2001 mpande
124    g_activity_type             CONSTANT VARCHAR2(30) := 'RFRQ';
125    -- added 02/08/2002 by feliu
126    g_universal_currency   CONSTANT VARCHAR2 (15) := fnd_profile.VALUE ('OZF_UNIV_CURR_CODE');
127    G_DEBUG BOOLEAN := FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_debug_high);
128 
129 
130 -----------------------------------------------------------------------
131 -- PROCEDURE
132 --    handle_fund_status
133 --
134 -- HISTORY
135 --    20/09/00  mpande  Created.
136 -----------------------------------------------------------------------
137 
138 
139 PROCEDURE handle_fund_status(
140    p_user_status_id   IN       NUMBER
141   ,x_status_code      OUT NOCOPY      VARCHAR2
142   ,x_return_status    OUT NOCOPY      VARCHAR2)
143 IS
144    l_status_code    VARCHAR2(30);
145 
146    CURSOR c_status_code
147    IS
148       SELECT   system_status_code
149       FROM     ams_user_statuses_vl
150       WHERE  user_status_id = p_user_status_id
151          AND system_status_type = 'OZF_FUND_STATUS'
152          AND enabled_flag = 'Y';
153 BEGIN
154    x_return_status := fnd_api.g_ret_sts_success;
155    OPEN c_status_code;
156    FETCH c_status_code INTO l_status_code;
157    CLOSE c_status_code;
158 
159    IF l_status_code IS NULL THEN
160       x_return_status := fnd_api.g_ret_sts_error;
161       Ozf_utility_pvt.error_message('OZF_FUND_BAD_USER_STATUS');
162    END IF;
163 
164    x_status_code := l_status_code;
165 END handle_fund_status;
166 
167 -----------------------------------------------------------------------
168 -- PROCEDURE
169 --    get_user_status
170 --
171 -- HISTORY
172 --    20/09/00  mpande  Created.
173 -- this packagge is created because ,if there are already records in funds table
174 -- then it would be taken care of them .
175 -----------------------------------------------------------------------
176 
177 PROCEDURE get_user_status(
178    p_status_code      IN       VARCHAR2
179   ,x_user_status_id   OUT NOCOPY      NUMBER
180   ,x_return_status    OUT NOCOPY      VARCHAR2)
181 IS
182    l_user_status_id    NUMBER;
183 
184    CURSOR c_user_status_id
185    IS
186       SELECT   user_status_id
187       FROM     ams_user_statuses_vl
188       WHERE  UPPER(system_status_code) = UPPER(p_status_code)
189          AND system_status_type = 'OZF_FUND_STATUS'
190          AND enabled_flag = 'Y';
191 BEGIN
192    x_return_status := fnd_api.g_ret_sts_success;
193    OPEN c_user_status_id;
194    FETCH c_user_status_id INTO l_user_status_id;
195    CLOSE c_user_status_id;
196 
197    IF l_user_status_id IS NULL THEN
198       x_return_status := fnd_api.g_ret_sts_error;
199       Ozf_utility_pvt.error_message('OZF_FUND_BAD_USER_STATUS');
200    END IF;
201 
202    x_user_status_id := l_user_status_id;
203 END get_user_status;
204 -----------------------------------------------------------------------
205 -- PROCEDURE
206 --    get_child_source_code
207 --
208 -- HISTORY
209 --    02/20/2001  mpande  Created.
210 -----------------------------------------------------------------------
211 
212 PROCEDURE get_child_source_code(
213    p_parent_fund_id   IN       NUMBER
214   ,x_code             OUT NOCOPY      VARCHAR2
215   ,x_return_status    OUT NOCOPY      VARCHAR2)
216 IS
217    l_par_number    VARCHAR2(30);
218    l_count         NUMBER       := 0;
219 
220    CURSOR c_child_count(
221       p_fund_id   IN   NUMBER)
222    IS
223       SELECT   COUNT(fund_id)
224       FROM     ozf_funds_all_b
225       WHERE  parent_fund_id = p_fund_id;
226 
227    CURSOR c_parent_number(
228       p_fund_id   IN   NUMBER)
229    IS
230       SELECT   fund_number
231       FROM     ozf_funds_all_b
232       WHERE  fund_id = p_fund_id;
233 BEGIN
234    x_return_status := fnd_api.g_ret_sts_success;
235    OPEN c_child_count(p_parent_fund_id);
236    FETCH c_child_count INTO l_count;
237    CLOSE c_child_count;
238    OPEN c_parent_number(p_parent_fund_id);
239    FETCH c_parent_number INTO l_par_number;
240    CLOSE c_parent_number;
241 
242    IF l_par_number IS NULL THEN
243       IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_error) THEN
244          fnd_message.set_name('OZF', 'OZF_API_RECORD_NOT_FOUND');
245          fnd_msg_pub.add;
246       END IF;
247 
248       x_return_status := fnd_api.g_ret_sts_error;
249    END IF;
250 
251    x_code := SUBSTRB(l_par_number || l_count, 1, 30);
252 
253    --asylvia Fixed bug 5073532
254    WHILE ozf_utility_pvt.check_uniqueness('ozf_funds_all_b'
255          ,'fund_number = ''' || x_code || '''') =
256             fnd_api.g_false LOOP
257                   l_count := l_count + 1 ;
258                   x_code :=SUBSTRB(l_par_number || l_count, 1, 30);
259   END LOOP;
260 
261 END get_child_source_code;
262 
263 -----------------------------------------------------------------------
264 -- PROCEDURE
265 --    raise_business_event
266 --
267 -- HISTORY
268 --    05/08/2004  feliu  Created.
269 -----------------------------------------------------------------------
270 
271 
272 PROCEDURE raise_business_event(p_object_id IN NUMBER,p_event_type IN VARCHAR2)
273 IS
274 CURSOR c_fund_type(p_fund_id NUMBER) IS
275 SELECT fund_type FROM ozf_funds_all_b
276 WHERE fund_id = p_fund_id;
277 
278 l_fund_type varchar2(30);
279 l_item_key varchar2(30);
280 l_event_name varchar2(80);
281 
282 l_parameter_list wf_parameter_list_t;
283 BEGIN
284   l_item_key := p_object_id ||'_'|| TO_CHAR(SYSDATE,'DDMMRRRRHH24MISS');
285   l_parameter_list := WF_PARAMETER_LIST_T();
286 
287   OPEN c_fund_type(p_object_id);
288   FETCH c_fund_type into l_fund_type;
289   CLOSE c_fund_type;
290 
291   IF l_fund_type = 'QUOTA' THEN
292     l_event_name :=  'oracle.apps.ozf.quota.QuotaApproval';
293   ELSE
294        IF p_event_type = 'CREATE' THEN
295               l_event_name :=  'oracle.apps.ozf.fund.budget.creation';
296        ELSIF  p_event_type = 'UPDATE' THEN
297                l_event_name :=  'oracle.apps.ozf.fund.budget.update';
298        ELSE
299               l_event_name :=  'oracle.apps.ozf.fund.budget.approval';
300        END IF;
301   END IF;
302 
303   IF G_DEBUG THEN
304     ozf_utility_pvt.debug_message('p_event_type is :'||p_event_type || '    Fund Id is :'||p_object_id );
305   END IF;
306 
307     wf_event.AddParameterToList(p_name           => 'P_FUND_ID',
308                               p_value          => p_object_id,
309                               p_parameterlist  => l_parameter_list);
310 
311    IF G_DEBUG THEN
312        ozf_utility_pvt.debug_message('Item Key is  :'||l_item_key);
313   END IF;
314 
315     wf_event.raise( p_event_name =>l_event_name,
316                   p_event_key  => l_item_key,
317                   p_parameters => l_parameter_list);
318 
319 
320 EXCEPTION
321 WHEN OTHERS THEN
322 RAISE Fnd_Api.g_exc_error;
323 ozf_utility_pvt.debug_message('Exception in raising business event');
324 END;
325 
326 
327 ---------------------------------------------------------------------
328 -- PROCEDURE
329 --    Create_Fund
330 --
331 -- HISTORY
332 --    02/02/2000  Shitij Vatsa  Create.
333 --    06/13/2000  Added access calls and other validations
334 --    07/24/2000  Added Multiple Currency Calls
335 
336 
337 --    01/15/2001  Made all necessary changes for 11.5.5 .
338 --    02/08/2002  Added create rollup amount.
339 -- NOTE
340 --    For all bug fixes for prior 11.5.5 please arcs out the
341 --    earlier versions.
342 --    The create API is called with a 'active' fund status only from allocation
343 --    where no approval is required . Create fund doesnot handle the approval process.
344 ---------------------------------------------------------------------
345 
346 PROCEDURE create_fund(
347    p_api_version        IN       NUMBER
348   ,p_init_msg_list      IN       VARCHAR2 := fnd_api.g_false
349   ,p_commit             IN       VARCHAR2 := fnd_api.g_false
350   ,p_validation_level   IN       NUMBER := fnd_api.g_valid_level_full
351   ,x_return_status      OUT NOCOPY      VARCHAR2
352   ,x_msg_count          OUT NOCOPY      NUMBER
353   ,x_msg_data           OUT NOCOPY      VARCHAR2
354   ,p_fund_rec           IN       fund_rec_type
355   ,x_fund_id            OUT NOCOPY      NUMBER)
356 IS
357    l_api_version     CONSTANT NUMBER       := 1.0;
358    l_api_name        CONSTANT VARCHAR2(30) := 'Create_Fund';
359 
360    l_full_name       CONSTANT VARCHAR2(60)
361             := g_pkg_name || '.' || l_api_name;
362    l_return_status            VARCHAR2(1);
363    l_fund_rec                 fund_rec_type
364          := p_fund_rec;
365    l_fund_count               NUMBER;
366    l_object_version_number    NUMBER                                           := 1;
367    --//mpande
368    l_request_id               NUMBER;
369    l_approver_id              NUMBER;
370    l_is_requester_owner       VARCHAR2(10);
371 --   l_request_rec              ozf_fund_request_pvt.request_rec_type;
372    -- variable for creating access //mpande
373    l_access_rec               ams_access_pvt.access_rec_type;
374    l_access_id                NUMBER;
375    l_par_fund_owner           NUMBER;
376    /* R12: yzhao bug 4669269 - obsolete ozf_mc_transactions
377    -- record and table variable for creating FC record // mpande
378    l_mc_transaction_rec       ozf_mc_transactions_pvt.mc_transactions_rec_type;
379    l_mc_transaction_id        NUMBER;
380     */
381    l_act_budget_rec              ozf_actbudgets_pvt.act_budgets_rec_type;
382    l_act_budget_id               NUMBER                                ;
383    l_is_requestor_owner       VARCHAR2(30);
384    l_rate                     NUMBER;
385    l_valid_flag               VARCHAR2(1);
386    l_ledger_name              VARCHAR2(50);
387 
388    CURSOR c_fund_seq
389    IS
390       SELECT   ozf_funds_s.nextval
391       FROM     dual;
392 
393    --changed by mpande
394    CURSOR c_fund_count(
395       cv_fund_id   IN   NUMBER)
396    IS
397       SELECT   COUNT(fund_id)
398       FROM     ozf_funds_all_b
399       WHERE  fund_id = cv_fund_id;
400 
401 
402      CURSOR c_prog_fund_number (cl_fund_number IN VARCHAR2)
403      IS
404      SELECT count(fund_id) from ozf_funds_all_b
405      WHERE fund_number = cl_fund_number;
406 
407 BEGIN
408    --------------------- initialize -----------------------
409    SAVEPOINT create_fund;
410    IF G_DEBUG THEN
411       ozf_utility_pvt.debug_message(l_full_name || ': start');
412    END IF;
413    x_return_status := fnd_api.g_ret_sts_success;
414 
415    IF fnd_api.to_boolean(p_init_msg_list) THEN
416       fnd_msg_pub.initialize;
417    END IF;
418 
419    IF NOT fnd_api.compatible_api_call(l_api_version, p_api_version, l_api_name, g_pkg_name) THEN
420       RAISE fnd_api.g_exc_unexpected_error;
421    END IF;
422 
423    -- check fund status and fill in system status
424    handle_fund_status(
425       p_user_status_id => l_fund_rec.user_status_id
426      ,x_status_code => l_fund_rec.status_code
427      ,x_return_status => x_return_status);
428 
429    IF x_return_status = fnd_api.g_ret_sts_error THEN
430       RAISE fnd_api.g_exc_error;
431    ELSIF x_return_status = fnd_api.g_ret_sts_unexp_error THEN
432       RAISE fnd_api.g_exc_unexpected_error;
433    END IF;
434 
435    -- default fund calendar
436    IF     l_fund_rec.fund_calendar IS NULL
437       AND (   l_fund_rec.start_period_name IS NOT NULL
438            OR l_fund_rec.end_period_name IS NOT NULL) THEN
439       l_fund_rec.fund_calendar := fnd_profile.VALUE('AMS_CAMPAIGN_DEFAULT_CALENDER');
440    END IF;
441 
442    IF p_fund_rec.fund_number IS NULL THEN
443       IF p_fund_rec.parent_fund_id IS NULL  THEN
444             /*l_fund_rec.fund_number :=
445                ams_sourcecode_pvt.get_source_code(
446                   p_category_id => p_fund_rec.category_id
447                  ,p_arc_object_for => 'FUND');*/
448           l_valid_flag := 1;
449           WHILE  l_valid_flag <> 0 LOOP
450            l_fund_rec.fund_number :=
451                ams_sourcecode_pvt.get_source_code(
452                   p_category_id => p_fund_rec.category_id
453                  ,p_arc_object_for => 'FUND');
454 
455              OPEN c_prog_fund_number (l_fund_rec.fund_number);
456              FETCH c_prog_fund_number INTO l_valid_flag;
457              CLOSE c_prog_fund_number; -- Bug Fix 3498826
458 
459            /*l_valid_flag := ams_utility_pvt.check_uniqueness(
460             'ozf_funds_all_vl'
461            ,'fund_number = ''' || l_fund_rec.fund_number || '''');*/
462 
463         END LOOP;
464         -- by feliu on 11/10/03 to fix bug  3244033
465       ELSE
466          get_child_source_code(
467             p_fund_rec.parent_fund_id
468            ,l_fund_rec.fund_number
469            ,x_return_status);
470          IF x_return_status = fnd_api.g_ret_sts_error THEN
471             RAISE fnd_api.g_exc_error;
472          ELSIF x_return_status = fnd_api.g_ret_sts_unexp_error THEN
473             RAISE fnd_api.g_exc_unexpected_error;
474          END IF;
475       END IF;
476    END IF;
477 
478    ----------------------- validate -----------------------
479    IF G_DEBUG THEN
480       ozf_utility_pvt.debug_message(l_full_name || ': validate');
481    END IF;
482    validate_fund(
483       p_api_version => l_api_version
484      ,p_init_msg_list => p_init_msg_list
485      ,p_validation_level => p_validation_level
486      ,x_return_status => l_return_status
487      ,x_msg_count => x_msg_count
488      ,x_msg_data => x_msg_data
489      ,p_fund_rec => l_fund_rec);
490 
491 
492    IF l_return_status = fnd_api.g_ret_sts_error THEN
493       RAISE fnd_api.g_exc_error;
494    ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
495       RAISE fnd_api.g_exc_unexpected_error;
496    END IF;
497 
498    -------------------------- insert --------------------------
499    IF G_DEBUG THEN
500       ozf_utility_pvt.debug_message(l_full_name || ': insert');
501    END IF;
502 
503    IF l_fund_rec.fund_id IS NULL THEN
504       LOOP
505          OPEN c_fund_seq;
506          FETCH c_fund_seq INTO l_fund_rec.fund_id;
507          CLOSE c_fund_seq;
508          OPEN c_fund_count(l_fund_rec.fund_id);
509          FETCH c_fund_count INTO l_fund_count;
510          CLOSE c_fund_count;
511          EXIT WHEN l_fund_count = 0;
512       END LOOP;
513    END IF;
514 
515 
516    IF G_DEBUG THEN
517       ozf_utility_pvt.debug_message(l_full_name || ': get_category');
518    END IF;
519 
520    -- kdass 09-NOV-05 Bug 4618523
521    /*
522    --added by mpande 6th JULY-2000 get default category GL Info
523    IF p_fund_rec.category_id IS NOT NULL THEN
524       complete_default_gl_info(
525          l_fund_rec.category_id
526         ,l_fund_rec.accrued_liable_account
527         ,l_fund_rec.ded_adjustment_account
528         ,l_return_status);
529 
530       IF l_return_status = fnd_api.g_ret_sts_error THEN
531          RAISE fnd_api.g_exc_error;
532       ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
533          RAISE fnd_api.g_exc_unexpected_error;
534       END IF;
535    END IF;
536    */
537 
538    -- 11/06/2001 mpande added for updating transfered in amount
539    IF p_fund_rec.status_code = 'ON_HOLD' OR  l_fund_rec.status_code = 'ACTIVE' THEN
540       IF p_fund_rec.parent_fund_id IS NOT NULL THEN
541          l_fund_rec.transfered_in_amt := l_fund_rec.original_budget;
542          l_fund_rec.original_budget := 0 ;
543       END IF;
544    END IF;
545 
546    IF g_universal_currency IS NULL THEN
547 
548       IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_error) THEN
549          fnd_message.set_name('OZF', 'OZF_UNIV_CURR_NOT_FOUND');
550          fnd_msg_pub.add;
551       END IF;
552 
553       RAISE fnd_api.g_exc_error;
554 
555    END IF;
556 
557 -- Calculate rollup amount columns, added by feliu 02/08/02
558    IF l_fund_rec.original_budget IS NOT NULL
559      AND l_fund_rec.original_budget <> fnd_api.g_miss_num THEN
560          Ozf_utility_pvt.convert_currency(
561             x_return_status => l_return_status
562            ,p_from_currency => l_fund_rec.currency_code_tc
563            ,p_to_currency => g_universal_currency
564            ,p_from_amount => l_fund_rec.original_budget
565            ,x_to_amount => l_fund_rec.rollup_original_budget
566            ,x_rate => l_rate);
567 
568          IF l_return_status = fnd_api.g_ret_sts_error THEN
569             RAISE fnd_api.g_exc_error;
570          ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
571             RAISE fnd_api.g_exc_unexpected_error;
572          END IF;
573 
574    END IF;
575 
576    IF l_fund_rec.transfered_in_amt IS NOT NULL
577      AND l_rate is NOT NULL
578      AND l_fund_rec.transfered_in_amt <> fnd_api.g_miss_num THEN
579 
580      l_fund_rec.rollup_transfered_in_amt := l_fund_rec.transfered_in_amt * l_rate;
581 
582    END IF;
583 
584    IF l_fund_rec.transfered_out_amt IS NOT NULL
585      AND l_rate is NOT NULL
586      AND l_fund_rec.transfered_out_amt <> fnd_api.g_miss_num THEN
587 
588      l_fund_rec.rollup_transfered_out_amt := l_fund_rec.transfered_out_amt * l_rate;
589 
590    END IF;
591 
592 
593    IF l_fund_rec.holdback_amt IS NOT NULL
594      AND l_rate is NOT NULL
595      AND l_fund_rec.holdback_amt <> fnd_api.g_miss_num THEN
596      l_fund_rec.rollup_holdback_amt := l_fund_rec.holdback_amt * l_rate;
597    END IF;
598 
599   -- make liability_flag to be 'N' for sales accrual.
600    IF l_fund_rec.accrual_basis ='SALES' THEN
601       l_fund_rec.liability_flag := 'N';
602    END IF;
603 
604    -- kdass 09-NOV-05 Bug 4618523
605    -- if ledger_id is null, derive it from org_id which is the default OU for the user
606    IF l_fund_rec.ledger_id = fnd_api.g_miss_num OR l_fund_rec.ledger_id IS NULL THEN
607 
608       IF l_fund_rec.org_id <> fnd_api.g_miss_num AND l_fund_rec.org_id IS NOT NULL THEN
609          MO_UTILS.Get_Ledger_Info (
610                     p_operating_unit     =>  l_fund_rec.org_id,
611                     p_ledger_id          =>  l_fund_rec.ledger_id,
612                     p_ledger_name        =>  l_ledger_name
613             );
614       END IF;
615 
616    END IF;
617 
618    INSERT INTO ozf_funds_all_b
619                (
620                               fund_id,
621                               last_update_date,
622                               last_updated_by,
623                               last_update_login,
624                               creation_date,
625                               created_by,
626                               created_from,
627                               request_id,
628                               program_application_id,
629                               program_id,
630                               program_update_date,
631                               fund_number,
632                               parent_fund_id,
633                               category_id,
634                               fund_type,
635                               fund_usage,   -- obsolete
636                               status_code,
637                               user_status_id,
638                               status_date,
639                               accrued_liable_account,
640                               ded_adjustment_account,
641                               liability_flag,
642                               set_of_books_id,   -- obsolete
643                               start_period_id,   -- obsolete
644                               end_period_id,   -- obsolete
645                               start_date_active,
646                               end_date_active,
647                               budget_amount_tc,   -- obsolete
648                               budget_amount_fc,   -- obsolete
649                               available_amount,   -- obsolete
650                               distributed_amount,   -- obsolete
651                               currency_code_tc,
652                               currency_code_fc,   -- obsolete
653                               exchange_rate_type,   -- obsolete
654                               exchange_rate_date,   -- obsolete
655                               exchange_rate,   -- obsolete
656                               department_id,   -- obsolete
657                               costcentre_id,   -- obsolete
658                               owner,
659                               accrual_method,
660                               accrual_operand,
661                               accrual_rate,
662                               accrual_basis,
663                               hierarchy,
664                               hierarchy_level,
665                               hierarchy_id,
666                               parent_node_id,
667                               node_id,   --,level_value
668                               budget_flag,
669                               earned_flag,
670                               apply_accrual_on,   -- obsolete
671                               accrual_phase,
672                               accrual_cap,
673                               accrual_uom,
674                               object_version_number,
675                               attribute_category,
676                               attribute1,
677                               attribute2,
678                               attribute3,
679                               attribute4,
680                               attribute5,
681                               attribute6,
682                               attribute7,
683                               attribute8,
684                               attribute9,
685                               attribute10,
686                               attribute11,
687                               attribute12,
688                               attribute13,
689                               attribute14,
690                               attribute15,
691                               org_id,
692                               original_budget,
693                               transfered_in_amt,
694                               transfered_out_amt,
695                               holdback_amt,
696                               planned_amt,
697                               committed_amt,
698                               earned_amt,
699                               paid_amt,
700                               plan_type,   -- obsolete
701                               plan_id,   -- obsolete
702                               liable_accnt_segments,   -- obsolete
703                               adjustment_accnt_segments,   -- obsolete
704                               fund_calendar,
705                               start_period_name,
706                               end_period_name,
707                               accrual_quantity,
708                               accrue_to_level_id,
709                               accrual_discount_level,
710                               custom_setup_id,
711                               threshold_id,
712                               business_unit_id,
713                               country_id,
714                               task_id,
715                               rollup_original_budget,
716                               rollup_transfered_in_amt,
717                               rollup_transfered_out_amt,
718                               rollup_holdback_amt,
719                               retroactive_flag,
720                               qualifier_id,
721                               -- niprakas added
722                               prev_fund_id,
723                               transfered_flag,
724                               utilized_amt,
725                               rollup_utilized_amt,
726                               product_spread_time_id,
727                               ledger_id  -- kdass - R12 MOAC changes
728         )
729         VALUES(
730            l_fund_rec.fund_id
731           ,SYSDATE   -- LAST_UPDATE_DATE
732           ,NVL(fnd_global.user_id, -1)   -- LAST_UPDATED_BY
733           ,NVL(fnd_global.conc_login_id, -1)   -- LAST_UPDATE_LOGIN
734           ,SYSDATE   -- CREATION_DATE
735           ,NVL(fnd_global.user_id, -1)   -- CREATED_BY
736           ,NULL   -- l_fund_rec.created_from                -- CREATED_FROM -- we donot use this column
737           ,fnd_global.conc_request_id   -- REQUEST_ID
738           ,fnd_global.prog_appl_id   -- PROGRAM_APPLICATION_ID
739           ,fnd_global.conc_program_id   -- PROGRAM_ID
740           ,SYSDATE   -- PROGRAM_UPDATE_DATE
741           ,l_fund_rec.fund_number
742           ,l_fund_rec.parent_fund_id
743           ,l_fund_rec.category_id
744           ,l_fund_rec.fund_type
745           ,l_fund_rec.fund_usage
746           ,l_fund_rec.status_code
747           ,l_fund_rec.user_status_id
748           ,NVL(l_fund_rec.status_date, SYSDATE)
749           ,l_fund_rec.accrued_liable_account
750           ,l_fund_rec.ded_adjustment_account
751           ,NVL(l_fund_rec.liability_flag, 'N')
752           ,l_fund_rec.set_of_books_id
753           ,l_fund_rec.start_period_id
754           ,l_fund_rec.end_period_id
755           ,NVL(l_fund_rec.start_date_active, SYSDATE)
756           ,l_fund_rec.end_date_active
757           ,l_fund_rec.budget_amount_tc
758           ,l_fund_rec.budget_amount_fc
759           ,l_fund_rec.available_amount
760           ,l_fund_rec.distributed_amount
761           ,l_fund_rec.currency_code_tc
762           ,l_fund_rec.currency_code_fc
763           ,l_fund_rec.exchange_rate_type
764           ,l_fund_rec.exchange_rate_date
765           ,l_fund_rec.exchange_rate
766           ,l_fund_rec.department_id
767           ,l_fund_rec.costcentre_id
768           ,NVL(l_fund_rec.owner, NVL(fnd_global.user_id, -1))   -- OWNER
769           ,l_fund_rec.accrual_method
770           ,l_fund_rec.accrual_operand
771           ,l_fund_rec.accrual_rate
772           ,l_fund_rec.accrual_basis
773           ,l_fund_rec.hierarchy
774           ,l_fund_rec.hierarchy_level
775           ,l_fund_rec.hierarchy_id
776           ,l_fund_rec.parent_node_id
777           ,l_fund_rec.node_id   --,l_fund_rec.level_value
778           ,NVL(l_fund_rec.budget_flag, 'N')
779           ,NVL(l_fund_rec.earned_flag, 'N')
780           ,l_fund_rec.apply_accrual_on
781           ,l_fund_rec.accrual_phase
782           ,l_fund_rec.accrual_cap
783           ,l_fund_rec.accrual_uom
784           ,l_object_version_number   -- OBJECT_VERSION_NUMBER
785           ,l_fund_rec.attribute_category
786           ,l_fund_rec.attribute1
787           ,l_fund_rec.attribute2
788           ,l_fund_rec.attribute3
789           ,l_fund_rec.attribute4
790           ,l_fund_rec.attribute5
791           ,l_fund_rec.attribute6
792           ,l_fund_rec.attribute7
793           ,l_fund_rec.attribute8
794           ,l_fund_rec.attribute9
795           ,l_fund_rec.attribute10
796           ,l_fund_rec.attribute11
797           ,l_fund_rec.attribute12
798           ,l_fund_rec.attribute13
799           ,l_fund_rec.attribute14
800           ,l_fund_rec.attribute15
801           --,TO_NUMBER(SUBSTRB(USERENV('CLIENT_INFO'), 1, 10))   -- org_id
802           ,l_fund_rec.org_id  -- kdass - R12 MOAC changes
803           ,l_fund_rec.original_budget
804           ,l_fund_rec.transfered_in_amt
805           ,l_fund_rec.transfered_out_amt
806           ,l_fund_rec.holdback_amt
807           ,l_fund_rec.planned_amt
808           ,l_fund_rec.committed_amt
809           ,l_fund_rec.earned_amt
810           ,l_fund_rec.paid_amt
811           ,l_fund_rec.plan_type
812           ,l_fund_rec.plan_id
813           ,l_fund_rec.liable_accnt_segments
814           ,l_fund_rec.adjustment_accnt_segments
815           ,l_fund_rec.fund_calendar
816           ,l_fund_rec.start_period_name
817           ,l_fund_rec.end_period_name
818           ,l_fund_rec.accrual_quantity
819           ,l_fund_rec.accrue_to_level_id
820           ,l_fund_rec.accrual_discount_level
821           ,l_fund_rec.custom_setup_id
822           ,l_fund_rec.threshold_id
823           ,l_fund_rec.business_unit_id
824           ,l_fund_rec.country_id
825           ,l_fund_rec.task_id
826           ,l_fund_rec.rollup_original_budget
827           ,l_fund_rec.rollup_transfered_in_amt
828           ,l_fund_rec.rollup_transfered_out_amt
829           ,l_fund_rec.rollup_holdback_amt
830           ,l_fund_rec.retroactive_flag
831           ,l_fund_rec.qualifier_id
832            -- niprakas added
833           ,l_fund_rec.prev_fund_id
834           ,l_fund_rec.transfered_flag
835           ,l_fund_rec.utilized_amt
836           ,l_fund_rec.rollup_utilized_amt
837           ,l_fund_rec.product_spread_time_id
838           ,l_fund_rec.ledger_id
839 );
840 
841    INSERT INTO ozf_funds_all_tl
842                (fund_id,
843                 last_update_date,
844                 last_updated_by,
845                 last_update_login,
846                 creation_date,
847                 created_by,
848                 created_from,
849                 request_id,
850                 program_application_id,
851                 program_id,
852                 program_update_date,
853                 short_name,
854                 description,
855                 source_lang,
856                 language,
857                 org_id     )
858       SELECT   l_fund_rec.fund_id
859               ,SYSDATE   -- LAST_UPDATE_DATE
860               ,NVL(fnd_global.user_id, -1)   -- LAST_UPDATED_BY
861               ,NVL(fnd_global.conc_login_id, -1)   -- LAST_UPDATE_LOGIN
862               ,SYSDATE   -- CREATION_DATE
863               ,NVL(fnd_global.user_id, -1)   -- CREATED_BY
864               ,NULL   -- CREATED_FROM
865               ,fnd_global.conc_request_id   -- REQUEST_ID
866               ,fnd_global.prog_appl_id   -- PROGRAM_APPLICATION_ID
867               ,fnd_global.conc_program_id   -- PROGRAM_ID
868               ,SYSDATE   -- PROGRAM_UPDATE_DATE
869               ,l_fund_rec.short_name
870               ,l_fund_rec.description
871               ,USERENV('LANG')
872               ,l.language_code
873               --,TO_NUMBER(SUBSTRB(USERENV('CLIENT_INFO'), 1, 10))
874               ,l_fund_rec.org_id  -- kdass - R12 MOAC changes
875       FROM     fnd_languages l
876       WHERE  l.installed_flag IN('I', 'B')
877          AND NOT EXISTS(SELECT   NULL
878                         FROM     ozf_funds_all_tl t
879                         WHERE  t.fund_id = l_fund_rec.fund_id
880                            AND t.language = l.language_code);
881 
882    ------------------------- finish -------------------------------
883    x_fund_id := l_fund_rec.fund_id;
884    IF G_DEBUG THEN
885       ozf_utility_pvt.debug_message(l_full_name || ': insert object attribute');
886    END IF;
887 
888    -- If the fund_status is 'ACTIVE', we need to create a record in th ACT_BUDGET table for the holdback amount
889    -- fixed bug for validation level and p_commit
890 
891    IF ((l_fund_rec.status_code = 'ACTIVE')
892        AND (NVL(l_fund_rec.holdback_amt, 0) <> 0)) THEN
893       l_act_budget_rec.status_code := 'APPROVED';
894       l_act_budget_rec.arc_act_budget_used_by := 'FUND';   -- hardcoded to fund
895       l_act_budget_rec.act_budget_used_by_id := l_fund_rec.fund_id;
896       l_act_budget_rec.requester_id := l_fund_rec.owner;
897       l_act_budget_rec.approver_id := l_fund_rec.owner;
898       l_act_budget_rec.request_amount := l_fund_rec.holdback_amt;   --- in transferring to fund currency
899       l_act_budget_rec.approved_amount := l_fund_rec.holdback_amt;   --- in transferring to fund currency
900       l_act_budget_rec.approved_original_amount := l_fund_rec.holdback_amt;   --- in transferring to fund currency
901       l_act_budget_rec.budget_source_type := 'FUND';
902       l_act_budget_rec.budget_source_id := l_fund_rec.fund_id;
903       l_act_budget_rec.transfer_type := 'RESERVE';
904       l_act_budget_rec.transaction_type := 'CREDIT';
905       l_act_budget_rec.approved_in_currency := l_fund_rec.currency_code_tc;
906       l_act_budget_rec.adjusted_flag :='N';
907       --l_act_budget_rec.date_required_by := p_needbydate;
908       -- Create_transfer record
909       ozf_actbudgets_pvt.create_act_budgets(
910          p_api_version => l_api_version
911         ,x_return_status => l_return_status
912         ,x_msg_count => x_msg_count
913         ,x_msg_data => x_msg_data
914         ,p_act_budgets_rec => l_act_budget_rec
915         ,x_act_budget_id => l_act_budget_id);
916 
917       IF l_return_status = fnd_api.g_ret_sts_error THEN
918          RAISE fnd_api.g_exc_error;
919       ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
920          RAISE fnd_api.g_exc_unexpected_error;
921       END IF;
922    END IF;
923 
924    /* R12: yzhao bug 4669269 - obsolete ozf_mc_transactions
925    --- Insert a record in OZF_MC_TRANSACTIONS_ALL IN functional currency
926    --  so that we have the functional currency amounts
927    --   The exchange_rate_type is picked up by the MC_TRAnSACTIONS API from proile
928    IF G_DEBUG THEN
929       ozf_utility_pvt.debug_message(l_full_name || ': insert Functional currency record');
930    END IF;
931    -- Populate the record variable
932    l_mc_transaction_rec.source_object_name := 'FUND';
933    l_mc_transaction_rec.source_object_id := l_fund_rec.fund_id;
934    l_mc_transaction_rec.currency_code := l_fund_rec.currency_code_tc;
935    l_mc_transaction_rec.amount_column1 := l_fund_rec.original_budget;
936    l_mc_transaction_rec.amount_column2 := l_fund_rec.transfered_in_amt;
937    l_mc_transaction_rec.amount_column3 := l_fund_rec.transfered_out_amt;
938    l_mc_transaction_rec.amount_column4 := l_fund_rec.holdback_amt;
939    l_mc_transaction_rec.amount_column5 := l_fund_rec.planned_amt;
940    l_mc_transaction_rec.amount_column6 := l_fund_rec.committed_amt;
941    l_mc_transaction_rec.amount_column7 := l_fund_rec.earned_amt;
942    l_mc_transaction_rec.amount_column8 := l_fund_rec.paid_amt;
943    l_mc_transaction_rec.amount_column9 := l_fund_rec.utilized_amt;   -- yzhao: 11.5.10
944    -- Call mc_transaction API if the fund type is not QUOTA
945    IF l_fund_rec.fund_type <> 'QUOTA' THEN
946            ozf_mc_transactions_pvt.insert_mc_transactions(
947               p_api_version => l_api_version
948              ,p_init_msg_list => fnd_api.g_false
949              ,p_commit => fnd_api.g_false
950              ,x_return_status => l_return_status
951              ,x_msg_count => x_msg_count
952              ,x_msg_data => x_msg_data
953              ,p_mc_transactions_rec => l_mc_transaction_rec
954              ,x_mc_transaction_id => l_mc_transaction_id);
955 
956            IF l_return_status = fnd_api.g_ret_sts_error THEN
957                   RAISE fnd_api.g_exc_error;
958            ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
959                   RAISE fnd_api.g_exc_unexpected_error;
960            END IF;
961    END IF;
962    */
963 
964    /************************   MPANDE JAN-15 2001 ************************************************
965       For 11.5.5 release fund status will not be 'active' but will be always 'Draft' in the create
966       mode except during allocation .During fund allocation we donot need a approval for a child
967    **********************************************************************************************/
968    -- 07/10/2001 mpande bug#1875760
969    IF p_fund_rec.status_code = 'ACTIVE' THEN
970          IF p_fund_rec.parent_fund_id IS NOT NULL AND
971             p_fund_rec.fund_type <> 'FULLY_ACCRUED'  THEN
972 
973                -- changing status from 'DRAFT or 'REJECTED' to 'ACTIVE or ON_HOLD  is
974                -- equivalent to submitting for approval.
975                -- Approval submission   child fund
976                IF G_DEBUG THEN
977                   ozf_utility_pvt.debug_message(l_full_name || 'owner' || p_fund_rec.owner);
978                END IF;
979 
980                ozf_fund_request_apr_pvt.create_fund_request(
981                   p_commit => fnd_api.g_false
982                  ,p_approval_for_id => l_fund_rec.fund_id
983                  ,p_requester_id => l_fund_rec.owner
984                  ,p_requested_amount => l_fund_rec.transfered_in_amt ---l_fund_rec.original_budget mpande 11/06/2001
985                  ,p_approval_fm => 'FUND'
986                  ,p_approval_fm_id => l_fund_rec.parent_fund_id
987                  ,p_transfer_type => 'TRANSFER'
988                  ,p_child_flag =>'Y'
989                  ,p_justification => l_fund_rec.description
990                   -- 10/22/2001   mpande    Changed code different owner allocation bug
991                  ,p_allocation_flag => 'Y' -- set this flag to yes to by pass workflow approval
992                  ,x_return_status => l_return_status
993                  ,x_msg_count => x_msg_count
994                  ,x_msg_data => x_msg_data
995                  ,x_request_id => l_request_id
996                  ,x_approver_id => l_approver_id
997                  ,x_is_requester_owner => l_is_requestor_owner);
998 
999                IF l_return_status = fnd_api.g_ret_sts_error THEN
1000                   RAISE fnd_api.g_exc_error;
1001                ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
1002                   RAISE fnd_api.g_exc_unexpected_error;
1003                END IF;
1004 
1005          -- mpande end if end
1006          END IF;
1007 
1008     END IF ;
1009    --added by mpande
1010    -- insert a access for the owner
1011    IF G_DEBUG THEN
1012       ozf_utility_pvt.debug_message(l_full_name || ': insert access owner');
1013    END IF;
1014 
1015    IF l_fund_rec.fund_id IS NOT NULL THEN
1016 
1017       l_access_rec.act_access_to_object_id := l_fund_rec.fund_id;
1018       l_access_rec.arc_act_access_to_object := 'FUND';
1019       l_access_rec.user_or_role_id := l_fund_rec.owner;
1020       l_access_rec.arc_user_or_role_type := 'USER';
1021       l_access_rec.admin_flag := 'Y';
1022       l_access_rec.owner_flag := 'Y';
1023       ams_access_pvt.create_access(
1024          p_api_version => l_api_version
1025         ,p_init_msg_list => fnd_api.g_false
1026         ,p_validation_level => p_validation_level
1027         ,x_return_status => l_return_status
1028         ,x_msg_count => x_msg_count
1029         ,x_msg_data => x_msg_data
1030         ,p_commit => fnd_api.g_false
1031         ,p_access_rec => l_access_rec
1032         ,x_access_id => l_access_id);
1033 
1034       IF l_return_status = fnd_api.g_ret_sts_error THEN
1035          RAISE fnd_api.g_exc_error;
1036       ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
1037          RAISE fnd_api.g_exc_unexpected_error;
1038       END IF;
1039    END IF;
1040 
1041    --added by mpande
1042    -- if parent id is not null during creation , a row is created in the ams_act_access to give access
1043    -- to the owner of the parent fund to this child
1044    IF G_DEBUG THEN
1045       ozf_utility_pvt.debug_message(l_full_name || ': insert access parent');
1046    END IF;
1047 
1048    IF l_fund_rec.parent_fund_id IS NOT NULL THEN
1049    -- added updating rollup columns by feliu.
1050       IF l_fund_rec.status_code = 'ACTIVE' THEN
1051          update_rollup_amount(
1052                          p_api_version  => l_api_version
1053                         ,p_init_msg_list  => fnd_api.g_false
1054                         ,p_commit     => fnd_api.g_false
1055                         ,p_validation_level   => p_validation_level
1056                         ,x_return_status      => l_return_status
1057                         ,x_msg_count  => x_msg_count
1058                         ,x_msg_data   => x_msg_data
1059                         ,p_fund_rec => l_fund_rec
1060                         );
1061 /* move this part to update_rollup_amount by feliu.
1062 
1063       OPEN c_par_fund_owner(l_fund_rec.parent_fund_id);
1064       FETCH c_par_fund_owner INTO l_par_fund_owner;
1065       CLOSE c_par_fund_owner;
1066       --if the owner of the parent and child fund is different then only add access
1067       IF l_fund_rec.owner <> l_par_fund_owner THEN
1068          l_access_rec.act_access_to_object_id := l_fund_rec.fund_id;
1069          l_access_rec.arc_act_access_to_object := 'FUND';
1070          l_access_rec.user_or_role_id := l_par_fund_owner;
1071          l_access_rec.arc_user_or_role_type := 'USER';
1072          l_access_rec.admin_flag := 'Y';    -- 12/03/2001 yzhao: give admin access to parent
1073          l_access_rec.owner_flag := 'N';
1074          ams_access_pvt.create_access(
1075             p_api_version => l_api_version
1076            ,p_init_msg_list => fnd_api.g_false
1077            ,p_validation_level => p_validation_level
1078            ,x_return_status => l_return_status
1079            ,x_msg_count => x_msg_count
1080            ,x_msg_data => x_msg_data
1081            ,p_commit => fnd_api.g_false
1082            ,p_access_rec => l_access_rec
1083            ,x_access_id => l_access_id);
1084       END IF;
1085 */
1086       IF l_return_status = fnd_api.g_ret_sts_error THEN
1087          RAISE fnd_api.g_exc_error;
1088       ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
1089          RAISE fnd_api.g_exc_unexpected_error;
1090       END IF;
1091 
1092      END IF;
1093   -- added by feliu to fix bug 2654263
1094 
1095       update_funds_access(
1096                          p_api_version  => l_api_version
1097                         ,p_init_msg_list  => fnd_api.g_false
1098                                     ,p_commit     => fnd_api.g_false
1099                                     ,p_validation_level   => p_validation_level
1100                                     ,x_return_status      => l_return_status
1101                                     ,x_msg_count  => x_msg_count
1102                                     ,x_msg_data   => x_msg_data
1103                         ,p_fund_rec => l_fund_rec
1104                         ,p_mode => 'CREATE'
1105                        );
1106 
1107       IF l_return_status = fnd_api.g_ret_sts_error THEN
1108          RAISE fnd_api.g_exc_error;
1109       ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
1110          RAISE fnd_api.g_exc_unexpected_error;
1111       END IF;
1112 
1113    END IF;
1114      -- mpadne 10/14/2002 for 11.5.9
1115      IF G_DEBUG THEN
1116         OZF_UTILITY_PVT.DEBUG_MESSAGE('ACCRUAL BASIS ='||L_FUND_REC.accrual_basis);
1117      END IF;
1118    IF p_fund_rec.fund_type = 'FULLY_ACCRUED'  AND p_fund_rec.plan_id is null THEN
1119               ozf_fundrules_pvt.process_accrual    (
1120                           p_fund_rec => l_fund_rec
1121                          ,p_api_version  => l_api_version
1122                          ,p_mode   => 'CREATE'
1123                          ,x_return_status      => l_return_status
1124                          ,x_msg_count  => x_msg_count
1125                          ,x_msg_data   => x_msg_data );
1126        IF l_return_status = fnd_api.g_ret_sts_error THEN
1127           RAISE fnd_api.g_exc_error;
1128        ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
1129           RAISE fnd_api.g_exc_unexpected_error;
1130        END IF;
1131    END IF;
1132    -- Check for commit
1133    IF fnd_api.to_boolean(p_commit) THEN
1134       COMMIT;
1135    END IF;
1136 
1137  -- raise business event.
1138  --nepanda : fix for bug # 9616725
1139   raise_business_event(p_object_id => l_fund_rec.fund_id ,p_event_type =>'CREATE');
1140 
1141    fnd_msg_pub.count_and_get(
1142       p_encoded => fnd_api.g_false
1143      ,p_count => x_msg_count
1144      ,p_data => x_msg_data);
1145    IF G_DEBUG THEN
1146       ozf_utility_pvt.debug_message(l_full_name || ': end');
1147    END IF;
1148 
1149 EXCEPTION
1150    WHEN fnd_api.g_exc_error THEN
1151       ROLLBACK TO create_fund;
1152       x_return_status := fnd_api.g_ret_sts_error;
1153       fnd_msg_pub.count_and_get(
1154          p_encoded => fnd_api.g_false
1155         ,p_count => x_msg_count
1156         ,p_data => x_msg_data);
1157    WHEN fnd_api.g_exc_unexpected_error THEN
1158       ROLLBACK TO create_fund;
1159       x_return_status := fnd_api.g_ret_sts_unexp_error;
1160       fnd_msg_pub.count_and_get(
1161          p_encoded => fnd_api.g_false
1162         ,p_count => x_msg_count
1163         ,p_data => x_msg_data);
1164    WHEN OTHERS THEN
1165       ROLLBACK TO create_fund;
1166       x_return_status := fnd_api.g_ret_sts_unexp_error;
1167 
1168       IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_unexp_error) THEN
1169          fnd_msg_pub.add_exc_msg(g_pkg_name, l_api_name);
1170       END IF;
1171 
1172       fnd_msg_pub.count_and_get(
1173          p_encoded => fnd_api.g_false
1174         ,p_count => x_msg_count
1175         ,p_data => x_msg_data);
1176 END create_fund;
1177 
1178 
1179 
1180 ---------------------------------------------------------------
1181 -- PROCEDURE
1182 --    Delete_Fund
1183 --
1184 -- HISTORY
1185 --    02/02/2000  Shitij Vatsa  Create.
1186 ---------------------------------------------------------------
1187 PROCEDURE delete_fund(
1188    p_api_version      IN       NUMBER
1189   ,p_init_msg_list    IN       VARCHAR2 := fnd_api.g_false
1190   ,p_commit           IN       VARCHAR2 := fnd_api.g_false
1191   ,x_return_status    OUT NOCOPY      VARCHAR2
1192   ,x_msg_count        OUT NOCOPY      NUMBER
1193   ,x_msg_data         OUT NOCOPY      VARCHAR2
1194   ,p_fund_id          IN       NUMBER
1195   ,p_object_version   IN       NUMBER)
1196 IS
1197    l_api_version    CONSTANT NUMBER       := 1.0;
1198    l_api_name       CONSTANT VARCHAR2(30) := 'Delete_Fund';
1199    l_full_name      CONSTANT VARCHAR2(60) := g_pkg_name || '.' || l_api_name;
1200 BEGIN
1201    --------------------- initialize -----------------------
1202    SAVEPOINT delete_fund;
1203    IF G_DEBUG THEN
1204       ozf_utility_pvt.debug_message(l_full_name || ': start');
1205    END IF;
1206 
1207    IF fnd_api.to_boolean(p_init_msg_list) THEN
1208       fnd_msg_pub.initialize;
1209    END IF;
1210 
1211    IF NOT fnd_api.compatible_api_call(l_api_version, p_api_version, l_api_name, g_pkg_name) THEN
1212       RAISE fnd_api.g_exc_unexpected_error;
1213    END IF;
1214 
1215    x_return_status := fnd_api.g_ret_sts_success;
1216    ------------------------ delete ------------------------
1217    IF G_DEBUG THEN
1218       ozf_utility_pvt.debug_message(l_full_name || ': delete');
1219    END IF;
1220 
1221    DELETE
1222      FROM ozf_funds_all_b
1223     WHERE fund_id = p_fund_id
1224       AND object_version_number = p_object_version;
1225 
1226    IF (SQL%NOTFOUND) THEN
1227       IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_error) THEN
1228          fnd_message.set_name('OZF', 'OZF_API_RECORD_NOT_FOUND');
1229          fnd_msg_pub.add;
1230       END IF;
1231 
1232       RAISE fnd_api.g_exc_error;
1233    END IF;
1234 
1235    DELETE
1236      FROM ozf_funds_all_tl
1237     WHERE fund_id = p_fund_id;
1238 
1239    IF (SQL%NOTFOUND) THEN
1240       IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_error) THEN
1241          fnd_message.set_name('OZF', 'OZF_API_RECORD_NOT_FOUND');
1242          fnd_msg_pub.add;
1243       END IF;
1244 
1245       RAISE fnd_api.g_exc_error;
1246    END IF;
1247 
1248    -------------------- finish --------------------------
1249    IF fnd_api.to_boolean(p_commit) THEN
1250       COMMIT;
1251    END IF;
1252 
1253    fnd_msg_pub.count_and_get(
1254       p_encoded => fnd_api.g_false
1255      ,p_count => x_msg_count
1256      ,p_data => x_msg_data);
1257    IF G_DEBUG THEN
1258       ozf_utility_pvt.debug_message(l_full_name || ': end');
1259    END IF;
1260 EXCEPTION
1261    WHEN fnd_api.g_exc_error THEN
1262       ROLLBACK TO delete_fund;
1263       x_return_status := fnd_api.g_ret_sts_error;
1264       fnd_msg_pub.count_and_get(
1265          p_encoded => fnd_api.g_false
1266         ,p_count => x_msg_count
1267         ,p_data => x_msg_data);
1268    WHEN fnd_api.g_exc_unexpected_error THEN
1269       ROLLBACK TO delete_fund;
1270       x_return_status := fnd_api.g_ret_sts_unexp_error;
1271       fnd_msg_pub.count_and_get(
1272          p_encoded => fnd_api.g_false
1273         ,p_count => x_msg_count
1274         ,p_data => x_msg_data);
1275    WHEN OTHERS THEN
1276       ROLLBACK TO delete_fund;
1277       x_return_status := fnd_api.g_ret_sts_unexp_error;
1278 
1279       IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_unexp_error) THEN
1280          fnd_msg_pub.add_exc_msg(g_pkg_name, l_api_name);
1281       END IF;
1282 
1283       fnd_msg_pub.count_and_get(
1284          p_encoded => fnd_api.g_false
1285         ,p_count => x_msg_count
1286         ,p_data => x_msg_data);
1287 END delete_fund;
1288 
1289 
1290 
1291 -------------------------------------------------------------------
1292 -- PROCEDURE
1293 --    Lock_Fund
1294 --
1295 -- HISTORY
1296 --    02/02/2000  Shitij Vatsa  Create.
1297 --------------------------------------------------------------------
1298 PROCEDURE lock_fund(
1299    p_api_version      IN       NUMBER
1300   ,p_init_msg_list    IN       VARCHAR2 := fnd_api.g_false
1301   ,x_return_status    OUT NOCOPY      VARCHAR2
1302   ,x_msg_count        OUT NOCOPY      NUMBER
1303   ,x_msg_data         OUT NOCOPY      VARCHAR2
1304   ,p_fund_id          IN       NUMBER
1305   ,p_object_version   IN       NUMBER)
1306 IS
1307    l_api_version    CONSTANT NUMBER       := 1.0;
1308    l_api_name       CONSTANT VARCHAR2(30) := 'Lock_Fund';
1309    l_full_name      CONSTANT VARCHAR2(60) := g_pkg_name || '.' || l_api_name;
1310    l_fund_id                 NUMBER;
1311 
1312    CURSOR c_fund_b
1313    IS
1314       SELECT   fund_id
1315       FROM     ozf_funds_all_b
1316       WHERE  fund_id = p_fund_id
1317          AND object_version_number = p_object_version
1318          FOR UPDATE OF fund_id NOWAIT;
1319 
1320    CURSOR c_fund_tl
1321    IS
1322       SELECT   fund_id
1323       FROM     ozf_funds_all_tl
1324       WHERE  fund_id = p_fund_id
1325          AND USERENV('LANG') IN(language, source_lang)
1326          FOR UPDATE OF fund_id NOWAIT;
1327 BEGIN
1328    -------------------- initialize ------------------------
1329    IF G_DEBUG THEN
1330       ozf_utility_pvt.debug_message(l_full_name || ': start');
1331    END IF;
1332 
1333    IF fnd_api.to_boolean(p_init_msg_list) THEN
1334       fnd_msg_pub.initialize;
1335    END IF;
1336 
1337    IF NOT fnd_api.compatible_api_call(l_api_version, p_api_version, l_api_name, g_pkg_name) THEN
1338       RAISE fnd_api.g_exc_unexpected_error;
1339    END IF;
1340 
1341    x_return_status := fnd_api.g_ret_sts_success;
1342    ------------------------ lock -------------------------
1343    IF G_DEBUG THEN
1344       ozf_utility_pvt.debug_message(l_full_name || ': lock');
1345    END IF;
1346    OPEN c_fund_b;
1347    FETCH c_fund_b INTO l_fund_id;
1348 
1349    IF (c_fund_b%NOTFOUND) THEN
1350       CLOSE c_fund_b;
1351 
1352       IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_error) THEN
1353          fnd_message.set_name('OZF', 'OZF_API_RECORD_NOT_FOUND');
1354          fnd_msg_pub.add;
1355       END IF;
1356 
1357       RAISE fnd_api.g_exc_error;
1358    END IF;
1359 
1360    CLOSE c_fund_b;
1361    OPEN c_fund_tl;
1362    CLOSE c_fund_tl;
1363    -------------------- finish --------------------------
1364    fnd_msg_pub.count_and_get(
1365       p_encoded => fnd_api.g_false
1366      ,p_count => x_msg_count
1367      ,p_data => x_msg_data);
1368    IF G_DEBUG THEN
1369       ozf_utility_pvt.debug_message(l_full_name || ': end');
1370    END IF;
1371 EXCEPTION
1372    WHEN ozf_utility_pvt.resource_locked THEN
1373       x_return_status := fnd_api.g_ret_sts_error;
1374 
1375       IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_error) THEN
1376          fnd_message.set_name('OZF', 'OZF_API_RESOURCE_LOCKED');
1377          fnd_msg_pub.add;
1378       END IF;
1379 
1380       fnd_msg_pub.count_and_get(
1381          p_encoded => fnd_api.g_false
1382         ,p_count => x_msg_count
1383         ,p_data => x_msg_data);
1384    WHEN fnd_api.g_exc_error THEN
1385       x_return_status := fnd_api.g_ret_sts_error;
1386       fnd_msg_pub.count_and_get(
1387          p_encoded => fnd_api.g_false
1388         ,p_count => x_msg_count
1389         ,p_data => x_msg_data);
1390    WHEN fnd_api.g_exc_unexpected_error THEN
1391       x_return_status := fnd_api.g_ret_sts_unexp_error;
1392       fnd_msg_pub.count_and_get(
1393          p_encoded => fnd_api.g_false
1394         ,p_count => x_msg_count
1395         ,p_data => x_msg_data);
1396    WHEN OTHERS THEN
1397       x_return_status := fnd_api.g_ret_sts_unexp_error;
1398 
1399       IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_unexp_error) THEN
1400          fnd_msg_pub.add_exc_msg(g_pkg_name, l_api_name);
1401       END IF;
1402 
1403       fnd_msg_pub.count_and_get(
1404          p_encoded => fnd_api.g_false
1405         ,p_count => x_msg_count
1406         ,p_data => x_msg_data);
1407 END lock_fund;
1408 
1409 ---------------------------------------------------------------------
1410 -- PROCEDURE
1411 -- Update_Fund
1412 -- Over loaded Update_Fund for bug#8867381
1413 -- Altered px_ozf_funds_new_rectype to px_ozf_funds_new_tbl for TPA Parallel Execution ER Bug#9614703.
1414 ----------------------------------------------------------------------
1415 PROCEDURE update_fund(
1416    p_api_version        IN       NUMBER
1417   ,p_init_msg_list      IN       VARCHAR2 := fnd_api.g_false
1418   ,p_commit             IN       VARCHAR2 := fnd_api.g_false
1419   ,p_validation_level   IN       NUMBER := fnd_api.g_valid_level_full
1420   ,x_return_status      OUT NOCOPY      VARCHAR2
1421   ,x_msg_count          OUT NOCOPY      NUMBER
1422   ,x_msg_data           OUT NOCOPY      VARCHAR2
1423   ,p_fund_rec           IN       fund_rec_type
1424   ,p_mode               IN       VARCHAR2 := jtf_plsql_api.g_update
1425   )
1426 IS
1427   l_resale_batch_id             NUMBER;
1428   l_use_fund_staging_tables     VARCHAR2(1) := 'F';
1429   lx_ozf_funds_old_rectype      OZF_UTILITY_PVT.ozf_funds_all_b_rectype;
1430   lx_ozf_funds_new_tbl      OZF_UTILITY_PVT.ozf_funds_table;
1431   l_batch_type VARCHAR2(30);
1432 BEGIN
1433 update_fund(
1434    p_api_version        =>       p_api_version
1435   ,p_init_msg_list      =>       p_init_msg_list
1436   ,p_commit             =>       p_commit
1437   ,p_validation_level   =>       p_validation_level
1438   ,x_return_status      =>      x_return_status
1439   ,x_msg_count          =>      x_msg_count
1440   ,x_msg_data           =>      x_msg_data
1441   ,p_fund_rec           =>       p_fund_rec
1442   ,p_mode               =>       p_mode
1443   ,p_resale_batch_id    =>      l_resale_batch_id
1444   ,p_batch_type      =>    l_batch_type
1445   ,p_use_fund_staging_tables => l_use_fund_staging_tables
1446   ,px_ozf_funds_old_rectype     => lx_ozf_funds_old_rectype
1447   ,px_ozf_funds_new_tbl     => lx_ozf_funds_new_tbl
1448   );
1449 END update_fund;
1450 
1451 ---------------------------------------------------------------------
1452 -- PROCEDURE
1453 --    Update_Fund
1454 --
1455 -- HISTORY
1456 --    02/02/2000  Shitij Vatsa  Create.
1457 --    06/13/2000  mpande Added access calls
1458 --    06/13/2000  mpande fixed bug complete rec
1459 --    06/13/2000  Added access calls and other validations
1460 --    07/24/2000  Added Multiple Currency Enabling Calls
1461 --    07/28/2000  Added parent_validation against child
1462 --    02/08/2002  Added rollup amount update.
1463 /*************major changes for 11.5.5*********************************
1464 --  All functionality related to statistical fund removed.
1465 -- 2) Added the five columns ,  start_period_name,  end_period_name,  accrual_quantity,
1466 --       accrue_to_level_id,fund_calendar
1467 --      3) Introduced new API check_fund-inter_entity
1468 -- 4) Removed some of the fund rules validations to package OzfFundRulesPvt (because this Api was getging bigger)
1469 -- 5) Removed all active fund transactions to package OzfFundRulesPvt
1470 -- 6) Added approval and other fully accrued fund related transactions
1471 --
1472 **********************************************************************/
1473 
1474 
1475 
1476 ----------------------------------------------------------------------
1477 PROCEDURE update_fund(
1478    p_api_version        IN       NUMBER
1479   ,p_init_msg_list      IN       VARCHAR2 := fnd_api.g_false
1480   ,p_commit             IN       VARCHAR2 := fnd_api.g_false
1481   ,p_validation_level   IN       NUMBER := fnd_api.g_valid_level_full
1482   ,x_return_status      OUT NOCOPY      VARCHAR2
1483   ,x_msg_count          OUT NOCOPY      NUMBER
1484   ,x_msg_data           OUT NOCOPY      VARCHAR2
1485   ,p_fund_rec           IN       fund_rec_type
1486   ,p_mode               IN       VARCHAR2 := jtf_plsql_api.g_update
1487   ,p_resale_batch_id    IN NUMBER
1488   ,p_batch_type      IN  VARCHAR2
1489   ,p_use_fund_staging_tables IN VARCHAR2
1490   ,px_ozf_funds_old_rectype     IN      OZF_UTILITY_PVT.ozf_funds_all_b_rectype
1491   ,px_ozf_funds_new_tbl     IN OUT NOCOPY   OZF_UTILITY_PVT.ozf_funds_table
1492   )
1493 IS
1494    l_api_version    CONSTANT NUMBER                                           := 1.0;
1495    l_api_name       CONSTANT VARCHAR2(30)
1496             := 'Update_Fund';
1497    l_full_name      CONSTANT VARCHAR2(60)
1498             := g_pkg_name || '.' || l_api_name;
1499    l_fund_rec                fund_rec_type;
1500    l_return_status           VARCHAR2(1) := FND_API.g_ret_sts_success;
1501    l_mode                    VARCHAR2(30);
1502    l_request_id              NUMBER;
1503    /* R12: yzhao bug 4669269 - obsolete ozf_mc_transactions
1504    l_mc_obj_number           NUMBER;
1505    l_mc_record_id            NUMBER;
1506    l_mc_transaction_rec      ozf_mc_transactions_pvt.mc_transactions_rec_type;
1507     */
1508    --- variable for creating access //mpande
1509    l_access_rec              ams_access_pvt.access_rec_type;
1510    l_access_id               NUMBER;
1511    l_act_access_id           NUMBER;
1512    l_acc_obj_ver_num         NUMBER;
1513    l_par_fund_owner          NUMBER;
1514    --  l_request_rec             ozf_fund_request_pvt.request_rec_type;
1515    l_status_code             VARCHAR2(30);
1516    --  08/14/2001 mpande added
1517    l_submit_budget_approval  VARCHAR2(1):= FND_API.g_false;
1518    l_submit_child_approval   VARCHAR2(1):= FND_API.g_false;
1519    l_approver_id             NUMBER;
1520    l_workflow_process        VARCHAR2(30) := 'AMSGAPP';
1521    l_item_type               VARCHAR2(30) := 'AMSGAPP';
1522    l_old_user_status_id      NUMBER;
1523    l_status_type             VARCHAR2(30) := 'OZF_FUND_STATUS';
1524    l_is_requestor_owner      VARCHAR2(1);
1525    l_reject_status_id        NUMBER;
1526    l_child_request_amt           NUMBER ; -- mpande 11/06/2001 added
1527 
1528    -- For Bug#8867381
1529    l_use_fund_staging_tables    VARCHAR2(1):= p_use_fund_staging_tables;
1530 
1531 
1532    l_operation VARCHAR2(15);
1533    l_fund_record_num number := 0;
1534 
1535 
1536    -- CURSOR for old status code //updated by mpande
1537    CURSOR c_old_status(
1538       cv_fund_id   IN   NUMBER)
1539    IS
1540       SELECT   status_code
1541               ,parent_fund_id
1542               ,user_status_id
1543       FROM     ozf_funds_all_b
1544       WHERE  fund_id = cv_fund_id;
1545 
1546    l_old_status              VARCHAR2(30);
1547    l_old_parent_fund_id      NUMBER;
1548    l_old_par_fund_owner      NUMBER;
1549 
1550    --added by mpande cursor to get parent fund owner
1551    CURSOR c_par_fund_owner(
1552       par_fund_id   IN   NUMBER)
1553    IS
1554       SELECT   owner
1555       FROM     ozf_funds_all_b
1556       WHERE  fund_id = par_fund_id;
1557 
1558    /* R12: yzhao bug 4669269 - obsolete ozf_mc_transactions
1559    CURSOR c_mc_record(
1560       source_id   IN   NUMBER)
1561    IS
1562       SELECT   mc_record_id
1563               ,object_version_number
1564       FROM     ozf_mc_transactions_all
1565       WHERE  source_object_id = source_id
1566          AND source_object_name = 'FUND';
1567     */
1568 
1569    CURSOR c_access(
1570       p_fund_id   IN   NUMBER)
1571    IS
1572       SELECT   activity_access_id
1573               ,object_version_number
1574       FROM     ams_act_access
1575       WHERE  act_access_to_object_id = p_fund_id
1576          AND arc_act_access_to_object = 'FUND'
1577          AND owner_flag = 'Y';
1578 
1579    CURSOR c_par_access(
1580       p_fund_id        IN   NUMBER
1581      ,p_par_owner_id   IN   NUMBER)
1582    IS
1583       SELECT   activity_access_id
1584               ,object_version_number
1585       FROM     ams_act_access
1586       WHERE  act_access_to_object_id = p_fund_id
1587          AND arc_act_access_to_object = 'FUND'
1588          AND arc_user_or_role_type = 'USER'
1589          AND user_or_role_id = p_par_owner_id
1590          -- 09/05/2001 mpande
1591          AND NVL(owner_flag,'N') = 'N' ;
1592 
1593    --- cursor to get old (TC) currency_code
1594    CURSOR c_old_curr(
1595       cv_fund_id   IN   NUMBER)
1596    IS
1597       SELECT   currency_code_tc , owner
1598       FROM     ozf_funds_all_b
1599       WHERE  fund_id = cv_fund_id;
1600 
1601    l_old_curr                VARCHAR2(30);
1602    l_rate                    NUMBER;
1603    l_owner                   NUMBER;
1604 
1605  -- added by feliu for rollup amount updating.
1606    CURSOR c_amt IS
1607      SELECT planned_amt,committed_amt,
1608      earned_amt,paid_amt,transfered_in_amt
1609      ,transfered_out_amt,original_budget
1610      ,recal_committed,holdback_amt
1611      ,utilized_amt   -- yzhao: 11.5.10
1612      FROM ozf_funds_all_b
1613      WHERE fund_id = p_fund_rec.fund_id;
1614 
1615    CURSOR c_rollup_amt IS
1616      SELECT rollup_planned_amt,rollup_committed_amt
1617      ,rollup_earned_amt,rollup_paid_amt,rollup_transfered_in_amt
1618      ,rollup_transfered_out_amt,rollup_original_budget
1619      ,rollup_recal_committed,rollup_holdback_amt
1620      ,rollup_utilized_amt   -- yzhao: 11.5.10
1621      FROM ozf_funds_all_b
1622      WHERE fund_id = p_fund_rec.fund_id;
1623 
1624    /* kdass - R12 MOAC changes
1625    CURSOR c_get_org_id IS
1626      SELECT org_id
1627      FROM   ozf_funds_all_b
1628      WHERE  fund_id = p_fund_rec.fund_id;
1629    */
1630 
1631     l_original_budget        NUMBER;
1632     l_old_original_budget    NUMBER;
1633     l_old_transfered_in_amt  NUMBER;
1634     l_old_transfered_out_amt NUMBER;
1635     l_old_holdback_amt       NUMBER;
1636     l_old_planned_amt        NUMBER;
1637     l_old_committed_amt      NUMBER;
1638     l_old_utilized_amt       NUMBER;    -- yzhao: 11.5.10
1639     l_old_earned_amt         NUMBER;
1640     l_old_paid_amt           NUMBER;
1641     l_old_recal_committed    NUMBER;
1642 
1643 
1644     l_or_original_budget    NUMBER;
1645     l_or_transfered_in_amt  NUMBER;
1646     l_or_transfered_out_amt NUMBER;
1647     l_or_holdback_amt       NUMBER;
1648     l_or_planned_amt        NUMBER;
1649     l_or_committed_amt      NUMBER;
1650     l_or_utilized_amt       NUMBER;     -- yzhao: 11.5.10
1651     l_or_earned_amt         NUMBER;
1652     l_or_paid_amt           NUMBER;
1653     l_or_recal_committed    NUMBER;
1654 
1655     l_rollup_original_budget    NUMBER;
1656     l_rollup_transfered_in_amt  NUMBER;
1657     l_rollup_transfered_out_amt NUMBER;
1658     l_rollup_holdback_amt       NUMBER;
1659     l_rollup_planned_amt        NUMBER;
1660     l_rollup_committed_amt      NUMBER;
1661     l_rollup_utilized_amt       NUMBER;   -- yzhao: 11.5.10
1662     l_rollup_earned_amt         NUMBER;
1663     l_rollup_paid_amt           NUMBER;
1664     l_rollup_recal_committed    NUMBER;
1665     l_active_flag               BOOLEAN := false;
1666     l_allocation_flag           VARCHAR2(2) := 'N';  -- yzhao: 03/18/2003 added
1667 
1668     l_tmp_status_code           VARCHAR2(30);
1669     l_tmp_status_id             NUMBER;
1670 
1671     --Added for bug 7425189
1672     l_fund_reconc_msg VARCHAR2(4000);
1673     l_act_bud_cst_msg VARCHAR2(4000);
1674 
1675 BEGIN
1676    -------------------- initialize -------------------------
1677    SAVEPOINT update_fund;
1678    IF G_DEBUG THEN
1679       ozf_utility_pvt.debug_message(l_full_name || ': start');
1680    END IF;
1681 
1682    IF fnd_api.to_boolean(p_init_msg_list) THEN
1683       fnd_msg_pub.initialize;
1684    END IF;
1685 
1686    IF NOT fnd_api.compatible_api_call(l_api_version, p_api_version, l_api_name, g_pkg_name) THEN
1687       RAISE fnd_api.g_exc_unexpected_error;
1688    END IF;
1689 
1690    x_return_status := fnd_api.g_ret_sts_success;
1691 
1692    --      //added on Sep20 for user status validation
1693     complete_fund_rec(p_fund_rec, l_fund_rec);
1694    -- check fund status and fill in system status
1695    IF p_fund_rec.user_status_id <> fnd_api.g_miss_num THEN
1696       handle_fund_status(
1697          p_user_status_id => p_fund_rec.user_status_id
1698         ,x_status_code => l_status_code
1699         ,x_return_status => x_return_status);
1700 
1701       IF x_return_status = fnd_api.g_ret_sts_error THEN
1702          RAISE fnd_api.g_exc_error;
1703       ELSIF x_return_status = fnd_api.g_ret_sts_unexp_error THEN
1704          RAISE fnd_api.g_exc_unexpected_error;
1705       END IF;
1706 
1707       l_fund_rec.status_code := l_status_code;
1708    ELSIF p_fund_rec.status_code <> fnd_api.g_miss_char THEN
1709       IF G_DEBUG THEN
1710          ozf_utility_pvt.debug_message(l_full_name || 'debug' || p_fund_rec.status_code);
1711       END IF;
1712       get_user_status(
1713          p_status_code => p_fund_rec.status_code
1714         ,x_user_status_id => l_fund_rec.user_status_id
1715         ,x_return_status => x_return_status);
1716 
1717       IF x_return_status = fnd_api.g_ret_sts_error THEN
1718          RAISE fnd_api.g_exc_error;
1719       ELSIF x_return_status = fnd_api.g_ret_sts_unexp_error THEN
1720          RAISE fnd_api.g_exc_unexpected_error;
1721       END IF;
1722    --- this we need because there could be some records in the database with no user status
1723    ELSE
1724       IF G_DEBUG THEN
1725          ozf_utility_pvt.debug_message(l_full_name || 'in else ');
1726       END IF;
1727 
1728       IF l_fund_rec.user_status_id IS NOT NULL THEN
1729          handle_fund_status(
1730             p_user_status_id => l_fund_rec.user_status_id
1731            ,x_status_code => l_status_code
1732            ,x_return_status => x_return_status);
1733 
1734          IF x_return_status = fnd_api.g_ret_sts_error THEN
1735             RAISE fnd_api.g_exc_error;
1736          ELSIF x_return_status = fnd_api.g_ret_sts_unexp_error THEN
1737             RAISE fnd_api.g_exc_unexpected_error;
1738          END IF;
1739       ELSE
1740          -- if user_status_id is null in database then we will populate it with the corrsponnding system status value form user_status_table
1741          get_user_status(
1742             p_status_code => l_fund_rec.status_code
1743            ,x_user_status_id => l_fund_rec.user_status_id
1744            ,x_return_status => x_return_status);
1745 
1746          IF x_return_status = fnd_api.g_ret_sts_error THEN
1747             RAISE fnd_api.g_exc_error;
1748          ELSIF x_return_status = fnd_api.g_ret_sts_unexp_error THEN
1749             RAISE fnd_api.g_exc_unexpected_error;
1750          END IF;
1751       END IF;
1752 
1753       l_fund_rec.status_code := l_status_code;
1754    END IF;
1755 
1756      --Added for bug 7425189
1757      l_fund_reconc_msg := fnd_message.get_string ('OZF', 'OZF_FUND_RECONCILE');
1758      l_act_bud_cst_msg := fnd_message.get_string ('OZF', 'OZF_ACT_BUDG_CST_UTIL');
1759 
1760    --changed by mpande
1761    -- Fetch the old status code and old parentID
1762    OPEN c_old_status(p_fund_rec.fund_id);
1763    FETCH c_old_status INTO l_old_status, l_old_parent_fund_id,l_old_user_status_id;
1764    CLOSE c_old_status;
1765    ----------------------- validate ----------------------
1766    IF G_DEBUG THEN
1767       ozf_utility_pvt.debug_message(l_full_name || ': validate');
1768    END IF;
1769    -- replace g_miss_char/num/date with current column values
1770    --added by mpande 27th JULY-2000
1771    ---if the fund is active and the currency_code_tc passed is different than the fund_currency_code
1772    -- then this is either a transfer of fund or utlization record or updation of planned amount .
1773    -- The amount could only be updated in fund currency
1774    -- All the amounts passed should be converted to the fund_currency and then updated
1775 
1776    OPEN c_old_curr(p_fund_rec.fund_id);
1777    FETCH c_old_curr INTO l_old_curr,l_owner;
1778    CLOSE c_old_curr;
1779    ----dbms_output.put_line ('OLD CURR = '||l_old_curr);
1780    ----dbms_output.put_line ('PASSED CURR = '||p_fund_rec.currency_code_tc);
1781    IF G_DEBUG THEN
1782       ozf_utility_pvt.debug_message(l_full_name || ': convert currrency');
1783    END IF;
1784 -- changed the status call here to check for the changed status
1785    IF     l_fund_rec.status_code <> 'DRAFT' AND l_old_status <> 'DRAFT'
1786       AND l_old_curr <> l_fund_rec.currency_code_tc THEN
1787       IF     p_fund_rec.original_budget IS NOT NULL
1788          AND p_fund_rec.original_budget <> fnd_api.g_miss_num THEN
1789 
1790 
1791          IF G_DEBUG THEN
1792             ozf_utility_pvt.debug_message (l_full_name
1793                         || ' p_fund_rec.exchange_rate_date1: ' || p_fund_rec.exchange_rate_date);
1794          END IF;
1795 
1796          ozf_utility_pvt.convert_currency(
1797               x_return_status => l_return_status
1798              ,p_from_currency => p_fund_rec.currency_code_tc
1799              ,p_to_currency   => l_old_curr
1800              ,p_conv_date     => p_fund_rec.exchange_rate_date --bug 7425189, 8532055
1801              ,p_from_amount   => p_fund_rec.original_budget
1802              ,x_to_amount     => l_fund_rec.original_budget
1803              ,x_rate          => l_rate);
1804          /*
1805          --nirprasa, added for bug 7425189
1806          IF p_fund_rec.description IN (l_fund_reconc_msg,l_act_bud_cst_msg)
1807          AND p_fund_rec.exchange_rate_date IS NOT NULL THEN
1808            Ozf_utility_pvt.convert_currency(
1809               x_return_status => l_return_status
1810              ,p_from_currency => p_fund_rec.currency_code_tc
1811              ,p_to_currency => l_old_curr
1812              ,p_conv_date => p_fund_rec.exchange_rate_date
1813              ,p_from_amount => p_fund_rec.original_budget
1814              ,x_to_amount => l_fund_rec.original_budget
1815              ,x_rate => l_rate);
1816          ELSE
1817          Ozf_utility_pvt.convert_currency(
1818             x_return_status => l_return_status
1819            ,p_from_currency => p_fund_rec.currency_code_tc
1820            ,p_to_currency => l_old_curr
1821            ,p_from_amount => p_fund_rec.original_budget
1822            ,x_to_amount => l_fund_rec.original_budget
1823            ,x_rate => l_rate);
1824          END IF;
1825          */
1826 
1827          -- we need to pass the fund currency after calculating
1828          l_fund_rec.currency_code_tc := l_old_curr;
1829 
1830          ----dbms_output.put_line ('DEBUG ');
1831          IF l_return_status = fnd_api.g_ret_sts_error THEN
1832             RAISE fnd_api.g_exc_error;
1833          ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
1834             RAISE fnd_api.g_exc_unexpected_error;
1835          END IF;
1836       END IF;
1837 
1838       IF     p_fund_rec.transfered_in_amt IS NOT NULL
1839          AND p_fund_rec.transfered_in_amt <> fnd_api.g_miss_num THEN
1840 
1841 
1842          IF G_DEBUG THEN
1843             ozf_utility_pvt.debug_message (l_full_name
1844                         || ' p_fund_rec.exchange_rate_date2: ' || p_fund_rec.exchange_rate_date);
1845          END IF;
1846 
1847          ozf_utility_pvt.convert_currency(
1848             x_return_status => l_return_status
1849            ,p_from_currency => p_fund_rec.currency_code_tc
1850            ,p_to_currency   => l_old_curr
1851            ,p_conv_date     => p_fund_rec.exchange_rate_date --bug 7425189, 8532055
1852            ,p_from_amount   => p_fund_rec.transfered_in_amt
1853            ,x_to_amount     => l_fund_rec.transfered_in_amt
1854            ,x_rate          => l_rate);
1855 
1856          /*
1857          --nirprasa, added for bug 7425189
1858          IF p_fund_rec.description IN (l_fund_reconc_msg,l_act_bud_cst_msg)
1859            AND p_fund_rec.exchange_rate_date IS NOT NULL THEN
1860            Ozf_utility_pvt.convert_currency(
1861             x_return_status => l_return_status
1862            ,p_from_currency => p_fund_rec.currency_code_tc
1863            ,p_to_currency => l_old_curr
1864            ,p_conv_date => p_fund_rec.exchange_rate_date
1865            ,p_from_amount => p_fund_rec.transfered_in_amt
1866            ,x_to_amount => l_fund_rec.transfered_in_amt
1867            ,x_rate => l_rate);
1868          ELSE
1869          Ozf_utility_pvt.convert_currency(
1870             x_return_status => l_return_status
1871            ,p_from_currency => p_fund_rec.currency_code_tc
1872            ,p_to_currency => l_old_curr
1873            ,p_from_amount => p_fund_rec.transfered_in_amt
1874            ,x_to_amount => l_fund_rec.transfered_in_amt
1875            ,x_rate => l_rate);
1876         END IF;
1877         */
1878 
1879          -- we need to pass the fund currency after calculating
1880          l_fund_rec.currency_code_tc := l_old_curr;
1881 
1882          IF l_return_status = fnd_api.g_ret_sts_error THEN
1883             RAISE fnd_api.g_exc_error;
1884          ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
1885             RAISE fnd_api.g_exc_unexpected_error;
1886          END IF;
1887       END IF;
1888 
1889       IF     p_fund_rec.transfered_out_amt IS NOT NULL
1890          AND p_fund_rec.transfered_out_amt <> fnd_api.g_miss_num THEN
1891 
1892          IF G_DEBUG THEN
1893             ozf_utility_pvt.debug_message (l_full_name
1894                         || ' p_fund_rec.exchange_rate_date3: ' || p_fund_rec.exchange_rate_date);
1895          END IF;
1896 
1897          ozf_utility_pvt.convert_currency(
1898             x_return_status => l_return_status
1899            ,p_from_currency => p_fund_rec.currency_code_tc
1900            ,p_to_currency   => l_old_curr
1901            ,p_conv_date     => p_fund_rec.exchange_rate_date --bug 7425189, 8532055
1902            ,p_from_amount   => p_fund_rec.transfered_in_amt
1903            ,x_to_amount     => l_fund_rec.transfered_in_amt
1904            ,x_rate          => l_rate);
1905          /*
1906          --nirprasa, added for bug 7425189
1907          IF p_fund_rec.description IN (l_fund_reconc_msg,l_act_bud_cst_msg)
1908          AND p_fund_rec.exchange_rate_date IS NOT NULL THEN
1909          Ozf_utility_pvt.convert_currency(
1910             x_return_status => l_return_status
1911            ,p_from_currency => p_fund_rec.currency_code_tc
1912            ,p_to_currency => l_old_curr
1913            ,p_conv_date => p_fund_rec.exchange_rate_date
1914            ,p_from_amount => p_fund_rec.transfered_in_amt
1915            ,x_to_amount => l_fund_rec.transfered_in_amt
1916            ,x_rate => l_rate);
1917          ELSE
1918           Ozf_utility_pvt.convert_currency(
1919             x_return_status => l_return_status
1920            ,p_from_currency => p_fund_rec.currency_code_tc
1921            ,p_to_currency => l_old_curr
1922            ,p_from_amount => p_fund_rec.transfered_in_amt
1923            ,x_to_amount => l_fund_rec.transfered_in_amt
1924            ,x_rate => l_rate);
1925          END IF;
1926          */
1927 
1928          -- we need to pass the fund currency after calculating
1929          l_fund_rec.currency_code_tc := l_old_curr;
1930 
1931          IF l_return_status = fnd_api.g_ret_sts_error THEN
1932             RAISE fnd_api.g_exc_error;
1933          ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
1934             RAISE fnd_api.g_exc_unexpected_error;
1935          END IF;
1936       END IF;
1937 
1938       IF     p_fund_rec.planned_amt IS NOT NULL
1939          AND p_fund_rec.planned_amt <> fnd_api.g_miss_num THEN
1940 
1941          IF G_DEBUG THEN
1942             ozf_utility_pvt.debug_message (l_full_name
1943                         || ' p_fund_rec.exchange_rate_date4: ' || p_fund_rec.exchange_rate_date);
1944          END IF;
1945 
1946          ozf_utility_pvt.convert_currency(
1947             x_return_status => l_return_status
1948            ,p_from_currency => p_fund_rec.currency_code_tc
1949            ,p_to_currency   => l_old_curr
1950            ,p_conv_date     => p_fund_rec.exchange_rate_date --bug 7425189, 8532055
1951            ,p_from_amount   => p_fund_rec.planned_amt
1952            ,x_to_amount     => l_fund_rec.planned_amt
1953            ,x_rate          => l_rate);
1954 
1955          /*
1956          --nirprasa, added for bug 7425189
1957          IF p_fund_rec.description IN (l_fund_reconc_msg,l_act_bud_cst_msg)
1958            AND p_fund_rec.exchange_rate_date IS NOT NULL THEN
1959             Ozf_utility_pvt.convert_currency(
1960             x_return_status => l_return_status
1961            ,p_from_currency => p_fund_rec.currency_code_tc
1962            ,p_to_currency => l_old_curr
1963            ,p_conv_date => p_fund_rec.exchange_rate_date
1964            ,p_from_amount => p_fund_rec.planned_amt
1965            ,x_to_amount => l_fund_rec.planned_amt
1966            ,x_rate => l_rate);
1967          ELSE
1968           Ozf_utility_pvt.convert_currency(
1969             x_return_status => l_return_status
1970            ,p_from_currency => p_fund_rec.currency_code_tc
1971            ,p_to_currency => l_old_curr
1972            ,p_from_amount => p_fund_rec.planned_amt
1973            ,x_to_amount => l_fund_rec.planned_amt
1974            ,x_rate => l_rate);
1975          END IF;
1976          */
1977 
1978          -- we need to pass the fund currency after calculating
1979          l_fund_rec.currency_code_tc := l_old_curr;
1980 
1981          IF l_return_status = fnd_api.g_ret_sts_error THEN
1982             RAISE fnd_api.g_exc_error;
1983          ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
1984             RAISE fnd_api.g_exc_unexpected_error;
1985          END IF;
1986       END IF;
1987 
1988       -- yzhao: 11.5.10
1989       IF     p_fund_rec.utilized_amt IS NOT NULL
1990          AND p_fund_rec.utilized_amt <> fnd_api.g_miss_num THEN
1991 
1992          IF G_DEBUG THEN
1993             ozf_utility_pvt.debug_message (l_full_name
1994                         || ' p_fund_rec.exchange_rate_date5: ' || p_fund_rec.exchange_rate_date);
1995          END IF;
1996 
1997          ozf_utility_pvt.convert_currency(
1998             x_return_status => l_return_status
1999            ,p_from_currency => p_fund_rec.currency_code_tc
2000            ,p_to_currency   => l_old_curr
2001            ,p_conv_date     => p_fund_rec.exchange_rate_date --bug 7425189, 8532055
2002            ,p_from_amount   => p_fund_rec.utilized_amt
2003            ,x_to_amount     => l_fund_rec.utilized_amt
2004            ,x_rate          => l_rate);
2005 
2006          /*
2007          --nirprasa, added for bug 7425189
2008          IF p_fund_rec.description IN (l_fund_reconc_msg,l_act_bud_cst_msg)
2009            AND p_fund_rec.exchange_rate_date IS NOT NULL THEN
2010          Ozf_utility_pvt.convert_currency(
2011             x_return_status => l_return_status
2012            ,p_from_currency => p_fund_rec.currency_code_tc
2013            ,p_to_currency => l_old_curr
2014            ,p_conv_date => p_fund_rec.exchange_rate_date
2015            ,p_from_amount => p_fund_rec.utilized_amt
2016            ,x_to_amount => l_fund_rec.utilized_amt
2017            ,x_rate => l_rate);
2018          ELSE
2019          Ozf_utility_pvt.convert_currency(
2020             x_return_status => l_return_status
2021            ,p_from_currency => p_fund_rec.currency_code_tc
2022            ,p_to_currency => l_old_curr
2023            ,p_from_amount => p_fund_rec.utilized_amt
2024            ,x_to_amount => l_fund_rec.utilized_amt
2025            ,x_rate => l_rate);
2026          END IF;
2027          */
2028          -- we need to pass the fund currency after calculating
2029          l_fund_rec.currency_code_tc := l_old_curr;
2030 
2031          IF l_return_status = fnd_api.g_ret_sts_error THEN
2032             RAISE fnd_api.g_exc_error;
2033          ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
2034             RAISE fnd_api.g_exc_unexpected_error;
2035          END IF;
2036       END IF;
2037 
2038       IF     p_fund_rec.earned_amt IS NOT NULL
2039          AND p_fund_rec.earned_amt <> fnd_api.g_miss_num THEN
2040 
2041          IF G_DEBUG THEN
2042             ozf_utility_pvt.debug_message (l_full_name
2043                         || ' p_fund_rec.exchange_rate_date6: ' || p_fund_rec.exchange_rate_date);
2044          END IF;
2045 
2046          ozf_utility_pvt.convert_currency(
2047             x_return_status => l_return_status
2048            ,p_from_currency => p_fund_rec.currency_code_tc
2049            ,p_to_currency   => l_old_curr
2050            ,p_conv_date     => p_fund_rec.exchange_rate_date --bug 7425189, 8532055
2051            ,p_from_amount   => p_fund_rec.earned_amt
2052            ,x_to_amount     => l_fund_rec.earned_amt
2053            ,x_rate          => l_rate);
2054 
2055          /*
2056          --nirprasa, added for bug 7425189
2057          IF p_fund_rec.description IN (l_fund_reconc_msg,l_act_bud_cst_msg)
2058            AND p_fund_rec.exchange_rate_date IS NOT NULL THEN
2059          Ozf_utility_pvt.convert_currency(
2060             x_return_status => l_return_status
2061            ,p_from_currency => p_fund_rec.currency_code_tc
2062            ,p_to_currency => l_old_curr
2063            ,p_conv_date => p_fund_rec.exchange_rate_date
2064            ,p_from_amount => p_fund_rec.earned_amt
2065            ,x_to_amount => l_fund_rec.earned_amt
2066            ,x_rate => l_rate);
2067          ELSE
2068          Ozf_utility_pvt.convert_currency(
2069             x_return_status => l_return_status
2070            ,p_from_currency => p_fund_rec.currency_code_tc
2071            ,p_to_currency => l_old_curr
2072            ,p_from_amount => p_fund_rec.earned_amt
2073            ,x_to_amount => l_fund_rec.earned_amt
2074            ,x_rate => l_rate);
2075          END IF;
2076          */
2077          -- we need to pass the fund currency after calculating
2078          l_fund_rec.currency_code_tc := l_old_curr;
2079 
2080          IF l_return_status = fnd_api.g_ret_sts_error THEN
2081             RAISE fnd_api.g_exc_error;
2082          ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
2083             RAISE fnd_api.g_exc_unexpected_error;
2084          END IF;
2085       END IF;
2086 
2087       IF     p_fund_rec.committed_amt IS NOT NULL
2088          AND p_fund_rec.committed_amt <> fnd_api.g_miss_num THEN
2089 
2090          IF G_DEBUG THEN
2091             ozf_utility_pvt.debug_message (l_full_name
2092                         || ' p_fund_rec.exchange_rate_date7: ' || p_fund_rec.exchange_rate_date);
2093          END IF;
2094 
2095          ozf_utility_pvt.convert_currency(
2096             x_return_status => l_return_status
2097            ,p_from_currency => p_fund_rec.currency_code_tc
2098            ,p_to_currency   => l_old_curr
2099            ,p_conv_date     => p_fund_rec.exchange_rate_date --bug 7425189, 8532055
2100            ,p_from_amount   => p_fund_rec.committed_amt
2101            ,x_to_amount     => l_fund_rec.committed_amt
2102            ,x_rate          => l_rate);
2103 
2104          /*
2105          --nirprasa, added for bug 7425189
2106          IF p_fund_rec.description IN (l_fund_reconc_msg,l_act_bud_cst_msg)
2107            AND p_fund_rec.exchange_rate_date IS NOT NULL THEN
2108          Ozf_utility_pvt.convert_currency(
2109             x_return_status => l_return_status
2110            ,p_from_currency => p_fund_rec.currency_code_tc
2111            ,p_to_currency => l_old_curr
2112            ,p_conv_date => p_fund_rec.exchange_rate_date
2113            ,p_from_amount => p_fund_rec.committed_amt
2114            ,x_to_amount => l_fund_rec.committed_amt
2115            ,x_rate => l_rate);
2116          ELSE
2117          Ozf_utility_pvt.convert_currency(
2118             x_return_status => l_return_status
2119            ,p_from_currency => p_fund_rec.currency_code_tc
2120            ,p_to_currency => l_old_curr
2121            ,p_from_amount => p_fund_rec.committed_amt
2122            ,x_to_amount => l_fund_rec.committed_amt
2123            ,x_rate => l_rate);
2124          END IF;
2125          */
2126          -- we need to pass the fund currency after calculating
2127          l_fund_rec.currency_code_tc := l_old_curr;
2128 
2129          IF l_return_status = fnd_api.g_ret_sts_error THEN
2130             RAISE fnd_api.g_exc_error;
2131          ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
2132             RAISE fnd_api.g_exc_unexpected_error;
2133          END IF;
2134       END IF;
2135 
2136       IF     p_fund_rec.paid_amt IS NOT NULL
2137          AND p_fund_rec.paid_amt <> fnd_api.g_miss_num THEN
2138 
2139          IF G_DEBUG THEN
2140             ozf_utility_pvt.debug_message (l_full_name
2141                         || ' p_fund_rec.exchange_rate_date8: ' || p_fund_rec.exchange_rate_date);
2142          END IF;
2143 
2144          Ozf_utility_pvt.convert_currency(
2145             x_return_status => l_return_status
2146            ,p_from_currency => p_fund_rec.currency_code_tc
2147            ,p_to_currency   => l_old_curr
2148            ,p_conv_date     => p_fund_rec.exchange_rate_date --bug 7425189, 8532055
2149            ,p_from_amount   => p_fund_rec.paid_amt
2150            ,x_to_amount     => l_fund_rec.paid_amt
2151            ,x_rate          => l_rate);
2152 
2153          /*
2154          --nirprasa, added for bug 7425189
2155          IF p_fund_rec.description IN (l_fund_reconc_msg,l_act_bud_cst_msg)
2156            AND p_fund_rec.exchange_rate_date IS NOT NULL THEN
2157          Ozf_utility_pvt.convert_currency(
2158             x_return_status => l_return_status
2159            ,p_from_currency => p_fund_rec.currency_code_tc
2160            ,p_to_currency => l_old_curr
2161            ,p_conv_date => p_fund_rec.exchange_rate_date
2162            ,p_from_amount => p_fund_rec.paid_amt
2163            ,x_to_amount => l_fund_rec.paid_amt
2164            ,x_rate => l_rate);
2165          ELSE
2166          Ozf_utility_pvt.convert_currency(
2167             x_return_status => l_return_status
2168            ,p_from_currency => p_fund_rec.currency_code_tc
2169            ,p_to_currency => l_old_curr
2170            ,p_from_amount => p_fund_rec.paid_amt
2171            ,x_to_amount => l_fund_rec.paid_amt
2172            ,x_rate => l_rate);
2173          END IF;
2174          */
2175          -- we need to pass the fund currency after calculating
2176          l_fund_rec.currency_code_tc := l_old_curr;
2177 
2178          IF l_return_status = fnd_api.g_ret_sts_error THEN
2179             RAISE fnd_api.g_exc_error;
2180          ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
2181             RAISE fnd_api.g_exc_unexpected_error;
2182          END IF;
2183       END IF;
2184    END IF;
2185 
2186    -- default fund_calendar
2187    IF     l_fund_rec.start_period_name IS NULL
2188       AND l_fund_rec.end_period_name IS NULL THEN
2189       l_fund_rec.fund_calendar := NULL;
2190    ELSE
2191       l_fund_rec.fund_calendar := fnd_profile.VALUE('AMS_CAMPAIGN_DEFAULT_CALENDER');
2192    END IF;
2193 
2194    -- generate source code
2195    IF     p_fund_rec.parent_fund_id IS NOT NULL
2196       AND p_fund_rec.parent_fund_id <> fnd_api.g_miss_num
2197       AND p_fund_rec.fund_number IS NULL THEN
2198       get_child_source_code(
2199          p_fund_rec.parent_fund_id
2200         ,l_fund_rec.fund_number
2201         ,x_return_status);
2202 
2203       IF x_return_status = fnd_api.g_ret_sts_error THEN
2204          RAISE fnd_api.g_exc_error;
2205       ELSIF x_return_status = fnd_api.g_ret_sts_unexp_error THEN
2206          RAISE fnd_api.g_exc_unexpected_error;
2207       END IF;
2208    END IF;
2209 
2210    IF p_validation_level >= jtf_plsql_api.g_valid_level_item THEN
2211       ----dbms_output.put_line ('Calling Check_Fund_Items');
2212        check_fund_items(
2213          /* yzhao: 06/03/2003 fix bug 2984497 - TST1159.14 MASTER: BUDGET APPROVAL VALIDATION FAILS UPON APPROVAL IN WORKFLOW
2214          p_fund_rec => p_fund_rec
2215           */
2216          p_fund_rec => l_fund_rec
2217         ,p_validation_mode => jtf_plsql_api.g_update
2218         ,x_return_status => l_return_status
2219 	,p_mode => p_mode); -- For Bug 13529250, to pass p_mode to avoid budget amount validation while claim settlement
2220 
2221       IF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
2222          RAISE fnd_api.g_exc_unexpected_error;
2223       ELSIF l_return_status = fnd_api.g_ret_sts_error THEN
2224          RAISE fnd_api.g_exc_error;
2225       END IF;
2226    END IF;
2227 
2228    -- record level
2229    IF p_validation_level >= jtf_plsql_api.g_valid_level_record THEN
2230       check_fund_record(
2231          p_fund_rec => p_fund_rec
2232         ,p_complete_rec => l_fund_rec
2233         ,p_mode => p_mode
2234         ,x_return_status => l_return_status);
2235 
2236       IF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
2237          RAISE fnd_api.g_exc_unexpected_error;
2238       ELSIF l_return_status = fnd_api.g_ret_sts_error THEN
2239          RAISE fnd_api.g_exc_error;
2240       END IF;
2241    END IF;
2242 
2243    -- inter-entity level
2244    IF G_DEBUG THEN
2245       ozf_utility_pvt.debug_message(l_full_name || ': check inter-entity');
2246    END IF;
2247 
2248    IF p_validation_level >= jtf_plsql_api.g_valid_level_inter_entity THEN
2249       check_fund_inter_entity(
2250          p_fund_rec => p_fund_rec
2251         ,p_complete_rec => l_fund_rec
2252         ,p_validation_mode => jtf_plsql_api.g_update
2253         ,x_return_status => l_return_status);
2254 
2255       IF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
2256          RAISE fnd_api.g_exc_unexpected_error;
2257       ELSIF l_return_status = fnd_api.g_ret_sts_error THEN
2258          RAISE fnd_api.g_exc_error;
2259       END IF;
2260    END IF;
2261 
2262    -------------------------- update --------------------
2263    IF G_DEBUG THEN
2264       ozf_utility_pvt.debug_message(l_full_name || ': update');
2265 
2266       ozf_utility_pvt.debug_message(l_full_name || ': get_category');
2267    END IF;
2268 
2269    -- kdass 09-NOV-05 Bug 4618523
2270    /*
2271    --added by mpande 6th JULY-2000
2272    --get default category GL Info not for statistical funds
2273    IF     p_fund_rec.category_id <> fnd_api.g_miss_num
2274       AND l_fund_rec.category_id IS NOT NULL THEN
2275       complete_default_gl_info(
2276          l_fund_rec.category_id
2277         ,l_fund_rec.accrued_liable_account
2278         ,l_fund_rec.ded_adjustment_account
2279         ,l_return_status);
2280 
2281       IF l_return_status = fnd_api.g_ret_sts_error THEN
2282          RAISE fnd_api.g_exc_error;
2283       ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
2284          RAISE fnd_api.g_exc_unexpected_error;
2285       END IF;
2286    END IF;
2287    */
2288 
2289    IF G_DEBUG THEN
2290       ozf_utility_pvt.debug_message(l_full_name || 'before update status' ||l_fund_rec.original_budget);
2291    END IF;
2292    -- perform all status related  updation and if it is successful then only update the fund record
2293    -- Update fund could be called by other APIS in active status to update earned amt or committed amt .
2294    -- We do allow them to update the record then
2295    IF l_return_status = fnd_api.g_ret_sts_success THEN
2296       IF p_mode IN  (jtf_PLSQL_API.G_UPDATE, 'WORKFLOW') THEN
2297          Ozf_fundrules_pvt.update_fund_status(
2298           p_fund_rec => l_fund_rec
2299          /* yzhao: 11/26/2002 how weird to pass IN parameter l_fund_rec, and use member as OUT parameter
2300                               most importantly, it breaks with NOCOPY hint
2301          ,x_new_status_code => l_fund_rec.status_code
2302          ,x_new_status_id => l_fund_rec.user_status_id
2303           */
2304          ,x_new_status_code => l_tmp_status_code
2305          ,x_new_status_id => l_tmp_status_id
2306          ,x_submit_budget_approval => l_submit_budget_approval
2307          ,x_submit_child_approval =>l_submit_child_approval
2308          ,x_return_status => l_return_status
2309          ,x_msg_count => x_msg_count
2310          ,x_msg_data => x_msg_data
2311          ,p_api_version => 1.0);
2312 
2313          IF l_return_status = fnd_api.g_ret_sts_error THEN
2314             RAISE fnd_api.g_exc_error;
2315          ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
2316              RAISE fnd_api.g_exc_unexpected_error;
2317          END IF;
2318 
2319          l_fund_rec.status_code := l_tmp_status_code;
2320          l_fund_rec.user_status_id := l_tmp_status_id;
2321 
2322          -- sangara added for R12
2323          IF l_tmp_status_code = 'ACTIVE' THEN
2324             l_fund_rec.activation_date := sysdate;
2325          END IF;
2326 
2327       END IF;
2328    END IF;
2329 
2330    -- 11/02/2001 mpande added for child fund we donot want to update original_budget but transfered_in_amt
2331    -- when no approval required , other the approval API will do the needful
2332    -- 11/06/2001 mpande added
2333    l_child_request_amt := l_fund_rec.original_budget;
2334    -- when setting the status directly to active
2335    IF l_fund_rec.parent_fund_id IS NOT NULL THEN
2336       IF l_fund_rec.status_code = 'ON_HOLD' OR  l_fund_rec.status_code = 'ACTIVE' THEN
2337       --OR  l_fund_rec.status_code = 'PENDING'
2338          IF l_old_status = 'DRAFT' THEN
2339             l_fund_rec.transfered_in_amt := l_fund_rec.original_budget;
2340             l_fund_rec.original_budget := 0 ;
2341          END IF ;
2342 
2343          IF l_old_status = 'PENDING' OR l_old_status = 'DRAFT' THEN
2344             l_active_flag := true;
2345          END IF ;
2346 
2347        END IF;
2348    END IF;
2349 
2350    OPEN c_amt;
2351    FETCH c_amt INTO
2352     l_old_planned_amt,
2353     l_old_committed_amt,
2354     l_old_earned_amt,
2355     l_old_paid_amt,
2356     l_old_transfered_in_amt ,
2357     l_old_transfered_out_amt ,
2358     l_old_original_budget,
2359     l_old_recal_committed,
2360     l_old_holdback_amt,
2361     l_old_utilized_amt;   -- yzhao: 11.5.10
2362    CLOSE c_amt;
2363 
2364    OPEN c_rollup_amt;
2365    FETCH c_rollup_amt INTO
2366     l_or_planned_amt,
2367     l_or_committed_amt,
2368     l_or_earned_amt,
2369     l_or_paid_amt,
2370     l_or_transfered_in_amt ,
2371     l_or_transfered_out_amt ,
2372     l_or_original_budget,
2373     l_or_recal_committed,
2374     l_or_holdback_amt,
2375     l_or_utilized_amt;
2376    CLOSE c_rollup_amt;
2377 
2378    IF l_fund_rec.original_budget IS NOT NULL
2379      THEN
2380 
2381          IF G_DEBUG THEN
2382             ozf_utility_pvt.debug_message (l_full_name
2383                         || ' p_fund_rec.exchange_rate_date9: ' || p_fund_rec.exchange_rate_date);
2384          END IF;
2385 
2386          ozf_utility_pvt.convert_currency(
2387             x_return_status => l_return_status
2388            ,p_from_currency => l_fund_rec.currency_code_tc
2389            ,p_to_currency   => g_universal_currency
2390            ,p_conv_date     => p_fund_rec.exchange_rate_date --bug 7425189, 8532055
2391            ,p_from_amount   => l_fund_rec.original_budget
2392            ,x_to_amount     => l_original_budget
2393            ,x_rate          => l_rate);
2394 
2395          /*
2396          --nirprasa, added for bug 7425189
2397          IF p_fund_rec.description IN (l_fund_reconc_msg,l_act_bud_cst_msg)
2398          AND p_fund_rec.exchange_rate_date IS NOT NULL THEN
2399          Ozf_utility_pvt.convert_currency(
2400             x_return_status => l_return_status
2401            ,p_from_currency => l_fund_rec.currency_code_tc
2402            ,p_to_currency => g_universal_currency
2403            ,p_conv_date => p_fund_rec.exchange_rate_date
2404            ,p_from_amount => l_fund_rec.original_budget
2405            ,x_to_amount => l_original_budget
2406            ,x_rate => l_rate);
2407          ELSE
2408          Ozf_utility_pvt.convert_currency(
2409             x_return_status => l_return_status
2410            ,p_from_currency => l_fund_rec.currency_code_tc
2411            ,p_to_currency => g_universal_currency
2412            ,p_from_amount => l_fund_rec.original_budget
2413            ,x_to_amount => l_original_budget
2414            ,x_rate => l_rate);
2415          END IF;
2416          */
2417 
2418 
2419      --l_rollup_original_budget :=  l_original_budget - NVL(l_or_original_budget,0);
2420      --l_fund_rec.rollup_original_budget := l_original_budget;
2421 
2422      l_fund_rec.rollup_original_budget := ozf_utility_pvt.CurrRound((l_fund_rec.original_budget - NVL(l_old_original_budget,0)) * l_rate
2423                                                                        ,g_universal_currency) + NVL(l_or_original_budget,0);
2424      l_rollup_original_budget := l_fund_rec.rollup_original_budget - NVL(l_or_original_budget,0);
2425 
2426 
2427       IF l_return_status = fnd_api.g_ret_sts_error THEN
2428             RAISE fnd_api.g_exc_error;
2429          ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
2430             RAISE fnd_api.g_exc_unexpected_error;
2431          END IF;
2432 
2433    END IF;
2434 
2435    IF l_fund_rec.transfered_in_amt IS NOT NULL
2436      AND l_rate is NOT NULL
2437      AND l_fund_rec.transfered_in_amt <> NVL(l_old_transfered_in_amt,0) THEN
2438 
2439      l_fund_rec.rollup_transfered_in_amt := ozf_utility_pvt.CurrRound((l_fund_rec.transfered_in_amt - NVL(l_old_transfered_in_amt,0)) * l_rate
2440                                                                        ,g_universal_currency) + NVL(l_or_transfered_in_amt,0);
2441      l_rollup_transfered_in_amt := l_fund_rec.rollup_transfered_in_amt - NVL(l_or_transfered_in_amt,0);
2442 
2443    END IF;
2444 
2445    IF l_fund_rec.transfered_out_amt IS NOT NULL
2446      AND l_rate is NOT NULL
2447      AND l_fund_rec.transfered_out_amt <> NVL(l_old_transfered_out_amt,0) THEN
2448 
2449      l_fund_rec.rollup_transfered_out_amt := ozf_utility_pvt.CurrRound((l_fund_rec.transfered_out_amt-NVL(l_old_transfered_out_amt,0)) * l_rate
2450                                                                        ,g_universal_currency) + NVL(l_or_transfered_out_amt,0);
2451      l_rollup_transfered_out_amt := l_fund_rec.rollup_transfered_out_amt - NVL(l_or_transfered_out_amt,0);
2452 
2453    END IF;
2454 
2455 
2456    --IF l_fund_rec.holdback_amt IS NOT NULL
2457    --Bug Fix 4087106, Rollup holdback amt not updated when manually updated.
2458      IF l_rate is NOT NULL
2459      AND NVL(l_fund_rec.holdback_amt,0) <> NVL(l_old_holdback_amt,0) THEN
2460 
2461      l_fund_rec.rollup_holdback_amt := ozf_utility_pvt.CurrRound((NVL(l_fund_rec.holdback_amt,0)-NVL(l_old_holdback_amt,0)) * l_rate
2462                                                                  ,g_universal_currency)+ NVL(l_or_holdback_amt,0);
2463      l_rollup_holdback_amt := l_fund_rec.rollup_holdback_amt - NVL(l_or_holdback_amt,0);
2464 
2465    END IF;
2466 
2467 
2468    IF l_fund_rec.planned_amt IS NOT NULL
2469      AND l_rate is NOT NULL
2470      AND l_fund_rec.planned_amt <> NVL(l_old_planned_amt,0) THEN
2471 
2472      l_fund_rec.rollup_planned_amt := ozf_utility_pvt.CurrRound((l_fund_rec.planned_amt-NVL(l_old_planned_amt,0)) * l_rate
2473                                                                  ,g_universal_currency)+ NVL(l_or_planned_amt,0);
2474      l_rollup_planned_amt := l_fund_rec.rollup_planned_amt - NVL(l_or_planned_amt,0);
2475 
2476    END IF;
2477 
2478    IF l_fund_rec.committed_amt IS NOT NULL
2479      AND l_rate is NOT NULL
2480      AND l_fund_rec.committed_amt <> NVL(l_old_committed_amt,0) THEN
2481 
2482      l_fund_rec.rollup_committed_amt := ozf_utility_pvt.CurrRound((l_fund_rec.committed_amt-NVL(l_old_committed_amt,0)) * l_rate
2483                                                                  ,g_universal_currency) + NVL(l_or_committed_amt,0);
2484      l_rollup_committed_amt :=l_fund_rec.rollup_committed_amt - NVL(l_or_committed_amt,0);
2485 
2486    END IF;
2487 
2488    IF l_fund_rec.utilized_amt IS NOT NULL
2489      AND l_rate is NOT NULL
2490      AND l_fund_rec.utilized_amt <> NVL(l_old_utilized_amt,0) THEN
2491 
2492      l_fund_rec.rollup_utilized_amt := ozf_utility_pvt.CurrRound((l_fund_rec.utilized_amt-NVL(l_old_utilized_amt,0)) * l_rate
2493                                                                  ,g_universal_currency) + NVL(l_or_utilized_amt,0);
2494      l_rollup_utilized_amt := l_fund_rec.rollup_utilized_amt - NVL(l_or_utilized_amt,0);
2495 
2496    END IF;
2497 
2498    IF l_fund_rec.earned_amt IS NOT NULL
2499      AND l_rate is NOT NULL
2500      AND l_fund_rec.earned_amt <> NVL(l_old_earned_amt,0) THEN
2501 
2502      l_fund_rec.rollup_earned_amt := ozf_utility_pvt.CurrRound((l_fund_rec.earned_amt-NVL(l_old_earned_amt,0)) * l_rate
2503                                                                  ,g_universal_currency) + NVL(l_or_earned_amt,0);
2504      l_rollup_earned_amt := l_fund_rec.rollup_earned_amt - NVL(l_or_earned_amt,0);
2505 
2506    END IF;
2507 
2508 
2509    IF l_fund_rec.paid_amt IS NOT NULL
2510      AND l_rate is NOT NULL
2511      AND l_fund_rec.paid_amt <> NVL(l_old_paid_amt,0) THEN
2512 
2513      l_fund_rec.rollup_paid_amt := ozf_utility_pvt.CurrRound((l_fund_rec.paid_amt-NVL(l_old_paid_amt,0)) * l_rate
2514                                                                  ,g_universal_currency) +NVL(l_or_paid_amt,0);
2515      l_rollup_paid_amt := l_fund_rec.rollup_paid_amt - NVL(l_or_paid_amt,0);
2516 
2517    END IF;
2518 
2519    IF l_fund_rec.recal_committed IS NOT NULL
2520      AND l_rate is NOT NULL
2521      AND l_fund_rec.recal_committed <> NVL(l_old_recal_committed,0) THEN
2522 
2523      l_fund_rec.rollup_recal_committed := ozf_utility_pvt.CurrRound((l_fund_rec.recal_committed-NVL(l_old_recal_committed,0)) * l_rate
2524                                                                  ,g_universal_currency) +NVL(l_or_recal_committed,0);
2525      l_rollup_recal_committed :=l_fund_rec.rollup_recal_committed - NVL(l_or_recal_committed,0);
2526 
2527    END IF;
2528 
2529 -- added by feliu to fix bug 2654263
2530    IF l_fund_rec.parent_fund_id IS NOT NULL THEN
2531       OPEN c_par_fund_owner(l_fund_rec.parent_fund_id);
2532       FETCH c_par_fund_owner INTO l_par_fund_owner;
2533       CLOSE c_par_fund_owner;
2534    END IF;
2535 
2536   -- delete access before update budget because we delete access by loop through tree.
2537    --if the parent fundowner and the child fund owner is not same.
2538    IF  l_fund_rec.parent_fund_id IS NOT NULL AND l_fund_rec.owner <> l_par_fund_owner THEN
2539      --if there is no parent fund OR (09/05/2001 mpande) when no records exists in ams_act_access for the fund
2540      --then create a access for the new parent ownner
2541     --if the old parent fund  and the new parent fund  is diffrent then delete the access
2542        IF  l_old_parent_fund_id <> l_fund_rec.parent_fund_id THEN
2543           -- remove old access.
2544           update_funds_access(
2545                               p_api_version  => l_api_version
2546                               ,p_init_msg_list  => fnd_api.g_false
2547                               ,p_commit     => fnd_api.g_false
2548                               ,p_validation_level   => p_validation_level
2549                               ,x_return_status      => l_return_status
2550                               ,x_msg_count  => x_msg_count
2551                               ,x_msg_data   => x_msg_data
2552                               ,p_fund_rec => l_fund_rec
2553                               ,p_mode => 'DELETE'
2554                               );
2555 
2556           IF l_return_status = fnd_api.g_ret_sts_error THEN
2557              RAISE fnd_api.g_exc_error;
2558           ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
2559              RAISE fnd_api.g_exc_unexpected_error;
2560           END IF;
2561        END IF; -- end of l_old_parent_fund_id <> l_fund_rec.parent_fund_id.
2562     END IF;  -- end of l_fund_rec.parent_fund_id IS NOT NULL
2563 
2564       -- if removing parent then remove access
2565     IF l_fund_rec.parent_fund_id IS NULL AND l_old_parent_fund_id IS NOT NULL THEN
2566        update_funds_access(
2567                            p_api_version  => l_api_version
2568                            ,p_init_msg_list  => fnd_api.g_false
2569                            ,p_commit     => fnd_api.g_false
2570                            ,p_validation_level   => p_validation_level
2571                            ,x_return_status      => l_return_status
2572                            ,x_msg_count  => x_msg_count
2573                            ,x_msg_data   => x_msg_data
2574                            ,p_fund_rec => l_fund_rec
2575                            ,p_mode => 'DELETE'
2576                            );
2577 
2578        IF l_return_status = fnd_api.g_ret_sts_error THEN
2579           RAISE fnd_api.g_exc_error;
2580        ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
2581           RAISE fnd_api.g_exc_unexpected_error;
2582        END IF;
2583 
2584    END IF; -- l_fund_rec.parent_fund_id
2585 -- added by feliu to fix bug 2654263
2586 
2587   -- feliu 04/08/04 to fix bug 3551038 to update status_date.
2588   IF l_fund_rec.status_code <> l_old_status THEN
2589      l_fund_rec.status_date := SYSDATE;
2590   END IF;
2591 
2592   IF G_DEBUG THEN
2593      ozf_utility_pvt.debug_message('l_use_fund_staging_tables: ' || l_use_fund_staging_tables );
2594   END IF;
2595    -- For BUG#8867381(+)
2596    -- l_use_fund_staging_tables flag is set only for chargeback flow and will insert the records into
2597    -- new record type and pass it on to OZF_RESALE_COMMON_PVT.UPDATE_OZF_FUNDS_ALL_B procedure for updating
2598    -- the main table.
2599 If l_use_fund_staging_tables <> 'T' then
2600 
2601 
2602    UPDATE ozf_funds_all_tl
2603       SET last_update_date = SYSDATE
2604          ,last_updated_by = NVL(fnd_global.user_id, -1)
2605          ,last_update_login = NVL(fnd_global.conc_login_id, -1)
2606          ,created_from = NULL
2607          ,request_id = fnd_global.conc_request_id
2608          ,program_application_id = fnd_global.prog_appl_id
2609          ,program_id = fnd_global.conc_program_id
2610          ,program_update_date = SYSDATE
2611          ,short_name = l_fund_rec.short_name
2612          ,description = l_fund_rec.description
2613          ,source_lang = USERENV('LANG')
2614     WHERE fund_id = l_fund_rec.fund_id
2615       AND USERENV('LANG') IN(language, source_lang);
2616 
2617    UPDATE ozf_funds_all_b
2618       SET last_update_date = SYSDATE
2619          ,last_updated_by = NVL(fnd_global.user_id, -1)
2620          ,last_update_login = NVL(fnd_global.conc_login_id, -1)
2621          ,created_from = NULL
2622          ,request_id = fnd_global.conc_request_id
2623          ,program_application_id = fnd_global.prog_appl_id
2624          ,program_id = fnd_global.conc_program_id
2625          ,program_update_date = SYSDATE
2626          ,fund_number = l_fund_rec.fund_number
2627          ,parent_fund_id = l_fund_rec.parent_fund_id
2628          ,category_id = l_fund_rec.category_id
2629          ,fund_type = l_fund_rec.fund_type
2630          ,fund_usage = l_fund_rec.fund_usage
2631          ,status_code = l_fund_rec.status_code
2632          ,user_status_id = l_fund_rec.user_status_id
2633          ,status_date = NVL(l_fund_rec.status_date, SYSDATE)
2634          ,accrued_liable_account = l_fund_rec.accrued_liable_account
2635          ,ded_adjustment_account = l_fund_rec.ded_adjustment_account
2636          ,liability_flag = l_fund_rec.liability_flag
2637          ,set_of_books_id = l_fund_rec.set_of_books_id
2638          ,start_period_id = l_fund_rec.start_period_id
2639          ,end_period_id = l_fund_rec.end_period_id
2640          ,start_date_active = l_fund_rec.start_date_active
2641          ,end_date_active = l_fund_rec.end_date_active
2642          ,budget_amount_tc = l_fund_rec.budget_amount_tc
2643          ,budget_amount_fc = l_fund_rec.budget_amount_fc
2644          ,available_amount = l_fund_rec.available_amount
2645          ,distributed_amount = l_fund_rec.distributed_amount
2646          ,currency_code_tc = l_fund_rec.currency_code_tc
2647          ,currency_code_fc = l_fund_rec.currency_code_fc
2648          ,exchange_rate_type = l_fund_rec.exchange_rate_type
2649          ,exchange_rate_date = l_fund_rec.exchange_rate_date
2650          ,exchange_rate = l_fund_rec.exchange_rate
2651          ,department_id = l_fund_rec.department_id
2652          ,costcentre_id = l_fund_rec.costcentre_id
2653          ,owner = l_fund_rec.owner
2654          ,accrual_method = l_fund_rec.accrual_method
2655          ,accrual_operand = l_fund_rec.accrual_operand
2656          ,accrual_rate = l_fund_rec.accrual_rate
2657          ,accrual_basis = l_fund_rec.accrual_basis
2658          ,hierarchy = l_fund_rec.hierarchy
2659          ,hierarchy_level = l_fund_rec.hierarchy_level
2660          ,hierarchy_id = l_fund_rec.hierarchy_id
2661          ,parent_node_id = l_fund_rec.parent_node_id
2662          ,node_id = l_fund_rec.node_id   --,level_value                   = l_fund_rec.level_value
2663          ,budget_flag = l_fund_rec.budget_flag
2664          ,earned_flag = l_fund_rec.earned_flag
2665          ,apply_accrual_on = l_fund_rec.apply_accrual_on
2666          ,accrual_phase = l_fund_rec.accrual_phase
2667          ,accrual_cap = l_fund_rec.accrual_cap
2668          ,accrual_uom = l_fund_rec.accrual_uom
2669          ,object_version_number = l_fund_rec.object_version_number + 1
2670          ,recal_committed = l_fund_rec.recal_committed
2671          ,attribute_category = l_fund_rec.attribute_category
2672          ,attribute1 = l_fund_rec.attribute1
2673          ,attribute2 = l_fund_rec.attribute2
2674          ,attribute3 = l_fund_rec.attribute3
2675          ,attribute4 = l_fund_rec.attribute4
2676          ,attribute5 = l_fund_rec.attribute5
2677          ,attribute6 = l_fund_rec.attribute6
2678          ,attribute7 = l_fund_rec.attribute7
2679          ,attribute8 = l_fund_rec.attribute8
2680          ,attribute9 = l_fund_rec.attribute9
2681          ,attribute10 = l_fund_rec.attribute10
2682          ,attribute11 = l_fund_rec.attribute11
2683          ,attribute12 = l_fund_rec.attribute12
2684          ,attribute13 = l_fund_rec.attribute13
2685          ,attribute14 = l_fund_rec.attribute14
2686          ,attribute15 = l_fund_rec.attribute15
2687          ,original_budget = l_fund_rec.original_budget
2688          ,transfered_in_amt = l_fund_rec.transfered_in_amt
2689          ,transfered_out_amt = l_fund_rec.transfered_out_amt
2690          ,holdback_amt = l_fund_rec.holdback_amt
2691          ,planned_amt = l_fund_rec.planned_amt
2692          ,committed_amt = l_fund_rec.committed_amt
2693          ,earned_amt = l_fund_rec.earned_amt
2694          ,paid_amt = l_fund_rec.paid_amt
2695          ,plan_type = l_fund_rec.plan_type
2696          ,plan_id = l_fund_rec.plan_id
2697          ,liable_accnt_segments = l_fund_rec.liable_accnt_segments
2698          ,adjustment_accnt_segments = l_fund_rec.adjustment_accnt_segments
2699          ,fund_calendar = l_fund_rec.fund_calendar
2700          ,start_period_name = l_fund_rec.start_period_name
2701          ,end_period_name = l_fund_rec.end_period_name
2702          ,accrual_quantity = l_fund_rec.accrual_quantity
2703          ,accrue_to_level_id = l_fund_rec.accrue_to_level_id
2704          ,accrual_discount_level = l_fund_rec.accrual_discount_level
2705          ,custom_setup_id       =  l_fund_rec.custom_setup_id
2706          ,threshold_id       =  l_fund_rec.threshold_id
2707          ,business_unit_id = l_fund_rec.business_unit_id
2708          ,country_id    =    l_fund_rec.country_id
2709          ,task_id     =       l_fund_rec.task_id
2710          ,rollup_original_budget = l_fund_rec.rollup_original_budget
2711          ,rollup_transfered_in_amt = l_fund_rec.rollup_transfered_in_amt
2712          ,rollup_transfered_out_amt = l_fund_rec.rollup_transfered_out_amt
2713          ,rollup_holdback_amt = l_fund_rec.rollup_holdback_amt
2714          ,rollup_planned_amt = l_fund_rec.rollup_planned_amt
2715          ,rollup_committed_amt = l_fund_rec.rollup_committed_amt
2716          ,rollup_earned_amt = l_fund_rec.rollup_earned_amt
2717          ,rollup_paid_amt = l_fund_rec.rollup_paid_amt
2718          ,rollup_recal_committed  = l_fund_rec.rollup_recal_committed
2719          ,retroactive_flag         =  l_fund_rec.retroactive_flag
2720          ,qualifier_id              = l_fund_rec.qualifier_id
2721          -- niprakas added
2722          ,prev_fund_id       = l_fund_rec.prev_fund_id
2723          ,transfered_flag    = l_fund_rec.transfered_flag
2724          ,utilized_amt = l_fund_rec.utilized_amt
2725          ,rollup_utilized_amt = l_fund_rec.rollup_utilized_amt
2726          ,product_spread_time_id    = l_fund_rec.product_spread_time_id
2727          -- sangara added
2728          ,activation_date = l_fund_rec.activation_date
2729          -- kdass - R12 MOAC changes
2730          ,ledger_id = l_fund_rec.ledger_id
2731     WHERE fund_id = l_fund_rec.fund_id
2732       AND object_version_number = l_fund_rec.object_version_number;
2733 
2734    IF (SQL%NOTFOUND) THEN
2735       IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_error) THEN
2736          fnd_message.set_name('OZF', 'OZF_API_RECORD_NOT_FOUND');
2737          fnd_msg_pub.add;
2738       END IF;
2739 
2740       RAISE fnd_api.g_exc_error;
2741    END IF;
2742 
2743    ELSE
2744         -- For TPA Parallel Execution ER - 9614703 (+)
2745         IF p_batch_type = 'CHARGEBACK' THEN
2746 
2747                 px_ozf_funds_new_tbl(1).RESALE_BATCH_ID                := p_resale_batch_id;
2748                 px_ozf_funds_new_tbl(1).FUND_ID                        := l_fund_rec.fund_id;
2749                 px_ozf_funds_new_tbl(1).BATCH_TYPE                     := px_ozf_funds_old_rectype.BATCH_TYPE;
2750                 px_ozf_funds_new_tbl(1).BUDGET_AMOUNT_TC               := NVL(px_ozf_funds_new_tbl(1).BUDGET_AMOUNT_TC ,0) + NVL(l_fund_rec.budget_amount_tc,0) - NVL(px_ozf_funds_old_rectype.BUDGET_AMOUNT_TC ,0);
2751                 px_ozf_funds_new_tbl(1).BUDGET_AMOUNT_FC               := NVL(px_ozf_funds_new_tbl(1).BUDGET_AMOUNT_FC ,0) + NVL(l_fund_rec.budget_amount_fc,0) - NVL(px_ozf_funds_old_rectype.BUDGET_AMOUNT_FC ,0);
2752                 px_ozf_funds_new_tbl(1).AVAILABLE_AMOUNT               := NVL(px_ozf_funds_new_tbl(1).AVAILABLE_AMOUNT ,0) + NVL(l_fund_rec.available_amount,0) - NVL(px_ozf_funds_old_rectype.AVAILABLE_AMOUNT ,0);
2753                 px_ozf_funds_new_tbl(1).TRANSFERED_IN_AMT              := NVL(px_ozf_funds_new_tbl(1).TRANSFERED_IN_AMT ,0) + NVL(l_fund_rec.transfered_in_amt,0) - NVL(px_ozf_funds_old_rectype.TRANSFERED_IN_AMT ,0);
2754                 px_ozf_funds_new_tbl(1).TRANSFERED_OUT_AMT             := NVL(px_ozf_funds_new_tbl(1).TRANSFERED_OUT_AMT ,0) + NVL(l_fund_rec.transfered_out_amt,0) - NVL(px_ozf_funds_old_rectype.TRANSFERED_OUT_AMT ,0);
2755                 px_ozf_funds_new_tbl(1).PLANNED_AMT                    := NVL(px_ozf_funds_new_tbl(1).PLANNED_AMT ,0) + NVL(l_fund_rec.planned_amt,0) - NVL(px_ozf_funds_old_rectype.PLANNED_AMT ,0);
2756                 px_ozf_funds_new_tbl(1).COMMITTED_AMT                  := NVL(px_ozf_funds_new_tbl(1).COMMITTED_AMT ,0) + NVL(l_fund_rec.committed_amt,0) - NVL(px_ozf_funds_old_rectype.COMMITTED_AMT ,0);
2757                 px_ozf_funds_new_tbl(1).EARNED_AMT                     := NVL(px_ozf_funds_new_tbl(1).EARNED_AMT ,0) + NVL(l_fund_rec.earned_amt,0) - NVL(px_ozf_funds_old_rectype.EARNED_AMT ,0);
2758                 px_ozf_funds_new_tbl(1).PAID_AMT                       := NVL(px_ozf_funds_new_tbl(1).PAID_AMT ,0) + NVL(l_fund_rec.paid_amt,0) - NVL(px_ozf_funds_old_rectype.PAID_AMT ,0);
2759                 px_ozf_funds_new_tbl(1).RECAL_COMMITTED                := NVL(px_ozf_funds_new_tbl(1).RECAL_COMMITTED ,0) + NVL(l_fund_rec.recal_committed,0) - NVL(px_ozf_funds_old_rectype.RECAL_COMMITTED ,0);
2760                 px_ozf_funds_new_tbl(1).ROLLUP_ORIGINAL_BUDGET         := NVL(px_ozf_funds_new_tbl(1).ROLLUP_ORIGINAL_BUDGET ,0) + NVL(l_fund_rec.rollup_original_budget,0) - NVL(px_ozf_funds_old_rectype.ROLLUP_ORIGINAL_BUDGET ,0);
2761                 px_ozf_funds_new_tbl(1).ROLLUP_TRANSFERED_IN_AMT       := NVL(px_ozf_funds_new_tbl(1).ROLLUP_TRANSFERED_IN_AMT ,0) + NVL(l_fund_rec.rollup_transfered_in_amt,0) - NVL(px_ozf_funds_old_rectype.ROLLUP_TRANSFERED_IN_AMT ,0);
2762                 px_ozf_funds_new_tbl(1).ROLLUP_TRANSFERED_OUT_AMT      := NVL(px_ozf_funds_new_tbl(1).ROLLUP_TRANSFERED_OUT_AMT ,0) + NVL(l_fund_rec.rollup_transfered_out_amt,0) - NVL(px_ozf_funds_old_rectype.ROLLUP_TRANSFERED_OUT_AMT ,0);
2763                 px_ozf_funds_new_tbl(1).ROLLUP_HOLDBACK_AMT            := NVL(px_ozf_funds_new_tbl(1).ROLLUP_HOLDBACK_AMT ,0) + NVL(l_fund_rec.rollup_holdback_amt,0) - NVL(px_ozf_funds_old_rectype.ROLLUP_HOLDBACK_AMT ,0);
2764                 px_ozf_funds_new_tbl(1).ROLLUP_PLANNED_AMT             := NVL(px_ozf_funds_new_tbl(1).ROLLUP_PLANNED_AMT ,0) + NVL(l_fund_rec.rollup_planned_amt,0) - NVL(px_ozf_funds_old_rectype.ROLLUP_PLANNED_AMT ,0);
2765                 px_ozf_funds_new_tbl(1).ROLLUP_COMMITTED_AMT           := NVL(px_ozf_funds_new_tbl(1).ROLLUP_COMMITTED_AMT ,0) + NVL(l_fund_rec.rollup_committed_amt,0) - NVL(px_ozf_funds_old_rectype.ROLLUP_COMMITTED_AMT ,0);
2766                 px_ozf_funds_new_tbl(1).ROLLUP_RECAL_COMMITTED         := NVL(px_ozf_funds_new_tbl(1).ROLLUP_RECAL_COMMITTED ,0) + NVL(l_fund_rec.rollup_recal_committed,0) - NVL(px_ozf_funds_old_rectype.ROLLUP_RECAL_COMMITTED ,0);
2767                 px_ozf_funds_new_tbl(1).ROLLUP_EARNED_AMT              := NVL(px_ozf_funds_new_tbl(1).ROLLUP_EARNED_AMT ,0) + NVL(l_fund_rec.rollup_earned_amt,0) - NVL(px_ozf_funds_old_rectype.ROLLUP_EARNED_AMT ,0);
2768                 px_ozf_funds_new_tbl(1).ROLLUP_PAID_AMT                := NVL(px_ozf_funds_new_tbl(1).ROLLUP_PAID_AMT ,0) + NVL(l_fund_rec.rollup_paid_amt,0) - NVL(px_ozf_funds_old_rectype.ROLLUP_PAID_AMT ,0);
2769                 px_ozf_funds_new_tbl(1).UTILIZED_AMT                   := NVL(px_ozf_funds_new_tbl(1).UTILIZED_AMT ,0) + NVL(l_fund_rec.utilized_amt,0) - NVL(px_ozf_funds_old_rectype.UTILIZED_AMT ,0);
2770                 px_ozf_funds_new_tbl(1).ROLLUP_UTILIZED_AMT            := NVL(px_ozf_funds_new_tbl(1).ROLLUP_UTILIZED_AMT ,0) + NVL(l_fund_rec.rollup_utilized_amt,0) - NVL(px_ozf_funds_old_rectype.ROLLUP_UTILIZED_AMT ,0);
2771 
2772         ELSIF p_batch_type = 'TP_ACCRUAL' THEN
2773 
2774                     l_fund_record_num := 0;
2775                     l_operation := 'INSERT';
2776 
2777                    IF px_ozf_funds_new_tbl.COUNT > 0 THEN
2778                         FOR i IN 1 .. px_ozf_funds_new_tbl.COUNT
2779                         LOOP
2780                            IF l_fund_rec.fund_id = px_ozf_funds_new_tbl(i).fund_id THEN
2781                                 l_operation := 'UPDATE';
2782                                 l_fund_record_num := i;
2783                                 GOTO START_OPERATION;
2784                            END IF;
2785                         END LOOP;
2786                    END IF;
2787 
2788                    <<START_OPERATION>>
2789 
2790                    IF G_DEBUG THEN
2791                       ozf_utility_pvt.debug_message('l_operation: ' || l_operation);
2792                    END IF;
2793 
2794                    IF l_operation = 'UPDATE' THEN
2795 
2796                         IF G_DEBUG THEN
2797                            ozf_utility_pvt.debug_message('fund_id: ' || px_ozf_funds_new_tbl(l_fund_record_num).FUND_ID);
2798                            ozf_utility_pvt.debug_message('existing earned: ' || px_ozf_funds_new_tbl(l_fund_record_num).EARNED_AMT);
2799                         END IF;
2800 
2801                         px_ozf_funds_new_tbl(l_fund_record_num).BUDGET_AMOUNT_TC               := NVL(px_ozf_funds_new_tbl(l_fund_record_num).BUDGET_AMOUNT_TC ,0)
2802                                                                                                   + NVL(l_fund_rec.budget_amount_tc,0)
2803                                                                                                   - NVL(px_ozf_funds_old_rectype.budget_amount_tc,0);
2804                         px_ozf_funds_new_tbl(l_fund_record_num).BUDGET_AMOUNT_FC               := NVL(px_ozf_funds_new_tbl(l_fund_record_num).BUDGET_AMOUNT_FC ,0)
2805                                                                                                   + NVL(l_fund_rec.budget_amount_fc,0)
2806                                                                                                   - NVL(px_ozf_funds_old_rectype.budget_amount_fc,0);
2807                         px_ozf_funds_new_tbl(l_fund_record_num).AVAILABLE_AMOUNT               := NVL(px_ozf_funds_new_tbl(l_fund_record_num).AVAILABLE_AMOUNT ,0)
2808                                                                                                   + NVL(l_fund_rec.available_amount,0)
2809                                                                                                   - NVL(px_ozf_funds_old_rectype.available_amount,0);
2810                         px_ozf_funds_new_tbl(l_fund_record_num).TRANSFERED_IN_AMT              := NVL(px_ozf_funds_new_tbl(l_fund_record_num).TRANSFERED_IN_AMT ,0)
2811                                                                                                   + NVL(l_fund_rec.transfered_in_amt,0)
2812                                                                                                   - NVL(px_ozf_funds_old_rectype.transfered_in_amt,0);
2813                         px_ozf_funds_new_tbl(l_fund_record_num).TRANSFERED_OUT_AMT             := NVL(px_ozf_funds_new_tbl(l_fund_record_num).TRANSFERED_OUT_AMT ,0)
2814                                                                                                   + NVL(l_fund_rec.transfered_out_amt,0)
2815                                                                                                   - NVL(px_ozf_funds_old_rectype.transfered_out_amt,0);
2816                         px_ozf_funds_new_tbl(l_fund_record_num).PLANNED_AMT                    := NVL(px_ozf_funds_new_tbl(l_fund_record_num).PLANNED_AMT ,0)
2817                                                                                                   + NVL(l_fund_rec.planned_amt,0)
2818                                                                                                   - NVL(px_ozf_funds_old_rectype.planned_amt,0);
2819                         px_ozf_funds_new_tbl(l_fund_record_num).COMMITTED_AMT                  := NVL(px_ozf_funds_new_tbl(l_fund_record_num).COMMITTED_AMT ,0)
2820                                                                                                   + NVL(l_fund_rec.committed_amt,0)
2821                                                                                                   - NVL(px_ozf_funds_old_rectype.committed_amt,0);
2822                         px_ozf_funds_new_tbl(l_fund_record_num).EARNED_AMT                     := NVL(px_ozf_funds_new_tbl(l_fund_record_num).EARNED_AMT ,0)
2823                                                                                                   + NVL(l_fund_rec.earned_amt,0)
2824                                                                                                   - NVL(px_ozf_funds_old_rectype.earned_amt,0);
2825                         px_ozf_funds_new_tbl(l_fund_record_num).PAID_AMT                       := NVL(px_ozf_funds_new_tbl(l_fund_record_num).PAID_AMT ,0)
2826                                                                                                   + NVL(l_fund_rec.paid_amt,0)
2827                                                                                                   - NVL(px_ozf_funds_old_rectype.paid_amt,0);
2828                         px_ozf_funds_new_tbl(l_fund_record_num).RECAL_COMMITTED                := NVL(px_ozf_funds_new_tbl(l_fund_record_num).RECAL_COMMITTED ,0)
2829                                                                                                   + NVL(l_fund_rec.recal_committed,0)
2830                                                                                                   - NVL(px_ozf_funds_old_rectype.recal_committed,0);
2831                         px_ozf_funds_new_tbl(l_fund_record_num).ROLLUP_ORIGINAL_BUDGET         := NVL(px_ozf_funds_new_tbl(l_fund_record_num).ROLLUP_ORIGINAL_BUDGET ,0)
2832                                                                                                   + NVL(l_fund_rec.rollup_original_budget,0)
2833                                                                                                   - NVL(px_ozf_funds_old_rectype.rollup_original_budget,0);
2834                         px_ozf_funds_new_tbl(l_fund_record_num).ROLLUP_TRANSFERED_IN_AMT       := NVL(px_ozf_funds_new_tbl(l_fund_record_num).ROLLUP_TRANSFERED_IN_AMT ,0)
2835                                                                                                   + NVL(l_fund_rec.rollup_transfered_in_amt,0)
2836                                                                                                   - NVL(px_ozf_funds_old_rectype.rollup_transfered_in_amt,0);
2837                         px_ozf_funds_new_tbl(l_fund_record_num).ROLLUP_TRANSFERED_OUT_AMT      := NVL(px_ozf_funds_new_tbl(l_fund_record_num).ROLLUP_TRANSFERED_OUT_AMT ,0)
2838                                                                                                   + NVL(l_fund_rec.rollup_transfered_out_amt,0)
2839                                                                                                   - NVL(px_ozf_funds_old_rectype.rollup_transfered_out_amt,0);
2840                         px_ozf_funds_new_tbl(l_fund_record_num).ROLLUP_HOLDBACK_AMT            := NVL(px_ozf_funds_new_tbl(l_fund_record_num).ROLLUP_HOLDBACK_AMT ,0)
2841                                                                                                   + NVL(l_fund_rec.rollup_holdback_amt,0)
2842                                                                                                   - NVL(px_ozf_funds_old_rectype.rollup_holdback_amt,0);
2843                         px_ozf_funds_new_tbl(l_fund_record_num).ROLLUP_PLANNED_AMT             := NVL(px_ozf_funds_new_tbl(l_fund_record_num).ROLLUP_PLANNED_AMT ,0)
2844                                                                                                   + NVL(l_fund_rec.rollup_planned_amt,0)
2845                                                                                                   - NVL(px_ozf_funds_old_rectype.rollup_planned_amt,0);
2846                         px_ozf_funds_new_tbl(l_fund_record_num).ROLLUP_COMMITTED_AMT           := NVL(px_ozf_funds_new_tbl(l_fund_record_num).ROLLUP_COMMITTED_AMT ,0)
2847                                                                                                   + NVL(l_fund_rec.rollup_committed_amt,0)
2848                                                                                                   - NVL(px_ozf_funds_old_rectype.rollup_committed_amt,0);
2849                         px_ozf_funds_new_tbl(l_fund_record_num).ROLLUP_RECAL_COMMITTED         := NVL(px_ozf_funds_new_tbl(l_fund_record_num).ROLLUP_RECAL_COMMITTED ,0)
2850                                                                                                   + NVL(l_fund_rec.rollup_recal_committed,0)
2851                                                                                                   - NVL(px_ozf_funds_old_rectype.rollup_recal_committed,0);
2852                         px_ozf_funds_new_tbl(l_fund_record_num).ROLLUP_EARNED_AMT              := NVL(px_ozf_funds_new_tbl(l_fund_record_num).ROLLUP_EARNED_AMT ,0)
2853                                                                                                   + NVL(l_fund_rec.rollup_earned_amt,0)
2854                                                                                                   - NVL(px_ozf_funds_old_rectype.rollup_earned_amt,0);
2855                         px_ozf_funds_new_tbl(l_fund_record_num).ROLLUP_PAID_AMT                := NVL(px_ozf_funds_new_tbl(l_fund_record_num).ROLLUP_PAID_AMT ,0)
2856                                                                                                   + NVL(l_fund_rec.rollup_paid_amt,0)
2857                                                                                                   - NVL(px_ozf_funds_old_rectype.rollup_paid_amt,0);
2858                         px_ozf_funds_new_tbl(l_fund_record_num).UTILIZED_AMT                   := NVL(px_ozf_funds_new_tbl(l_fund_record_num).UTILIZED_AMT ,0)
2859                                                                                                   + NVL(l_fund_rec.utilized_amt,0)
2860                                                                                                   - NVL(px_ozf_funds_old_rectype.utilized_amt,0);
2861                         px_ozf_funds_new_tbl(l_fund_record_num).ROLLUP_UTILIZED_AMT            := NVL(px_ozf_funds_new_tbl(l_fund_record_num).ROLLUP_UTILIZED_AMT ,0)
2862                                                                                                   + NVL(l_fund_rec.rollup_utilized_amt,0)
2863                                                                                                   - NVL(px_ozf_funds_old_rectype.rollup_utilized_amt,0);
2864 
2865                    ELSIF l_operation = 'INSERT' THEN
2866                         l_fund_record_num := px_ozf_funds_new_tbl.COUNT + 1;
2867 
2868                         IF G_DEBUG THEN
2869                            ozf_utility_pvt.debug_message('fund_id: ' || l_fund_rec.fund_id);
2870                         END IF;
2871 
2872                         px_ozf_funds_new_tbl(l_fund_record_num).RESALE_BATCH_ID                := p_resale_batch_id;
2873                         px_ozf_funds_new_tbl(l_fund_record_num).FUND_ID                        := l_fund_rec.fund_id;
2874                         px_ozf_funds_new_tbl(l_fund_record_num).BATCH_TYPE                     := p_batch_type;
2875                         px_ozf_funds_new_tbl(l_fund_record_num).REQUEST_ID                     := fnd_global.conc_request_id;
2876                         px_ozf_funds_new_tbl(l_fund_record_num).BUDGET_AMOUNT_TC               := NVL(l_fund_rec.budget_amount_tc,0) - NVL(px_ozf_funds_old_rectype.budget_amount_tc,0);
2877                         px_ozf_funds_new_tbl(l_fund_record_num).BUDGET_AMOUNT_FC               := NVL(l_fund_rec.budget_amount_fc,0)- NVL(px_ozf_funds_old_rectype.budget_amount_fc,0);
2878                         px_ozf_funds_new_tbl(l_fund_record_num).AVAILABLE_AMOUNT               := NVL(l_fund_rec.available_amount,0) - NVL(px_ozf_funds_old_rectype.available_amount,0);
2879                         px_ozf_funds_new_tbl(l_fund_record_num).TRANSFERED_IN_AMT              := NVL(l_fund_rec.transfered_in_amt,0) - NVL(px_ozf_funds_old_rectype.transfered_in_amt,0);
2880                         px_ozf_funds_new_tbl(l_fund_record_num).TRANSFERED_OUT_AMT             := NVL(l_fund_rec.transfered_out_amt,0) - NVL(px_ozf_funds_old_rectype.transfered_out_amt,0);
2881                         px_ozf_funds_new_tbl(l_fund_record_num).PLANNED_AMT                    := NVL(l_fund_rec.planned_amt,0) - NVL(px_ozf_funds_old_rectype.planned_amt,0);
2882                         px_ozf_funds_new_tbl(l_fund_record_num).COMMITTED_AMT                  := NVL(l_fund_rec.committed_amt,0) - NVL(px_ozf_funds_old_rectype.committed_amt,0);
2883                         px_ozf_funds_new_tbl(l_fund_record_num).EARNED_AMT                     := NVL(l_fund_rec.earned_amt,0) - NVL(px_ozf_funds_old_rectype.earned_amt,0);
2884                         px_ozf_funds_new_tbl(l_fund_record_num).PAID_AMT                       := NVL(l_fund_rec.paid_amt,0) - NVL(px_ozf_funds_old_rectype.paid_amt,0);
2885                         px_ozf_funds_new_tbl(l_fund_record_num).RECAL_COMMITTED                := NVL(l_fund_rec.recal_committed,0) - NVL(px_ozf_funds_old_rectype.recal_committed,0);
2886                         px_ozf_funds_new_tbl(l_fund_record_num).ROLLUP_ORIGINAL_BUDGET         := NVL(l_fund_rec.rollup_original_budget,0) - NVL(px_ozf_funds_old_rectype.rollup_original_budget,0);
2887                         px_ozf_funds_new_tbl(l_fund_record_num).ROLLUP_TRANSFERED_IN_AMT       := NVL(l_fund_rec.rollup_transfered_in_amt,0) - NVL(px_ozf_funds_old_rectype.rollup_transfered_in_amt,0);
2888                         px_ozf_funds_new_tbl(l_fund_record_num).ROLLUP_TRANSFERED_OUT_AMT      := NVL(l_fund_rec.rollup_transfered_out_amt,0) - NVL(px_ozf_funds_old_rectype.rollup_transfered_out_amt,0);
2889                         px_ozf_funds_new_tbl(l_fund_record_num).ROLLUP_HOLDBACK_AMT            := NVL(l_fund_rec.rollup_holdback_amt,0) - NVL(px_ozf_funds_old_rectype.rollup_holdback_amt,0);
2890                         px_ozf_funds_new_tbl(l_fund_record_num).ROLLUP_PLANNED_AMT             := NVL(l_fund_rec.rollup_planned_amt,0) - NVL(px_ozf_funds_old_rectype.rollup_planned_amt,0);
2891                         px_ozf_funds_new_tbl(l_fund_record_num).ROLLUP_COMMITTED_AMT           := NVL(l_fund_rec.rollup_committed_amt,0) - NVL(px_ozf_funds_old_rectype.rollup_committed_amt,0);
2892                         px_ozf_funds_new_tbl(l_fund_record_num).ROLLUP_RECAL_COMMITTED         := NVL(l_fund_rec.rollup_recal_committed,0) - NVL(px_ozf_funds_old_rectype.rollup_recal_committed,0);
2893                         px_ozf_funds_new_tbl(l_fund_record_num).ROLLUP_EARNED_AMT              := NVL(l_fund_rec.rollup_earned_amt,0) - NVL(px_ozf_funds_old_rectype.rollup_earned_amt,0);
2894                         px_ozf_funds_new_tbl(l_fund_record_num).ROLLUP_PAID_AMT                := NVL(l_fund_rec.rollup_paid_amt,0) - NVL(px_ozf_funds_old_rectype.rollup_paid_amt,0);
2895                         px_ozf_funds_new_tbl(l_fund_record_num).UTILIZED_AMT                   := NVL(l_fund_rec.utilized_amt,0) - NVL(px_ozf_funds_old_rectype.utilized_amt,0);
2896                         px_ozf_funds_new_tbl(l_fund_record_num).ROLLUP_UTILIZED_AMT            := NVL(l_fund_rec.rollup_utilized_amt,0) - NVL(px_ozf_funds_old_rectype.rollup_utilized_amt,0);
2897 
2898                    END IF;
2899 
2900                    IF G_DEBUG THEN
2901                       ozf_utility_pvt.debug_message('earned from fund table: ' || px_ozf_funds_old_rectype.earned_amt);
2902                       ozf_utility_pvt.debug_message('new earned: ' || l_fund_rec.earned_amt);
2903                       ozf_utility_pvt.debug_message('final earned: ' || px_ozf_funds_new_tbl(l_fund_record_num).EARNED_AMT);
2904                    END IF;
2905 
2906         END IF;
2907         -- For TPA Parallel Execution ER - 9614703 (-)
2908 
2909    END IF;
2910 -- For Bug#8867381 (-)
2911 
2912    IF l_return_status = fnd_api.g_ret_sts_success THEN
2913 
2914       -- added by feliu for updating rollup amount columns.
2915       --  if parent_fund_id is not null, update parent's rollup amount by using this fund's
2916       --  rollup amount change.
2917       --dbms_output.put_line('parent_fund_id  '||l_fund_rec.parent_fund_id);
2918 
2919       IF l_fund_rec.status_code NOT IN (  'DRAFT' ,'REJECTED','PENDING')
2920           AND (l_rollup_original_budget IS NOT NULL OR
2921           l_rollup_transfered_in_amt  IS NOT NULL OR
2922           l_rollup_transfered_out_amt IS NOT NULL OR
2923           l_rollup_holdback_amt       IS NOT NULL OR
2924           l_rollup_planned_amt        IS NOT NULL OR
2925           l_rollup_committed_amt      IS NOT NULL OR
2926           l_rollup_utilized_amt       IS NOT NULL OR
2927           l_rollup_earned_amt         IS NOT NULL OR   -- yzhao: 11.5.10
2928           l_rollup_paid_amt           IS NOT NULL OR
2929           l_rollup_recal_committed    IS NOT NULL)
2930          THEN
2931 
2932           --nirprasa, no chnage needed as parent_fund_id is NULL for reconcile flow
2933          IF  l_fund_rec.parent_fund_id IS NOT NULL THEN
2934            --For case from draft to active, update with own value, other case use difference to update rollup
2935             IF l_active_flag = false THEN
2936                l_fund_rec.rollup_original_budget := NVL(l_rollup_original_budget,0);
2937                l_fund_rec.rollup_transfered_in_amt := NVL(l_rollup_transfered_in_amt,0);
2938                l_fund_rec.rollup_transfered_out_amt := NVL(l_rollup_transfered_out_amt,0);
2939                l_fund_rec.rollup_holdback_amt       := NVL(l_rollup_holdback_amt,0);
2940                l_fund_rec.rollup_planned_amt        := NVL(l_rollup_planned_amt,0);
2941                l_fund_rec.rollup_committed_amt      := NVL(l_rollup_committed_amt,0);
2942                l_fund_rec.rollup_utilized_amt       := NVL(l_rollup_utilized_amt,0);    -- yzhao: 11.5.10
2943                l_fund_rec.rollup_earned_amt         := NVL(l_rollup_earned_amt,0);
2944                l_fund_rec.rollup_paid_amt           := NVL(l_rollup_paid_amt,0);
2945                l_fund_rec.rollup_recal_committed    := NVL(l_rollup_recal_committed,0);
2946             END IF;
2947 
2948 
2949    -- For BUG#8867381(+)
2950    -- l_use_fund_staging_tables flag is set only for chargeback flow and for the
2951    -- chargeback flow it updates roll up amount in OZF_RESALE_COMMON_PVT.UPDATE_OZF_FUNDS_ALL_B procedure.
2952 
2953         If l_use_fund_staging_tables <> 'T' then
2954 
2955            IF G_DEBUG THEN
2956             ozf_utility_pvt.debug_message('Going to update mode of update_rollup_amount as l_use_fund_staging_tables is :'||l_use_fund_staging_tables );
2957           END IF;
2958 
2959             update_rollup_amount(
2960                          p_api_version  => l_api_version
2961                         ,p_init_msg_list  => fnd_api.g_false
2962                         ,p_commit     => fnd_api.g_false
2963                         ,p_validation_level   => p_validation_level
2964                         ,x_return_status      => l_return_status
2965                         ,x_msg_count  => x_msg_count
2966                         ,x_msg_data   => x_msg_data
2967                         ,p_fund_rec => l_fund_rec
2968                         );
2969             IF l_return_status = fnd_api.g_ret_sts_error THEN
2970                RAISE fnd_api.g_exc_error;
2971             ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
2972                RAISE fnd_api.g_exc_unexpected_error;
2973             END IF;
2974         END IF;
2975    -- For BUG#8867381(-)
2976 
2977      -- commented by feliu to fix bug 2654263
2978      /*      IF l_active_flag = true THEN
2979 
2980             update_funds_access(
2981                                     p_api_version  => l_api_version
2982                                     ,p_init_msg_list  => fnd_api.g_false
2983                                     ,p_commit     => fnd_api.g_false
2984                                     ,p_validation_level   => p_validation_level
2985                                     ,x_return_status      => l_return_status
2986                                     ,x_msg_count  => x_msg_count
2987                                     ,x_msg_data   => x_msg_data
2988                                     ,p_fund_rec => l_fund_rec
2989                                     ,p_mode => 'CREATE'
2990                                   );
2991             IF l_return_status = fnd_api.g_ret_sts_error THEN
2992                RAISE fnd_api.g_exc_error;
2993             ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
2994                RAISE fnd_api.g_exc_unexpected_error;
2995             END IF;
2996          END IF; */
2997          END IF; -- end if for parent fund
2998       END IF; -- end if for status code
2999 
3000 
3001       -- yzhao 04/02/2002 no need to call process_approval if it's from actbudget update
3002 
3003       IF p_mode NOT IN ('ADJUST', 'SETTLE') THEN
3004           -- 10/14/2002 mode is always update in QP
3005          /*IF l_fund_rec.status_code IN ('CLOSED','CANCELLED','ACTIVE','ON_HOLD')
3006               AND  l_old_status IN ('ACTIVE','ON_HOLD') THEN
3007          */
3008              l_mode := 'UPDATE' ; -- when not creating act_budgets
3009          IF l_fund_rec.status_code IN ('ACTIVE','ON_HOLD')
3010               AND  l_old_status IN ('PENDING','DRAFT') THEN
3011              l_mode := 'ACTIVE' ; -- when creating act budgets for active funds
3012          END IF;
3013          -- call when it is active after submitting for approval
3014          IF l_mode IN ('ACTIVE' , 'UPDATE' ) THEN
3015             ozf_fundrules_pvt.process_approval(
3016                 p_fund_rec => l_fund_rec
3017                ,p_mode     => l_mode
3018                ,p_old_fund_status => l_old_status
3019                ,x_return_status => l_return_status
3020                ,x_msg_count => x_msg_count
3021                ,x_msg_data => x_msg_data
3022                ,p_api_version => 1.0);
3023          END IF;
3024 
3025          IF l_return_status = fnd_api.g_ret_sts_error THEN
3026             RAISE fnd_api.g_exc_error;
3027          ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
3028             RAISE fnd_api.g_exc_unexpected_error;
3029          END IF;
3030      END IF;    -- yzhao: end of IF p_mode <> 'ADJUST'
3031 
3032      -- call when it is submitting for approval
3033      IF l_submit_child_approval = FND_API.g_true THEN
3034         -- yzhao: 03/18/2003 handle budget allocation as well
3035         IF l_fund_rec.fund_usage IS NOT NULL AND l_fund_rec.fund_usage = 'ALLOC' THEN
3036             -- yzhao: 03/18/2003 budget allocation does not need workflow approval process so pass allocation_flag='Y'
3037            l_allocation_flag := 'Y';
3038         ELSE
3039            l_allocation_flag := 'N';
3040         END IF;
3041         --nirprasa, no chnage needed as this flow is for request
3042         ozf_fund_request_apr_pvt.create_fund_request(
3043                   p_commit => fnd_api.g_false
3044                  ,p_approval_for_id => p_fund_rec.fund_id
3045                   /* yzhao: Jan 16 2005 fix bug 4943323(4912954) pass in correct requester id
3046                  ,p_requester_id => l_fund_rec.owner
3047                    */
3048                  ,p_requester_id => ozf_utility_pvt.get_resource_id(p_user_id => fnd_global.user_id)
3049                  ,p_requested_amount => l_child_request_amt
3050                  ,p_approval_fm => 'FUND'
3051                  ,p_approval_fm_id => l_fund_rec.parent_fund_id
3052                  ,p_transfer_type => 'REQUEST'
3053                  ,p_child_flag =>'Y'
3054                   -- yzhao: 03/18/2003 11.5.9 for allocation activation of territory hierarchy, always pass as 'Y'; all others 'N'
3055                  ,p_allocation_flag => l_allocation_flag
3056                  ,p_justification => l_fund_rec.description
3057                  ,x_return_status => l_return_status
3058                  ,x_msg_count => x_msg_count
3059                  ,x_msg_data => x_msg_data
3060                  ,x_request_id => l_request_id
3061                  ,x_approver_id => l_approver_id
3062                  ,x_is_requester_owner => l_is_requestor_owner);
3063 
3064         IF l_return_status = fnd_api.g_ret_sts_error THEN
3065            RAISE fnd_api.g_exc_error;
3066         ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
3067            RAISE fnd_api.g_exc_unexpected_error;
3068         END IF;
3069      END IF;
3070      -- call when it is submitting for approval
3071      IF l_submit_budget_approval = FND_API.g_true THEN
3072          l_reject_status_id :=ozf_utility_pvt.get_default_user_status(
3073                         l_status_type
3074                        ,'REJECTED');
3075 
3076                 AMS_GEN_APPROVAL_PVT.StartProcess
3077                  (p_activity_type  => g_activity_type
3078                   ,p_activity_id    => p_fund_rec.fund_id
3079                   ,p_approval_type  => G_PARENT_APPROVAL_TYPE
3080                   ,p_object_version_number  =>p_fund_rec.object_version_number -- old object version number
3081                   ,p_orig_stat_id           =>l_old_user_status_id
3082                   ,p_new_stat_id            =>p_fund_rec.user_status_id -- active status
3083                   ,p_reject_stat_id         =>l_reject_status_id
3084                   /* yzhao: Jan 16 2005 fix bug 4943323(4912954) pass in correct requester id
3085                   ,p_requester_userid       =>l_fund_rec.owner
3086                    */
3087                   ,p_requester_userid       =>ozf_utility_pvt.get_resource_id(p_user_id => fnd_global.user_id)
3088                   ,p_notes_from_requester   =>l_fund_rec.description
3089                   ,p_workflowprocess        => l_workflow_process
3090                   ,p_item_type              => l_item_type);
3091 
3092          raise_business_event(p_object_id => p_fund_rec.fund_id , p_event_type =>'APPROVAL');
3093      ELSE
3094         -- raise business event.
3095          raise_business_event(p_object_id => p_fund_rec.fund_id ,p_event_type =>'UPDATE');
3096      END IF;
3097 
3098       /************************   MPANDE JAN-16 2001 ************************************************
3099       ..The calls that were made to the following API for child fund  workflow process
3100                   ozf_wf_request_apr_pvt.create_fund_request
3101          was removed from this place and put in update_fund_status APIS
3102          The code was removed and not commented because of clarity and cleanliness. Please refer to
3103          earlier versions for bug fixes etc. in releases prior to 11.5.5. (hornet)
3104       **********************************************************************************************/
3105       -- reinitialize the variables
3106       l_act_access_id := NULL;
3107       l_acc_obj_ver_num := NULL;
3108        -- if owner is changing update acesss
3109       IF  p_fund_rec.owner <> fnd_api.g_miss_num
3110          AND l_owner <> p_fund_rec.owner THEN
3111             IF G_DEBUG THEN
3112                ozf_utility_pvt.debug_message(l_full_name || ': insert access owner');
3113             END IF;
3114 /*     commented by feliu on 05/13/2003 to fix bug 2969498;
3115             OPEN c_access(p_fund_rec.fund_id);
3116             FETCH c_access INTO l_act_access_id, l_acc_obj_ver_num;
3117             CLOSE c_access;
3118             ams_access_pvt.init_access_rec(l_access_rec);
3119             l_access_rec.activity_access_id := l_act_access_id;
3120             l_access_rec.object_version_number := l_acc_obj_ver_num;
3121             l_access_rec.act_access_to_object_id := l_fund_rec.fund_id;
3122             l_access_rec.arc_act_access_to_object := 'FUND';
3123             l_access_rec.user_or_role_id := l_fund_rec.owner;
3124             l_access_rec.arc_user_or_role_type := 'USER';
3125             l_access_rec.admin_flag := 'Y';
3126             l_access_rec.owner_flag := 'Y';
3127             ams_access_pvt.update_access(
3128                p_api_version => l_api_version
3129               ,p_init_msg_list => fnd_api.g_false
3130               ,p_validation_level => p_validation_level
3131               ,x_return_status => l_return_status
3132               ,x_msg_count => x_msg_count
3133               ,x_msg_data => x_msg_data
3134               ,p_commit => fnd_api.g_false
3135               ,p_access_rec => l_access_rec);
3136 */
3137 
3138            AMS_Access_PVT.update_object_owner
3139               ( p_api_version        => 1.0
3140                 ,p_init_msg_list      => FND_API.G_FALSE
3141                 ,p_commit             => FND_API.G_FALSE
3142                 ,p_validation_level   => p_validation_level
3143                 ,x_return_status      => x_return_status
3144                 ,x_msg_count          => x_msg_count
3145                 ,x_msg_data           => x_msg_data
3146                 ,p_object_type        => 'FUND'
3147                 ,p_object_id          => l_fund_rec.fund_id
3148                 ,p_resource_id        => l_fund_rec.owner
3149                 ,p_old_resource_id    => l_owner
3150               );
3151             IF l_return_status = fnd_api.g_ret_sts_error THEN
3152                RAISE fnd_api.g_exc_error;
3153             ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
3154                RAISE fnd_api.g_exc_unexpected_error;
3155             END IF;
3156        END IF; -- end of owner is changing
3157 
3158      -- added by feliu to fix bug 2654263
3159       -- if parent id is not null during updation and old parent id is null ,
3160       -- a row is created in the ams_act_access to give access
3161       -- to the owner of the parent fund to this child
3162       --if the parent fund owner and the child fund owner is not same then only create this
3163        IF l_fund_rec.parent_fund_id IS NOT NULL AND l_fund_rec.owner <> l_par_fund_owner THEN
3164        --if there is no parent fund OR (09/05/2001 mpande) when no records exists in ams_act_access for the fund
3165         --then create a access for the new parent ownner
3166           IF l_old_parent_fund_id IS NULL THEN
3167              update_funds_access(
3168                               p_api_version  => l_api_version
3169                               ,p_init_msg_list  => fnd_api.g_false
3170                               ,p_commit     => fnd_api.g_false
3171                               ,p_validation_level   => p_validation_level
3172                               ,x_return_status      => l_return_status
3173                               ,x_msg_count  => x_msg_count
3174                               ,x_msg_data   => x_msg_data
3175                               ,p_fund_rec => l_fund_rec
3176                               ,p_mode => 'CREATE'
3177                               );
3178              IF l_return_status = fnd_api.g_ret_sts_error THEN
3179                 RAISE fnd_api.g_exc_error;
3180              ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
3181                 RAISE fnd_api.g_exc_unexpected_error;
3182              END IF;
3183 
3184             --if the old parent fund  and the new parent fund  is diffrent.
3185           ELSIF  l_old_parent_fund_id <> l_fund_rec.parent_fund_id THEN
3186              update_funds_access(
3187                               p_api_version  => l_api_version
3188                               ,p_init_msg_list  => fnd_api.g_false
3189                               ,p_commit     => fnd_api.g_false
3190                               ,p_validation_level   => p_validation_level
3191                               ,x_return_status      => l_return_status
3192                               ,x_msg_count  => x_msg_count
3193                               ,x_msg_data   => x_msg_data
3194                               ,p_fund_rec => l_fund_rec
3195                               ,p_mode => 'CREATE'
3196                               );
3197              IF l_return_status = fnd_api.g_ret_sts_error THEN
3198                 RAISE fnd_api.g_exc_error;
3199              ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
3200                 RAISE fnd_api.g_exc_unexpected_error;
3201              END IF;
3202           END IF; -- end of l_old_parent_fund_id <> l_fund_rec.parent_fund_id.
3203        END IF;  -- end of l_fund_rec.parent_fund_id IS NOT NULL
3204        -- added by feliu to fix bug 2654263
3205 
3206        /* R12: yzhao bug 4669269 - obsolete ozf_mc_transactions
3207        IF   p_fund_rec.original_budget <> FND_API.g_miss_num
3208            OR p_fund_rec.transfered_in_amt <> FND_API.g_miss_num
3209            OR p_fund_rec.transfered_out_amt <> FND_API.g_miss_num
3210            OR p_fund_rec.holdback_amt <> FND_API.g_miss_num
3211            OR p_fund_rec.planned_amt <> FND_API.g_miss_num
3212            OR p_fund_rec.committed_amt <> FND_API.g_miss_num
3213            OR p_fund_rec.utilized_amt <> FND_API.g_miss_num            -- yzhao: 11.5.10
3214            OR p_fund_rec.earned_amt <> FND_API.g_miss_num
3215            OR p_fund_rec.paid_amt <> FND_API.g_miss_num
3216            OR p_fund_rec.currency_code_tc <> FND_API.g_miss_char   THEN
3217 
3218           OPEN c_mc_record(p_fund_rec.fund_id);
3219           FETCH c_mc_record INTO l_mc_record_id, l_mc_obj_number;
3220           CLOSE c_mc_record;
3221           --///mpande
3222           -- Insert a record in OZF_MC_TRANSACTIONS_ALL IN functional currency
3223           --  so that we have the functional currency amounts
3224           --   The exchange_rate_type is picked up by the MC_TRAnSACTIONS API
3225           -- from proile
3226           -- update the transaction table on all cases.
3227 
3228           IF G_DEBUG THEN
3229              ozf_utility_pvt.debug_message(l_full_name ||': insert FC record' ||l_fund_rec.currency_code_tc);
3230           END IF;
3231           ozf_mc_transactions_pvt.init_transaction_rec(x_mc_transactions_rec => l_mc_transaction_rec);
3232           -- Populate the record variable
3233           l_mc_transaction_rec.mc_record_id := l_mc_record_id;
3234           l_mc_transaction_rec.object_version_number := l_mc_obj_number;
3235           l_mc_transaction_rec.source_object_name := 'FUND';
3236           l_mc_transaction_rec.source_object_id := l_fund_rec.fund_id;
3237           l_mc_transaction_rec.currency_code := l_fund_rec.currency_code_tc;
3238           l_mc_transaction_rec.amount_column1 := l_fund_rec.original_budget;
3239           l_mc_transaction_rec.amount_column2 := l_fund_rec.transfered_in_amt;
3240           l_mc_transaction_rec.amount_column3 := l_fund_rec.transfered_out_amt;
3241           l_mc_transaction_rec.amount_column4 := l_fund_rec.holdback_amt;
3242           l_mc_transaction_rec.amount_column5 := l_fund_rec.planned_amt;
3243           l_mc_transaction_rec.amount_column6 := l_fund_rec.committed_amt;
3244           l_mc_transaction_rec.amount_column7 := l_fund_rec.earned_amt;
3245           l_mc_transaction_rec.amount_column8 := l_fund_rec.paid_amt;
3246           l_mc_transaction_rec.amount_column9 := l_fund_rec.utilized_amt;          -- yzhao: 11.5.10
3247 
3248           -- kdass - R12 MOAC changes
3249           OPEN c_get_org_id;
3250           FETCH c_get_org_id INTO l_fund_rec.org_id;
3251           CLOSE c_get_org_id;
3252 
3253           -- Call mc_transaction API if fund type is not QUOTA
3254           IF l_fund_rec.fund_type <> 'QUOTA' THEN
3255               ozf_mc_transactions_pvt.update_mc_transactions(
3256                  p_api_version => l_api_version
3257                 ,p_init_msg_list => fnd_api.g_false
3258                 ,p_commit => fnd_api.g_false
3259                  -- 01/13/2003  yzhao fix bug BUG 2750841(same as 2741039) pass in org_id
3260                 ,p_org_id => l_fund_rec.org_id
3261                 ,x_return_status => l_return_status
3262                 ,x_msg_count => x_msg_count
3263                 ,x_msg_data => x_msg_data
3264                 ,p_mc_transactions_rec => l_mc_transaction_rec);
3265 
3266                  IF l_return_status = fnd_api.g_ret_sts_error THEN
3267                         RAISE fnd_api.g_exc_error;
3268                  ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
3269                         RAISE fnd_api.g_exc_unexpected_error;
3270                  END IF;
3271           END IF;
3272 
3273        END IF ; --check for amount
3274        */
3275 
3276    END IF;-- end return status
3277 
3278    -- Check for commit
3279    IF fnd_api.to_boolean(p_commit) THEN
3280       COMMIT;
3281    END IF;
3282 
3283    fnd_msg_pub.count_and_get(
3284       p_encoded => fnd_api.g_false
3285      ,p_count => x_msg_count
3286      ,p_data => x_msg_data);
3287    IF G_DEBUG THEN
3288       ozf_utility_pvt.debug_message(l_full_name || ': end');
3289    END IF;
3290 EXCEPTION
3291    WHEN fnd_api.g_exc_error THEN
3292       ROLLBACK TO update_fund;
3293       x_return_status := fnd_api.g_ret_sts_error;
3294       fnd_msg_pub.count_and_get(
3295          p_encoded => fnd_api.g_false
3296         ,p_count => x_msg_count
3297         ,p_data => x_msg_data);
3298    WHEN fnd_api.g_exc_unexpected_error THEN
3299       ROLLBACK TO update_fund;
3300       x_return_status := fnd_api.g_ret_sts_unexp_error;
3301       fnd_msg_pub.count_and_get(
3302          p_encoded => fnd_api.g_false
3303         ,p_count => x_msg_count
3304         ,p_data => x_msg_data);
3305    WHEN OTHERS THEN
3306       ROLLBACK TO update_fund;
3307       x_return_status := fnd_api.g_ret_sts_unexp_error;
3308 
3309       IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_unexp_error) THEN
3310          fnd_msg_pub.add_exc_msg(g_pkg_name, l_api_name);
3311       END IF;
3312 
3313       fnd_msg_pub.count_and_get(
3314          p_encoded => fnd_api.g_false
3315         ,p_count => x_msg_count
3316         ,p_data => x_msg_data);
3317 END update_fund;
3318 
3319 --------------------------------------------------------------------
3320 -- PROCEDURE
3321 --    Validate_Fund
3322 --
3323 -- HISTORY
3324 --    02/02/2000  Shitij Vatsa  Create.
3325 --    06/13/2000  Mumu PAnde Added validations
3326 --    07/28/2000  Mumu Pande Added parent_validation against child
3327 --    01/20/2001  Mumu Pande Added call for fund inter entity validations
3328 --------------------------------------------------------------------
3329 PROCEDURE validate_fund(
3330    p_api_version        IN       NUMBER
3331   ,p_init_msg_list      IN       VARCHAR2 := fnd_api.g_false
3332   ,p_validation_level   IN       NUMBER := fnd_api.g_valid_level_full
3333   ,x_return_status      OUT NOCOPY      VARCHAR2
3334   ,x_msg_count          OUT NOCOPY      NUMBER
3335   ,x_msg_data           OUT NOCOPY      VARCHAR2
3336   ,p_fund_rec           IN       fund_rec_type)
3337 IS
3338    l_api_version    CONSTANT NUMBER       := 1.0;
3339    l_api_name       CONSTANT VARCHAR2(30) := 'Validate_Fund';
3340    l_full_name      CONSTANT VARCHAR2(60) := g_pkg_name || '.' || l_api_name;
3341    l_return_status           VARCHAR2(1);
3342 BEGIN
3343    ----------------------- initialize --------------------
3344    IF G_DEBUG THEN
3345       ozf_utility_pvt.debug_message(l_full_name || ': start');
3346    END IF;
3347 
3348    IF fnd_api.to_boolean(p_init_msg_list) THEN
3349       fnd_msg_pub.initialize;
3350    END IF;
3351 
3352    IF NOT fnd_api.compatible_api_call(l_api_version, p_api_version, l_api_name, g_pkg_name) THEN
3353       RAISE fnd_api.g_exc_unexpected_error;
3354    END IF;
3355 
3356    x_return_status := fnd_api.g_ret_sts_success;
3357    ---------------------- validate ------------------------
3358    IF G_DEBUG THEN
3359       ozf_utility_pvt.debug_message(l_full_name || ': check items');
3360    END IF;
3361 
3362    IF p_validation_level >= jtf_plsql_api.g_valid_level_item THEN
3363       ----dbms_output.put_line ('Calling Check_Fund_Items from validate');
3364       check_fund_items(
3365          p_fund_rec => p_fund_rec
3366         ,p_validation_mode => jtf_plsql_api.g_create
3367         ,x_return_status => l_return_status);
3368 
3369       ----dbms_output.put_line ('Called Check_Fund_Items from validate');
3370       IF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
3371          RAISE fnd_api.g_exc_unexpected_error;
3372       ELSIF l_return_status = fnd_api.g_ret_sts_error THEN
3373          RAISE fnd_api.g_exc_error;
3374       END IF;
3375    END IF;
3376 
3377    IF G_DEBUG THEN
3378       ozf_utility_pvt.debug_message(l_full_name || ': check record');
3379    END IF;
3380 
3381    IF p_validation_level >= jtf_plsql_api.g_valid_level_record THEN
3382       check_fund_record(
3383          p_fund_rec => p_fund_rec
3384         ,p_complete_rec => p_fund_rec
3385         ,p_mode => jtf_plsql_api.g_create
3386         ,x_return_status => l_return_status);
3387 
3388       IF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
3389          RAISE fnd_api.g_exc_unexpected_error;
3390       ELSIF l_return_status = fnd_api.g_ret_sts_error THEN
3391          RAISE fnd_api.g_exc_error;
3392       END IF;
3393    END IF;
3394 
3395    -- added on 01/20/2001  for all inter entity validations Mumu Pande
3396    IF G_DEBUG THEN
3397       ozf_utility_pvt.debug_message(l_full_name || ': check inter-entity');
3398    END IF;
3399 
3400    IF p_validation_level >= jtf_plsql_api.g_valid_level_inter_entity THEN
3401       check_fund_inter_entity(
3402          p_fund_rec => p_fund_rec
3403         ,p_complete_rec => p_fund_rec
3404         ,p_validation_mode => jtf_plsql_api.g_create
3405         ,x_return_status => l_return_status);
3406 
3407       IF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
3408          RAISE fnd_api.g_exc_unexpected_error;
3409       ELSIF l_return_status = fnd_api.g_ret_sts_error THEN
3410          RAISE fnd_api.g_exc_error;
3411       END IF;
3412    END IF;
3413 
3414    -------------------- finish --------------------------
3415    fnd_msg_pub.count_and_get(
3416       p_encoded => fnd_api.g_false
3417      ,p_count => x_msg_count
3418      ,p_data => x_msg_data);
3419    IF G_DEBUG THEN
3420       ozf_utility_pvt.debug_message(l_full_name || ': end');
3421    END IF;
3422 EXCEPTION
3423    WHEN fnd_api.g_exc_error THEN
3424       x_return_status := fnd_api.g_ret_sts_error;
3425       fnd_msg_pub.count_and_get(
3426          p_encoded => fnd_api.g_false
3427         ,p_count => x_msg_count
3428         ,p_data => x_msg_data);
3429    WHEN fnd_api.g_exc_unexpected_error THEN
3430       x_return_status := fnd_api.g_ret_sts_unexp_error;
3431       fnd_msg_pub.count_and_get(
3432          p_encoded => fnd_api.g_false
3433         ,p_count => x_msg_count
3434         ,p_data => x_msg_data);
3435    WHEN OTHERS THEN
3436       x_return_status := fnd_api.g_ret_sts_unexp_error;
3437 
3438       IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_unexp_error) THEN
3439          fnd_msg_pub.add_exc_msg(g_pkg_name, l_api_name);
3440       END IF;
3441 
3442       fnd_msg_pub.count_and_get(
3443          p_encoded => fnd_api.g_false
3444         ,p_count => x_msg_count
3445         ,p_data => x_msg_data);
3446 END validate_fund;
3447 
3448 ---------------------------------------------------------------------
3449 -- PROCEDURE
3450 --    Check_Fund_Req_Items
3451 --
3452 -- HISTORY
3453 --    02/02/2000  Shitij Vatsa  Create.
3454 --   09/20/2000  Mumu Pande for user status
3455 --   01/20/2001  Mumu Pande for category
3456 --	29/DEC/2011 Added parameter p_mode default NULL Bug 13529250 to avoid validation for budget amount while settling claim
3457 ---------------------------------------------------------------------
3458 PROCEDURE check_fund_req_items(
3459    p_fund_rec        IN       fund_rec_type
3460   ,x_return_status   OUT NOCOPY      VARCHAR2
3461   ,p_mode		IN	VARCHAR2 DEFAULT NULL)
3462 IS
3463 
3464 BEGIN
3465    x_return_status := fnd_api.g_ret_sts_success;
3466 
3467    -- Commented by mpande  02/16/2001 We are going to generate the number if it is null
3468    ------------------------ fund_number --------------------------
3469    /*   IF p_fund_rec.fund_number IS NULL THEN   -- check for fund number
3470          IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_error) THEN
3471             IF p_fund_rec.fund_type = 'QUOTA' THEN
3472               fnd_message.set_name('OZF', 'OZF_TP_NO_QUOTA_NUMBER');
3473             ELSE
3474               fnd_message.set_name('OZF', 'OZF_FUND_NO_FUND_NUMBER');
3475             END IF;
3476             fnd_msg_pub.add;
3477          END IF;
3478 
3479          x_return_status := fnd_api.g_ret_sts_error;
3480          RETURN;
3481       END IF;
3482    */
3483    ------------------------ owner -------------------------------
3484    IF p_fund_rec.owner IS NULL THEN   -- check for fund owner
3485       IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_error) THEN
3486          IF p_fund_rec.fund_type = 'QUOTA' THEN
3487             fnd_message.set_name('OZF', 'OZF_TP_NO_QUOTA_OWNER');
3488          ELSE
3489             fnd_message.set_name('OZF', 'OZF_FUND_NO_FUND_OWNER');
3490          END IF;
3491          fnd_msg_pub.add;
3492       END IF;
3493 
3494       x_return_status := fnd_api.g_ret_sts_error;
3495       RETURN;
3496    END IF;
3497 
3498    IF p_fund_rec.fund_type IS NULL THEN   -- check for fund owner
3499       IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_error) THEN
3500          fnd_message.set_name('OZF', 'OZF_FUND_NO_FUND_TYPE');
3501          fnd_msg_pub.add;
3502       END IF;
3503 
3504       x_return_status := fnd_api.g_ret_sts_error;
3505       RETURN;
3506    END IF;
3507 
3508    --   09/20/2000  Mumu Pande for user status
3509    IF p_fund_rec.user_status_id IS NULL THEN   -- check for fund user status
3510       IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_error) THEN
3511          fnd_message.set_name('OZF', 'OZF_FUND_NO_USER_STATUS');
3512          fnd_msg_pub.add;
3513       END IF;
3514 
3515       x_return_status := fnd_api.g_ret_sts_error;
3516       RETURN;
3517    END IF;
3518 
3519    --   01/20/2001  Mumu Pande for category
3520    IF p_fund_rec.fund_type <> 'QUOTA' AND p_fund_rec.category_id IS NULL THEN   -- check for fund category
3521       IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_error) THEN
3522          fnd_message.set_name('OZF', 'OZF_FUND_NO_CATEGORY');
3523          fnd_msg_pub.add;
3524       END IF;
3525 
3526       x_return_status := fnd_api.g_ret_sts_error;
3527       RETURN;
3528    END IF;
3529    --   01/20/2001  Mumu Pande for custom_setup_id
3530    IF p_fund_rec.custom_setup_id IS NULL THEN   -- check for fund category
3531       IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_error) THEN
3532          fnd_message.set_name('OZF', 'OZF_FUND_NO_CUSTOM_SETUP');
3533          fnd_msg_pub.add;
3534       END IF;
3535 
3536       x_return_status := fnd_api.g_ret_sts_error;
3537       RETURN;
3538    END IF;
3539    --  11/13/2001 mpande added budget amount cannot be euqal to 0 for root budgets
3540   --   12/23/04 by feliu. For the budgets created from mass transfer, don't  validate. fix bug 3580531.
3541   --	29/DEC/2011 Added parameter p_mode default NULL Bug 13529250 , to avoid validation while claim settling
3542   --			p_mode ='SETTLE' is passed while claim settlement fetcher
3543    IF p_fund_rec.prev_fund_id IS NULL AND p_fund_rec.parent_fund_id IS NULL AND p_fund_rec.fund_type = 'FIXED' AND (p_mode is NULL OR p_mode <> 'SETTLE') THEN
3544 	-- niprakas changed <= to <
3545       -- rimehrot changed back to <= for bug fix 3580531
3546       IF NVL(p_fund_rec.original_budget,0) <= 0 THEN   -- check for fund amount
3547          IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_error) THEN
3548            IF p_fund_rec.fund_type = 'QUOTA' THEN
3549              fnd_message.set_name('OZF', 'OZF_TP_NO_ORG_QUOTA');
3550            ELSE
3551              fnd_message.set_name('OZF', 'OZF_FUND_NO_ORG_BUDGET');
3552            END IF;
3553            fnd_msg_pub.add;
3554          END IF;
3555 
3556          x_return_status := fnd_api.g_ret_sts_error;
3557          RETURN;
3558       END IF;
3559    END IF;
3560 
3561    --kdass 25-APR-2006 bug 5176819 - Ledger is required field
3562    IF p_fund_rec.fund_type <> 'QUOTA' AND p_fund_rec.ledger_id IS NULL THEN
3563       IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_error) THEN
3564          fnd_message.set_name('OZF', 'OZF_FUND_NO_LEDGER');
3565          fnd_msg_pub.add;
3566       END IF;
3567 
3568       x_return_status := fnd_api.g_ret_sts_error;
3569       RETURN;
3570    END IF;
3571 
3572    /* yzhao: bug 4669461: R12 budget is org aware, but not org stripped. quota is not org aware
3573                           so org_id is not required
3574    IF p_fund_rec.org_id IS NULL THEN   -- check for org id
3575       IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_error) THEN
3576          fnd_message.set_name('OZF', 'OZF_NO_DEFAULT_ORG_ID');
3577          fnd_msg_pub.add;
3578       END IF;
3579 
3580       x_return_status := fnd_api.g_ret_sts_error;
3581       RETURN;
3582    END IF;
3583     */
3584 
3585 END check_fund_req_items;
3586 
3587 ---------------------------------------------------------------------
3588 -- PROCEDURE
3589 --    Check_Fund_Uk_Items
3590 --
3591 -- HISTORY
3592 --    02/02/2000  Shitij Vatsa  Create.
3593 --  2nd August200 MPAnde Updated
3594 ---------------------------------------------------------------------
3595 PROCEDURE check_fund_uk_items(
3596    p_fund_rec          IN       fund_rec_type
3597   ,p_validation_mode   IN       VARCHAR2 := jtf_plsql_api.g_create
3598   ,x_return_status     OUT NOCOPY      VARCHAR2)
3599 IS
3600    l_valid_flag    VARCHAR2(1);
3601 
3602     -- Added for Bug #3498826
3603      CURSOR c_prog_fund_number_create
3604      IS
3605      SELECT 1 from ozf_funds_all_b
3606      WHERE fund_number = p_fund_rec.fund_number;
3607 
3608       CURSOR c_prog_fund_number_update
3609       IS
3610       SELECT 1 from ozf_funds_all_b
3611       WHERE fund_number = p_fund_rec.fund_number
3612       AND fund_id <> p_fund_rec.fund_id;
3613 
3614 
3615 BEGIN
3616    x_return_status := fnd_api.g_ret_sts_success;
3617 
3618    -- For Create_Fund, when fund_id is passed in, we need to
3619    -- check if this fund_id is unique.
3620    IF     p_validation_mode = jtf_plsql_api.g_create
3621       AND p_fund_rec.fund_id IS NOT NULL THEN
3622       IF ozf_utility_pvt.check_uniqueness(
3623             'ozf_funds_all_vl'
3624            ,'fund_id = ' || p_fund_rec.fund_id) =
3625             fnd_api.g_false THEN
3626          IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_error) THEN
3627             IF p_fund_rec.fund_type = 'QUOTA' THEN
3628                fnd_message.set_name('OZF', 'OZF_TP_DUPLICATE_ID');
3629              ELSE
3630                fnd_message.set_name('OZF', 'OZF_FUND_DUPLICATE_ID');
3631              END IF;
3632             fnd_msg_pub.add;
3633          END IF;
3634 
3635          x_return_status := fnd_api.g_ret_sts_error;
3636          RETURN;
3637       END IF;
3638    END IF;
3639 
3640    -- Check if fund_number is unique. Need to handle create and
3641    -- update differently.
3642    IF p_validation_mode = jtf_plsql_api.g_create THEN
3643       /*l_valid_flag :=
3644          ozf_utility_pvt.check_uniqueness(
3645             'ozf_funds_all_vl'
3646            ,'fund_number = ''' || p_fund_rec.fund_number || '''');*/
3647       OPEN c_prog_fund_number_create;
3648      FETCH c_prog_fund_number_create INTO l_valid_flag;
3649      CLOSE c_prog_fund_number_create;
3650    ELSE
3651      /* l_valid_flag :=
3652          ozf_utility_pvt.check_uniqueness(
3653             'ozf_funds_all_vl'
3654            ,'fund_number = ''' ||
3655             p_fund_rec.fund_number ||
3656             ''' AND fund_id <> ' ||
3657             p_fund_rec.fund_id);*/
3658      OPEN c_prog_fund_number_update;
3659      FETCH c_prog_fund_number_update INTO l_valid_flag;
3660      CLOSE c_prog_fund_number_update;
3661    END IF;
3662 
3663    IF l_valid_flag = 1 THEN
3664       IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_error) THEN
3665          IF p_fund_rec.fund_type = 'QUOTA' THEN
3666             fnd_message.set_name('OZF', 'OZF_TP_DUPLICATE_NUMBER');
3667           ELSE
3668             fnd_message.set_name('OZF', 'OZF_FUND_DUPLICATE_NUMBER');
3669           END IF;
3670          fnd_msg_pub.add;
3671       END IF;
3672 
3673       x_return_status := fnd_api.g_ret_sts_error;
3674       RETURN;
3675    END IF;
3676    -- Check if fund_name is unique if it is accrual fund/offer name . Need to handle create and
3677    -- update differently.
3678    -- Commented for Bug Fix #3498826
3679   /*
3680    IF p_fund_rec.fund_type = 'FULLY_ACCRUED' THEN
3681    IF p_validation_mode = jtf_plsql_api.g_create THEN
3682       l_valid_flag :=
3683          ozf_utility_pvt.check_uniqueness(
3684             'ozf_funds_all_vl'
3685            ,'short_name = ''' || p_fund_rec.short_name || '''');
3686    ELSE
3687       l_valid_flag :=
3688          ozf_utility_pvt.check_uniqueness(
3689             'ozf_funds_all_vl'
3690            ,'short_name = ''' ||
3691             p_fund_rec.short_name ||
3692             ''' AND fund_id <> ' ||
3693             p_fund_rec.fund_id);
3694    END IF;
3695 
3696    IF l_valid_flag = fnd_api.g_false THEN
3697       IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_error) THEN
3698          IF p_fund_rec.fund_type = 'QUOTA' THEN
3699             fnd_message.set_name('OZF', 'OZF_TP_DUPLICATE_NAME');
3700           ELSE
3701             fnd_message.set_name('OZF', 'OZF_FUND_DUPLICATE_NAME');
3702           END IF;
3703          fnd_msg_pub.add;
3704       END IF;
3705 
3706       x_return_status := fnd_api.g_ret_sts_error;
3707       RETURN;
3708    END IF;
3709    END IF;*/
3710 
3711 END check_fund_uk_items;
3712 
3713 ---------------------------------------------------------------------
3714 -- PROCEDURE
3715 --    Check_Fund_Fk_Items
3716 --
3717 -- HISTORY
3718 --    20/09/2000  Mumu Pande  Create.
3719 --   09/20/2000  Mumu Pande for user status
3720 --    01/20/2001  Mumu PAnde for category validations
3721 ---------------------------------------------------------------------
3722 PROCEDURE check_fund_fk_items(
3723    p_fund_rec        IN       fund_rec_type
3724   ,x_return_status   OUT NOCOPY      VARCHAR2)
3725 IS
3726 BEGIN
3727    x_return_status := fnd_api.g_ret_sts_success;
3728 
3729    ----------------------- user_status_id ------------------------
3730    IF p_fund_rec.user_status_id <> fnd_api.g_miss_num THEN
3731       IF ozf_utility_pvt.check_fk_exists(
3732             'ams_user_statuses_vl'
3733            ,'user_status_id'
3734            ,p_fund_rec.user_status_id) =
3735             fnd_api.g_false THEN
3736          IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_error) THEN
3737             fnd_message.set_name('OZF', 'OZF_FUND_BAD_USER_STATUS_ID');
3738             fnd_msg_pub.add;
3739          END IF;
3740 
3741          x_return_status := fnd_api.g_ret_sts_error;
3742          RETURN;
3743       END IF;
3744    END IF;
3745 
3746    -- added on 01/20/2001  MPANDE
3747    ----------------------- category_id ------------------------
3748   -- mkothari - Bug 4701105 - start ----
3749   IF p_fund_rec.fund_type <> 'QUOTA' THEN
3750    IF p_fund_rec.category_id <> fnd_api.g_miss_num THEN
3751       IF ozf_utility_pvt.check_fk_exists(
3752             'ams_categories_vl'
3753            ,'category_id'
3754            ,p_fund_rec.category_id) =
3755             fnd_api.g_false THEN
3756          IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_error) THEN
3757             fnd_message.set_name('OZF', 'OZF_FUND_BAD_CAT_ID');
3758             fnd_msg_pub.add;
3759          END IF;
3760 
3761          x_return_status := fnd_api.g_ret_sts_error;
3762          RETURN;
3763       END IF;
3764    END IF;
3765   END IF;
3766   -- mkothari - Bug 4701105 - end ----
3767 -- check other fk items
3768 
3769 END check_fund_fk_items;
3770 
3771 
3772 
3773 ---------------------------------------------------------------------
3774 -- PROCEDURE
3775 --    Check_Fund_Lookup_Items
3776 --
3777 -- HISTORY
3778 --    02/02/2000  Shitij Vatsa  Create.
3779 ---------------------------------------------------------------------
3780 PROCEDURE check_fund_lookup_items(
3781    p_fund_rec        IN       fund_rec_type
3782   ,x_return_status   OUT NOCOPY      VARCHAR2)
3783 IS
3784 BEGIN
3785    x_return_status := fnd_api.g_ret_sts_success;
3786 
3787    ----------------------- fund_type ------------------------
3788    IF p_fund_rec.fund_type <> fnd_api.g_miss_char THEN
3789       IF ozf_utility_pvt.check_lookup_exists(
3790             p_lookup_table_name => 'OZF_LOOKUPS'
3791            ,p_lookup_type => 'OZF_FUND_TYPE'
3792            ,p_lookup_code => p_fund_rec.fund_type) =
3793             fnd_api.g_false THEN
3794          IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_error) THEN
3795              IF p_fund_rec.fund_type = 'QUOTA' THEN
3796                fnd_message.set_name('OZF', 'OZF_TP_BAD_QUOTA_TYPE');
3797              ELSE
3798                fnd_message.set_name('OZF', 'OZF_FUND_BAD_FUND_TYPE');
3799              END IF;
3800             fnd_msg_pub.add;
3801          END IF;
3802 
3803          x_return_status := fnd_api.g_ret_sts_error;
3804          RETURN;
3805       END IF;
3806    END IF;
3807 
3808 
3809    ----------------------- status_code ------------------------
3810    IF p_fund_rec.status_code <> fnd_api.g_miss_char THEN
3811       IF ozf_utility_pvt.check_lookup_exists(
3812             p_lookup_table_name => 'OZF_LOOKUPS'
3813            ,p_lookup_type => 'OZF_FUND_STATUS'
3814            ,p_lookup_code => p_fund_rec.status_code) =
3815             fnd_api.g_false THEN
3816          IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_error) THEN
3817              IF p_fund_rec.fund_type = 'QUOTA' THEN
3818                fnd_message.set_name('OZF', 'OZF_TP_BAD_STATUS_CODE');
3819              ELSE
3820                fnd_message.set_name('OZF', 'OZF_FUND_BAD_STATUS_CODE');
3821              END IF;
3822             fnd_msg_pub.add;
3823          END IF;
3824 
3825          x_return_status := fnd_api.g_ret_sts_error;
3826          RETURN;
3827       END IF;
3828    END IF;
3829 -- check other lookup codes
3830 
3831 END check_fund_lookup_items;
3832 
3833 
3834 
3835 ---------------------------------------------------------------------
3836 -- PROCEDURE
3837 --    Check_Fund_Flag_Items
3838 --
3839 -- HISTORY
3840 --    02/02/2000  Shitij Vatsa  Create.
3841 ---------------------------------------------------------------------
3842 PROCEDURE check_fund_flag_items(
3843    p_fund_rec        IN       fund_rec_type
3844   ,x_return_status   OUT NOCOPY      VARCHAR2)
3845 IS
3846 BEGIN
3847    x_return_status := fnd_api.g_ret_sts_success;
3848 
3849    ----------------------- liability_flag ------------------------
3850    IF     p_fund_rec.liability_flag <> fnd_api.g_miss_char
3851       AND p_fund_rec.liability_flag IS NOT NULL THEN
3852       IF ozf_utility_pvt.is_y_or_n(p_fund_rec.liability_flag) = fnd_api.g_false THEN
3853          IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_error) THEN
3854             fnd_message.set_name('OZF', 'OZF_FUND_BAD_LIABILITY_FLAG');
3855             fnd_msg_pub.add;
3856          END IF;
3857 
3858          x_return_status := fnd_api.g_ret_sts_error;
3859          RETURN;
3860       END IF;
3861    END IF;
3862 
3863    ----------------------- budget_flag ------------------------
3864    IF     p_fund_rec.budget_flag <> fnd_api.g_miss_char
3865       AND p_fund_rec.budget_flag IS NOT NULL THEN
3866       IF ozf_utility_pvt.is_y_or_n(p_fund_rec.budget_flag) = fnd_api.g_false THEN
3867          IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_error) THEN
3868              IF p_fund_rec.fund_type = 'QUOTA' THEN
3869                fnd_message.set_name('OZF', 'OZF_TP_BAD_QUOTA_FLAG');
3870              ELSE
3871                fnd_message.set_name('OZF', 'OZF_FUND_BAD_BUDGET_FLAG');
3872              END IF;
3873             fnd_msg_pub.add;
3874          END IF;
3875 
3876          x_return_status := fnd_api.g_ret_sts_error;
3877          RETURN;
3878       END IF;
3879    END IF;
3880 
3881    ----------------------- earned_flag ------------------------
3882    IF     p_fund_rec.earned_flag <> fnd_api.g_miss_char
3883       AND p_fund_rec.earned_flag IS NOT NULL THEN
3884       IF ozf_utility_pvt.is_y_or_n(p_fund_rec.earned_flag) = fnd_api.g_false THEN
3885          IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_error) THEN
3886             fnd_message.set_name('OZF', 'OZF_FUND_BAD_EARNED_FLAG');
3887             fnd_msg_pub.add;
3888          END IF;
3889 
3890          x_return_status := fnd_api.g_ret_sts_error;
3891          RETURN;
3892       END IF;
3893    END IF;
3894 -- check other flags
3895 
3896 END check_fund_flag_items;
3897 
3898 ---------------------------------------------------------------------
3899 -- PROCEDURE
3900 --    Check_Fund_Items
3901 --
3902 -- HISTORY
3903 --    02/02/2000  Shitij Vatsa  Create.
3904 --	29/DEC/2011 Added parameter p_mode default NULL Bug 13529250
3905 ---------------------------------------------------------------------
3906 PROCEDURE check_fund_items(
3907    p_validation_mode   IN       VARCHAR2 := jtf_plsql_api.g_create
3908   ,x_return_status     OUT NOCOPY      VARCHAR2
3909   ,p_fund_rec          IN       fund_rec_type
3910   ,p_mode		IN	VARCHAR2 DEFAULT NULL)
3911 IS
3912 BEGIN
3913    ----dbms_output.put_line('Calling Req_Items');
3914 
3915    check_fund_req_items(p_fund_rec => p_fund_rec, x_return_status => x_return_status, p_mode => p_mode);
3916 
3917    IF x_return_status <> fnd_api.g_ret_sts_success THEN
3918       RETURN;
3919    END IF;
3920 
3921    ----dbms_output.put_line('Calling Uk_Items');
3922    check_fund_uk_items(
3923       p_fund_rec => p_fund_rec
3924      ,p_validation_mode => p_validation_mode
3925      ,x_return_status => x_return_status);
3926 
3927    IF x_return_status <> fnd_api.g_ret_sts_success THEN
3928       RETURN;
3929    END IF;
3930 
3931    ----dbms_output.put_line('Calling Fk_Items');
3932    check_fund_fk_items(p_fund_rec => p_fund_rec, x_return_status => x_return_status);
3933 
3934    IF x_return_status <> fnd_api.g_ret_sts_success THEN
3935       RETURN;
3936    END IF;
3937 
3938    ----dbms_output.put_line('Calling Lookup_Items');
3939 
3940    check_fund_lookup_items(p_fund_rec => p_fund_rec, x_return_status => x_return_status);
3941 
3942    IF x_return_status <> fnd_api.g_ret_sts_success THEN
3943       RETURN;
3944    END IF;
3945 
3946    ----dbms_output.put_line('Calling Flag_Items');
3947    check_fund_flag_items(p_fund_rec => p_fund_rec, x_return_status => x_return_status);
3948 
3949    IF x_return_status <> fnd_api.g_ret_sts_success THEN
3950       RETURN;
3951    END IF;
3952 END check_fund_items;
3953 
3954 
3955 
3956 ---------------------------------------------------------------------
3957 -- PROCEDURE
3958 --    Check_Fund_Record
3959 --
3960 -- HISTORY
3961 --    02/02/2000  Shitij Vatsa  Create.
3962 --    06/14/2000  Mumu Pande  Added validation and chaged some of the earlier validations
3963 --   01/20/2001  Mumu Pande  Rempved all fund inter entity validation to procedure check_fund_inter_entity
3964 --   01/20/2001  Mumu Pande  Added  all calls for fund accrual  validation
3965 --    11/05/2003 yzhao: fix bug 3238497 - allow fully accrual budget to go below 0
3966 ---------------------------------------------------------------------
3967 PROCEDURE check_fund_record(
3968    p_fund_rec        IN       fund_rec_type
3969   ,p_complete_rec    IN       fund_rec_type
3970   ,p_mode            IN       VARCHAR2
3971   ,x_return_status   OUT NOCOPY      VARCHAR2)
3972 IS
3973    l_fund_id            NUMBER;
3974    l_start_date         DATE;
3975    l_end_date           DATE;
3976 
3977    -- Check old fund status
3978    CURSOR c_old_status(
3979       cv_fund_id   IN   NUMBER)
3980    IS
3981       SELECT   status_code, original_budget
3982       FROM     ozf_funds_all_b
3983       WHERE  fund_id = cv_fund_id;
3984 
3985    CURSOR c_offer_org(p_list_header_id IN NUMBER)
3986    IS
3987       SELECT org_id
3988       FROM  ozf_offers
3989       WHERE qp_list_header_id = p_list_header_id;
3990 
3991    l_fund_old_status    VARCHAR2(30);
3992    l_fund_old_amount    NUMBER;
3993    l_return_status      VARCHAR2(1);
3994    l_resource_id        NUMBER;
3995    l_offer_org          NUMBER := NULL;
3996    l_offer_ledger       NUMBER;
3997    l_offer_ledgerName   VARCHAR2(50);
3998 
3999 BEGIN
4000    x_return_status := fnd_api.g_ret_sts_success;
4001    -- Check all modes validations
4002 
4003    -- Ensure that start date is greater than the end date --
4004    l_start_date := p_complete_rec.start_date_active;
4005    l_end_date := p_complete_rec.end_date_active;
4006    IF p_complete_rec.status_code = 'DRAFT' THEN
4007     IF p_fund_rec.fund_type = 'FULLY_ACCRUED' THEN
4008        -- yzhao 07/15/2002 fix bug 2457199 UNABLE TO CREATE FULLY ACCRUED BUDGET DUE TO START DATE PROB
4009        --   start date passed in is midnight of the selected day. So trunc sysdate to get midnight time
4010        IF NVL(l_start_date, sysdate) < trunc(sysdate) THEN
4011          IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_error) THEN
4012             fnd_message.set_name('OZF', 'OZF_FUND_STARTDATE_MISMATCH');
4013             fnd_msg_pub.add;
4014          END IF;
4015 
4016          x_return_status := fnd_api.g_ret_sts_error;
4017        END IF;
4018     END IF ;
4019    END IF;
4020 
4021    /* yzhao: 01/14/2003 fix BUG 2750445 - UNABLE TO CLOSE BUDGET, BUDGET 'END DATE' CANNOT BE BEFORE TODAY'S DATE
4022    IF p_fund_rec.end_date_active <> FND_API.g_miss_date
4023       AND l_end_date IS NOT NULL OR p_complete_rec.status_code = 'DRAFT'
4024       AND p_fund_rec.status_code = FND_API.g_miss_char THEN
4025     */
4026    IF p_complete_rec.status_code NOT IN ('CLOSED','CANCELLED','ARCHIVED') AND
4027       l_end_date IS NOT NULL THEN
4028        -- validate only if status changes or date changes
4029        OPEN c_old_status(p_fund_rec.fund_id);
4030        FETCH c_old_status INTO l_fund_old_status,l_fund_old_amount;
4031        CLOSE c_old_status;
4032        IF ((p_fund_rec.status_code <> FND_API.G_MISS_CHAR AND
4033             p_fund_rec.status_code <> l_fund_old_status) OR
4034            p_fund_rec.end_date_active <> FND_API.g_miss_date) THEN
4035    /* yzhao: 01/14/2003 fix bug 2750445 ends */
4036 
4037             -- yzhao 09/03/2002 fix bug 2540628 TST 1158.7 FUNC MASTER : CANNOT END DATE A BUDGET ON CURRENT DATE
4038             --   end date passed in is midnight of the selected day. So trunc sysdate to get midnight time
4039             -- IF NVL(l_end_date,sysdate) < sysdate THEN
4040             /* kdass 28-Dec-2004 fix for 11.5.10 bug 4089720, when the fund is created from mass transfer,
4041                do not check for end date */
4042             --IF NVL(l_end_date,sysdate) < trunc(sysdate) THEN
4043             IF NVL(l_end_date,sysdate) < trunc(sysdate) AND p_fund_rec.prev_fund_id IS NULL THEN
4044               IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_error) THEN
4045                  IF p_fund_rec.fund_type = 'QUOTA' THEN
4046                    fnd_message.set_name('OZF', 'OZF_TP_ENDDATE_MISMATCH');
4047                  ELSE
4048                     fnd_message.set_name('OZF', 'OZF_FUND_ENDDATE_MISMATCH');
4049                  END IF;
4050                  fnd_msg_pub.add;
4051               END IF;
4052               x_return_status := fnd_api.g_ret_sts_error;
4053             END IF;
4054        END IF;
4055    END IF;
4056 
4057 /*   -- Budget Amount cannot be updated for an active budget. #3570045 -- reverted change.
4058    IF p_complete_rec.status_code = 'ACTIVE' THEN
4059         OPEN c_old_status(p_fund_rec.fund_id);
4060         FETCH c_old_status INTO l_fund_old_status, l_fund_old_amount;
4061         CLOSE c_old_status;
4062 
4063         IF l_fund_old_status = 'ACTIVE' AND p_complete_rec.original_budget <> l_fund_old_amount THEN
4064             fnd_message.set_name('OZF', 'OZF_ACTIVE_FUND_AMT');
4065             fnd_msg_pub.add;
4066             x_return_status := fnd_api.g_ret_sts_error;
4067         END IF;
4068    END IF;
4069 */
4070    --original amount should be within 15 digits
4071       IF p_complete_rec.original_budget > 999999999999999 THEN
4072          IF p_fund_rec.fund_type = 'QUOTA' THEN
4073              fnd_message.set_name('OZF', 'OZF_TP_MAX_AMT_EXCEEDED');
4074           ELSE
4075              fnd_message.set_name('OZF', 'OZF_FUND_MAX_AMT_EXCEEDED');
4076           END IF;
4077          fnd_msg_pub.add;
4078          x_return_status := fnd_api.g_ret_sts_error;
4079       END IF;
4080 
4081    IF l_start_date > l_end_date THEN
4082       IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_error) THEN
4083          fnd_message.set_name('OZF', 'OZF_FUND_DATE_MISMATCH');
4084          fnd_msg_pub.add;
4085       END IF;
4086 
4087       x_return_status := fnd_api.g_ret_sts_error;
4088    END IF;
4089 
4090    IF p_mode = jtf_plsql_api.g_update THEN
4091       IF     p_fund_rec.parent_fund_id <> fnd_api.g_miss_num
4092          AND p_fund_rec.parent_fund_id IS NOT NULL THEN
4093          IF p_complete_rec.fund_id = p_complete_rec.parent_fund_id THEN
4094             IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_error) THEN
4095                 IF p_fund_rec.fund_type = 'QUOTA' THEN
4096                   fnd_message.set_name('OZF', 'OZF_TP_WRONG_PARENT');
4097                 ELSE
4098                    fnd_message.set_name('OZF', 'OZF_FUND_WRONG_PARENT');
4099                 END IF;
4100                fnd_msg_pub.add;
4101                x_return_status := fnd_api.g_ret_sts_error;
4102             END IF;
4103          END IF;
4104       END IF;
4105    END IF;
4106 
4107    -- added by mpande
4108    -- holdback amt cannot be greater than total budget which is equal to
4109    -- (ORG_BUDG - Holdback_amt + Trasfered_in_amt - Transfered_out_amt)
4110    -- in a active fund where as in a draft fund holdback should be more than original budget
4111    IF p_complete_rec.status_code = 'ACTIVE' THEN
4112       -- 11/05/2003 yzhao: fix bug 3238497 - allow fully accrual budget to go below 0
4113       IF p_complete_rec.fund_type <> 'FULLY_ACCRUED' OR
4114          p_complete_rec.original_budget >= 0 OR
4115          NVL(p_complete_rec.holdback_amt, 0) <> 0 THEN
4116          IF p_complete_rec.holdback_amt >
4117             (  NVL(p_complete_rec.original_budget, 0) +
4118                NVL(p_complete_rec.transfered_in_amt, 0) -
4119                NVL(p_complete_rec.transfered_out_amt, 0)) THEN
4120             IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_error) THEN
4121                fnd_message.set_name('OZF', 'OZF_EXCESS_HOLDBACK_AMT');
4122                fnd_msg_pub.add;
4123             END IF;
4124             x_return_status := fnd_api.g_ret_sts_error;
4125          END IF;
4126       END IF;
4127 
4128         -- hold back amount should not be negative fix for bug#3352216
4129       IF p_complete_rec.holdback_amt < 0 THEN
4130          fnd_message.set_name('OZF', 'OZF_FUND_NO_HOLDBACK_BUDGET');
4131          fnd_msg_pub.add;
4132          x_return_status := fnd_api.g_ret_sts_error;
4133       END IF;
4134 
4135    ELSE
4136       IF p_complete_rec.holdback_amt > (NVL(p_complete_rec.original_budget, 0)) THEN
4137          IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_error) THEN
4138             fnd_message.set_name('OZF', 'OZF_EXCESS_HOLDBACK_AMT');
4139             fnd_msg_pub.add;
4140          END IF;
4141 
4142          x_return_status := fnd_api.g_ret_sts_error;
4143       --RAISE FND_API.g_exc_error;
4144       END IF;
4145 
4146        -- holdback amount should not be negative. Fix for bug#3352216
4147       IF p_complete_rec.holdback_amt < 0 THEN
4148          fnd_message.set_name('OZF', 'OZF_FUND_NO_HOLDBACK_BUDGET');
4149          fnd_msg_pub.add;
4150          x_return_status := fnd_api.g_ret_sts_error;
4151       END IF;
4152 
4153    END IF;
4154 
4155    -- For a accrual type fund whenever it becomes active the original budget should be 0
4156    --   01/20/2001  Mumu Pande  Added  all calls for fund accrual  validation
4157    -- 6/11/2002 mpande Check for Original Budget = 0 when the status is not ACTIVE
4158    IF p_complete_rec.fund_type = 'FULLY_ACCRUED' THEN
4159 
4160       /* yzhao: 02/04/2003 fix bug: can not close an accrual budget if it already accrued some fund
4161       IF NVL(p_complete_rec.original_budget, 0) <> 0 AND p_complete_rec.status_code IN ('DRAFT','CLOSED','CANCELLED','ARCHIVED')  THEN
4162        */
4163       IF NVL(p_complete_rec.original_budget, 0) <> 0 AND p_complete_rec.status_code = 'DRAFT'  THEN
4164          IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_error) THEN
4165             fnd_message.set_name('OZF', 'OZF_ACCRUAL_NO_ORG_BUDGET');
4166             fnd_msg_pub.add;
4167          END IF;
4168 
4169          x_return_status := fnd_api.g_ret_sts_error;
4170       END IF;
4171       /* 11.5.9
4172       IF p_complete_rec.accrual_basis IS NULL THEN
4173          IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_error) THEN
4174             fnd_message.set_name('OZF', 'OZF_ACCRUAL_NO_BASIS');
4175             fnd_msg_pub.add;
4176          END IF;
4177 
4178          x_return_status := fnd_api.g_ret_sts_error;
4179       END IF;*/
4180       /*
4181       IF p_complete_rec.accrual_operand IS NULL THEN
4182          IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_error) THEN
4183             fnd_message.set_name('OZF', 'OZF_ACCRUAL_NO_OPERAND');
4184             fnd_msg_pub.add;
4185          END IF;
4186 
4187          x_return_status := fnd_api.g_ret_sts_error;
4188       END IF;
4189       */
4190       /* -- we donot need to give the UOM
4191       IF p_complete_rec.accrual_uom IS NULL THEN
4192          IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_error) THEN
4193             fnd_message.set_name('OZF', 'OZF_ACCRUAL_NO_UOM');
4194             fnd_msg_pub.add;
4195          END IF;
4196 
4197          x_return_status := fnd_api.g_ret_sts_error;
4198       END IF;
4199       */
4200       /*
4201       -- sangara - R12 enhancement - not mandatory, as they are moved to Market Options cuecard
4202       IF p_complete_rec.accrual_phase IS NULL THEN
4203          IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_error) THEN
4204             fnd_message.set_name('OZF', 'OZF_ACCRUAL_NO_PHASE');
4205             fnd_msg_pub.add;
4206          END IF;
4207 
4208          x_return_status := fnd_api.g_ret_sts_error;
4209       END IF;
4210       */
4211       /*
4212       IF NVL(p_complete_rec.accrual_rate, 0) <= 0 THEN
4213          IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_error) THEN
4214             fnd_message.set_name('OZF', 'OZF_ACCRUAL_NO_RATE');
4215             fnd_msg_pub.add;
4216          END IF;
4217 
4218          x_return_status := fnd_api.g_ret_sts_error;
4219       END IF;
4220       -- default the quantity to 1
4221       /*
4222       IF NVL(p_complete_rec.accrual_quantity, 0) <= 0 THEN
4223          IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_error) THEN
4224             fnd_message.set_name('OZF', 'OZF_ACCRUAL_NO_QUANTITY');
4225             fnd_msg_pub.add;
4226          END IF;
4227 
4228          x_return_status := fnd_api.g_ret_sts_error;
4229       END IF;
4230 
4231       --- for a active accrual fund product eligibiilty should exist 01/20/2001 mpande
4232       -- not when a active fund is created automatically
4233       IF p_complete_rec.status_code = 'ACTIVE' AND
4234       p_mode <> jtf_plsql_api.g_create THEN
4235          Ozf_fundrules_pvt.check_product_elig_exists(
4236             p_complete_rec.fund_id
4237            ,l_return_status);
4238 
4239          IF l_return_status <> fnd_api.g_ret_sts_success THEN
4240             x_return_status := l_return_status;
4241          END IF;
4242       END IF; */
4243    END IF;
4244 
4245    -- Check for update validations
4246    IF p_mode = jtf_plsql_api.g_update THEN
4247       -- mpande added on Sep 11 for giving update access to owner and persons who have access with edit metric flag = 'Y'
4248       l_resource_id := ozf_utility_pvt.get_resource_id(p_user_id => fnd_global.user_id);
4249 
4250          IF G_DEBUG THEN
4251             ozf_utility_pvt.debug_message('resource'||ams_access_pvt.check_update_access(p_complete_rec.fund_id, 'FUND', l_resource_id, 'USER'));
4252          END IF;
4253 
4254       IF l_resource_id <> -1 THEN
4255          IF ams_access_pvt.check_update_access(
4256                p_complete_rec.fund_id
4257               ,'FUND'
4258               ,l_resource_id
4259               ,'USER') <>
4260                'F' THEN
4261             IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_error) THEN
4262                 IF p_fund_rec.fund_type = 'QUOTA' THEN
4263                   fnd_message.set_name('OZF', 'OZF_TP_ILLEGAL_OWNER');
4264                 ELSE
4265                    fnd_message.set_name('OZF', 'OZF_FUND_ILLEGAL_OWNER');
4266                 END IF;
4267                fnd_msg_pub.add;
4268             END IF;
4269 
4270             x_return_status := fnd_api.g_ret_sts_error;
4271          END IF;
4272       ELSIF l_resource_id = -1 THEN
4273          IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_error) THEN
4274             fnd_message.set_name('OZF', 'OZF_NO_RESOURCE_ID');
4275             fnd_msg_pub.add;
4276          END IF;
4277 
4278          x_return_status := fnd_api.g_ret_sts_error;
4279       END IF;
4280 
4281       --kdass 10-OCT-05 - R12 bug 4613689 validate accrual budget's ledger and offer's org
4282       IF p_fund_rec.fund_type = 'FULLY_ACCRUED' AND p_complete_rec.ledger_id IS NOT NULL THEN
4283          OPEN c_offer_org (p_complete_rec.plan_id);
4284          FETCH c_offer_org INTO l_offer_org;
4285          CLOSE c_offer_org;
4286 
4287          IF l_offer_org IS NOT NULL THEN
4288             -- Get offer's ledger
4289             MO_UTILS.Get_Ledger_Info (p_operating_unit =>  l_offer_org,
4290                                       p_ledger_id      =>  l_offer_ledger,
4291                                       p_ledger_name    =>  l_offer_ledgerName
4292                                      );
4293             IF p_complete_rec.ledger_id <> l_offer_ledger THEN
4294                IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_error) THEN
4295                   fnd_message.set_name('OZF', 'OZF_BUDGET_OFFR_LEDG_MISMATCH');
4296                   fnd_msg_pub.add;
4297                END IF;
4298                x_return_status := fnd_api.g_ret_sts_error;
4299             END IF;
4300          END IF;
4301       END IF;
4302 
4303    END IF;
4304 
4305 END check_fund_record;
4306 
4307 ---------------------------------------------------------------------
4308 -- PROCEDURE
4309 --    check_fund_inter_entity
4310 --
4311 -- HISTORY
4312 --    1/15/01  mpande  Created.
4313 ---------------------------------------------------------------------
4314 
4315 PROCEDURE check_fund_inter_entity(
4316    p_fund_rec          IN       fund_rec_type
4317   ,p_complete_rec      IN       fund_rec_type
4318   ,p_validation_mode   IN       VARCHAR2
4319   ,x_return_status     OUT NOCOPY      VARCHAR2)
4320 IS
4321    l_return_status    VARCHAR2(1);
4322 BEGIN
4323    x_return_status := fnd_api.g_ret_sts_success;
4324 
4325    ------------------- check calendar ----------------------
4326    IF    p_fund_rec.fund_calendar <> fnd_api.g_miss_char
4327       OR p_fund_rec.start_period_name <> fnd_api.g_miss_char
4328       OR p_fund_rec.end_period_name <> fnd_api.g_miss_char
4329       OR p_fund_rec.start_date_active <> fnd_api.g_miss_date
4330       OR p_fund_rec.end_date_active <> fnd_api.g_miss_date THEN
4331       Ozf_fundrules_pvt.check_fund_calendar(
4332          p_complete_rec.fund_calendar
4333         ,p_complete_rec.start_period_name
4334         ,p_complete_rec.end_period_name
4335         ,p_complete_rec.start_date_active
4336         ,p_complete_rec.end_date_active
4337         ,p_complete_rec.fund_type
4338         ,l_return_status);
4339 
4340       IF l_return_status <> fnd_api.g_ret_sts_success THEN
4341          x_return_status := l_return_status;
4342       END IF;
4343    END IF;
4344 
4345    ------------------- check dates ------------------------------
4346    IF    p_fund_rec.start_date_active <> fnd_api.g_miss_date
4347       OR p_fund_rec.end_date_active <> fnd_api.g_miss_date THEN
4348       Ozf_fundrules_pvt.check_fund_dates_vs_parent(
4349          p_complete_rec.parent_fund_id
4350         ,p_complete_rec.start_date_active
4351         ,p_complete_rec.end_date_active
4352         ,l_return_status);
4353 
4354       IF l_return_status <> fnd_api.g_ret_sts_success THEN
4355          x_return_status := l_return_status;
4356       END IF;
4357 
4358       IF p_validation_mode = jtf_plsql_api.g_update THEN
4359          Ozf_fundrules_pvt.check_fund_dates_vs_child(
4360             p_complete_rec.fund_id
4361            ,p_complete_rec.start_date_active
4362            ,p_complete_rec.end_date_active
4363            ,l_return_status);
4364 
4365          IF l_return_status <> fnd_api.g_ret_sts_success THEN
4366             x_return_status := l_return_status;
4367          END IF;
4368       END IF;
4369    END IF;
4370 
4371    ------------------- check budget amounts ------------------------------
4372   -- only in planning stage  --07/23/2001 mpande
4373    IF p_complete_rec.status_code NOT IN ('ACTIVE','ON_HOLD','CANCELLED','ARCHIVED','CLOSED') THEN
4374    IF    p_fund_rec.original_budget <> fnd_api.g_miss_num
4375       OR p_fund_rec.transfered_in_amt <> fnd_api.g_miss_num
4376       OR p_fund_rec.transfered_out_amt <> fnd_api.g_miss_num THEN
4377          -- updated 09/04/2001 mpande for Multi Currency Child
4378       Ozf_fundrules_pvt.check_fund_amount_vs_parent(
4379          p_complete_rec.parent_fund_id
4380         ,p_complete_rec.currency_code_tc
4381         ,p_complete_rec.original_budget
4382         ,l_return_status);
4383 
4384       IF l_return_status <> fnd_api.g_ret_sts_success THEN
4385          x_return_status := l_return_status;
4386       END IF;
4387 
4388       IF p_validation_mode = jtf_plsql_api.g_update  THEN
4389          -- updated 09/04/2001 mpande for Multi Currency Child
4390          Ozf_fundrules_pvt.check_fund_amount_vs_child(
4391             p_complete_rec.fund_id
4392            ,p_complete_rec.original_budget
4393            ,p_complete_rec.transfered_in_amt
4394            ,p_complete_rec.transfered_out_amt
4395            ,p_complete_rec.currency_code_tc
4396            ,l_return_status);
4397 
4398          IF l_return_status <> fnd_api.g_ret_sts_success THEN
4399             x_return_status := l_return_status;
4400          END IF;
4401       END IF;
4402    END IF;
4403    END IF;
4404 
4405    ------------------- check fund type ------------------------------
4406    IF    p_fund_rec.fund_type <> fnd_api.g_miss_char
4407       OR p_fund_rec.parent_fund_id <> fnd_api.g_miss_num THEN
4408       --- the chikd parent validation  is done always
4409       Ozf_fundrules_pvt.check_fund_type_vs_parent(
4410          p_complete_rec.parent_fund_id
4411         ,p_complete_rec.fund_type
4412         ,l_return_status);
4413 
4414       IF l_return_status <> fnd_api.g_ret_sts_success THEN
4415          x_return_status := l_return_status;
4416       END IF;
4417 
4418       -- check for change of fund type only when the status is going active
4419       -- cause in a draft mode the user can change the fund type
4420       IF     p_validation_mode = jtf_plsql_api.g_update
4421          AND p_complete_rec.status_code = 'ACTIVE' THEN
4422          Ozf_fundrules_pvt.check_fund_type_vs_child(
4423             p_complete_rec.fund_id
4424            ,p_complete_rec.fund_type
4425            ,l_return_status);
4426 
4427          IF l_return_status <> fnd_api.g_ret_sts_success THEN
4428             x_return_status := l_return_status;
4429          END IF;
4430       END IF;
4431    END IF;
4432 
4433    ------------------- check fund curr ------------------------------
4434    --09/04/2001 mpande commented
4435    /*
4436    IF    p_fund_rec.currency_code_tc <> fnd_api.g_miss_char
4437       OR p_fund_rec.parent_fund_id <> fnd_api.g_miss_num THEN
4438       --- the child parent validation  is done always
4439       Ozf_fundrules_pvt.check_fund_curr_vs_parent(
4440          p_complete_rec.parent_fund_id
4441         ,p_complete_rec.currency_code_tc
4442         ,l_return_status);
4443 
4444       IF l_return_status <> fnd_api.g_ret_sts_success THEN
4445          x_return_status := l_return_status;
4446       END IF;
4447 
4448       -- check for change of fund currency only when the status is going active
4449       -- cause in a draft mode the user can change the fund currency
4450       IF     p_validation_mode = jtf_plsql_api.g_update
4451          AND p_complete_rec.status_code = 'ACTIVE' THEN
4452          Ozf_fundrules_pvt.check_fund_curr_vs_child(
4453             p_complete_rec.fund_id
4454            ,p_complete_rec.currency_code_tc
4455            ,l_return_status);
4456 
4457          IF l_return_status <> fnd_api.g_ret_sts_success THEN
4458             x_return_status := l_return_status;
4459          END IF;
4460       END IF;
4461    END IF;
4462    */
4463 
4464    ------------------- check fund_status ------------------------------
4465    IF    p_fund_rec.status_code <> fnd_api.g_miss_char
4466       OR p_fund_rec.parent_fund_id <> fnd_api.g_miss_num THEN
4467       Ozf_fundrules_pvt.check_fund_status_vs_parent(
4468          p_complete_rec.parent_fund_id
4469         ,p_complete_rec.status_code
4470         ,l_return_status);
4471 
4472       IF l_return_status <> fnd_api.g_ret_sts_success THEN
4473          x_return_status := l_return_status;
4474       END IF;
4475    END IF;
4476 END check_fund_inter_entity;
4477 
4478 
4479 
4480 ---------------------------------------------------------------------
4481 -- PROCEDURE
4482 --    Init_Fund_Rec
4483 --
4484 -- HISTORY
4485 --    02/02/2000  Shitij Vatsa  Create.
4486 ---------------------------------------------------------------------
4487 PROCEDURE init_fund_rec(
4488    x_fund_rec   OUT NOCOPY   fund_rec_type)
4489 IS
4490 BEGIN
4491 
4492    RETURN;
4493 END init_fund_rec;
4494 
4495 
4496 
4497 ---------------------------------------------------------------------
4498 -- PROCEDURE
4499 --    Complete_Fund_Rec
4500 --
4501 -- HISTORY
4502 --    02/02/2000  Shitij Vatsa  Create.
4503 ---------------------------------------------------------------------
4504 PROCEDURE complete_fund_rec(
4505    p_fund_rec       IN       fund_rec_type
4506   ,x_complete_rec   OUT NOCOPY      fund_rec_type)
4507 IS
4508    CURSOR c_fund
4509    IS
4510       SELECT   *
4511       FROM     ozf_funds_all_vl
4512       WHERE  fund_id = p_fund_rec.fund_id;
4513 
4514    l_fund_rec    c_fund%ROWTYPE;
4515 BEGIN
4516    x_complete_rec := p_fund_rec;
4517    OPEN c_fund;
4518    FETCH c_fund INTO l_fund_rec;
4519 
4520    IF c_fund%NOTFOUND THEN
4521       CLOSE c_fund;
4522 
4523       IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_error) THEN
4524          fnd_message.set_name('OZF', 'OZF_API_RECORD_NOT_FOUND');
4525          fnd_msg_pub.add;
4526       END IF;
4527 
4528       RAISE fnd_api.g_exc_error;
4529    END IF;
4530 
4531    CLOSE c_fund;
4532 
4533    IF p_fund_rec.fund_number = fnd_api.g_miss_char THEN
4534       x_complete_rec.fund_number := NULL;
4535    END IF;
4536    IF p_fund_rec.fund_number IS NULL THEN
4537       x_complete_rec.fund_number := l_fund_rec.fund_number;
4538    END IF;
4539 
4540    IF p_fund_rec.parent_fund_id = fnd_api.g_miss_num THEN
4541       x_complete_rec.parent_fund_id := NULL;
4542    END IF;
4543    IF p_fund_rec.parent_fund_id IS NULL THEN
4544       x_complete_rec.parent_fund_id := l_fund_rec.parent_fund_id;
4545    END IF;
4546 
4547    IF p_fund_rec.category_id = fnd_api.g_miss_num THEN
4548       x_complete_rec.category_id := NULL;
4549    END IF;
4550    IF p_fund_rec.category_id IS NULL THEN
4551       x_complete_rec.category_id := l_fund_rec.category_id;
4552    END IF;
4553 
4554    IF p_fund_rec.fund_type = fnd_api.g_miss_char THEN
4555       x_complete_rec.fund_type := NULL;
4556    END IF;
4557    IF p_fund_rec.fund_type IS NULL THEN
4558       x_complete_rec.fund_type := l_fund_rec.fund_type;
4559    END IF;
4560 
4561    IF p_fund_rec.fund_usage = fnd_api.g_miss_char THEN
4562       x_complete_rec.fund_usage := NULL;
4563    END IF;
4564    IF p_fund_rec.fund_usage IS NULL THEN
4565       x_complete_rec.fund_usage := l_fund_rec.fund_usage;
4566    END IF;
4567 
4568    IF p_fund_rec.status_code = fnd_api.g_miss_char THEN
4569       x_complete_rec.status_code := NULL;
4570    END IF;
4571    IF p_fund_rec.status_code IS NULL THEN
4572       x_complete_rec.status_code := l_fund_rec.status_code;
4573    END IF;
4574 
4575    IF p_fund_rec.user_status_id = fnd_api.g_miss_num THEN
4576       x_complete_rec.user_status_id := NULL;
4577    END IF;
4578    IF p_fund_rec.user_status_id IS NULL THEN
4579       x_complete_rec.user_status_id := l_fund_rec.user_status_id;
4580    END IF;
4581 
4582    IF p_fund_rec.status_date = fnd_api.g_miss_date THEN
4583       x_complete_rec.status_date := NULL;
4584    END IF;
4585    IF p_fund_rec.status_date IS NULL THEN
4586       x_complete_rec.status_date := l_fund_rec.status_date;
4587    END IF;
4588 
4589    IF p_fund_rec.accrued_liable_account = fnd_api.g_miss_num THEN
4590       x_complete_rec.accrued_liable_account := NULL;
4591    END IF;
4592    IF p_fund_rec.accrued_liable_account IS NULL THEN
4593       x_complete_rec.accrued_liable_account := l_fund_rec.accrued_liable_account;
4594    END IF;
4595 
4596    IF p_fund_rec.ded_adjustment_account = fnd_api.g_miss_num THEN
4597       x_complete_rec.ded_adjustment_account := NULL;
4598    END IF;
4599    IF p_fund_rec.ded_adjustment_account IS NULL THEN
4600       x_complete_rec.ded_adjustment_account := l_fund_rec.ded_adjustment_account;
4601    END IF;
4602 
4603    IF p_fund_rec.liability_flag = fnd_api.g_miss_char THEN
4604       x_complete_rec.liability_flag := NULL;
4605    END IF;
4606    IF p_fund_rec.liability_flag IS NULL THEN
4607       x_complete_rec.liability_flag := l_fund_rec.liability_flag;
4608    END IF;
4609 
4610    IF p_fund_rec.set_of_books_id = fnd_api.g_miss_num THEN
4611       x_complete_rec.set_of_books_id := NULL;
4612    END IF;
4613    IF p_fund_rec.set_of_books_id IS NULL THEN
4614       x_complete_rec.set_of_books_id := l_fund_rec.set_of_books_id;
4615    END IF;
4616 
4617    IF p_fund_rec.start_period_id = fnd_api.g_miss_num THEN
4618       x_complete_rec.start_period_id := NULL;
4619    END IF;
4620    IF p_fund_rec.start_period_id IS NULL THEN
4621       x_complete_rec.start_period_id := l_fund_rec.start_period_id;
4622    END IF;
4623 
4624    IF p_fund_rec.end_period_id = fnd_api.g_miss_num THEN
4625       x_complete_rec.end_period_id := NULL;
4626    END IF;
4627    IF p_fund_rec.end_period_id IS NULL THEN
4628       x_complete_rec.end_period_id := l_fund_rec.end_period_id;
4629    END IF;
4630 
4631    IF p_fund_rec.start_date_active = fnd_api.g_miss_date THEN
4632       x_complete_rec.start_date_active := NULL;
4633    END IF;
4634    IF p_fund_rec.start_date_active IS NULL THEN
4635       x_complete_rec.start_date_active := l_fund_rec.start_date_active;
4636    END IF;
4637 
4638    IF p_fund_rec.end_date_active = fnd_api.g_miss_date THEN
4639       x_complete_rec.end_date_active := NULL;
4640    END IF;
4641    IF p_fund_rec.end_date_active IS NULL THEN
4642       x_complete_rec.end_date_active := l_fund_rec.end_date_active;
4643    END IF;
4644 
4645    IF p_fund_rec.budget_amount_tc = fnd_api.g_miss_num THEN
4646       x_complete_rec.budget_amount_tc := NULL;
4647    END IF;
4648    IF p_fund_rec.budget_amount_tc IS NULL THEN
4649       x_complete_rec.budget_amount_tc := l_fund_rec.budget_amount_tc;
4650    END IF;
4651 
4652    IF p_fund_rec.budget_amount_fc = fnd_api.g_miss_num THEN
4653       x_complete_rec.budget_amount_fc := NULL;
4654    END IF;
4655    IF p_fund_rec.budget_amount_fc IS NULL THEN
4656       x_complete_rec.budget_amount_fc := l_fund_rec.budget_amount_fc;
4657    END IF;
4658 
4659    IF p_fund_rec.available_amount = fnd_api.g_miss_num THEN
4660       x_complete_rec.available_amount := NULL;
4661    END IF;
4662    IF p_fund_rec.available_amount IS NULL THEN
4663       x_complete_rec.available_amount := l_fund_rec.available_amount;
4664    END IF;
4665 
4666    IF p_fund_rec.distributed_amount = fnd_api.g_miss_num THEN
4667       x_complete_rec.distributed_amount := NULL;
4668    END IF;
4669    IF p_fund_rec.distributed_amount IS NULL THEN
4670       x_complete_rec.distributed_amount := l_fund_rec.distributed_amount;
4671    END IF;
4672 
4673    IF p_fund_rec.currency_code_tc = fnd_api.g_miss_char THEN
4674       x_complete_rec.currency_code_tc := NULL;
4675    END IF;
4676    IF p_fund_rec.currency_code_tc IS NULL THEN
4677       x_complete_rec.currency_code_tc := l_fund_rec.currency_code_tc;
4678    END IF;
4679 
4680    IF p_fund_rec.currency_code_fc = fnd_api.g_miss_char THEN
4681       x_complete_rec.currency_code_fc := NULL;
4682    END IF;
4683    IF p_fund_rec.currency_code_fc IS NULL THEN
4684       x_complete_rec.currency_code_fc := l_fund_rec.currency_code_fc;
4685    END IF;
4686 
4687    IF p_fund_rec.exchange_rate_type = fnd_api.g_miss_char THEN
4688       x_complete_rec.exchange_rate_type := NULL;
4689    END IF;
4690    IF p_fund_rec.exchange_rate_type IS NULL THEN
4691       x_complete_rec.exchange_rate_type := l_fund_rec.exchange_rate_type;
4692    END IF;
4693 
4694    IF p_fund_rec.exchange_rate_date = fnd_api.g_miss_date THEN
4695       x_complete_rec.exchange_rate_date := NULL;
4696    END IF;
4697    IF p_fund_rec.exchange_rate_date IS NULL THEN
4698       x_complete_rec.exchange_rate_date := l_fund_rec.exchange_rate_date;
4699    END IF;
4700 
4701    IF p_fund_rec.exchange_rate = fnd_api.g_miss_num THEN
4702       x_complete_rec.exchange_rate := NULL;
4703    END IF;
4704    IF p_fund_rec.exchange_rate IS NULL THEN
4705       x_complete_rec.exchange_rate := l_fund_rec.exchange_rate;
4706    END IF;
4707 
4708    IF p_fund_rec.department_id = fnd_api.g_miss_num THEN
4709       x_complete_rec.department_id := NULL;
4710    END IF;
4711    IF p_fund_rec.department_id IS NULL THEN
4712       x_complete_rec.department_id := l_fund_rec.department_id;
4713    END IF;
4714 
4715    IF p_fund_rec.costcentre_id = fnd_api.g_miss_num THEN
4716       x_complete_rec.costcentre_id := NULL;
4717    END IF;
4718    IF p_fund_rec.costcentre_id IS NULL THEN
4719       x_complete_rec.costcentre_id := l_fund_rec.costcentre_id;
4720    END IF;
4721 
4722    IF p_fund_rec.owner = fnd_api.g_miss_num THEN
4723       x_complete_rec.owner := NULL;
4724    END IF;
4725    IF p_fund_rec.owner IS NULL THEN
4726       x_complete_rec.owner := l_fund_rec.owner;
4727    END IF;
4728 
4729    IF p_fund_rec.accrual_method = fnd_api.g_miss_char THEN
4730       x_complete_rec.accrual_method := NULL;
4731    END IF;
4732    IF p_fund_rec.accrual_method IS NULL THEN
4733       x_complete_rec.accrual_method := l_fund_rec.accrual_method;
4734    END IF;
4735 
4736    IF p_fund_rec.accrual_operand = fnd_api.g_miss_char THEN
4737       x_complete_rec.accrual_operand := NULL;
4738    END IF;
4739    IF p_fund_rec.accrual_operand IS NULL THEN
4740       x_complete_rec.accrual_operand := l_fund_rec.accrual_operand;
4741    END IF;
4742 
4743    IF p_fund_rec.accrual_rate = fnd_api.g_miss_num THEN
4744       x_complete_rec.accrual_rate := NULL;
4745    END IF;
4746    IF p_fund_rec.accrual_rate IS NULL THEN
4747       x_complete_rec.accrual_rate := l_fund_rec.accrual_rate;
4748    END IF;
4749 
4750    IF p_fund_rec.accrual_basis = fnd_api.g_miss_char THEN
4751       x_complete_rec.accrual_basis := NULL;
4752    END IF;
4753    IF p_fund_rec.accrual_basis IS NULL THEN
4754       x_complete_rec.accrual_basis := l_fund_rec.accrual_basis;
4755    END IF;
4756 
4757    IF p_fund_rec.hierarchy = fnd_api.g_miss_char THEN
4758       x_complete_rec.hierarchy := NULL;
4759    END IF;
4760    IF p_fund_rec.hierarchy IS NULL THEN
4761       x_complete_rec.hierarchy := l_fund_rec.hierarchy;
4762    END IF;
4763 
4764    IF p_fund_rec.hierarchy_level = fnd_api.g_miss_char THEN
4765       x_complete_rec.hierarchy_level := NULL;
4766    END IF;
4767    IF p_fund_rec.hierarchy_level IS NULL THEN
4768       x_complete_rec.hierarchy_level := l_fund_rec.hierarchy_level;
4769    END IF;
4770 
4771    IF p_fund_rec.hierarchy_id = fnd_api.g_miss_num THEN
4772       x_complete_rec.hierarchy_id := NULL;
4773    END IF;
4774    IF p_fund_rec.hierarchy_id IS NULL THEN
4775       x_complete_rec.hierarchy_id := l_fund_rec.hierarchy_id;
4776    END IF;
4777 
4778    IF p_fund_rec.parent_node_id = fnd_api.g_miss_num THEN
4779       x_complete_rec.parent_node_id := NULL;
4780    END IF;
4781    IF p_fund_rec.parent_node_id IS NULL THEN
4782       x_complete_rec.parent_node_id := l_fund_rec.parent_node_id;
4783    END IF;
4784 
4785    IF p_fund_rec.node_id = fnd_api.g_miss_num THEN
4786       x_complete_rec.node_id := NULL;
4787    END IF;
4788    IF p_fund_rec.node_id IS NULL THEN
4789       x_complete_rec.node_id := l_fund_rec.node_id;
4790    END IF;
4791 
4792    IF p_fund_rec.budget_flag = fnd_api.g_miss_char THEN
4793       x_complete_rec.budget_flag := NULL;
4794    END IF;
4795    IF p_fund_rec.budget_flag IS NULL THEN
4796       x_complete_rec.budget_flag := l_fund_rec.budget_flag;
4797    END IF;
4798 
4799    IF p_fund_rec.earned_flag = fnd_api.g_miss_char THEN
4800       x_complete_rec.earned_flag := NULL;
4801    END IF;
4802    IF p_fund_rec.earned_flag IS NULL THEN
4803       x_complete_rec.earned_flag := l_fund_rec.earned_flag;
4804    END IF;
4805 
4806    IF p_fund_rec.apply_accrual_on = fnd_api.g_miss_char THEN
4807       x_complete_rec.apply_accrual_on := NULL;
4808    END IF;
4809    IF p_fund_rec.apply_accrual_on IS NULL THEN
4810       x_complete_rec.apply_accrual_on := l_fund_rec.apply_accrual_on;
4811    END IF;
4812 
4813    IF p_fund_rec.accrual_phase = fnd_api.g_miss_char THEN
4814       x_complete_rec.accrual_phase := NULL;
4815    END IF;
4816    IF p_fund_rec.accrual_phase IS NULL THEN
4817       x_complete_rec.accrual_phase := l_fund_rec.accrual_phase;
4818    END IF;
4819 
4820    IF p_fund_rec.accrual_cap = fnd_api.g_miss_num THEN
4821       x_complete_rec.accrual_cap := NULL;
4822    END IF;
4823    IF p_fund_rec.accrual_cap IS NULL THEN
4824       x_complete_rec.accrual_cap := l_fund_rec.accrual_cap;
4825    END IF;
4826 
4827    IF p_fund_rec.accrual_uom = fnd_api.g_miss_char THEN
4828       x_complete_rec.accrual_uom := NULL;
4829    END IF;
4830    IF p_fund_rec.accrual_uom IS NULL THEN
4831       x_complete_rec.accrual_uom := l_fund_rec.accrual_uom;
4832    END IF;
4833 
4834 
4835    IF p_fund_rec.recal_committed = fnd_api.g_miss_num THEN
4836       x_complete_rec.recal_committed := NULL;
4837    END IF;
4838    IF p_fund_rec.recal_committed IS NULL THEN
4839       x_complete_rec.recal_committed := l_fund_rec.recal_committed;
4840    END IF;
4841 
4842 
4843    IF p_fund_rec.attribute_category = fnd_api.g_miss_char THEN
4844       x_complete_rec.attribute_category := NULL;
4845    END IF;
4846    IF p_fund_rec.attribute_category IS NULL THEN
4847       x_complete_rec.attribute_category := l_fund_rec.attribute_category;
4848    END IF;
4849 
4850    IF p_fund_rec.attribute1 = fnd_api.g_miss_char THEN
4851       x_complete_rec.attribute1 := NULL;
4852    END IF;
4853    IF p_fund_rec.attribute1 IS NULL THEN
4854       x_complete_rec.attribute1 := l_fund_rec.attribute1;
4855    END IF;
4856 
4857    IF p_fund_rec.attribute2 = fnd_api.g_miss_char THEN
4858       x_complete_rec.attribute2 := NULL;
4859    END IF;
4860    IF p_fund_rec.attribute2 IS NULL THEN
4861       x_complete_rec.attribute2 := l_fund_rec.attribute2;
4862    END IF;
4863 
4864    IF p_fund_rec.attribute3 = fnd_api.g_miss_char THEN
4865       x_complete_rec.attribute3 := NULL;
4866    END IF;
4867    IF p_fund_rec.attribute3 IS NULL THEN
4868       x_complete_rec.attribute3 := l_fund_rec.attribute3;
4869    END IF;
4870 
4871    IF p_fund_rec.attribute4 = fnd_api.g_miss_char THEN
4872       x_complete_rec.attribute4 := NULL;
4873    END IF;
4874    IF p_fund_rec.attribute4 IS NULL THEN
4875       x_complete_rec.attribute4 := l_fund_rec.attribute4;
4876    END IF;
4877 
4878    IF p_fund_rec.attribute5 = fnd_api.g_miss_char THEN
4879       x_complete_rec.attribute5 := NULL;
4880    END IF;
4881    IF p_fund_rec.attribute5 IS NULL THEN
4882       x_complete_rec.attribute5 := l_fund_rec.attribute5;
4883    END IF;
4884 
4885    IF p_fund_rec.attribute6 = fnd_api.g_miss_char THEN
4886       x_complete_rec.attribute6 := NULL;
4887    END IF;
4888    IF p_fund_rec.attribute6 IS NULL THEN
4889       x_complete_rec.attribute6 := l_fund_rec.attribute6;
4890    END IF;
4891 
4892    IF p_fund_rec.attribute7 = fnd_api.g_miss_char THEN
4893       x_complete_rec.attribute7 := NULL;
4894    END IF;
4895    IF p_fund_rec.attribute7 IS NULL THEN
4896       x_complete_rec.attribute7 := l_fund_rec.attribute7;
4897    END IF;
4898 
4899    IF p_fund_rec.attribute8 = fnd_api.g_miss_char THEN
4900       x_complete_rec.attribute8 := NULL;
4901    END IF;
4902    IF p_fund_rec.attribute8 IS NULL THEN
4903       x_complete_rec.attribute8 := l_fund_rec.attribute8;
4904    END IF;
4905 
4906    IF p_fund_rec.attribute9 = fnd_api.g_miss_char THEN
4907       x_complete_rec.attribute9 := NULL;
4908    END IF;
4909    IF p_fund_rec.attribute9 IS NULL THEN
4910       x_complete_rec.attribute9 := l_fund_rec.attribute9;
4911    END IF;
4912 
4913    IF p_fund_rec.attribute10 = fnd_api.g_miss_char THEN
4914       x_complete_rec.attribute10 := NULL;
4915    END IF;
4916    IF p_fund_rec.attribute10 IS NULL THEN
4917       x_complete_rec.attribute10 := l_fund_rec.attribute10;
4918    END IF;
4919 
4920    IF p_fund_rec.attribute11 = fnd_api.g_miss_char THEN
4921       x_complete_rec.attribute11 := NULL;
4922    END IF;
4923    IF p_fund_rec.attribute11 IS NULL THEN
4924       x_complete_rec.attribute11 := l_fund_rec.attribute11;
4925    END IF;
4926 
4927    IF p_fund_rec.attribute12 = fnd_api.g_miss_char THEN
4928       x_complete_rec.attribute12 := NULL;
4929    END IF;
4930    IF p_fund_rec.attribute12 IS NULL THEN
4931       x_complete_rec.attribute12 := l_fund_rec.attribute12;
4932    END IF;
4933 
4934    IF p_fund_rec.attribute13 = fnd_api.g_miss_char THEN
4935       x_complete_rec.attribute13 := NULL;
4936    END IF;
4937    IF p_fund_rec.attribute13 IS NULL THEN
4938       x_complete_rec.attribute13 := l_fund_rec.attribute13;
4939    END IF;
4940 
4941    IF p_fund_rec.attribute14 = fnd_api.g_miss_char THEN
4942       x_complete_rec.attribute14 := NULL;
4943    END IF;
4944    IF p_fund_rec.attribute14 IS NULL THEN
4945       x_complete_rec.attribute14 := l_fund_rec.attribute14;
4946    END IF;
4947 
4948    IF p_fund_rec.attribute15 = fnd_api.g_miss_char THEN
4949       x_complete_rec.attribute15 := NULL;
4950    END IF;
4951    IF p_fund_rec.attribute15 IS NULL THEN
4952       x_complete_rec.attribute15 := l_fund_rec.attribute15;
4953    END IF;
4954 
4955    IF p_fund_rec.original_budget = fnd_api.g_miss_num THEN
4956       x_complete_rec.original_budget := NULL;
4957    END IF;
4958    IF p_fund_rec.original_budget IS NULL THEN
4959       x_complete_rec.original_budget := l_fund_rec.original_budget;
4960    END IF;
4961 
4962    IF p_fund_rec.transfered_in_amt = fnd_api.g_miss_num THEN
4963       x_complete_rec.transfered_in_amt := NULL;
4964    END IF;
4965    IF p_fund_rec.transfered_in_amt IS NULL THEN
4966       x_complete_rec.transfered_in_amt := l_fund_rec.transfered_in_amt;
4967    END IF;
4968 
4969    IF p_fund_rec.transfered_out_amt = fnd_api.g_miss_num THEN
4970       x_complete_rec.transfered_out_amt := NULL;
4971    END IF;
4972    IF p_fund_rec.transfered_out_amt IS NULL THEN
4973       x_complete_rec.transfered_out_amt := l_fund_rec.transfered_out_amt;
4974    END IF;
4975 
4976    IF p_fund_rec.holdback_amt = fnd_api.g_miss_num THEN
4977       x_complete_rec.holdback_amt := NULL;
4978    END IF;
4979    IF p_fund_rec.holdback_amt IS NULL THEN
4980       x_complete_rec.holdback_amt := l_fund_rec.holdback_amt;
4981    END IF;
4982 
4983    IF p_fund_rec.planned_amt = fnd_api.g_miss_num THEN
4984       x_complete_rec.planned_amt := NULL;
4985    END IF;
4986    IF p_fund_rec.planned_amt IS NULL THEN
4987       x_complete_rec.planned_amt := l_fund_rec.planned_amt;
4988    END IF;
4989 
4990    IF p_fund_rec.committed_amt = fnd_api.g_miss_num THEN
4991       x_complete_rec.committed_amt := NULL;
4992    END IF;
4993    IF p_fund_rec.committed_amt IS NULL THEN
4994       x_complete_rec.committed_amt := l_fund_rec.committed_amt;
4995    END IF;
4996 
4997    -- yzhao: 11.5.10
4998    IF p_fund_rec.utilized_amt = fnd_api.g_miss_num THEN
4999       x_complete_rec.utilized_amt := NULL;
5000    END IF;
5001    IF p_fund_rec.utilized_amt IS NULL THEN
5002       x_complete_rec.utilized_amt := l_fund_rec.utilized_amt;
5003    END IF;
5004 
5005    IF p_fund_rec.earned_amt = fnd_api.g_miss_num THEN
5006       x_complete_rec.earned_amt := NULL;
5007    END IF;
5008    IF p_fund_rec.earned_amt IS NULL THEN
5009       x_complete_rec.earned_amt := l_fund_rec.earned_amt;
5010    END IF;
5011 
5012    IF p_fund_rec.paid_amt = fnd_api.g_miss_num THEN
5013       x_complete_rec.paid_amt := NULL;
5014    END IF;
5015    IF p_fund_rec.paid_amt IS NULL THEN
5016       x_complete_rec.paid_amt := l_fund_rec.paid_amt;
5017    END IF;
5018 
5019    IF p_fund_rec.plan_type = fnd_api.g_miss_char THEN
5020       x_complete_rec.plan_type := NULL;
5021    END IF;
5022    IF p_fund_rec.plan_type IS NULL THEN
5023       x_complete_rec.plan_type := l_fund_rec.plan_type;
5024    END IF;
5025 
5026    IF p_fund_rec.plan_id = fnd_api.g_miss_num THEN
5027       x_complete_rec.plan_id := NULL;
5028    END IF;
5029    IF p_fund_rec.plan_id IS NULL THEN
5030       x_complete_rec.plan_id := l_fund_rec.plan_id;
5031    END IF;
5032 
5033    IF p_fund_rec.liable_accnt_segments = fnd_api.g_miss_char THEN
5034       x_complete_rec.liable_accnt_segments := NULL;
5035    END IF;
5036    IF p_fund_rec.liable_accnt_segments IS NULL THEN
5037       x_complete_rec.liable_accnt_segments := l_fund_rec.liable_accnt_segments;
5038    END IF;
5039 
5040    IF p_fund_rec.adjustment_accnt_segments = fnd_api.g_miss_char THEN
5041       x_complete_rec.adjustment_accnt_segments := NULL;
5042    END IF;
5043    IF p_fund_rec.adjustment_accnt_segments IS NULL THEN
5044       x_complete_rec.adjustment_accnt_segments := l_fund_rec.adjustment_accnt_segments;
5045    END IF;
5046 
5047    IF p_fund_rec.short_name = fnd_api.g_miss_char THEN
5048       x_complete_rec.short_name := NULL;
5049    END IF;
5050    IF p_fund_rec.short_name IS NULL THEN
5051       x_complete_rec.short_name := l_fund_rec.short_name;
5052    END IF;
5053 
5054    IF p_fund_rec.description = fnd_api.g_miss_char THEN
5055       x_complete_rec.description := NULL;
5056    END IF;
5057    IF p_fund_rec.description IS NULL THEN
5058       x_complete_rec.description := l_fund_rec.description;
5059    END IF;
5060    --08/28/2001 mpande bug#1950117
5061    /*
5062    IF p_fund_rec.language = fnd_api.g_miss_char THEN
5063       x_complete_rec.language := NULL;
5064    END IF;
5065    IF p_fund_rec.language IS NULL THEN
5066       x_complete_rec.language := l_fund_rec.language;
5067    END IF;
5068 
5069    IF p_fund_rec.source_lang = fnd_api.g_miss_char THEN
5070       x_complete_rec.source_lang := NULL;
5071    END IF;
5072    IF p_fund_rec.source_lang IS NULL THEN
5073       x_complete_rec.source_lang := l_fund_rec.source_lang;
5074    END IF;
5075    */
5076    IF p_fund_rec.fund_calendar = fnd_api.g_miss_char THEN
5077       x_complete_rec.fund_calendar := NULL;
5078    END IF;
5079    IF p_fund_rec.fund_calendar IS NULL THEN
5080       x_complete_rec.fund_calendar := l_fund_rec.fund_calendar;
5081    END IF;
5082 
5083    IF p_fund_rec.start_period_name = fnd_api.g_miss_char THEN
5084       x_complete_rec.start_period_name := NULL;
5085    END IF;
5086    IF p_fund_rec.start_period_name IS NULL THEN
5087       x_complete_rec.start_period_name := l_fund_rec.start_period_name;
5088    END IF;
5089 
5090    IF p_fund_rec.end_period_name = fnd_api.g_miss_char THEN
5091       x_complete_rec.end_period_name := NULL;
5092    END IF;
5093    IF p_fund_rec.end_period_name IS NULL THEN
5094       x_complete_rec.end_period_name := l_fund_rec.end_period_name;
5095    END IF;
5096 
5097    IF p_fund_rec.accrual_quantity = fnd_api.g_miss_num THEN
5098       x_complete_rec.accrual_quantity := NULL;
5099    END IF;
5100    IF p_fund_rec.accrual_quantity IS NULL THEN
5101       x_complete_rec.accrual_quantity := l_fund_rec.accrual_quantity;
5102    END IF;
5103 
5104    IF p_fund_rec.accrue_to_level_id = fnd_api.g_miss_num THEN
5105       x_complete_rec.accrue_to_level_id := NULL;
5106    END IF;
5107    IF p_fund_rec.accrue_to_level_id IS NULL THEN
5108       x_complete_rec.accrue_to_level_id := l_fund_rec.accrue_to_level_id;
5109    END IF;
5110 
5111    IF p_fund_rec.accrual_discount_level = fnd_api.g_miss_char THEN
5112       x_complete_rec.accrual_discount_level := NULL;
5113    END IF;
5114    IF p_fund_rec.accrual_discount_level IS NULL THEN
5115       x_complete_rec.accrual_discount_level := l_fund_rec.accrual_discount_level;
5116    END IF;
5117    IF p_fund_rec.custom_setup_id = fnd_api.g_miss_num THEN
5118       x_complete_rec.custom_setup_id := NULL;
5119    END IF;
5120    IF p_fund_rec.custom_setup_id IS NULL THEN
5121       x_complete_rec.custom_setup_id := l_fund_rec.custom_setup_id;
5122    END IF;
5123    IF p_fund_rec.threshold_id = fnd_api.g_miss_num THEN
5124       x_complete_rec.threshold_id := NULL;
5125    END IF;
5126    IF p_fund_rec.threshold_id IS NULL THEN
5127       x_complete_rec.threshold_id := l_fund_rec.threshold_id;
5128    END IF;
5129    IF p_fund_rec.business_unit_id = fnd_api.g_miss_num THEN
5130       x_complete_rec.business_unit_id := NULL;
5131    END IF;
5132    IF p_fund_rec.business_unit_id IS NULL THEN
5133       x_complete_rec.business_unit_id := l_fund_rec.business_unit_id;
5134    END IF;
5135    IF p_fund_rec.task_id = fnd_api.g_miss_num THEN
5136       x_complete_rec.task_id := NULL;
5137    END IF;
5138    IF p_fund_rec.task_id IS NULL THEN
5139       x_complete_rec.task_id := l_fund_rec.task_id;
5140    END IF;
5141    IF p_fund_rec.country_id = fnd_api.g_miss_num THEN
5142       x_complete_rec.country_id := NULL;
5143    END IF;
5144    IF p_fund_rec.country_id IS NULL THEN
5145       x_complete_rec.country_id := l_fund_rec.country_id;
5146    END IF;
5147  -- added by feliu 02/08/2002 for rollup amount columns
5148     IF p_fund_rec.rollup_original_budget = fnd_api.g_miss_num THEN
5149       x_complete_rec.rollup_original_budget := NULL;
5150    END IF;
5151     IF p_fund_rec.rollup_original_budget IS NULL THEN
5152       x_complete_rec.rollup_original_budget := l_fund_rec.rollup_original_budget;
5153    END IF;
5154    IF p_fund_rec.rollup_holdback_amt = fnd_api.g_miss_num THEN
5155       x_complete_rec.rollup_holdback_amt := NULL;
5156    END IF;
5157    IF p_fund_rec.rollup_holdback_amt IS NULL THEN
5158       x_complete_rec.rollup_holdback_amt := l_fund_rec.rollup_holdback_amt;
5159    END IF;
5160    IF p_fund_rec.rollup_transfered_in_amt = fnd_api.g_miss_num THEN
5161       x_complete_rec.rollup_transfered_in_amt := NULL;
5162    END IF;
5163    IF p_fund_rec.rollup_transfered_in_amt IS NULL THEN
5164       x_complete_rec.rollup_transfered_in_amt := l_fund_rec.rollup_transfered_in_amt;
5165    END IF;
5166    IF p_fund_rec.rollup_transfered_out_amt = fnd_api.g_miss_num THEN
5167       x_complete_rec.rollup_transfered_out_amt := NULL;
5168    END IF;
5169    IF p_fund_rec.rollup_transfered_out_amt IS NULL THEN
5170       x_complete_rec.rollup_transfered_out_amt := l_fund_rec.rollup_transfered_out_amt;
5171    END IF;
5172    IF p_fund_rec.rollup_planned_amt = fnd_api.g_miss_num THEN
5173       x_complete_rec.rollup_planned_amt := NULL;
5174    END IF;
5175    IF p_fund_rec.rollup_planned_amt IS NULL THEN
5176       x_complete_rec.rollup_planned_amt := l_fund_rec.rollup_planned_amt;
5177    END IF;
5178    IF p_fund_rec.rollup_committed_amt = fnd_api.g_miss_num THEN
5179       x_complete_rec.rollup_committed_amt := NULL;
5180    END IF;
5181    IF p_fund_rec.rollup_committed_amt IS NULL THEN
5182       x_complete_rec.rollup_committed_amt := l_fund_rec.rollup_committed_amt;
5183    END IF;
5184    -- yzhao: 11.5.10
5185    IF p_fund_rec.rollup_utilized_amt = fnd_api.g_miss_num THEN
5186       x_complete_rec.rollup_utilized_amt := NULL;
5187    END IF;
5188    IF p_fund_rec.rollup_utilized_amt IS NULL THEN
5189       x_complete_rec.rollup_utilized_amt := l_fund_rec.rollup_utilized_amt;
5190    END IF;
5191    IF p_fund_rec.rollup_earned_amt = fnd_api.g_miss_num THEN
5192       x_complete_rec.rollup_earned_amt := NULL;
5193    END IF;
5194    IF p_fund_rec.rollup_earned_amt IS NULL THEN
5195       x_complete_rec.rollup_earned_amt := l_fund_rec.rollup_earned_amt;
5196    END IF;
5197    IF p_fund_rec.rollup_paid_amt = fnd_api.g_miss_num THEN
5198       x_complete_rec.rollup_paid_amt := NULL;
5199    END IF;
5200    IF p_fund_rec.rollup_paid_amt IS NULL THEN
5201       x_complete_rec.rollup_paid_amt := l_fund_rec.rollup_paid_amt;
5202    END IF;
5203    IF p_fund_rec.rollup_recal_committed  = fnd_api.g_miss_num THEN
5204       x_complete_rec.rollup_recal_committed  := NULL;
5205    END IF;
5206    IF p_fund_rec.rollup_recal_committed  IS NULL THEN
5207       x_complete_rec.rollup_recal_committed  := l_fund_rec.rollup_recal_committed ;
5208    END IF;
5209     IF p_fund_rec.retroactive_flag  = fnd_api.g_miss_char THEN
5210        x_complete_rec.retroactive_flag  := NULL;
5211     END IF;
5212     IF p_fund_rec.retroactive_flag  IS NULL THEN
5213        x_complete_rec.retroactive_flag  := l_fund_rec.retroactive_flag ;
5214     END IF;
5215     IF p_fund_rec.qualifier_id  = fnd_api.g_miss_num THEN
5216        x_complete_rec.qualifier_id  := NULL;
5217     END IF;
5218     IF p_fund_rec.qualifier_id  IS NULL THEN
5219        x_complete_rec.qualifier_id  := l_fund_rec.qualifier_id;
5220     END IF;
5221 
5222     -- niprakas added
5223     IF p_fund_rec.prev_fund_id  = fnd_api.g_miss_num THEN
5224        x_complete_rec.prev_fund_id  := NULL;
5225     END IF;
5226     IF p_fund_rec.prev_fund_id IS NULL THEN
5227       x_complete_rec.prev_fund_id := l_fund_rec.prev_fund_id;
5228     END IF;
5229 
5230     -- niprakas added
5231 
5232     IF p_fund_rec.transfered_flag  = fnd_api.g_miss_char THEN
5233        x_complete_rec.transfered_flag  := NULL;
5234     END IF;
5235     IF p_fund_rec.transfered_flag IS NULL THEN
5236       x_complete_rec.transfered_flag := l_fund_rec.transfered_flag;
5237     END IF;
5238 
5239      -- niprakas added
5240     IF p_fund_rec.utilized_amt  = fnd_api.g_miss_num THEN
5241        x_complete_rec.utilized_amt  := NULL;
5242     END IF;
5243     IF p_fund_rec.utilized_amt = fnd_api.g_miss_num THEN
5244       x_complete_rec.utilized_amt := l_fund_rec.utilized_amt;
5245     END IF;
5246 
5247     -- niprakas added
5248     IF p_fund_rec.rollup_utilized_amt  = fnd_api.g_miss_num THEN
5249        x_complete_rec.rollup_utilized_amt  := NULL;
5250     END IF;
5251     IF p_fund_rec.rollup_utilized_amt = fnd_api.g_miss_num THEN
5252       x_complete_rec.rollup_utilized_amt := l_fund_rec.rollup_utilized_amt;
5253     END IF;
5254 
5255         --kdass added
5256     IF p_fund_rec.product_spread_time_id  = fnd_api.g_miss_num THEN
5257        x_complete_rec.product_spread_time_id  := NULL;
5258     END IF;
5259     IF p_fund_rec.product_spread_time_id IS NULL THEN
5260       x_complete_rec.product_spread_time_id := l_fund_rec.product_spread_time_id;
5261     END IF;
5262 
5263     --kdass - R12 MOAC changes
5264     IF p_fund_rec.org_id  = fnd_api.g_miss_num THEN
5265        x_complete_rec.org_id  := NULL;
5266     END IF;
5267     IF p_fund_rec.org_id IS NULL THEN
5268       x_complete_rec.org_id := l_fund_rec.org_id;
5269     END IF;
5270 
5271     IF p_fund_rec.ledger_id  = fnd_api.g_miss_num THEN
5272        x_complete_rec.ledger_id  := NULL;
5273     END IF;
5274     IF p_fund_rec.ledger_id IS NULL THEN
5275       x_complete_rec.ledger_id := l_fund_rec.ledger_id;
5276     END IF;
5277 
5278 END complete_fund_rec;
5279 
5280 
5281 -- ADDED FOR R2 Requirements to get default GL info--- by mpande //6th JULY-2000
5282 ---------------------------------------------------------------------
5283 -- PROCEDURE
5284 --    GET_DEFAULT_GL_INFO
5285 --
5286 -- PURPOSE : A fund should always have a category . When creating a category the user can
5287 --           give the GL info 1) ACCRUED_LIABILITY_ACCOUNT 2) DED_ADJUSTMENT_ACCOUNT
5288 --          When the user is creating a fund the funds API should pickup
5289 --         the default GL INFO from the associated category of the fund if the user has not passed anything.
5290 --        This API gets the defauls GL INFO.
5291 -- PARAMETERS
5292 --  p_category_id    IN  NUMBER,
5293 --   p_accrued_liability_account  IN OUT  NUMBER -- if null will deafult it otherwise will return whatever was passed
5294 --   p_ded_adjustment_account     IN OUT  NUMBER,-- if null will deafult it otherwise will return whatever was passed
5295 --   x_return_status              OUT VARCHAR2
5296 --  Created  by mpande 07/07/2000
5297 ---------------------------------------------------------------------
5298 PROCEDURE complete_default_gl_info(
5299    p_category_id                 IN       NUMBER
5300   ,p_accrued_liability_account   IN OUT NOCOPY   NUMBER
5301   ,p_ded_adjustment_account      IN OUT NOCOPY   NUMBER
5302   ,x_return_status               OUT NOCOPY      VARCHAR2)
5303 IS
5304    CURSOR c_gl_info(
5305       p_cat_id   IN   NUMBER)
5306    IS
5307       SELECT   accrued_liability_account
5308               ,ded_adjustment_account
5309       FROM     ams_categories_vl
5310       WHERE  category_id = p_cat_id;
5311 
5312    l_accrued_liability_account    NUMBER;
5313    l_ded_adjustment_account       NUMBER;
5314 BEGIN
5315    x_return_status := fnd_api.g_ret_sts_success;
5316    OPEN c_gl_info(p_category_id);
5317    FETCH c_gl_info INTO l_accrued_liability_account, l_ded_adjustment_account;
5318    CLOSE c_gl_info;
5319 
5320    --- if p_categroy_id is null then return null----
5321    IF p_category_id IS NULL THEN
5322       x_return_status := fnd_api.g_ret_sts_success;
5323    ELSIF p_category_id IS NOT NULL THEN
5324       IF p_accrued_liability_account IS NULL THEN   --if present keep the value else default it
5325          p_accrued_liability_account := l_accrued_liability_account;
5326       END IF;
5327 
5328       IF p_ded_adjustment_account IS NULL THEN   --if present keep the value else default it
5329          p_ded_adjustment_account := l_ded_adjustment_account;
5330       END IF;
5331    END IF;
5332 EXCEPTION
5333    WHEN OTHERS THEN
5334       x_return_status := fnd_api.g_ret_sts_unexp_error;
5335 END complete_default_gl_info;
5336 
5337 
5338 -- 14-May-2001 feliu  added for copy function.
5339 ---------------------------------------------------------------------
5340 -- PROCEDURE
5341 --    copy_fund
5342 --
5343 -- PURPOSE : -- Copy is broken into 4 sections:
5344 --    - copy all required fields of the object
5345 --    - copy all fields passed in thru the UI, but
5346 --      use the value of the base object if the field
5347 --      isn't passed through the UI
5348 --    - copy all fields passed in thru the UI, but
5349 --      leave the field as null if it isn't passed in
5350 --    - copy all attributes passed in from the UI
5351 -- PARAMETERS
5352 --   p_source_object_id: Original object id,
5353 --   p_attributes_table: AMS_CpyUtility_PVT.copy_attributes_table_type,
5354 --   p_copy_columns_table: AMS_CpyUtility_PVT.copy_columns_table_type,
5355 --   x_new_object_id: New object Id.
5356 --   x_custom_setup_id: custom_setup_id.
5357 ---------------------------------------------------------------------
5358 PROCEDURE copy_fund (
5359    p_api_version        IN NUMBER,
5360    p_init_msg_list      IN VARCHAR2 := FND_API.G_FALSE,
5361    p_commit             IN VARCHAR2 := FND_API.G_FALSE,
5362    p_validation_level   IN NUMBER := FND_API.G_VALID_LEVEL_FULL,
5363    x_return_status      OUT NOCOPY VARCHAR2,
5364    x_msg_count          OUT NOCOPY NUMBER,
5365    x_msg_data           OUT NOCOPY VARCHAR2,
5366    p_source_object_id   IN NUMBER,
5367    p_attributes_table   IN AMS_CpyUtility_PVT.copy_attributes_table_type,
5368    p_copy_columns_table IN AMS_CpyUtility_PVT.copy_columns_table_type,
5369    x_new_object_id      OUT NOCOPY NUMBER,
5370    x_custom_setup_id    OUT NOCOPY NUMBER
5371 )
5372 IS
5373    L_API_NAME           CONSTANT VARCHAR2(30) := 'copy_fund';
5374    L_API_VERSION_NUMBER CONSTANT NUMBER := 1.0;
5375    L_OBJECT_TYPE_FUND        CONSTANT VARCHAR2(30) := 'FUND';
5376    L_FUND_STATUS_TYPE        CONSTANT VARCHAR2(30) := 'OZF_FUND_STATUS';
5377    L_DEFAULT_STATUS           CONSTANT VARCHAR2(30) := 'DRAFT';
5378    l_return_status            VARCHAR2(1);
5379 
5380    l_new_fund_id    NUMBER;
5381    l_fund_rec       fund_rec_type;
5382 
5383    -- for non-standard out params in copy_act_access
5384    l_errnum          NUMBER;
5385    l_errcode         VARCHAR2(30);
5386    l_errmsg          VARCHAR2(4000);
5387 
5388    CURSOR c_fund (p_fund_id IN NUMBER) IS
5389       SELECT *
5390       FROM   ozf_funds_all_vl
5391       WHERE  fund_id = p_fund_id
5392       ;
5393    CURSOR c_user_status_id (p_status_type IN VARCHAR2, p_status_code IN VARCHAR2) IS
5394       SELECT user_status_id
5395       FROM   ams_user_statuses_b
5396       WHERE  system_status_type = p_status_type
5397       AND    system_status_code = p_status_code
5398       AND    default_flag = 'Y'
5399       AND    enabled_flag = 'Y'
5400    ;
5401    l_reference_rec      c_fund%ROWTYPE;
5402    l_new_fund_rec      c_fund%ROWTYPE;
5403    l_offer_custsetup  NUMBER;
5404    l_plan_id          NUMBER;
5405    l_attr_table      AMS_CpyUtility_PVT.copy_attributes_table_type;
5406    l_copy_columns_table  AMS_CpyUtility_PVT.copy_columns_table_type;
5407 
5408    -- julou: get custom_setup_id for FAB offer. bug fix for copy offer enhancement
5409    CURSOR c_custom_setup_id(p_obj_id NUMBER) IS
5410    SELECT custom_setup_id
5411    FROM   ozf_offers
5412    WHERE  qp_list_header_id = p_obj_id;
5413    -- julou: end
5414 
5415 BEGIN
5416    -- Standard Start of API savepoint
5417    SAVEPOINT copy_fund;
5418 
5419    -- Standard call to check for call compatibility.
5420    IF NOT FND_API.Compatible_API_Call ( l_api_version_number,
5421                                         p_api_version,
5422                                         l_api_name,
5423                                         G_PKG_NAME)
5424    THEN
5425        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5426    END IF;
5427 
5428    -- Initialize message list if p_init_msg_list is set to TRUE.
5429    IF FND_API.to_Boolean( p_init_msg_list )THEN
5430       FND_MSG_PUB.initialize;
5431    END IF;
5432 
5433    IF G_DEBUG THEN
5434       OZF_UTILITY_PVT.debug_message('Private API: ' || l_api_name || ' start');
5435    END IF;
5436 
5437    -- Initialize API return status to SUCCESS
5438    x_return_status := FND_API.G_RET_STS_SUCCESS;
5439 
5440    --
5441    -- Start of API body.
5442    --
5443    -- Initialize the new fund record
5444    -- use ams_cpyutility_pvt.get_column_value to fetch a value
5445    -- to replace the reference column value with a new value
5446    -- passed in from the UI through p_copy_columns_table.
5447    OPEN c_fund (p_source_object_id);
5448    FETCH c_fund INTO l_reference_rec;
5449    CLOSE c_fund;
5450 
5451    -- copy all required fields
5452    l_fund_rec.fund_type := l_reference_rec.fund_type;
5453    l_fund_rec.fund_number := null;
5454    l_fund_rec.status_code := L_DEFAULT_STATUS;
5455    l_fund_rec.category_id := l_reference_rec.category_id;
5456    l_fund_rec.currency_code_tc := l_reference_rec.currency_code_tc;
5457 
5458    -- 08/13/2004  kdass when the budget has a parent budget, then the original budget amount is 0, so copy budget gives error.
5459    -- l_fund_rec.original_budget := l_reference_rec.original_budget;
5460    l_fund_rec.original_budget :=   NVL(l_reference_rec.original_budget, 0)
5461                                  + NVL(l_reference_rec.transfered_in_amt, 0)
5462                                  - NVL(l_reference_rec.transfered_out_amt, 0);
5463 
5464    l_fund_rec.custom_setup_id := l_reference_rec.custom_setup_id;
5465    l_fund_rec.accrual_rate := l_reference_rec.accrual_rate;
5466    l_fund_rec.accrual_basis := l_reference_rec.accrual_basis;
5467    l_fund_rec.country_id := l_reference_rec.country_id;
5468    l_fund_rec.holdback_amt := l_reference_rec.holdback_amt;
5469 
5470    -- kdass R12 Bug 4621165 - copy org_id and ledger_id to the new budget
5471    l_fund_rec.org_id := l_reference_rec.org_id;
5472    l_fund_rec.ledger_id := l_reference_rec.ledger_id;
5473 
5474    -- 10/22/2001 mpande added to copy all other accrual parameters and not copy org budget for fully accrued
5475    IF l_fund_rec.fund_type = 'FULLY_ACCRUED' THEN
5476       l_fund_rec.original_budget := 0;
5477       l_fund_rec.plan_type := 'OFFR';
5478    END IF;
5479 
5480    l_fund_rec.apply_accrual_on := l_reference_rec.apply_accrual_on;
5481    l_fund_rec.accrual_quantity := l_reference_rec.accrual_quantity;
5482    l_fund_rec.retroactive_flag := l_reference_rec.retroactive_flag;
5483    l_fund_rec.qualifier_id := l_reference_rec.qualifier_id;
5484    l_fund_rec.accrue_to_level_id := l_reference_rec.accrue_to_level_id;
5485    l_fund_rec.business_unit_id := l_reference_rec.business_unit_id;
5486    l_fund_rec.accrual_method := l_reference_rec.accrual_method;
5487    l_fund_rec.liability_flag := l_reference_rec.liability_flag;
5488    l_fund_rec.accrual_operand := l_reference_rec.accrual_operand;
5489    l_fund_rec.accrual_discount_level := l_reference_rec.accrual_discount_level;
5490    l_fund_rec.liability_flag := l_reference_rec.liability_flag;
5491    l_fund_rec.accrual_cap := l_reference_rec.accrual_cap;
5492    l_fund_rec.accrual_method := l_reference_rec.accrual_method;
5493 
5494    -- 02/05/2003 yzhao fix bug 2788123 MKTF1R9:1159.0204:FUNC:COPY BUDGET THROWING ERROR OZF_ACCRUAL_NO_PHASE
5495    l_fund_rec.accrual_phase := l_reference_rec.accrual_phase;
5496    l_fund_rec.accrual_uom := l_reference_rec.accrual_uom;
5497    -- 02/05/2003 yzhao fix bug 2788123 ends
5498 
5499    --asylvia fixed bug 5169099 - Activity copied to new budget.
5500    l_fund_rec.task_id := l_reference_rec.task_id;
5501    --asylvia start bug 5107243
5502    l_fund_rec.parent_fund_id := l_reference_rec.parent_fund_id ;
5503    l_fund_rec.accrued_liable_account := l_reference_rec.accrued_liable_account;
5504    l_fund_rec.ded_adjustment_account := l_reference_rec.ded_adjustment_account;
5505    l_fund_rec.description := l_reference_rec.description;
5506    l_fund_rec.threshold_id := l_reference_rec.threshold_id;
5507    --l_fund_rec.start_period_id:= l_reference_rec.start_period_id;
5508    --l_fund_rec.end_period_id:= l_reference_rec.end_period_id;
5509    --l_fund_rec.end_date_active := NVL (l_fund_rec.end_date_active, l_reference_rec.end_date_active);
5510    l_fund_rec.attribute_category :=  l_reference_rec.attribute_category;
5511    l_fund_rec.attribute1 := l_reference_rec.attribute1;
5512    l_fund_rec.attribute2 := l_reference_rec.attribute2;
5513    l_fund_rec.attribute3 := l_reference_rec.attribute3;
5514    l_fund_rec.attribute4 := l_reference_rec.attribute4;
5515    l_fund_rec.attribute5 := l_reference_rec.attribute5;
5516    l_fund_rec.attribute6 := l_reference_rec.attribute6;
5517    l_fund_rec.attribute7 := l_reference_rec.attribute7;
5518    l_fund_rec.attribute8 := l_reference_rec.attribute8;
5519    l_fund_rec.attribute9 := l_reference_rec.attribute9;
5520    l_fund_rec.attribute10 := l_reference_rec.attribute10;
5521    l_fund_rec.attribute11 := l_reference_rec.attribute11;
5522    l_fund_rec.attribute12 := l_reference_rec.attribute12;
5523    l_fund_rec.attribute13 := l_reference_rec.attribute13;
5524    l_fund_rec.attribute14 := l_reference_rec.attribute14;
5525    l_fund_rec.attribute15 := l_reference_rec.attribute15;
5526    --asylvia end bug 5107243
5527 
5528    OPEN c_user_status_id (L_FUND_STATUS_TYPE, l_fund_rec.status_code);
5529    FETCH c_user_status_id INTO l_fund_rec.user_status_id;
5530    CLOSE c_user_status_id;
5531    l_fund_rec.currency_code_tc := l_reference_rec.currency_code_tc;
5532 
5533    -- if field is not passed in from copy_columns_table
5534    -- copy from the base object
5535    AMS_CpyUtility_PVT.get_column_value ('ownerId', p_copy_columns_table, l_fund_rec.owner);
5536    l_fund_rec.owner := NVL (l_fund_rec.owner, l_reference_rec.owner);
5537 
5538    AMS_CpyUtility_PVT.get_column_value ('startDate', p_copy_columns_table, l_fund_rec.start_date_active);
5539    l_fund_rec.start_date_active := NVL (l_fund_rec.start_date_active, l_reference_rec.start_date_active);
5540 
5541    -- if field is not passed in from copy_columns_table
5542    -- don't copy
5543    AMS_CpyUtility_PVT.get_column_value ('newObjName', p_copy_columns_table, l_fund_rec.short_name);
5544 
5545    IF l_fund_rec.fund_type = 'FULLY_ACCRUED' THEN
5546         -- to fix bug 3240787
5547       IF l_fund_rec.parent_fund_id IS NULL  THEN
5548             l_fund_rec.fund_number :=
5549                ams_sourcecode_pvt.get_source_code(
5550                   p_category_id => l_fund_rec.category_id
5551                  ,p_arc_object_for => 'FUND');
5552       ELSE
5553          get_child_source_code(
5554             l_fund_rec.parent_fund_id
5555            ,l_fund_rec.fund_number
5556            ,x_return_status);
5557          IF x_return_status = fnd_api.g_ret_sts_error THEN
5558             RAISE fnd_api.g_exc_error;
5559          ELSIF x_return_status = fnd_api.g_ret_sts_unexp_error THEN
5560             RAISE fnd_api.g_exc_unexpected_error;
5561          END IF;
5562       END IF;
5563       -- to fix bug 3240787
5564 
5565       l_attr_table(1) := 'DETL';
5566       l_attr_table(2) := 'ELIG';
5567       l_copy_columns_table(1).column_name := 'offerCode';
5568       l_copy_columns_table(1).column_value := l_fund_rec.fund_number;
5569       l_copy_columns_table(2).column_name := 'startDateActive';
5570       l_copy_columns_table(2).column_value := l_fund_rec.start_date_active;
5571       l_copy_columns_table(3).column_name := 'endDateActive';
5572       l_copy_columns_table(3).column_value := '';
5573       l_copy_columns_table(4).column_name := 'ownerId';
5574       l_copy_columns_table(4).column_value := l_fund_rec.owner;
5575       l_copy_columns_table(5).column_name := 'description';
5576       l_copy_columns_table(5).column_value := '';
5577       l_copy_columns_table(6).column_name :='newObjName';
5578       l_copy_columns_table(6).column_value := l_fund_rec.short_name;
5579 
5580       OPEN  c_custom_setup_id(l_reference_rec.plan_id);
5581       FETCH c_custom_setup_id INTO l_offer_custsetup;
5582       CLOSE c_custom_setup_id;
5583 
5584 	--Fix for Bug 13360969
5585 	--Doing budget validation before calling copy offer detail to avoid savepoint error as earlier validation was done in Create_Fund
5586 	-- after copy offer detail.
5587 	--As in copy offer detail copy_discounts is called for pricing where unconditional commit is present causing savepoint never established error.
5588 	 ----------------------- validate -----------------------
5589       	IF G_DEBUG THEN
5590 	OZF_UTILITY_PVT.debug_message('Private API: ' || l_api_name || ' validate');
5591 	 END IF;
5592 	 validate_fund(
5593 	    p_api_version => l_api_version_number
5594 	    ,p_init_msg_list => p_init_msg_list
5595 	    ,p_validation_level => p_validation_level
5596 	    ,x_return_status => l_return_status
5597 	    ,x_msg_count => x_msg_count
5598 	    ,x_msg_data => x_msg_data
5599 	    ,p_fund_rec => l_fund_rec);
5600 
5601 
5602 	  IF l_return_status = fnd_api.g_ret_sts_error THEN
5603 	      RAISE fnd_api.g_exc_error;
5604 	  ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
5605 	      RAISE fnd_api.g_exc_unexpected_error;
5606 	   END IF;
5607 	------------------------------------------------------------
5608 	--end 13360969
5609 
5610       OZF_COPY_OFFER_PVT.copy_offer_detail(
5611                                     p_api_version=> 1.0,
5612                                     p_init_msg_list=> FND_API.G_FALSE,
5613                                     p_commit=> FND_API.G_FALSE,
5614                                     p_validation_level=> p_validation_level,
5615                                     x_return_status=> l_return_status,
5616                                     x_msg_count=> x_msg_count,
5617                                     x_msg_data=> x_msg_data,
5618                                     p_source_object_id => l_reference_rec.plan_id,
5619                                     p_attributes_table =>l_attr_table,
5620                                     p_copy_columns_table =>l_copy_columns_table,
5621                                     x_new_object_id =>l_plan_id,
5622                                     p_custom_setup_id =>l_offer_custsetup);
5623 
5624      l_fund_rec.plan_id := l_plan_id;
5625 
5626       IF l_return_status = fnd_api.g_ret_sts_error THEN
5627          RAISE fnd_api.g_exc_error;
5628       ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
5629          RAISE fnd_api.g_exc_unexpected_error;
5630       END IF;
5631 
5632    END IF;
5633 
5634    OZF_Funds_PVT.Create_Fund (
5635       p_api_version => 1.0,
5636       p_init_msg_list   => FND_API.G_FALSE,
5637       p_commit          => FND_API.G_FALSE,
5638       p_validation_level   => p_validation_level,
5639       x_return_status   => l_return_status,
5640       x_msg_count       => x_msg_count,
5641       x_msg_data        => x_msg_data,
5642       p_fund_rec    => l_fund_rec,
5643       x_fund_id        => l_new_fund_id
5644    );
5645 
5646    IF l_return_status = fnd_api.g_ret_sts_error THEN
5647       RAISE fnd_api.g_exc_error;
5648    ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
5649       RAISE fnd_api.g_exc_unexpected_error;
5650    END IF;
5651 
5652    -- copy market_segments
5653 
5654 
5655    IF AMS_CpyUtility_PVT.is_copy_attribute ('ELIG', p_attributes_table) = FND_API.G_TRUE THEN
5656 
5657       AMS_CopyElements_PVT.copy_act_market_segments (
5658          p_src_act_type   => L_OBJECT_TYPE_FUND,
5659          p_new_act_type   => L_OBJECT_TYPE_FUND,
5660          p_src_act_id     => p_source_object_id,
5661          p_new_act_id     => l_new_fund_id,
5662          p_errnum         => l_errnum,
5663          p_errcode        => l_errcode,
5664          p_errmsg         => l_errmsg
5665       );
5666       IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
5667           RAISE FND_API.G_EXC_ERROR;
5668       END IF;
5669    END IF;
5670 
5671    -- copy product
5672    IF AMS_CpyUtility_PVT.is_copy_attribute (AMS_CopyElements_PVT.G_ATTRIBUTE_PROD, p_attributes_table) = FND_API.G_TRUE THEN
5673       AMS_CopyElements_PVT.copy_act_prod(
5674          p_src_act_type   => L_OBJECT_TYPE_FUND,
5675          p_new_act_type   => L_OBJECT_TYPE_FUND,
5676          p_src_act_id     => p_source_object_id,
5677          p_new_act_id     => l_new_fund_id,
5678          p_errnum         => l_errnum,
5679          p_errcode        => l_errcode,
5680          p_errmsg         => l_errmsg
5681       );
5682    END IF;
5683 
5684    -- currently, only needed to fetch custom_setup_id
5685    -- but can be used to return other values later.
5686    OPEN c_fund (l_new_fund_id);
5687    FETCH c_fund INTO l_new_fund_rec;
5688    CLOSE c_fund;
5689 
5690    x_new_object_id := l_new_fund_id;
5691    x_custom_setup_id := l_new_fund_rec.custom_setup_id;
5692    --
5693    -- End of API body.
5694    --
5695 
5696    -- Standard check for p_commit
5697    IF FND_API.to_Boolean( p_commit ) THEN
5698       COMMIT WORK;
5699    END IF;
5700 
5701 
5702    -- Debug Message
5703    IF G_DEBUG THEN
5704       OZF_UTILITY_PVT.debug_message('Private API: ' || l_api_name || ' end');
5705    END IF;
5706 
5707    -- Standard call to get message count and if count is 1, get message info.
5708    FND_MSG_PUB.Count_And_Get (
5709       p_count          =>   x_msg_count,
5710       p_data           =>   x_msg_data
5711    );
5712 EXCEPTION
5713    WHEN FND_API.G_EXC_ERROR THEN
5714       ROLLBACK TO copy_fund;
5715       x_return_status := FND_API.G_RET_STS_ERROR;
5716       -- Standard call to get message count and if count=1, get the message
5717       FND_MSG_PUB.Count_And_Get (
5718              p_encoded => FND_API.G_FALSE,
5719              p_count   => x_msg_count,
5720              p_data    => x_msg_data
5721       );
5722    WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
5723       ROLLBACK TO copy_fund;
5724       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5725       -- Standard call to get message count and if count=1, get the message
5726       FND_MSG_PUB.Count_And_Get (
5727              p_encoded => FND_API.G_FALSE,
5728              p_count => x_msg_count,
5729              p_data  => x_msg_data
5730       );
5731    WHEN OTHERS THEN
5732       ROLLBACK TO copy_fund;
5733       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5734       IF FND_MSG_PUB.Check_Msg_Level ( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
5735          FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME,l_api_name);
5736       END IF;
5737       -- Standard call to get message count and if count=1, get the message
5738       FND_MSG_PUB.Count_And_Get (
5739              p_encoded => FND_API.G_FALSE,
5740              p_count => x_msg_count,
5741              p_data  => x_msg_data
5742       );
5743 END copy_fund;
5744 
5745 
5746 ---------------------------------------------------------------------
5747 -- PROCEDURE
5748 ---   update_rollup_amount
5749 --
5750 -- PURPOSE
5751 --    Update rollup columns. added by feliu
5752 --
5753 -- PARAMETERS
5754 --  p_fund_rec    fund record.
5755 ---------------------------------------------------------------------
5756 
5757 PROCEDURE  update_rollup_amount(
5758    p_api_version        IN       NUMBER
5759   ,p_init_msg_list      IN       VARCHAR2 := fnd_api.g_false
5760   ,p_commit             IN       VARCHAR2 := fnd_api.g_false
5761   ,p_validation_level   IN       NUMBER := fnd_api.g_valid_level_full
5762   ,x_return_status      OUT NOCOPY      VARCHAR2
5763   ,x_msg_count          OUT NOCOPY      NUMBER
5764   ,x_msg_data           OUT NOCOPY      VARCHAR2
5765   ,p_fund_rec           IN       fund_rec_type
5766 ) IS
5767  l_api_version    CONSTANT NUMBER  := 1.0;
5768  l_api_name       CONSTANT VARCHAR2(30)
5769             := 'update_rollup_amount';
5770  l_full_name      CONSTANT VARCHAR2(60)
5771             := g_pkg_name || '.' || l_api_name;
5772 
5773 --Get all of parent fund through bottom up tree walking.
5774  CURSOR c_parent
5775  IS
5776    SELECT fund_id
5777      ,object_version_number
5778      ,rollup_original_budget
5779      ,rollup_transfered_in_amt
5780      ,rollup_transfered_out_amt
5781      ,rollup_holdback_amt
5782      ,rollup_planned_amt
5783      ,rollup_committed_amt
5784      ,rollup_utilized_amt           -- yzhao: 11.5.10
5785      ,rollup_earned_amt
5786      ,rollup_paid_amt
5787      ,rollup_recal_committed
5788    FROM ozf_funds_all_b
5789    connect by prior  parent_fund_id =fund_id
5790    start with fund_id =  p_fund_rec.fund_id;
5791 
5792 BEGIN
5793 
5794    -- Standard call to check for call compatibility.
5795    IF NOT FND_API.Compatible_API_Call ( l_api_version,
5796                                         p_api_version,
5797                                         l_api_name,
5798                                         G_PKG_NAME)
5799    THEN
5800        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5801    END IF;
5802 
5803    -- Initialize message list if p_init_msg_list is set to TRUE.
5804    IF FND_API.to_Boolean( p_init_msg_list )THEN
5805       FND_MSG_PUB.initialize;
5806    END IF;
5807 
5808    IF G_DEBUG THEN
5809       OZF_UTILITY_PVT.debug_message('Private API: ' || l_api_name || ' start');
5810    END IF;
5811 
5812    -- Initialize API return status to SUCCESS
5813    x_return_status := FND_API.G_RET_STS_SUCCESS;
5814 
5815    FOR fund IN c_parent
5816    LOOP
5817       IF fund.fund_id <> p_fund_rec.fund_id THEN
5818 
5819          UPDATE ozf_funds_all_b
5820          SET object_version_number = fund.object_version_number + 1
5821             ,rollup_original_budget = NVL(fund.rollup_original_budget,0) + NVL(p_fund_rec.rollup_original_budget,0)
5822             ,rollup_transfered_in_amt = NVL(fund.rollup_transfered_in_amt,0) + NVL(p_fund_rec.rollup_transfered_in_amt,0)
5823             ,rollup_transfered_out_amt = NVL(fund.rollup_transfered_out_amt,0) + NVL(p_fund_rec.rollup_transfered_out_amt,0)
5824             ,rollup_holdback_amt = NVL(fund.rollup_holdback_amt,0) + NVL(p_fund_rec.rollup_holdback_amt,0)
5825             ,rollup_planned_amt = NVL(fund.rollup_planned_amt,0)+ NVL(p_fund_rec.rollup_planned_amt,0)
5826             ,rollup_committed_amt = NVL(fund.rollup_committed_amt,0) +  NVL(p_fund_rec.rollup_committed_amt,0)
5827             ,rollup_utilized_amt = NVL(fund.rollup_utilized_amt,0) + NVL(p_fund_rec.rollup_utilized_amt,0)   -- yzhao: 11.5.10
5828             ,rollup_earned_amt = NVL(fund.rollup_earned_amt,0) + NVL(p_fund_rec.rollup_earned_amt,0)
5829             ,rollup_paid_amt = NVL(fund.rollup_paid_amt,0) + NVL(p_fund_rec.rollup_paid_amt,0)
5830             ,rollup_recal_committed  = NVL(fund.rollup_recal_committed ,0)+ NVL(p_fund_rec.rollup_recal_committed,0)
5831          WHERE fund_id = fund.fund_id
5832          AND object_version_number = fund.object_version_number;
5833 
5834          IF (SQL%NOTFOUND) THEN
5835            IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_error) THEN
5836               fnd_message.set_name('OZF', 'OZF_API_RECORD_NOT_FOUND');
5837               fnd_msg_pub.add;
5838            END IF;
5839 
5840            RAISE fnd_api.g_exc_error;
5841          END IF;
5842       END IF;
5843    END LOOP;
5844    -------------------- finish --------------------------
5845    fnd_msg_pub.count_and_get(
5846       p_encoded => fnd_api.g_false
5847      ,p_count => x_msg_count
5848      ,p_data => x_msg_data);
5849    IF G_DEBUG THEN
5850       ozf_utility_pvt.debug_message( l_api_name || ': end');
5851    END IF;
5852 EXCEPTION
5853    WHEN fnd_api.g_exc_error THEN
5854       x_return_status := fnd_api.g_ret_sts_error;
5855       fnd_msg_pub.count_and_get(
5856          p_encoded => fnd_api.g_false
5857         ,p_count => x_msg_count
5858         ,p_data => x_msg_data);
5859    WHEN fnd_api.g_exc_unexpected_error THEN
5860       x_return_status := fnd_api.g_ret_sts_unexp_error;
5861       fnd_msg_pub.count_and_get(
5862          p_encoded => fnd_api.g_false
5863         ,p_count => x_msg_count
5864         ,p_data => x_msg_data);
5865    WHEN OTHERS THEN
5866       x_return_status := fnd_api.g_ret_sts_unexp_error;
5867 
5868       IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_unexp_error) THEN
5869          fnd_msg_pub.add_exc_msg(g_pkg_name, l_api_name);
5870       END IF;
5871 
5872       fnd_msg_pub.count_and_get(
5873          p_encoded => fnd_api.g_false
5874         ,p_count => x_msg_count
5875         ,p_data => x_msg_data);
5876 
5877 END update_rollup_amount;
5878 
5879 ---------------------------------------------------------------------
5880 -- PROCEDURE
5881 ---   update_funds_access
5882 --
5883 -- PURPOSE
5884 --    Update parent funds access. added by feliu
5885 --
5886 -- PARAMETERS
5887 -- p_fund_rec: the fund record.
5888 -- p_mode: the mode for create, and delete.
5889 ---------------------------------------------------------------------
5890 
5891 PROCEDURE  update_funds_access(
5892    p_api_version        IN       NUMBER
5893   ,p_init_msg_list      IN       VARCHAR2 := fnd_api.g_false
5894   ,p_commit             IN       VARCHAR2 := fnd_api.g_false
5895   ,p_validation_level   IN       NUMBER := fnd_api.g_valid_level_full
5896   ,x_return_status      OUT NOCOPY      VARCHAR2
5897   ,x_msg_count          OUT NOCOPY      NUMBER
5898   ,x_msg_data           OUT NOCOPY      VARCHAR2
5899   ,p_fund_rec           IN       fund_rec_type
5900   ,p_mode               IN       VARCHAR2 := JTF_PLSQL_API.G_CREATE
5901 ) IS
5902 
5903  l_api_version    CONSTANT NUMBER  := 1.0;
5904  l_api_name       CONSTANT VARCHAR2(30)
5905             := 'update_funds_access';
5906  l_full_name      CONSTANT VARCHAR2(60)
5907             := g_pkg_name || '.' || l_api_name;
5908 
5909  l_access_rec               ams_access_pvt.access_rec_type;
5910 --l_fund_owner    NUMBER;
5911 l_return_status     VARCHAR2(1);
5912 l_access_id         NUMBER;
5913 l_acc_obj_ver_num   NUMBER;
5914 --Get all of parent fund through bottom up tree walking.
5915  CURSOR c_parent
5916  IS
5917    SELECT fund_id,owner
5918    FROM ozf_funds_all_b
5919    connect by prior  parent_fund_id =fund_id
5920    start with fund_id =  p_fund_rec.fund_id;
5921 
5922  CURSOR c_fund_access(
5923       p_fund_id        IN   NUMBER
5924      ,p_owner_id   IN   NUMBER)
5925  IS
5926     SELECT   activity_access_id
5927               ,object_version_number
5928     FROM     ams_act_access
5929     WHERE  act_access_to_object_id = p_fund_id
5930     AND arc_act_access_to_object = 'FUND'
5931     AND arc_user_or_role_type = 'USER'
5932     AND user_or_role_id = p_owner_id;
5933     --AND NVL(owner_flag,'N') = 'N' ;
5934 
5935 
5936  TYPE owner_table_type IS TABLE of NUMBER
5937       INDEX BY BINARY_INTEGER;
5938  l_owner_table       owner_table_type;
5939  l_count           NUMBER  := 1 ;
5940  l_owner_exist       BOOLEAN := false;
5941 
5942 BEGIN
5943    -- Standard call to check for call compatibility.
5944    IF NOT FND_API.Compatible_API_Call ( l_api_version,
5945                                         p_api_version,
5946                                         l_api_name,
5947                                         G_PKG_NAME)
5948    THEN
5949        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5950    END IF;
5951 
5952    -- Initialize message list if p_init_msg_list is set to TRUE.
5953    IF FND_API.to_Boolean( p_init_msg_list )THEN
5954       FND_MSG_PUB.initialize;
5955    END IF;
5956 
5957    IF G_DEBUG THEN
5958       OZF_UTILITY_PVT.debug_message('Private API: ' || l_api_name || ' start');
5959    END IF;
5960 
5961    FOR fund IN c_parent
5962    LOOP
5963      --Remove last level fund.
5964      IF fund.fund_id <> p_fund_rec.fund_id THEN
5965        IF p_mode = 'CREATE' THEN
5966          --check if access has been created for same owner at children level.
5967          FOR i IN  NVL(l_owner_table.FIRST, 0)..NVL(l_owner_table.LAST, 0) LOOP
5968            EXIT WHEN l_owner_table.COUNT = 0;
5969            IF l_owner_table(i) = fund.owner THEN
5970              l_owner_exist := true;
5971            END IF;
5972          END LOOP;
5973 
5974          --if the owner of the parent and child fund is different then only add access
5975        IF l_owner_exist = false AND fund.owner <> p_fund_rec.owner THEN
5976            --added owner to owner table to avoide creating another access next time.
5977            l_owner_table(l_count) := fund.owner;
5978            l_count := l_count + 1;
5979 
5980             l_access_rec.act_access_to_object_id := p_fund_rec.fund_id;
5981             l_access_rec.arc_act_access_to_object := 'FUND';
5982             l_access_rec.user_or_role_id := fund.owner;
5983             l_access_rec.arc_user_or_role_type := 'USER';
5984             l_access_rec.admin_flag := 'Y';
5985             l_access_rec.owner_flag := 'Y';
5986             ams_access_pvt.create_access(
5987                p_api_version => l_api_version
5988                ,p_init_msg_list => fnd_api.g_false
5989                ,p_validation_level => p_validation_level
5990                ,x_return_status => l_return_status
5991                ,x_msg_count => x_msg_count
5992                ,x_msg_data => x_msg_data
5993                ,p_commit => fnd_api.g_false
5994                ,p_access_rec => l_access_rec
5995                ,x_access_id => l_access_id);
5996 
5997                --l_return_status := fnd_api.g_ret_sts_error;
5998             IF l_return_status = fnd_api.g_ret_sts_error THEN
5999                RAISE fnd_api.g_exc_error;
6000             ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
6001                RAISE fnd_api.g_exc_unexpected_error;
6002             END IF;
6003         END IF;
6004       ELSE -- end create access mode.
6005 
6006           OPEN c_fund_access(p_fund_rec.fund_id, fund.owner);
6007           FETCH c_fund_access INTO l_access_id, l_acc_obj_ver_num;
6008           CLOSE c_fund_access;
6009           l_access_rec.activity_access_id := l_access_id;
6010           l_access_rec.object_version_number := l_acc_obj_ver_num;
6011 
6012           IF  fund.owner <>p_fund_rec.owner AND l_access_rec.activity_access_id is NOT NULL THEN
6013                ams_access_pvt.delete_access(
6014                   p_api_version => l_api_version
6015                  ,p_init_msg_list => fnd_api.g_false
6016                  ,p_validation_level => p_validation_level
6017                  ,x_return_status => l_return_status
6018                  ,x_msg_count => x_msg_count
6019                  ,x_msg_data => x_msg_data
6020                  ,p_commit => fnd_api.g_false
6021                  ,p_access_id => l_access_id
6022                  ,p_object_version => l_acc_obj_ver_num);
6023 
6024                IF l_return_status = fnd_api.g_ret_sts_error THEN
6025                   RAISE fnd_api.g_exc_error;
6026                ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
6027                   RAISE fnd_api.g_exc_unexpected_error;
6028                END IF;
6029           END IF; -- end of l_access_rec.activity_access_id is NOT NULL
6030 
6031        END IF; -- end delete access mode.
6032      END IF;
6033    END LOOP;
6034    -------------------- finish --------------------------
6035    fnd_msg_pub.count_and_get(
6036       p_encoded => fnd_api.g_false
6037      ,p_count => x_msg_count
6038      ,p_data => x_msg_data);
6039    IF G_DEBUG THEN
6040       ozf_utility_pvt.debug_message( l_api_name ||': end');
6041    END IF;
6042 
6043 EXCEPTION
6044    WHEN fnd_api.g_exc_error THEN
6045       x_return_status := fnd_api.g_ret_sts_error;
6046       fnd_msg_pub.count_and_get(
6047          p_encoded => fnd_api.g_false
6048         ,p_count => x_msg_count
6049         ,p_data => x_msg_data);
6050    WHEN fnd_api.g_exc_unexpected_error THEN
6051       x_return_status := fnd_api.g_ret_sts_unexp_error;
6052       fnd_msg_pub.count_and_get(
6053          p_encoded => fnd_api.g_false
6054         ,p_count => x_msg_count
6055         ,p_data => x_msg_data);
6056    WHEN OTHERS THEN
6057       x_return_status := fnd_api.g_ret_sts_unexp_error;
6058 
6059       IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_unexp_error) THEN
6060          fnd_msg_pub.add_exc_msg(g_pkg_name, l_api_name);
6061       END IF;
6062 
6063        fnd_msg_pub.count_and_get(
6064          p_encoded => fnd_api.g_false
6065         ,p_count => x_msg_count
6066         ,p_data => x_msg_data);
6067 
6068 END update_funds_access;
6069 
6070 END Ozf_funds_pvt;
6071