DBA Data[Home] [Help]

PACKAGE BODY: APPS.PA_PROJECT_ASSETS_PUB

Source


1 PACKAGE BODY pa_project_assets_pub AS
2 /*$Header: PAPMPAPB.pls 120.3 2005/12/19 12:07:14 dlanka noship $*/
3 
4 --Global constants to be used in error messages
5 G_PKG_NAME  	CONSTANT VARCHAR2(30) := 'PA_PROJECT_ASSETS_PUB';
6 G_ASSET_CODE	CONSTANT VARCHAR2(5)  := 'ASSET';
7 
8 --Global constants to be used in inserts and updates
9 G_USER_ID  		CONSTANT NUMBER := FND_GLOBAL.user_id;
10 G_LOGIN_ID		CONSTANT NUMBER := FND_GLOBAL.login_id;
11 
12 
13 
14 
15 
16 
17 --JPULTORAK Project Asset Creation
18 
19 
20 --------------------------------------------------------------------------------
21 --Name:               add_project_asset
22 --Type:               Procedure
23 --Description:        This procedure adds a project asset to an OP project, when this is allowed.
24 --
25 --
26 --
27 --Called subprograms:
28 --
29 --
30 --
31 --History:
32 --    15-JAN-2003    JPULTORAK       Created
33 --
34 PROCEDURE add_project_asset
35 ( p_api_version_number		IN	NUMBER
36  ,p_commit					IN	VARCHAR2	:= FND_API.G_FALSE
37  ,p_init_msg_list		    IN	VARCHAR2	:= FND_API.G_FALSE
38  ,p_msg_count				OUT NOCOPY	NUMBER
39  ,p_msg_data				OUT NOCOPY	VARCHAR2
40  ,p_return_status		    OUT	 NOCOPY VARCHAR2
41  ,p_pm_product_code			IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
42  ,p_pm_project_reference	IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
43  ,p_pa_project_id			IN	NUMBER      := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
44  ,p_pm_asset_reference		IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
45  ,p_pa_asset_name			IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
46  ,p_asset_number			IN	VARCHAR2	:= PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
47  ,p_asset_description		IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
48  ,p_project_asset_type		IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
49  ,p_location_id				IN	NUMBER      := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
50  ,p_assigned_to_person_id	IN 	NUMBER      := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
51  ,p_date_placed_in_service	IN 	DATE        := PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE
52  ,p_asset_category_id		IN	NUMBER      := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
53  ,p_book_type_code			IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
54  ,p_asset_units				IN	NUMBER      := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
55  ,p_estimated_asset_units	IN	NUMBER      := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
56  ,p_estimated_cost			IN	NUMBER      := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
57  ,p_depreciate_flag			IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
58  ,p_depreciation_expense_ccid IN	NUMBER  := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
59  ,p_amortize_flag			IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
60  ,p_estimated_in_service_date IN	DATE    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE
61  ,p_asset_key_ccid			IN	NUMBER      := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
62  ,p_attribute_category		IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
63  ,p_attribute1				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
64  ,p_attribute2				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
65  ,p_attribute3				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
66  ,p_attribute4				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
67  ,p_attribute5				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
68  ,p_attribute6				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
69  ,p_attribute7				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
70  ,p_attribute8				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
71  ,p_attribute9				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
72  ,p_attribute10				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
73  ,p_attribute11				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
74  ,p_attribute12				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
75  ,p_attribute13				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
76  ,p_attribute14				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
77  ,p_attribute15				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
78  ,p_parent_asset_id		    IN	NUMBER      := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
79  ,p_manufacturer_name		IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
80  ,p_model_number			IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
81  ,p_serial_number			IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
82  ,p_tag_number				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
83  ,p_ret_target_asset_id		IN	NUMBER      := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
84  ,p_pa_project_id_out		OUT NOCOPY	NUMBER
85  ,p_pa_project_number_out	OUT NOCOPY	VARCHAR2
86  ,p_pa_project_asset_id_out	OUT NOCOPY	NUMBER
87  ,p_pm_asset_reference_out  OUT NOCOPY VARCHAR2) IS
88 
89 
90 
91     l_asset_in_rec                   PA_PROJECT_ASSETS_PUB.asset_in_rec_type;
92 
93 
94     --Used to get the project number for AMG messages
95     CURSOR l_amg_project_csr(x_project_id   NUMBER) IS
96     SELECT  segment1
97     FROM    pa_projects p
98     WHERE   p.project_id = x_project_id;
99 
100     l_amg_project_number             pa_projects_all.segment1%TYPE;
101     l_amg_pa_asset_name              pa_project_assets_all.asset_name%TYPE;
102 
103 
104     --Used to determine if the project is CAPITAL
105     CURSOR capital_project_cur(x_project_id   NUMBER) IS
106     SELECT  'Project is CAPITAL'
107     FROM    pa_projects p,
108             pa_project_types t
109     WHERE   p.project_id = x_project_id
110     AND     p.project_type = t.project_type
111     AND     t.project_type_class_code = 'CAPITAL';
112 
113     capital_project_rec      capital_project_cur%ROWTYPE;
114 
115 
116     --Used to determine if asset ref is unique within project
117     CURSOR  unique_ref_cur(x_project_id  NUMBER) IS
118     SELECT  'Asset Ref Exists'
119     FROM    pa_project_assets_all
120     WHERE   project_id = x_project_id
121     AND     pm_asset_reference = l_asset_in_rec.pm_asset_reference;
122 
123     unique_ref_rec      unique_ref_cur%ROWTYPE;
124 
125 
126     --Used to determine if asset name is unique within project
127     CURSOR  unique_name_cur(x_project_id  NUMBER) IS
128     SELECT  'Asset Name Exists'
129     FROM    pa_project_assets_all
130     WHERE   project_id = x_project_id
131     AND     asset_name = l_asset_in_rec.pa_asset_name;
132 
133     unique_name_rec      unique_name_cur%ROWTYPE;
134 
135 
136     --Used to determine if asset number is unique
137     CURSOR  unique_number_cur IS
138     SELECT  'Asset Number Exists'
139     FROM    pa_project_assets_all
140     WHERE   asset_number = p_asset_number;
141 
142     unique_number_rec      unique_number_cur%ROWTYPE;
143 
144 
145     --Used to determine if project asset type is valid
146     CURSOR  valid_type_cur IS
147     SELECT  meaning
148     FROM    pa_lookups
149     WHERE   lookup_type = 'PROJECT_ASSET_TYPES'
150     AND     lookup_code = p_project_asset_type;
151 
152     valid_type_rec      valid_type_cur%ROWTYPE;
153 
154 
155     --Used to determine if asset location is valid
156     CURSOR  asset_location_cur IS
157     SELECT  'Asset Location Exists'
158     FROM    fa_locations
159     WHERE   location_id = p_location_id
160     AND     enabled_flag = 'Y';
161 
162     asset_location_rec      asset_location_cur%ROWTYPE;
163 
164 
165     --Used to determine if assigned to person is valid
166     CURSOR  people_cur IS
167     SELECT  'Person Exists'
168     FROM    per_people_x
169     WHERE   person_id = p_assigned_to_person_id
170     --CWK changes, added the below condition
171     AND     nvl(current_employee_flag, 'N') = 'Y';
172 
173     people_rec      people_cur%ROWTYPE;
174 
175 
176     --Used to determine if the book type code is valid for the current SOB
177     CURSOR  book_type_code_cur IS
178     SELECT  'Book Type Code is valid'
179     FROM    fa_book_controls fb,
180             pa_implementations pi
181     WHERE   fb.set_of_books_id = pi.set_of_books_id
182     AND     fb.book_type_code = p_book_type_code
183     AND     fb.book_class = 'CORPORATE';
184 
185     book_type_code_rec      book_type_code_cur%ROWTYPE;
186 
187 
188     --Used to identify default book type code, if specified
189     CURSOR  default_book_type_code_cur IS
190     SELECT  pi.book_type_code
191     FROM    pa_implementations pi
192     WHERE   pi.book_type_code IS NOT NULL;
193 
194 
195     --Used to determine if the asset category is valid
196     CURSOR  asset_category_cur IS
197     SELECT  'Asset Category is valid'
198     FROM    fa_categories
199     WHERE   category_id = p_asset_category_id
200     AND     enabled_flag = 'Y';
201 
202     asset_category_rec      asset_category_cur%ROWTYPE;
203 
204 
205     --Used to determine if the category/books combination is valid
206     CURSOR  category_books_cur IS
207     SELECT  'Category/Books combination is valid'
208     FROM    fa_category_books
209     WHERE   category_id = p_asset_category_id
210     AND     book_type_code = l_asset_in_rec.book_type_code;
211 
212     category_books_rec      category_books_cur%ROWTYPE;
213 
214 
215     --Used to default the depreciate_flag from category book defaults
216     CURSOR  depreciate_flag_cur IS
217     SELECT  SUBSTR(depreciate_flag,1,1)
218     FROM    fa_category_book_defaults
219     WHERE   category_id = p_asset_category_id
220     AND     book_type_code = l_asset_in_rec.book_type_code
221     AND     NVL(p_date_placed_in_service,NVL(p_estimated_in_service_date,TRUNC(SYSDATE)))
222         BETWEEN start_dpis AND NVL(end_dpis,NVL(p_date_placed_in_service,NVL(p_estimated_in_service_date,TRUNC(SYSDATE))));
223 
224 
225 
226     --Used to determine if the Depreciation Expense CCID is valid for the current COA
227     CURSOR  deprn_expense_cur IS
228     SELECT  'Deprn Expense Acct code combination is valid'
229     FROM    gl_code_combinations gcc,
230             gl_sets_of_books gsob,
231             pa_implementations pi
232     WHERE   gcc.code_combination_id = l_asset_in_rec.depreciation_expense_ccid
233     AND     gcc.chart_of_accounts_id = gsob.chart_of_accounts_id
234     AND     gsob.set_of_books_id = pi.set_of_books_id
235     AND     gcc.account_type = 'E';
236 
237     deprn_expense_rec      deprn_expense_cur%ROWTYPE;
238 
239 
240     --Used to determine if the asset key is valid
241     CURSOR  asset_key_cur IS
242     SELECT  'Asset Key is valid'
243     FROM    fa_asset_keywords
244     WHERE   code_combination_id = p_asset_key_ccid
245     AND     enabled_flag = 'Y';
246 
247     asset_key_rec      asset_key_cur%ROWTYPE;
248 
249 
250     --Used to determine if Tag Number is unique in Oracle Assets
251     CURSOR  unique_tag_number_fa_cur IS
252     SELECT  'Tag Number Exists'
253     FROM    fa_additions
254     WHERE   tag_number = p_tag_number;
255 
256     unique_tag_number_fa_rec      unique_tag_number_fa_cur%ROWTYPE;
257 
258 
259     --Used to determine if Tag Number is unique in Oracle Projects
260     CURSOR  unique_tag_number_pa_cur IS
261     SELECT  'Tag Number Exists'
262     FROM    pa_project_assets_all
263     WHERE   tag_number = p_tag_number;
264 
265     unique_tag_number_pa_rec      unique_tag_number_pa_cur%ROWTYPE;
266 
267 
268     --Used to determine if Parent Asset ID is valid in Oracle Assets
269     CURSOR  parent_asset_cur IS
270     SELECT  'Parent Asset Number Exists'
271     FROM    fa_additions
272     WHERE   asset_id = p_parent_asset_id
273     AND     asset_type <> 'GROUP';
274 
275     parent_asset_rec      parent_asset_cur%ROWTYPE;
276 
277 
278     --Used to determine if Parent Asset ID is valid for Book specified
279     CURSOR  parent_asset_book_cur IS
280     SELECT  'Parent Asset Number Exists in Book'
281     FROM    fa_additions fa,
282             fa_books fb
283     WHERE   fa.asset_id = p_parent_asset_id
284     AND     fa.asset_type <> 'GROUP'
285     AND     fa.asset_id = fb.asset_id
286     AND     fb.book_type_code = l_asset_in_rec.book_type_code
287     AND     fb.date_ineffective IS NULL;
288 
289     parent_asset_book_rec      parent_asset_book_cur%ROWTYPE;
290 
291 
292     --Used to determine if the Ret Target Asset ID is a valid GROUP asset in the book
293     CURSOR  ret_target_cur IS
294     SELECT  fa.asset_category_id
295     FROM    fa_books fb,
296             fa_additions fa
297     WHERE   fa.asset_id = p_ret_target_asset_id
298     AND     fa.asset_type = 'GROUP'
299     AND     fa.asset_id = fb.asset_id
300     AND     fb.book_type_code = l_asset_in_rec.book_type_code
301     AND     fb.date_ineffective IS NULL;
302 
303     ret_target_rec      ret_target_cur%ROWTYPE;
304 
305 
306     l_api_name			   CONSTANT	 VARCHAR2(30) 		:= 'add_project_asset';
307     l_return_status				     VARCHAR2(1);
308     l_project_id					 pa_projects.project_id%TYPE;
309     l_task_id					     pa_tasks.task_id%TYPE;
310     l_msg_count					     NUMBER ;
311     l_msg_data					     VARCHAR2(2000);
312     l_function_allowed				 VARCHAR2(1);
313     l_resp_id					     NUMBER := 0;
314     l_user_id		                 NUMBER := 0;
315     l_module_name                    VARCHAR2(80);
316     v_intf_complete_asset_flag       VARCHAR2(1);
317     v_asset_key_required             VARCHAR2(1);
318     v_depreciation_expense_ccid      NUMBER;
319 
320     --Variable used for validation of required Asset KFF segments
321     fftype          FND_FLEX_KEY_API.FLEXFIELD_TYPE;
322     numstruct       NUMBER;
323     structnum       NUMBER;
324     liststruct      FND_FLEX_KEY_API.STRUCTURE_LIST;
325     thestruct       FND_FLEX_KEY_API.STRUCTURE_TYPE;
326     numsegs         NUMBER;
327     listsegs        FND_FLEX_KEY_API.SEGMENT_LIST;
328     segtype         FND_FLEX_KEY_API.SEGMENT_TYPE;
329     segname         FND_ID_FLEX_SEGMENTS.SEGMENT_NAME%TYPE;
330 
331  BEGIN
332 
333     --  Standard begin of API savepoint
334     SAVEPOINT add_project_asset_pub;
335 
336 
337     --	Initialize the message table if requested.
338     IF FND_API.TO_BOOLEAN( p_init_msg_list ) THEN
339 	   FND_MSG_PUB.initialize;
340     END IF;
341 
342 
343     --  Set API return status to success
344     p_return_status := FND_API.G_RET_STS_SUCCESS;
345 
346 
347 
348     --  Standard call to check for call compatibility.
349     IF NOT FND_API.Compatible_API_Call ( g_api_version_number	,
350     	    	    	    	    	 p_api_version_number	,
351     	    	    	    	    	 l_api_name 	    	,
352     	    	    	    	    	 G_PKG_NAME 	    	)
353     THEN
354 
355 	   RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
356 
357     END IF;
358 
359 
360     --  pm_product_code is mandatory
361     IF p_pm_product_code IS NULL OR p_pm_product_code = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
362 
363 	    IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
364             pa_interface_utils_pub.map_new_amg_msg
365                 ( p_old_message_code => 'PA_PRODUCT_CODE_IS_MISSING'
366                 ,p_msg_attribute    => 'CHANGE'
367                 ,p_resize_flag      => 'N'
368                 ,p_msg_context      => 'GENERAL'
369                 ,p_attribute1       => ''
370                 ,p_attribute2       => ''
371                 ,p_attribute3       => ''
372                 ,p_attribute4       => ''
373                 ,p_attribute5       => '');
374 	    END IF;
375 
376         RAISE FND_API.G_EXC_ERROR;
377     END IF;
378 
379 
380     --Initialize variables
381     l_resp_id := FND_GLOBAL.Resp_id;
382     l_user_id := FND_GLOBAL.User_id;
383     l_module_name := 'PA_PM_ADD_PROJECT_ASSET';
384 
385 
386 
387     -- Get the project ID
388     PA_PROJECT_PVT.Convert_pm_projref_to_id
389         (        p_pm_project_reference =>      p_pm_project_reference
390                  ,  p_pa_project_id     =>      p_pa_project_id
391                  ,  p_out_project_id    =>      l_project_id
392                  ,  p_return_status     =>      l_return_status
393         );
394 
395 
396     IF (l_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
397         RAISE  FND_API.G_EXC_UNEXPECTED_ERROR;
398     ELSIF  (l_return_status = FND_API.G_RET_STS_ERROR) THEN
399         RAISE  FND_API.G_EXC_ERROR;
400     END IF;
401 
402 
403     -- Get project number for AMG messages
404     OPEN l_amg_project_csr( l_project_id );
405     FETCH l_amg_project_csr INTO l_amg_project_number;
406     CLOSE l_amg_project_csr;
407 
408 
409     --Validate that the project is CAPITAL project type class
410     OPEN capital_project_cur(l_project_id);
411     FETCH capital_project_cur INTO capital_project_rec;
412 	IF capital_project_cur%NOTFOUND THEN
413 
414         CLOSE capital_project_cur;
415         -- The project must be CAPITAL. Raise error
416         pa_interface_utils_pub.map_new_amg_msg
417            ( p_old_message_code => 'PA_PR_NOT_CAPITAL'
418             ,p_msg_attribute    => 'CHANGE'
419             ,p_resize_flag      => 'N'
420             ,p_msg_context      => 'PROJ'
421             ,p_attribute1       => l_amg_project_number
422             ,p_attribute2       => ''
423             ,p_attribute3       => ''
424             ,p_attribute4       => ''
425             ,p_attribute5       => '');
426 
427         p_return_status := FND_API.G_RET_STS_ERROR;
428 
429         RAISE FND_API.G_EXC_ERROR;
430 	END IF;
431 	CLOSE capital_project_cur;
432 
433 
434 
435     -- As part of enforcing project security, which would determine
436     -- whether the user has the necessary privileges to update the project
437     -- need to call the pa_security package
438 
439     pa_security.initialize (X_user_id        => l_user_id,
440                             X_calling_module => l_module_name);
441 
442     -- Actions performed using the APIs would be subject to
443     -- function security. If the responsibility does not allow
444     -- such functions to be executed, the API should not proceed further
445     -- since the user does not have access to such functions
446 
447     -- Function security procedure check whether user have the
448     -- privilege to add project asset or not
449 
450     PA_INTERFACE_UTILS_PUB.G_PROJECT_ID := l_project_id;
451 
452     PA_PM_FUNCTION_SECURITY_PUB.check_function_security
453       (p_api_version_number => p_api_version_number,
454        p_responsibility_id  => l_resp_id,
455        p_function_name      => 'PA_PM_ADD_PROJECT_ASSET',
456        p_msg_count	        => l_msg_count,
457        p_msg_data           => l_msg_data,
458        p_return_status	    => l_return_status,
459        p_function_allowed   => l_function_allowed);
460 
461     IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
462 		RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
463     ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
464 		RAISE FND_API.G_EXC_ERROR;
465     END IF;
466 
467     IF l_function_allowed = 'N' THEN
468          pa_interface_utils_pub.map_new_amg_msg
469            ( p_old_message_code => 'PA_FUNCTION_SECURITY_ENFORCED'
470             ,p_msg_attribute    => 'CHANGE'
471             ,p_resize_flag      => 'Y'
472             ,p_msg_context      => 'GENERAL'
473             ,p_attribute1       => ''
474             ,p_attribute2       => ''
475             ,p_attribute3       => ''
476             ,p_attribute4       => ''
477             ,p_attribute5       => '');
478 	       p_return_status := FND_API.G_RET_STS_ERROR;
479 	       RAISE FND_API.G_EXC_ERROR;
480     END IF;
481 
482 
483     -- Now verify whether project security allows the user to update the project
484     IF pa_security.allow_query (x_project_id => l_project_id ) = 'N' THEN
485 
486         -- The user does not have query privileges on this project
487         -- Hence, cannot update the project.Raise error
488         pa_interface_utils_pub.map_new_amg_msg
489            ( p_old_message_code => 'PA_PROJECT_SECURITY_ENFORCED'
490             ,p_msg_attribute    => 'CHANGE'
491             ,p_resize_flag      => 'Y'
492             ,p_msg_context      => 'GENERAL'
493             ,p_attribute1       => ''
494             ,p_attribute2       => ''
495             ,p_attribute3       => ''
496             ,p_attribute4       => ''
497             ,p_attribute5       => '');
498 
499         p_return_status := FND_API.G_RET_STS_ERROR;
500 
501         RAISE FND_API.G_EXC_ERROR;
502     ELSE
503         -- If the user has query privileges, then check whether
504         -- update privileges are also available
505         IF pa_security.allow_update (x_project_id => l_project_id ) = 'N' THEN
506 
507             -- The user does not have update privileges on this project
508             -- Hence , raise error
509 
510             pa_interface_utils_pub.map_new_amg_msg
511                 ( p_old_message_code => 'PA_PROJECT_SECURITY_ENFORCED'
512                 ,p_msg_attribute    => 'CHANGE'
513                 ,p_resize_flag      => 'Y'
514                 ,p_msg_context      => 'GENERAL'
515                 ,p_attribute1       => ''
516                 ,p_attribute2       => ''
517                 ,p_attribute3       => ''
518                 ,p_attribute4       => ''
519                 ,p_attribute5       => '');
520 
521 	        p_return_status := FND_API.G_RET_STS_ERROR;
522 
523             RAISE FND_API.G_EXC_ERROR;
524         END IF;
525      END IF;
526 
527 
528     --Bind local asset_in_rec variables to parameter values
529     l_asset_in_rec.pm_asset_reference           := p_pm_asset_reference;
530     l_asset_in_rec.pa_project_asset_id          := NULL;
531     l_asset_in_rec.asset_number	                := p_asset_number;
532     --Default asset name to pm_asset_reference if NULL
533     IF p_pa_asset_name IS NULL OR p_pa_asset_name = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
534         l_asset_in_rec.pa_asset_name	        := p_pm_asset_reference;
535         l_amg_pa_asset_name                     := p_pm_asset_reference;
536     ELSE
537         l_asset_in_rec.pa_asset_name	        := p_pa_asset_name;
538         l_amg_pa_asset_name                     := p_pa_asset_name;
539     END IF;
540     l_asset_in_rec.asset_description	        := p_asset_description;
541     l_asset_in_rec.project_asset_type		    := p_project_asset_type;
542     l_asset_in_rec.location_id				    := p_location_id;
543     l_asset_in_rec.assigned_to_person_id	    := p_assigned_to_person_id;
544     l_asset_in_rec.date_placed_in_service	    := p_date_placed_in_service;
545     l_asset_in_rec.asset_category_id		    := p_asset_category_id;
546     l_asset_in_rec.book_type_code               := p_book_type_code;
547     l_asset_in_rec.asset_units                  := p_asset_units;
548     l_asset_in_rec.estimated_asset_units        := p_estimated_asset_units;
549     l_asset_in_rec.estimated_cost	            := p_estimated_cost;
550     l_asset_in_rec.depreciate_flag              := p_depreciate_flag;
551     l_asset_in_rec.depreciation_expense_ccid    := p_depreciation_expense_ccid;
552     l_asset_in_rec.amortize_flag                := p_amortize_flag;
553     l_asset_in_rec.estimated_in_service_date    := p_estimated_in_service_date;
554     l_asset_in_rec.asset_key_ccid               := p_asset_key_ccid;
555     l_asset_in_rec.attribute_category           := p_attribute_category;
556     l_asset_in_rec.attribute1                   := p_attribute1;
557     l_asset_in_rec.attribute2                   := p_attribute2;
558     l_asset_in_rec.attribute3                   := p_attribute3;
559     l_asset_in_rec.attribute4                   := p_attribute4;
560     l_asset_in_rec.attribute5                   := p_attribute5;
561     l_asset_in_rec.attribute6                   := p_attribute6;
562     l_asset_in_rec.attribute7                   := p_attribute7;
563     l_asset_in_rec.attribute8                   := p_attribute8;
564     l_asset_in_rec.attribute9                   := p_attribute9;
565     l_asset_in_rec.attribute10                  := p_attribute10;
566     l_asset_in_rec.attribute11                  := p_attribute11;
567     l_asset_in_rec.attribute12                  := p_attribute12;
568     l_asset_in_rec.attribute13                  := p_attribute13;
569     l_asset_in_rec.attribute14                  := p_attribute14;
570     l_asset_in_rec.attribute15                  := p_attribute15;
571     l_asset_in_rec.parent_asset_id              := p_parent_asset_id;
572     l_asset_in_rec.manufacturer_name            := p_manufacturer_name;
573     l_asset_in_rec.model_number	                := p_model_number;
574     l_asset_in_rec.serial_number                := p_serial_number;
575     l_asset_in_rec.tag_number                   := p_tag_number;
576     l_asset_in_rec.ret_target_asset_id          := p_ret_target_asset_id;
577 
578 
579 
580     --Begin logic of validating Project Asset
581 
582     --Validate that the new Asset Reference is NOT NULL
583     IF p_pm_asset_reference IS NULL OR p_pm_asset_reference = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
584 
585         -- The Asset Reference must be specified. Raise error
586         pa_interface_utils_pub.map_new_amg_msg
587            ( p_old_message_code => 'PA_ASSET_REF_IS_MISSING'
588             ,p_msg_attribute    => 'CHANGE'
589             ,p_resize_flag      => 'N'
590             ,p_msg_context      => 'PROJ'
591             ,p_attribute1       => l_amg_project_number
592             ,p_attribute2       => ''
593             ,p_attribute3       => ''
594             ,p_attribute4       => ''
595             ,p_attribute5       => '');
596 
597         p_return_status := FND_API.G_RET_STS_ERROR;
598 
599         RAISE FND_API.G_EXC_ERROR;
600     END IF;
601 
602 
603     --Validate that the new Asset reference is unique in the project
604     OPEN unique_ref_cur(l_project_id);
605     FETCH unique_ref_cur INTO unique_ref_rec;
606 	IF unique_ref_cur%FOUND THEN
607 
608         CLOSE unique_ref_cur;
609         -- The Asset Reference must be unique in the project. Raise error
610         pa_interface_utils_pub.map_new_amg_msg
611            ( p_old_message_code => 'PA_ASSET_REF_NOT_UNIQUE_AS'
612             ,p_msg_attribute    => 'CHANGE'
613             ,p_resize_flag      => 'N'
614             ,p_msg_context      => 'ASSET'
615             ,p_attribute1       => l_amg_project_number
616             ,p_attribute2       => l_amg_pa_asset_name
617             ,p_attribute3       => ''
618             ,p_attribute4       => ''
619             ,p_attribute5       => '');
620 
621         p_return_status := FND_API.G_RET_STS_ERROR;
622 
623         RAISE FND_API.G_EXC_ERROR;
624 	END IF;
625 	CLOSE unique_ref_cur;
626 
627 
628     --Validate that the new Asset Name is NOT NULL
629     IF l_asset_in_rec.pa_asset_name IS NULL OR l_asset_in_rec.pa_asset_name = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
630 
631         -- The Asset Name must be specified. Raise error
632         pa_interface_utils_pub.map_new_amg_msg
633            ( p_old_message_code => 'PA_ASSET_NAME_IS_MISSING'
634             ,p_msg_attribute    => 'CHANGE'
635             ,p_resize_flag      => 'N'
636             ,p_msg_context      => 'PROJ'
637             ,p_attribute1       => l_amg_project_number
638             ,p_attribute2       => ''
639             ,p_attribute3       => ''
640             ,p_attribute4       => ''
641             ,p_attribute5       => '');
642 
643         p_return_status := FND_API.G_RET_STS_ERROR;
644 
645         RAISE FND_API.G_EXC_ERROR;
646     END IF;
647 
648 
649     --Validate that the new Asset Name is unique in the project
650     OPEN unique_name_cur(l_project_id);
651     FETCH unique_name_cur INTO unique_name_rec;
652 	IF unique_name_cur%FOUND THEN
653 
654         CLOSE unique_name_cur;
655         -- The Asset Name must be unique in the project. Raise error
656         pa_interface_utils_pub.map_new_amg_msg
657            ( p_old_message_code => 'PA_ASSET_NAME_NOT_UNIQ_AS'
658             ,p_msg_attribute    => 'CHANGE'
659             ,p_resize_flag      => 'N'
660             ,p_msg_context      => 'ASSET'
661             ,p_attribute1       => l_amg_project_number
662             ,p_attribute2       => l_amg_pa_asset_name
663             ,p_attribute3       => ''
664             ,p_attribute4       => ''
665             ,p_attribute5       => '');
666 
667         p_return_status := FND_API.G_RET_STS_ERROR;
668 
669         RAISE FND_API.G_EXC_ERROR;
670 	END IF;
671 	CLOSE unique_name_cur;
672 
673 
674     --Validate that the new Asset Description is NOT NULL
675     IF p_asset_description IS NULL OR p_asset_description = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
676 
677         -- The Asset Description is required. Raise error
678         pa_interface_utils_pub.map_new_amg_msg
679            ( p_old_message_code => 'PA_ASSET_DESC_MISSING_AS'
680             ,p_msg_attribute    => 'CHANGE'
681             ,p_resize_flag      => 'N'
682             ,p_msg_context      => 'ASSET'
683             ,p_attribute1       => l_amg_project_number
684             ,p_attribute2       => l_amg_pa_asset_name
685             ,p_attribute3       => ''
686             ,p_attribute4       => ''
687             ,p_attribute5       => '');
688 
689         p_return_status := FND_API.G_RET_STS_ERROR;
690 
691         RAISE FND_API.G_EXC_ERROR;
692     END IF;
693 
694 
695     --Validate that the new Project Asset Type is NOT NULL
696     IF p_project_asset_type IS NULL OR p_project_asset_type = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
697 
698          -- The Project Asset Type is required. Raise error
699         pa_interface_utils_pub.map_new_amg_msg
700            ( p_old_message_code => 'PA_ASSET_TYPE_MISSING_AS'
701             ,p_msg_attribute    => 'CHANGE'
702             ,p_resize_flag      => 'N'
703             ,p_msg_context      => 'ASSET'
704             ,p_attribute1       => l_amg_project_number
705             ,p_attribute2       => l_amg_pa_asset_name
706             ,p_attribute3       => ''
707             ,p_attribute4       => ''
708             ,p_attribute5       => '');
709 
710         p_return_status := FND_API.G_RET_STS_ERROR;
711 
712         RAISE FND_API.G_EXC_ERROR;
713     END IF;
714 
715 
716     --Validate that the new Project Asset Type is ESTIMATED, AS-BUILT or RETIREMENT_ADJUSTMENT
717     OPEN valid_type_cur;
718     FETCH valid_type_cur INTO valid_type_rec;
719 	IF valid_type_cur%NOTFOUND THEN
720 
721         CLOSE valid_type_cur;
722         -- The Project Asset Type is invalid. Raise error
723         pa_interface_utils_pub.map_new_amg_msg
724            ( p_old_message_code => 'PA_ASSET_TYPE_INVALID_AS'
725             ,p_msg_attribute    => 'CHANGE'
726             ,p_resize_flag      => 'N'
727             ,p_msg_context      => 'ASSET'
728             ,p_attribute1       => l_amg_project_number
729             ,p_attribute2       => l_amg_pa_asset_name
730             ,p_attribute3       => ''
731             ,p_attribute4       => ''
732             ,p_attribute5       => '');
733 
734         p_return_status := FND_API.G_RET_STS_ERROR;
735 
736         RAISE FND_API.G_EXC_ERROR;
737 	END IF;
738 	CLOSE valid_type_cur;
739 
740 
741     --Validate that the new Asset DPIS and Asset Units are NOT NULL if type is AS-BUILT
742     IF p_project_asset_type = 'AS-BUILT' THEN
743         IF p_date_placed_in_service IS NULL OR p_date_placed_in_service = PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE THEN
744 
745             -- The Actual DPIS is required for 'AS-BUILT' assets. Raise error
746             pa_interface_utils_pub.map_new_amg_msg
747                 ( p_old_message_code => 'PA_ASSET_DPIS_MISSING_AS'
748                 ,p_msg_attribute    => 'CHANGE'
749                 ,p_resize_flag      => 'N'
750                 ,p_msg_context      => 'ASSET'
751                 ,p_attribute1       => l_amg_project_number
752                 ,p_attribute2       => l_amg_pa_asset_name
753                 ,p_attribute3       => ''
754                 ,p_attribute4       => ''
755                 ,p_attribute5       => '');
756 
757             p_return_status := FND_API.G_RET_STS_ERROR;
758 
759             RAISE FND_API.G_EXC_ERROR;
760         END IF;
761 
762         IF p_asset_units IS NULL OR p_asset_units = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM THEN
763 
764             -- The Asset Units are required for 'AS-BUILT' assets. Raise error
765             pa_interface_utils_pub.map_new_amg_msg
766                 ( p_old_message_code => 'PA_ASSET_UNITS_MISSING_AS'
767                 ,p_msg_attribute    => 'CHANGE'
768                 ,p_resize_flag      => 'N'
769                 ,p_msg_context      => 'ASSET'
770                 ,p_attribute1       => l_amg_project_number
771                 ,p_attribute2       => l_amg_pa_asset_name
772                 ,p_attribute3       => ''
773                 ,p_attribute4       => ''
774                 ,p_attribute5       => '');
775 
776             p_return_status := FND_API.G_RET_STS_ERROR;
777 
778             RAISE FND_API.G_EXC_ERROR;
779         END IF;
780     END IF;
781 
782 
783 
784     --Validate that the new Asset DPIS and Asset Units are NULL if type is ESTIMATED
785     IF p_project_asset_type = 'ESTIMATED' THEN
786         IF p_date_placed_in_service IS NOT NULL AND p_date_placed_in_service <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE THEN
787 
788             -- The Actual DPIS must be NULL for 'ESTIMATED' assets. Raise error
789             pa_interface_utils_pub.map_new_amg_msg
790                 ( p_old_message_code => 'PA_ASSET_DPIS_MB_NULL_AS'
791                 ,p_msg_attribute    => 'CHANGE'
792                 ,p_resize_flag      => 'N'
793                 ,p_msg_context      => 'ASSET'
794                 ,p_attribute1       => l_amg_project_number
795                 ,p_attribute2       => l_amg_pa_asset_name
796                 ,p_attribute3       => ''
797                 ,p_attribute4       => ''
798                 ,p_attribute5       => '');
799 
800             p_return_status := FND_API.G_RET_STS_ERROR;
801 
802             RAISE FND_API.G_EXC_ERROR;
803         END IF;
804     END IF;
805 
806 
807     --If Asset Number is specified, it must not exist on other project assets
808     IF p_asset_number IS NOT NULL AND p_asset_number <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
809         OPEN unique_number_cur;
810         FETCH unique_number_cur INTO unique_number_rec;
811 	    IF unique_number_cur%FOUND THEN
812 
813             CLOSE unique_number_cur;
814             -- The Asset Number must be unique. Raise error
815             pa_interface_utils_pub.map_new_amg_msg
816                 ( p_old_message_code => 'PA_ASSET_NUM_NOT_UNIQUE_AS'
817                 ,p_msg_attribute    => 'CHANGE'
818                 ,p_resize_flag      => 'N'
819                 ,p_msg_context      => 'ASSET'
820                 ,p_attribute1       => l_amg_project_number
821                 ,p_attribute2       => l_amg_pa_asset_name
822                 ,p_attribute3       => ''
823                 ,p_attribute4       => ''
824                 ,p_attribute5       => '');
825 
826             p_return_status := FND_API.G_RET_STS_ERROR;
827 
828             RAISE FND_API.G_EXC_ERROR;
829 	    END IF;
830 	    CLOSE unique_number_cur;
831     END IF;
832 
833 
834     --If Tag Number is specified, it must not exist on other project assets or in Oracle Assets
835     IF p_tag_number IS NOT NULL AND p_tag_number <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
836 
837         --Test for uniqueness in Oracle Assets
838         OPEN unique_tag_number_fa_cur;
839         FETCH unique_tag_number_fa_cur INTO unique_tag_number_fa_rec;
840 	    IF unique_tag_number_fa_cur%FOUND THEN
841 
842             CLOSE unique_tag_number_fa_cur;
843             -- The Tag Number must be unique. Raise error
844             pa_interface_utils_pub.map_new_amg_msg
845                 ( p_old_message_code => 'PA_TAG_NUM_FA_NOT_UNIQ_AS'
846                 ,p_msg_attribute    => 'CHANGE'
847                 ,p_resize_flag      => 'N'
848                 ,p_msg_context      => 'ASSET'
849                 ,p_attribute1       => l_amg_project_number
850                 ,p_attribute2       => l_amg_pa_asset_name
851                 ,p_attribute3       => ''
852                 ,p_attribute4       => ''
853                 ,p_attribute5       => '');
854 
855             p_return_status := FND_API.G_RET_STS_ERROR;
856 
857             RAISE FND_API.G_EXC_ERROR;
858 	    END IF;
859 	    CLOSE unique_tag_number_fa_cur;
860 
861         --Test for uniqueness in Oracle Projects
862         OPEN unique_tag_number_pa_cur;
863         FETCH unique_tag_number_pa_cur INTO unique_tag_number_pa_rec;
864 	    IF unique_tag_number_pa_cur%FOUND THEN
865 
866             CLOSE unique_tag_number_pa_cur;
867             -- The Tag Number must be unique. Raise error
868             pa_interface_utils_pub.map_new_amg_msg
869                 ( p_old_message_code => 'PA_TAG_NUM_PA_NOT_UNIQ_AS'
870                 ,p_msg_attribute    => 'CHANGE'
871                 ,p_resize_flag      => 'N'
872                 ,p_msg_context      => 'ASSET'
873                 ,p_attribute1       => l_amg_project_number
874                 ,p_attribute2       => l_amg_pa_asset_name
875                 ,p_attribute3       => ''
876                 ,p_attribute4       => ''
877                 ,p_attribute5       => '');
878 
879             p_return_status := FND_API.G_RET_STS_ERROR;
880 
881             RAISE FND_API.G_EXC_ERROR;
882 	    END IF;
883 	    CLOSE unique_tag_number_pa_cur;
884     END IF;
885 
886 
887 
888     --If Asset Location is specified, it must be valid in Oracle Assets
889     IF p_location_id IS NOT NULL AND p_location_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM THEN
890         OPEN asset_location_cur;
891         FETCH asset_location_cur INTO asset_location_rec;
892 	    IF asset_location_cur%NOTFOUND THEN
893 
894             CLOSE asset_location_cur;
895             -- The Asset Location is not valid. Raise error
896             pa_interface_utils_pub.map_new_amg_msg
897                 ( p_old_message_code => 'PA_ASSET_LOC_INVALID_AS'
898                 ,p_msg_attribute    => 'CHANGE'
899                 ,p_resize_flag      => 'N'
900                 ,p_msg_context      => 'ASSET'
901                 ,p_attribute1       => l_amg_project_number
902                 ,p_attribute2       => l_amg_pa_asset_name
903                 ,p_attribute3       => ''
904                 ,p_attribute4       => ''
905                 ,p_attribute5       => '');
906 
907             p_return_status := FND_API.G_RET_STS_ERROR;
908 
909             RAISE FND_API.G_EXC_ERROR;
910 	    END IF;
911 	    CLOSE asset_location_cur;
912     END IF;
913 
914 
915     --If Assigned to Person is specified, it must be valid Person ID
916     IF p_assigned_to_person_id IS NOT NULL AND p_assigned_to_person_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM THEN
917         OPEN people_cur;
918         FETCH people_cur INTO people_rec;
919 	    IF people_cur%NOTFOUND THEN
920 
921             CLOSE people_cur;
922             -- The Assign to Person is not valid. Raise error
923             pa_interface_utils_pub.map_new_amg_msg
924                 ( p_old_message_code => 'PA_ASSGN_TO_PER_INVALID_AS'
925                 ,p_msg_attribute    => 'CHANGE'
926                 ,p_resize_flag      => 'N'
927                 ,p_msg_context      => 'ASSET'
928                 ,p_attribute1       => l_amg_project_number
929                 ,p_attribute2       => l_amg_pa_asset_name
930                 ,p_attribute3       => ''
931                 ,p_attribute4       => ''
932                 ,p_attribute5       => '');
933 
934             p_return_status := FND_API.G_RET_STS_ERROR;
935 
936             RAISE FND_API.G_EXC_ERROR;
937 	    END IF;
938 	    CLOSE people_cur;
939     END IF;
940 
941 
942     --If Book Type Code is specified, it must be valid for the current Set of Books
943     IF p_book_type_code IS NOT NULL AND p_book_type_code <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
944         OPEN book_type_code_cur;
945         FETCH book_type_code_cur INTO book_type_code_rec;
946 	    IF book_type_code_cur%NOTFOUND THEN
947 
948             CLOSE book_type_code_cur;
949             -- The book_type_code is not valid. Raise error
950             pa_interface_utils_pub.map_new_amg_msg
951                 ( p_old_message_code => 'PA_BOOK_TYPE_INVALID_AS'
952                 ,p_msg_attribute    => 'CHANGE'
953                 ,p_resize_flag      => 'N'
954                 ,p_msg_context      => 'ASSET'
955                 ,p_attribute1       => l_amg_project_number
956                 ,p_attribute2       => l_amg_pa_asset_name
957                 ,p_attribute3       => ''
958                 ,p_attribute4       => ''
959                 ,p_attribute5       => '');
960 
961             p_return_status := FND_API.G_RET_STS_ERROR;
962 
963             RAISE FND_API.G_EXC_ERROR;
964         ELSE
965             l_asset_in_rec.book_type_code := p_book_type_code;
966 	    END IF;
967 	    CLOSE book_type_code_cur;
968     ELSE
969         --Determine if default book_type_code exists in PA_IMPLEMENTATIONS
970         OPEN default_book_type_code_cur;
971         FETCH default_book_type_code_cur INTO l_asset_in_rec.book_type_code;
972 	    IF default_book_type_code_cur%NOTFOUND THEN
973 
974             -- No default book_type_code exists.  Set l_asset_in_rec.book_type_code to NULL;
975             l_asset_in_rec.book_type_code := NULL;
976         END IF;
977 	    CLOSE default_book_type_code_cur;
978 
979     END IF;
980 
981 
982     --Book Type Code must have a value for assets of type 'RETIREMENT_ADJUSTMENT'
983     IF l_asset_in_rec.book_type_code IS NULL AND p_project_asset_type = 'RETIREMENT_ADJUSTMENT' THEN
984 
985         -- The book_type_code must be specified for this type of asset. Raise error
986         pa_interface_utils_pub.map_new_amg_msg
987                 ( p_old_message_code => 'PA_BOOK_TYPE_IS_MISSING_AS'
988                 ,p_msg_attribute    => 'CHANGE'
989                 ,p_resize_flag      => 'N'
990                 ,p_msg_context      => 'ASSET'
991                 ,p_attribute1       => l_amg_project_number
992                 ,p_attribute2       => l_amg_pa_asset_name
993                 ,p_attribute3       => ''
994                 ,p_attribute4       => ''
995                 ,p_attribute5       => '');
996 
997         p_return_status := FND_API.G_RET_STS_ERROR;
998 
999         RAISE FND_API.G_EXC_ERROR;
1000 
1001     END IF;
1002 
1003 
1004     --If l_asset_in_rec.book_type_code has a value, then the Parent Asset ID must be valid for the book
1005     IF l_asset_in_rec.book_type_code IS NOT NULL AND p_parent_asset_id IS NOT NULL
1006         AND p_parent_asset_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM THEN
1007 
1008         OPEN parent_asset_book_cur;
1009         FETCH parent_asset_book_cur INTO parent_asset_book_rec;
1010 	    IF parent_asset_book_cur%NOTFOUND THEN
1011 
1012             CLOSE parent_asset_book_cur;
1013             -- The parent_asset_id must be valid for the book_type_code. Raise error
1014             pa_interface_utils_pub.map_new_amg_msg
1015                 ( p_old_message_code => 'PA_PARENT_BOOK_INVALID_AS'
1016                 ,p_msg_attribute    => 'CHANGE'
1017                 ,p_resize_flag      => 'N'
1018                 ,p_msg_context      => 'ASSET'
1019                 ,p_attribute1       => l_amg_project_number
1020                 ,p_attribute2       => l_amg_pa_asset_name
1021                 ,p_attribute3       => ''
1022                 ,p_attribute4       => ''
1023                 ,p_attribute5       => '');
1024 
1025             p_return_status := FND_API.G_RET_STS_ERROR;
1026 
1027             RAISE FND_API.G_EXC_ERROR;
1028         END IF;
1029 
1030         CLOSE parent_asset_book_cur;
1031 
1032     ELSIF l_asset_in_rec.book_type_code IS NULL AND p_parent_asset_id IS NOT NULL
1033         AND p_parent_asset_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM THEN
1034 
1035         --Parent Asset ID must be a valid asset
1036         OPEN parent_asset_cur;
1037         FETCH parent_asset_cur INTO parent_asset_rec;
1038 	    IF parent_asset_cur%NOTFOUND THEN
1039 
1040             CLOSE parent_asset_cur;
1041             -- The parent_asset_id must be valid in Oracle Assets. Raise error
1042             pa_interface_utils_pub.map_new_amg_msg
1043                 ( p_old_message_code => 'PA_PARENT_ASSET_INVALID_AS'
1044                 ,p_msg_attribute    => 'CHANGE'
1045                 ,p_resize_flag      => 'N'
1046                 ,p_msg_context      => 'ASSET'
1047                 ,p_attribute1       => l_amg_project_number
1048                 ,p_attribute2       => l_amg_pa_asset_name
1049                 ,p_attribute3       => ''
1050                 ,p_attribute4       => ''
1051                 ,p_attribute5       => '');
1052 
1053             p_return_status := FND_API.G_RET_STS_ERROR;
1054 
1055             RAISE FND_API.G_EXC_ERROR;
1056         END IF;
1057 
1058         CLOSE parent_asset_cur;
1059 
1060     END IF;
1061 
1062 
1063     --If Asset Category is specified, it must be valid in FA_CATEGORIES
1064     IF p_asset_category_id IS NOT NULL AND p_asset_category_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM THEN
1065         OPEN asset_category_cur;
1066         FETCH asset_category_cur INTO asset_category_rec;
1067 	    IF asset_category_cur%NOTFOUND THEN
1068 
1069             CLOSE asset_category_cur;
1070             -- The asset_category is not valid. Raise error
1071             pa_interface_utils_pub.map_new_amg_msg
1072                 ( p_old_message_code => 'PA_CATEGORY_INVALID_AS'
1073                 ,p_msg_attribute    => 'CHANGE'
1074                 ,p_resize_flag      => 'N'
1075                 ,p_msg_context      => 'ASSET'
1076                 ,p_attribute1       => l_amg_project_number
1077                 ,p_attribute2       => l_amg_pa_asset_name
1078                 ,p_attribute3       => ''
1079                 ,p_attribute4       => ''
1080                 ,p_attribute5       => '');
1081 
1082             p_return_status := FND_API.G_RET_STS_ERROR;
1083 
1084             RAISE FND_API.G_EXC_ERROR;
1085 	    END IF;
1086 	    CLOSE asset_category_cur;
1087 
1088 
1089         --If l_asset_in_rec.book_type_code has a value, then the Category/Book combination must be valid
1090         IF l_asset_in_rec.book_type_code IS NOT NULL THEN
1091             OPEN category_books_cur;
1092             FETCH category_books_cur INTO category_books_rec;
1093 	        IF category_books_cur%NOTFOUND THEN
1094 
1095                 CLOSE category_books_cur;
1096                 -- The category/books combination is not valid. Raise error
1097                 pa_interface_utils_pub.map_new_amg_msg
1098                     ( p_old_message_code => 'PA_CAT_BOOKS_INVALID_AS'
1099                     ,p_msg_attribute    => 'CHANGE'
1100                     ,p_resize_flag      => 'N'
1101                     ,p_msg_context      => 'ASSET'
1102                     ,p_attribute1       => l_amg_project_number
1103                     ,p_attribute2       => l_amg_pa_asset_name
1104                     ,p_attribute3       => ''
1105                     ,p_attribute4       => ''
1106                     ,p_attribute5       => '');
1107 
1108                 p_return_status := FND_API.G_RET_STS_ERROR;
1109 
1110                 RAISE FND_API.G_EXC_ERROR;
1111 	        END IF;
1112 	        CLOSE category_books_cur;
1113 
1114 
1115             --Default depreciate_flag from category book defaults if not specified
1116             IF p_depreciate_flag IS NULL OR p_depreciate_flag = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
1117                 OPEN depreciate_flag_cur;
1118                 FETCH depreciate_flag_cur INTO l_asset_in_rec.depreciate_flag;
1119 	            IF depreciate_flag_cur%NOTFOUND THEN
1120                     l_asset_in_rec.depreciate_flag := NULL;
1121 	            END IF;
1122 	            CLOSE depreciate_flag_cur;
1123 
1124             END IF; --Depreciate Flag not specified
1125 
1126 
1127             --Default amortize_flag to 'N' if not specified
1128             IF p_amortize_flag IS NULL OR p_amortize_flag = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
1129 
1130                 l_asset_in_rec.amortize_flag := 'N';
1131 
1132             END IF; --Amortize Flag not specified
1133 
1134         END IF; --l_asset_in_rec.book_type_code NOT NULL
1135 
1136     END IF;
1137 
1138 
1139     --If amortize_flag has a value, it must be Y or N
1140     IF p_amortize_flag IS NOT NULL AND p_amortize_flag <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
1141         IF p_amortize_flag NOT IN ('Y','N') THEN
1142             -- The amortize_flag is not valid. Raise error
1143             pa_interface_utils_pub.map_new_amg_msg
1144                 ( p_old_message_code => 'PA_AMORT_FLAG_INVALID_AS'
1145                 ,p_msg_attribute    => 'CHANGE'
1146                 ,p_resize_flag      => 'N'
1147                 ,p_msg_context      => 'ASSET'
1148                 ,p_attribute1       => l_amg_project_number
1149                 ,p_attribute2       => l_amg_pa_asset_name
1150                 ,p_attribute3       => ''
1151                 ,p_attribute4       => ''
1152                 ,p_attribute5       => '');
1153 
1154             p_return_status := FND_API.G_RET_STS_ERROR;
1155 
1156             RAISE FND_API.G_EXC_ERROR;
1157         ELSE
1158             l_asset_in_rec.amortize_flag := p_amortize_flag;
1159         END IF;
1160 
1161     END IF; --Amortize Flag specified
1162 
1163 
1164     --If depreciate_flag has a value, it must be Y or N
1165     IF p_depreciate_flag IS NOT NULL AND p_depreciate_flag <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
1166         IF p_depreciate_flag NOT IN ('Y','N') THEN
1167             -- The depreciate_flag is not valid. Raise error
1168             pa_interface_utils_pub.map_new_amg_msg
1169                 ( p_old_message_code => 'PA_DEPR_FLAG_INVALID_AS'
1170                 ,p_msg_attribute    => 'CHANGE'
1171                 ,p_resize_flag      => 'N'
1172                 ,p_msg_context      => 'ASSET'
1173                 ,p_attribute1       => l_amg_project_number
1174                 ,p_attribute2       => l_amg_pa_asset_name
1175                 ,p_attribute3       => ''
1176                 ,p_attribute4       => ''
1177                 ,p_attribute5       => '');
1178 
1179             p_return_status := FND_API.G_RET_STS_ERROR;
1180 
1181             RAISE FND_API.G_EXC_ERROR;
1182         ELSE
1183             l_asset_in_rec.depreciate_flag := p_depreciate_flag;
1184         END IF;
1185 
1186     END IF; --Depreciate Flag specified
1187 
1188 
1189 
1190     --Call the Depreciation Expense CCID Override client extension for AS-BUILT assets
1191     IF p_project_asset_type = 'AS-BUILT' THEN
1192 
1193         IF p_asset_category_id IS NOT NULL AND p_asset_category_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
1194             AND l_asset_in_rec.book_type_code IS NOT NULL AND l_asset_in_rec.book_type_code <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
1195             AND p_date_placed_in_service IS NOT NULL AND p_date_placed_in_service <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE THEN
1196 
1197                --Determine value of parameter to be sent for current Deprn Expense CCID
1198                IF l_asset_in_rec.depreciation_expense_ccid = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM THEN
1199                    v_depreciation_expense_ccid := NULL;
1200                ELSE
1201                    v_depreciation_expense_ccid := l_asset_in_rec.depreciation_expense_ccid;
1202                END IF;
1203 
1204 
1205                l_asset_in_rec.depreciation_expense_ccid := PA_CLIENT_EXTN_DEPRN_EXP_OVR.DEPRN_EXPENSE_ACCT_OVERRIDE
1206                                         (p_project_asset_id        => NULL,
1207                                          p_book_type_code          => l_asset_in_rec.book_type_code,
1208 			                             p_asset_category_id       => p_asset_category_id,
1209                                          p_date_placed_in_service  => p_date_placed_in_service,
1210                                          p_deprn_expense_acct_ccid => v_depreciation_expense_ccid);
1211 
1212         END IF;
1213     END IF;
1214 
1215 
1216 
1217     --If Depreciation Expense CCID is specified, it must be a valid Code Combination
1218     IF l_asset_in_rec.depreciation_expense_ccid IS NOT NULL AND l_asset_in_rec.depreciation_expense_ccid <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM THEN
1219         OPEN deprn_expense_cur;
1220         FETCH deprn_expense_cur INTO deprn_expense_rec;
1221 	    IF deprn_expense_cur%NOTFOUND THEN
1222 
1223             CLOSE deprn_expense_cur;
1224             -- The depreciation_expense_ccid is not valid. Raise error
1225             pa_interface_utils_pub.map_new_amg_msg
1226                 ( p_old_message_code => 'PA_DEPRN_EXP_INVALID_AS'
1227                 ,p_msg_attribute    => 'CHANGE'
1228                 ,p_resize_flag      => 'N'
1229                 ,p_msg_context      => 'ASSET'
1230                 ,p_attribute1       => l_amg_project_number
1231                 ,p_attribute2       => l_amg_pa_asset_name
1232                 ,p_attribute3       => ''
1233                 ,p_attribute4       => ''
1234                 ,p_attribute5       => '');
1235 
1236             p_return_status := FND_API.G_RET_STS_ERROR;
1237 
1238             RAISE FND_API.G_EXC_ERROR;
1239 	    END IF;
1240 	    CLOSE deprn_expense_cur;
1241 
1242     END IF;
1243 
1244 
1245 
1246     --If Asset Key CCID is specified, it must be a valid FA Keywords combination
1247     IF p_asset_key_ccid IS NOT NULL AND p_asset_key_ccid <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM THEN
1248         OPEN asset_key_cur;
1249         FETCH asset_key_cur INTO asset_key_rec;
1250 	    IF asset_key_cur%NOTFOUND THEN
1251 
1252             CLOSE asset_key_cur;
1253             -- The asset_key_ccid is not valid. Raise error
1254             pa_interface_utils_pub.map_new_amg_msg
1255                 ( p_old_message_code => 'PA_ASSET_KEY_INVALID_AS'
1256                 ,p_msg_attribute    => 'CHANGE'
1257                 ,p_resize_flag      => 'N'
1258                 ,p_msg_context      => 'ASSET'
1259                 ,p_attribute1       => l_amg_project_number
1260                 ,p_attribute2       => l_amg_pa_asset_name
1261                 ,p_attribute3       => ''
1262                 ,p_attribute4       => ''
1263                 ,p_attribute5       => '');
1264 
1265             p_return_status := FND_API.G_RET_STS_ERROR;
1266 
1267             RAISE FND_API.G_EXC_ERROR;
1268 	    END IF;
1269 	    CLOSE asset_key_cur;
1270     END IF;
1271 
1272 
1273 
1274     --If project_asset_type is 'RETIREMENT_ADJUSTMENT', the Ret Target Asset ID must be specified
1275     IF p_project_asset_type = 'RETIREMENT_ADJUSTMENT' THEN
1276         IF p_ret_target_asset_id IS NOT NULL AND p_ret_target_asset_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM THEN
1277 
1278             --Ret Target Asset ID must be a valid Group Asset for the Book
1279             OPEN ret_target_cur;
1280             FETCH ret_target_cur INTO ret_target_rec;
1281 	        IF ret_target_cur%NOTFOUND THEN
1282 
1283                 CLOSE ret_target_cur;
1284                 -- The Ret Target Asset ID is not valid. Raise error
1285                 pa_interface_utils_pub.map_new_amg_msg
1286                     ( p_old_message_code => 'PA_RET_ASSET_ID_INVALID_AS'
1287                     ,p_msg_attribute    => 'CHANGE'
1288                     ,p_resize_flag      => 'N'
1289                     ,p_msg_context      => 'ASSET'
1290                     ,p_attribute1       => l_amg_project_number
1291                     ,p_attribute2       => l_amg_pa_asset_name
1292                     ,p_attribute3       => ''
1293                     ,p_attribute4       => ''
1294                     ,p_attribute5       => '');
1295 
1296                 p_return_status := FND_API.G_RET_STS_ERROR;
1297 
1298                 RAISE FND_API.G_EXC_ERROR;
1299 	       END IF;
1300 	       CLOSE ret_target_cur;
1301 
1302            --If Asset Category ID is NULL, default it to the Category of the Ret Target Asset
1303            IF p_asset_category_id IS NULL OR p_asset_category_id = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM THEN
1304                l_asset_in_rec.asset_category_id := ret_target_rec.asset_category_id;
1305            END IF;
1306         ELSE
1307             --Ret Target Asset ID must be specified for RETIREMENT_ADJUSTMENT assets
1308             pa_interface_utils_pub.map_new_amg_msg
1309                 ( p_old_message_code => 'PA_RET_ASSET_ID_MISSING_AS'
1310                 ,p_msg_attribute    => 'CHANGE'
1311                 ,p_resize_flag      => 'N'
1312                 ,p_msg_context      => 'ASSET'
1313                 ,p_attribute1       => l_amg_project_number
1314                 ,p_attribute2       => l_amg_pa_asset_name
1315                 ,p_attribute3       => ''
1316                 ,p_attribute4       => ''
1317                 ,p_attribute5       => '');
1318 
1319             p_return_status := FND_API.G_RET_STS_ERROR;
1320 
1321             RAISE FND_API.G_EXC_ERROR;
1322         END IF;
1323     ELSE
1324         --Ret Target Asset ID must not be specified
1325         IF p_ret_target_asset_id IS NOT NULL AND p_ret_target_asset_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM THEN
1326 
1327             --Ret Target Asset ID must be not specified for ESTIMATED or AS-BUILT assets
1328             pa_interface_utils_pub.map_new_amg_msg
1329                 ( p_old_message_code => 'PA_RET_ASSET_ID_MB_NULL_AS'
1330                 ,p_msg_attribute    => 'CHANGE'
1331                 ,p_resize_flag      => 'N'
1332                 ,p_msg_context      => 'ASSET'
1333                 ,p_attribute1       => l_amg_project_number
1334                 ,p_attribute2       => l_amg_pa_asset_name
1335                 ,p_attribute3       => ''
1336                 ,p_attribute4       => ''
1337                 ,p_attribute5       => '');
1338 
1339             p_return_status := FND_API.G_RET_STS_ERROR;
1340 
1341             RAISE FND_API.G_EXC_ERROR;
1342         END IF;
1343     END IF;
1344 
1345 
1346 
1347     --Validate that the Asset Category, Book Type Code, Location, Asset Key, Depreciate Flag and Deprn Expense CCID
1348     --are NOT NULL if the Project Asset Type is AS-BUILT and Complete Asset Definition is required
1349 
1350     SELECT  NVL(pt.interface_complete_asset_flag,'N')
1351     INTO    v_intf_complete_asset_flag
1352     FROM    pa_project_types pt,
1353             pa_projects p
1354     WHERE   p.project_type = pt.project_type
1355     AND     p.project_id = l_project_id;
1356 
1357 
1358     IF p_project_asset_type = 'AS-BUILT' AND v_intf_complete_asset_flag = 'Y' THEN
1359 
1360         IF p_asset_category_id IS NULL OR p_asset_category_id = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM THEN
1361 
1362             -- The Asset Category is required for 'AS-BUILT' assets. Raise error
1363             pa_interface_utils_pub.map_new_amg_msg
1364                 ( p_old_message_code => 'PA_CATEGORY_MISSING_AS'
1365                 ,p_msg_attribute    => 'CHANGE'
1366                 ,p_resize_flag      => 'N'
1367                 ,p_msg_context      => 'ASSET'
1368                 ,p_attribute1       => l_amg_project_number
1369                 ,p_attribute2       => l_amg_pa_asset_name
1370                 ,p_attribute3       => ''
1371                 ,p_attribute4       => ''
1372                 ,p_attribute5       => '');
1373 
1374             p_return_status := FND_API.G_RET_STS_ERROR;
1375 
1376             RAISE FND_API.G_EXC_ERROR;
1377         END IF;
1378 
1379 
1380         IF p_location_id IS NULL OR p_location_id = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM THEN
1381 
1382             -- The Asset Location is required for 'AS-BUILT' assets. Raise error
1383             pa_interface_utils_pub.map_new_amg_msg
1384                 ( p_old_message_code => 'PA_ASSET_LOC_MISSING_AS'
1385                 ,p_msg_attribute    => 'CHANGE'
1386                 ,p_resize_flag      => 'N'
1387                 ,p_msg_context      => 'ASSET'
1388                 ,p_attribute1       => l_amg_project_number
1389                 ,p_attribute2       => l_amg_pa_asset_name
1390                 ,p_attribute3       => ''
1391                 ,p_attribute4       => ''
1392                 ,p_attribute5       => '');
1393 
1394             p_return_status := FND_API.G_RET_STS_ERROR;
1395 
1396             RAISE FND_API.G_EXC_ERROR;
1397         END IF;
1398 
1399 
1400         IF l_asset_in_rec.book_type_code IS NULL OR l_asset_in_rec.book_type_code = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
1401 
1402             -- The Book Type Code is required for 'AS-BUILT' assets. Raise error
1403             pa_interface_utils_pub.map_new_amg_msg
1404                 ( p_old_message_code => 'PA_BOOK_TYPE_IS_MISSING_AS'
1405                 ,p_msg_attribute    => 'CHANGE'
1406                 ,p_resize_flag      => 'N'
1407                 ,p_msg_context      => 'ASSET'
1408                 ,p_attribute1       => l_amg_project_number
1409                 ,p_attribute2       => l_amg_pa_asset_name
1410                 ,p_attribute3       => ''
1411                 ,p_attribute4       => ''
1412                 ,p_attribute5       => '');
1413 
1414             p_return_status := FND_API.G_RET_STS_ERROR;
1415 
1416             RAISE FND_API.G_EXC_ERROR;
1417         END IF;
1418 
1419 
1420         IF l_asset_in_rec.depreciation_expense_ccid IS NULL OR l_asset_in_rec.depreciation_expense_ccid = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM THEN
1421 
1422             -- The Depreciation Expense CCID is required for 'AS-BUILT' assets. Raise error
1423             pa_interface_utils_pub.map_new_amg_msg
1424                 ( p_old_message_code => 'PA_DEPRN_EXP_MISSING_AS'
1425                 ,p_msg_attribute    => 'CHANGE'
1426                 ,p_resize_flag      => 'N'
1427                 ,p_msg_context      => 'ASSET'
1428                 ,p_attribute1       => l_amg_project_number
1429                 ,p_attribute2       => l_amg_pa_asset_name
1430                 ,p_attribute3       => ''
1431                 ,p_attribute4       => ''
1432                 ,p_attribute5       => '');
1433 
1434             p_return_status := FND_API.G_RET_STS_ERROR;
1435 
1436             RAISE FND_API.G_EXC_ERROR;
1437         END IF;
1438 
1439 
1440         IF p_asset_key_ccid IS NULL OR p_asset_key_ccid = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM THEN
1441 
1442             --Asset Key CCID must be specified if any of the segments are specified
1443             BEGIN
1444                 SELECT  asset_key_flex_structure
1445                 INTO    structnum
1446                 FROM    fa_system_controls;
1447 
1448             EXCEPTION
1449                 WHEN NO_DATA_FOUND THEN
1450                     NULL;
1451             END;
1452 
1453             IF structnum IS NOT NULL THEN
1454 
1455                 FND_FLEX_KEY_API.SET_SESSION_MODE('seed_data');
1456 
1457                 fftype := FND_FLEX_KEY_API.FIND_FLEXFIELD
1458                                 (appl_short_name =>'OFA',
1459                                 flex_code =>'KEY#');
1460 
1461                 thestruct := FND_FLEX_KEY_API.FIND_STRUCTURE(fftype,structnum);
1462 
1463                 FND_FLEX_KEY_API.GET_SEGMENTS(fftype,thestruct,TRUE,numsegs,listsegs);
1464 
1465                 v_asset_key_required := 'N';
1466 
1467                 FOR i IN 1 .. numsegs LOOP
1468                     segtype := FND_FLEX_KEY_API.FIND_SEGMENT(fftype,thestruct,listsegs(i));
1469 
1470                     IF (segtype.required_flag = 'Y' and segtype.enabled_flag = 'Y') THEN
1471                         v_asset_key_required := 'Y';
1472                     END IF;
1473                 END LOOP;
1474 
1475 
1476                 IF v_asset_key_required = 'Y' THEN
1477 
1478                     -- The Asset Key CCID is required. Raise error
1479                     pa_interface_utils_pub.map_new_amg_msg
1480                         ( p_old_message_code => 'PA_ASSET_KEY_MISSING_AS'
1481                         ,p_msg_attribute    => 'CHANGE'
1482                         ,p_resize_flag      => 'N'
1483                         ,p_msg_context      => 'ASSET'
1484                         ,p_attribute1       => l_amg_project_number
1485                         ,p_attribute2       => l_amg_pa_asset_name
1486                         ,p_attribute3       => ''
1487                         ,p_attribute4       => ''
1488                         ,p_attribute5       => '');
1489 
1490                     p_return_status := FND_API.G_RET_STS_ERROR;
1491 
1492                     RAISE FND_API.G_EXC_ERROR;
1493                 END IF; --Asset Key is required
1494             END IF; --Structnum was determined
1495         END IF; --Asset Key was not specified
1496     END IF; --AS-BUILT asset with Complete Asset Info required
1497 
1498 
1499 
1500     --Validations are complete.  Begin INSERT logic for new PA_PROJECT_ASSETS_ALL row.
1501 
1502 
1503     --NULL out any unspecified fields
1504 	IF l_asset_in_rec.pa_asset_name = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
1505 		l_asset_in_rec.pa_asset_name := NULL;
1506 	END IF;
1507 
1508    	IF l_asset_in_rec.pm_asset_reference = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
1509 		l_asset_in_rec.pm_asset_reference := NULL;
1510 	END IF;
1511 
1512 	IF l_asset_in_rec.asset_number = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
1513 		l_asset_in_rec.asset_number := NULL;
1514 	END IF;
1515 
1516    	IF l_asset_in_rec.asset_description = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
1517 		l_asset_in_rec.asset_description := NULL;
1518 	END IF;
1519 
1520    	IF l_asset_in_rec.project_asset_type = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
1521 		l_asset_in_rec.project_asset_type := NULL;
1522 	END IF;
1523 
1524    	IF l_asset_in_rec.location_id = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM THEN
1525 		l_asset_in_rec.location_id := NULL;
1526 	END IF;
1527 
1528    	IF l_asset_in_rec.assigned_to_person_id = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM THEN
1529 		l_asset_in_rec.assigned_to_person_id := NULL;
1530 	END IF;
1531 
1532    	IF l_asset_in_rec.date_placed_in_service = PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE THEN
1533 		l_asset_in_rec.date_placed_in_service := NULL;
1534 	END IF;
1535 
1536    	IF l_asset_in_rec.asset_category_id = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM THEN
1537 		l_asset_in_rec.asset_category_id := NULL;
1538 	END IF;
1539 
1540     IF l_asset_in_rec.book_type_code = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
1541 		l_asset_in_rec.book_type_code := NULL;
1542 	END IF;
1543 
1544     IF l_asset_in_rec.asset_units = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM THEN
1545 		l_asset_in_rec.asset_units := NULL;
1546 	END IF;
1547 
1548     IF l_asset_in_rec.estimated_asset_units = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM THEN
1549 		l_asset_in_rec.estimated_asset_units := NULL;
1550 	END IF;
1551 
1552     IF l_asset_in_rec.estimated_cost = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM THEN
1553 		l_asset_in_rec.estimated_cost := NULL;
1554 	END IF;
1555 
1556     IF l_asset_in_rec.depreciate_flag = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
1557 		l_asset_in_rec.depreciate_flag := NULL;
1558 	END IF;
1559 
1560     IF l_asset_in_rec.depreciation_expense_ccid = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM THEN
1561 		l_asset_in_rec.depreciation_expense_ccid := NULL;
1562 	END IF;
1563 
1564     IF l_asset_in_rec.amortize_flag = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
1565 		l_asset_in_rec.amortize_flag := NULL;
1566 	END IF;
1567 
1568    	IF l_asset_in_rec.estimated_in_service_date = PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE THEN
1569 		l_asset_in_rec.estimated_in_service_date := NULL;
1570 	END IF;
1571 
1572     IF l_asset_in_rec.asset_key_ccid = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM THEN
1573 		l_asset_in_rec.asset_key_ccid := NULL;
1574 	END IF;
1575 
1576     IF l_asset_in_rec.attribute_category = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
1577 		l_asset_in_rec.attribute_category := NULL;
1578 	END IF;
1579 
1580     IF l_asset_in_rec.attribute1 = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
1581 		l_asset_in_rec.attribute1 := NULL;
1582 	END IF;
1583 
1584     IF l_asset_in_rec.attribute2 = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
1585 		l_asset_in_rec.attribute2 := NULL;
1586 	END IF;
1587 
1588     IF l_asset_in_rec.attribute3 = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
1589 		l_asset_in_rec.attribute3 := NULL;
1590 	END IF;
1591 
1592     IF l_asset_in_rec.attribute4 = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
1593 		l_asset_in_rec.attribute4 := NULL;
1594 	END IF;
1595 
1596     IF l_asset_in_rec.attribute5 = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
1597 		l_asset_in_rec.attribute5 := NULL;
1598 	END IF;
1599 
1600     IF l_asset_in_rec.attribute6 = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
1601 		l_asset_in_rec.attribute6 := NULL;
1602 	END IF;
1603 
1604     IF l_asset_in_rec.attribute7 = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
1605 		l_asset_in_rec.attribute7 := NULL;
1606 	END IF;
1607 
1608     IF l_asset_in_rec.attribute8 = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
1609 		l_asset_in_rec.attribute8 := NULL;
1610 	END IF;
1611 
1612     IF l_asset_in_rec.attribute9 = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
1613 		l_asset_in_rec.attribute9 := NULL;
1614 	END IF;
1615 
1616     IF l_asset_in_rec.attribute10 = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
1617 		l_asset_in_rec.attribute10 := NULL;
1618 	END IF;
1619 
1620     IF l_asset_in_rec.attribute11 = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
1621 		l_asset_in_rec.attribute11 := NULL;
1622 	END IF;
1623 
1624     IF l_asset_in_rec.attribute12 = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
1625 		l_asset_in_rec.attribute12 := NULL;
1626 	END IF;
1627 
1628     IF l_asset_in_rec.attribute13 = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
1629 		l_asset_in_rec.attribute13 := NULL;
1630 	END IF;
1631 
1632     IF l_asset_in_rec.attribute14 = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
1633 		l_asset_in_rec.attribute14 := NULL;
1634 	END IF;
1635 
1636     IF l_asset_in_rec.attribute15 = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
1637 		l_asset_in_rec.attribute15 := NULL;
1638 	END IF;
1639 
1640     IF l_asset_in_rec.manufacturer_name = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
1641 		l_asset_in_rec.manufacturer_name := NULL;
1642 	END IF;
1643 
1644     IF l_asset_in_rec.model_number = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
1645 		l_asset_in_rec.model_number	 := NULL;
1646 	END IF;
1647 
1648     IF l_asset_in_rec.serial_number = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
1649 		l_asset_in_rec.serial_number := NULL;
1650 	END IF;
1651 
1652     IF l_asset_in_rec.tag_number = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
1653 		l_asset_in_rec.tag_number := NULL;
1654 	END IF;
1655 
1656     IF l_asset_in_rec.ret_target_asset_id = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM THEN
1657 		l_asset_in_rec.ret_target_asset_id := NULL;
1658 	END IF;
1659 
1660     IF l_asset_in_rec.parent_asset_id = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM THEN
1661 		l_asset_in_rec.parent_asset_id := NULL;
1662 	END IF;
1663 
1664 
1665     --Get next project_asset_id sequence value
1666     SELECT  pa_project_assets_s.NEXTVAL
1667     INTO    l_asset_in_rec.pa_project_asset_id
1668     FROM    SYS.DUAL;
1669 
1670 
1671     --Insert new project asset, since all validations have passed
1672     INSERT INTO pa_project_assets_all(
1673         project_asset_id,
1674         project_id,
1675         asset_number,
1676         asset_name,
1677         asset_description,
1678         pm_product_code,
1679         pm_asset_reference,
1680         location_id,
1681         assigned_to_person_id,
1682         date_placed_in_service,
1683         asset_category_id,
1684         book_type_code,
1685         asset_units,
1686         depreciate_flag,
1687         depreciation_expense_ccid,
1688         amortize_flag,
1689         capitalized_flag,
1690         reverse_flag,
1691         capital_hold_flag,
1692         estimated_in_service_date,
1693         last_update_date,
1694         last_updated_by,
1695         created_by,
1696         creation_date,
1697         last_update_login,
1698         attribute_category,
1699         attribute1,
1700         attribute2,
1701         attribute3,
1702         attribute4,
1703         attribute5,
1704         attribute6,
1705         attribute7,
1706         attribute8,
1707         attribute9,
1708         attribute10,
1709         attribute11,
1710         attribute12,
1711         attribute13,
1712         attribute14,
1713         attribute15,
1714         org_id,
1715         asset_key_ccid,
1716         project_asset_type,
1717         estimated_cost,
1718         estimated_asset_units,
1719         manufacturer_name,
1720         model_number,
1721         tag_number,
1722         serial_number,
1723         ret_target_asset_id,
1724         parent_asset_id
1725         )
1726     VALUES (
1727         l_asset_in_rec.pa_project_asset_id,
1728         l_project_id,
1729         l_asset_in_rec.asset_number,
1730         l_asset_in_rec.pa_asset_name,
1731         RTRIM(SUBSTR(l_asset_in_rec.asset_description,1,80)),
1732         p_pm_product_code,
1733         l_asset_in_rec.pm_asset_reference,
1734         l_asset_in_rec.location_id,
1735         l_asset_in_rec.assigned_to_person_id,
1736         l_asset_in_rec.date_placed_in_service,
1737         l_asset_in_rec.asset_category_id,
1738         l_asset_in_rec.book_type_code,
1739         --l_asset_in_rec.asset_units,
1740         --Adding TRUNC until Oracle Assets allows fractional Units
1741         GREATEST(TRUNC(l_asset_in_rec.asset_units),1),
1742         NVL(l_asset_in_rec.depreciate_flag,'Y'),
1743         l_asset_in_rec.depreciation_expense_ccid,
1744         NVL(l_asset_in_rec.amortize_flag,'N'),
1745         'N', --capitalized_flag
1746         'N', --reverse_flag
1747         'N', --capital_hold_flag
1748         l_asset_in_rec.estimated_in_service_date,
1749         SYSDATE, --last_update_date
1750         FND_GLOBAL.user_id, --last_updated_by
1751         FND_GLOBAL.user_id, --created_by
1752         SYSDATE, --creation_date
1753         FND_GLOBAL.login_id, --last_update_login
1754         l_asset_in_rec.attribute_category,
1755         l_asset_in_rec.attribute1,
1756         l_asset_in_rec.attribute2,
1757         l_asset_in_rec.attribute3,
1758         l_asset_in_rec.attribute4,
1759         l_asset_in_rec.attribute5,
1760         l_asset_in_rec.attribute6,
1761         l_asset_in_rec.attribute7,
1762         l_asset_in_rec.attribute8,
1763         l_asset_in_rec.attribute9,
1764         l_asset_in_rec.attribute10,
1765         l_asset_in_rec.attribute11,
1766         l_asset_in_rec.attribute12,
1767         l_asset_in_rec.attribute13,
1768         l_asset_in_rec.attribute14,
1769         l_asset_in_rec.attribute15,
1770         mo_global.get_current_org_id ,
1771         l_asset_in_rec.asset_key_ccid,
1772         l_asset_in_rec.project_asset_type,
1773         l_asset_in_rec.estimated_cost,
1774         --l_asset_in_rec.estimated_asset_units,
1775         --Adding TRUNC until Oracle Assets allows fractional Units
1776         GREATEST(TRUNC(l_asset_in_rec.estimated_asset_units),1),
1777         l_asset_in_rec.manufacturer_name,
1778         l_asset_in_rec.model_number,
1779         l_asset_in_rec.tag_number,
1780         l_asset_in_rec.serial_number,
1781         l_asset_in_rec.ret_target_asset_id,
1782         l_asset_in_rec.parent_asset_id
1783         );
1784 
1785 
1786     --Set sucessful output variables
1787     p_pa_project_id_out		   := l_project_id;
1788     p_pa_project_number_out	   := l_amg_project_number;
1789     p_pa_project_asset_id_out  := l_asset_in_rec.pa_project_asset_id;
1790     p_pm_asset_reference_out   := l_asset_in_rec.pm_asset_reference;
1791 
1792 
1793     --Issue commit if indicated
1794     IF FND_API.to_boolean( p_commit ) THEN
1795 	   COMMIT;
1796     END IF;
1797 
1798 
1799  EXCEPTION
1800  	WHEN FND_API.G_EXC_ERROR THEN
1801 		ROLLBACK TO add_project_asset_pub;
1802 
1803 		p_return_status := FND_API.G_RET_STS_ERROR;
1804 
1805 		FND_MSG_PUB.Count_And_Get
1806 			(   p_count		=>	p_msg_count	,
1807 			    p_data		=>	p_msg_data	);
1808 
1809 	WHEN FND_API.G_EXC_UNEXPECTED_ERROR	THEN
1810 	   ROLLBACK TO add_project_asset_pub;
1811 
1812 	   p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1813 
1814 	   FND_MSG_PUB.Count_And_Get
1815 			(   p_count		=>	p_msg_count	,
1816 			    p_data		=>	p_msg_data	);
1817 
1818  	WHEN OTHERS	THEN
1819 	   ROLLBACK TO add_project_asset_pub;
1820 
1821 	   p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1822 
1823 	   IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
1824 		  FND_MSG_PUB.add_exc_msg
1825 				( p_pkg_name		=> G_PKG_NAME
1826 				, p_procedure_name	=> l_api_name	);
1827 
1828 	   END IF;
1829 
1830 	   FND_MSG_PUB.Count_And_Get
1831 			(   p_count		=>	p_msg_count	,
1832 			    p_data		=>	p_msg_data	);
1833 
1834  END add_project_asset;
1835 
1836 
1837 
1838 --------------------------------------------------------------------------------
1839 --Name:               add_asset_assignment
1840 --Type:               Procedure
1841 --Description:        This procedure adds an asset assignment to an OP project, when this is allowed.
1842 --
1843 --
1844 --
1845 --Called subprograms:
1846 --
1847 --
1848 --
1849 --History:
1850 --    15-JAN-2003    JPULTORAK       Created
1851 --
1852 PROCEDURE add_asset_assignment
1853 ( p_api_version_number		IN	NUMBER
1854  ,p_commit					IN	VARCHAR2	:= FND_API.G_FALSE
1855  ,p_init_msg_list		    IN	VARCHAR2	:= FND_API.G_FALSE
1856  ,p_msg_count				OUT NOCOPY	NUMBER
1857  ,p_msg_data				OUT NOCOPY	VARCHAR2
1858  ,p_return_status		    OUT NOCOPY	VARCHAR2
1859  ,p_pm_product_code			IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
1860  ,p_pm_project_reference	IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
1861  ,p_pa_project_id			IN	NUMBER      := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
1862  ,p_pm_task_reference	    IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
1863  ,p_pa_task_id			    IN	NUMBER      := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
1864  ,p_pm_asset_reference		IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
1865  ,p_pa_project_asset_id		IN	NUMBER      := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
1866  ,p_attribute_category		IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
1867  ,p_attribute1				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
1868  ,p_attribute2				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
1869  ,p_attribute3				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
1870  ,p_attribute4				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
1871  ,p_attribute5				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
1872  ,p_attribute6				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
1873  ,p_attribute7				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
1874  ,p_attribute8				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
1875  ,p_attribute9				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
1876  ,p_attribute10				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
1877  ,p_attribute11				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
1878  ,p_attribute12				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
1879  ,p_attribute13				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
1880  ,p_attribute14				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
1881  ,p_attribute15				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
1882  ,p_pa_task_id_out		    OUT NOCOPY	NUMBER
1883  ,p_pa_project_asset_id_out	OUT NOCOPY	NUMBER ) IS
1884 
1885 
1886     --Used to get the project number for AMG messages
1887     CURSOR l_amg_project_csr(x_project_id   NUMBER) IS
1888     SELECT  segment1
1889     FROM    pa_projects p
1890     WHERE   p.project_id = x_project_id;
1891 
1892     l_amg_project_number             pa_projects_all.segment1%TYPE;
1893 
1894 
1895     --Used to get the asset number for AMG messages
1896     CURSOR l_amg_asset_csr(x_project_asset_id   NUMBER) IS
1897     SELECT  asset_name
1898     FROM    pa_project_assets p
1899     WHERE   p.project_asset_id = x_project_asset_id;
1900 
1901     l_amg_pa_asset_name              pa_project_assets_all.asset_name%TYPE;
1902 
1903 
1904     --Used to determine if the project is CAPITAL
1905     CURSOR capital_project_cur(x_project_id   NUMBER) IS
1906     SELECT  'Project is CAPITAL'
1907     FROM    pa_projects p,
1908             pa_project_types t
1909     WHERE   p.project_id = x_project_id
1910     AND     p.project_type = t.project_type
1911     AND     t.project_type_class_code = 'CAPITAL';
1912 
1913     capital_project_rec      capital_project_cur%ROWTYPE;
1914 
1915 
1916     l_project_id                     NUMBER;
1917 
1918 
1919     --Used to determine if Task assignments exist
1920     CURSOR task_assign_cur IS
1921     SELECT  'Task Assignments Exist'
1922     FROM    pa_project_asset_assignments
1923     WHERE   project_id = l_project_id
1924     AND     task_id <> 0;
1925 
1926     task_assign_rec      task_assign_cur%ROWTYPE;
1927 
1928 
1929     --Used to determine if Project assignments exist
1930     CURSOR proj_assign_cur IS
1931     SELECT  'Project Assignments Exist'
1932     FROM    pa_project_asset_assignments
1933     WHERE   project_id = l_project_id
1934     AND     task_id = 0;
1935 
1936     proj_assign_rec      proj_assign_cur%ROWTYPE;
1937 
1938 
1939     --Used to determine if Project-level Specific Asset assignments exist
1940     CURSOR specific_assign_cur IS
1941     SELECT  'Project Specific Assignments Exist'
1942     FROM    pa_project_asset_assignments
1943     WHERE   project_id = l_project_id
1944     AND     task_id = 0
1945     AND     project_asset_id <> 0;
1946 
1947     specific_assign_rec      specific_assign_cur%ROWTYPE;
1948 
1949 
1950     --Used to determine if Project-level Common assignments exist
1951     CURSOR common_assign_cur IS
1952     SELECT  'Project Common Assignments Exist'
1953     FROM    pa_project_asset_assignments
1954     WHERE   project_id = l_project_id
1955     AND     task_id = 0
1956     AND     project_asset_id = 0;
1957 
1958     common_assign_rec      common_assign_cur%ROWTYPE;
1959 
1960 
1961     --Used to determine if Task-level Specific Asset assignments exist
1962     CURSOR task_specific_assign_cur(x_task_id  NUMBER) IS
1963     SELECT  'Project Specific Assignments Exist'
1964     FROM    pa_project_asset_assignments
1965     WHERE   project_id = l_project_id
1966     AND     task_id = x_task_id
1967     AND     project_asset_id <> 0;
1968 
1969     task_specific_assign_rec      task_specific_assign_cur%ROWTYPE;
1970 
1971 
1972     --Used to determine if Task-level Common assignments exist
1973     CURSOR task_common_assign_cur(x_task_id  NUMBER) IS
1974     SELECT  'Project Common Assignments Exist'
1975     FROM    pa_project_asset_assignments
1976     WHERE   project_id = l_project_id
1977     AND     task_id = x_task_id
1978     AND     project_asset_id = 0;
1979 
1980     task_common_assign_rec      task_common_assign_cur%ROWTYPE;
1981 
1982 
1983     --Used to determine the Top Task ID for a given Task
1984     CURSOR top_task_cur(x_task_id  NUMBER) IS
1985     SELECT  top_task_id
1986     FROM    pa_tasks
1987     WHERE   task_id = x_task_id;
1988 
1989     top_task_rec      top_task_cur%ROWTYPE;
1990 
1991 
1992     --Used to determine if the current Task has any children
1993     CURSOR child_task_cur(x_task_id  NUMBER) IS
1994     SELECT  'Child Tasks Exist'
1995     FROM    pa_tasks
1996     WHERE   parent_task_id = x_task_id;
1997 
1998     child_task_rec      child_task_cur%ROWTYPE;
1999 
2000 
2001     --Used to determine if Lowest-Task assignments exist below a given Top Task
2002     CURSOR child_assign_cur(x_task_id  NUMBER) IS
2003     SELECT  'Lowest Task Assignments Exist'
2004     FROM    pa_project_asset_assignments p,
2005             pa_tasks t
2006     WHERE   p.project_id = l_project_id
2007     AND     p.task_id = t.task_id
2008     AND     t.top_task_id = x_task_id
2009     AND     t.top_task_id <> t.task_id; --We don't care if other assignments exist for the top task itself
2010 
2011     child_assign_rec      child_assign_cur%ROWTYPE;
2012 
2013 
2014     --Used to determine if Top-Task assignments exist above a given Lowest Task
2015     CURSOR top_assign_cur(x_task_id  NUMBER) IS
2016     SELECT  'Top Task Assignments Exist'
2017     FROM    pa_project_asset_assignments p,
2018             pa_tasks t
2019     WHERE   p.project_id = l_project_id
2020     AND     p.task_id = t.top_task_id
2021     AND     t.task_id = x_task_id
2022     AND     p.task_id <> x_task_id; --We don't care if other assignments exist for the lowest task itself
2023 
2024     top_assign_rec      top_assign_cur%ROWTYPE;
2025 
2026 
2027     --Used to determine if the new assignment already exists
2028     CURSOR existing_assignment_cur (x_project_id        NUMBER,
2029                                     x_task_id           NUMBER,
2030                                     x_project_asset_id  NUMBER) IS
2031     SELECT  'Assignment Already Exists'
2032     FROM    pa_project_asset_assignments
2033     WHERE   project_id = x_project_id
2034     AND     task_id = x_task_id
2035     AND     project_asset_id = x_project_asset_id;
2036 
2037     existing_assignment_rec      existing_assignment_cur%ROWTYPE;
2038 
2039 
2040 
2041     l_api_name			   CONSTANT	 VARCHAR2(30) 		:= 'add_asset_assignment';
2042     l_return_status                  VARCHAR2(1);
2043     l_function_allowed				 VARCHAR2(1);
2044     l_resp_id					     NUMBER := 0;
2045     l_user_id		                 NUMBER := 0;
2046     l_module_name                    VARCHAR2(80);
2047     l_msg_count					     NUMBER ;
2048     l_msg_data					     VARCHAR2(2000);
2049     l_task_id                        NUMBER;
2050     l_project_asset_id               NUMBER;
2051     l_attribute_category             PA_PROJECT_ASSET_ASSIGNMENTS.attribute_category%TYPE;
2052     l_attribute1                     PA_PROJECT_ASSET_ASSIGNMENTS.attribute1%TYPE;
2053     l_attribute2                     PA_PROJECT_ASSET_ASSIGNMENTS.attribute2%TYPE;
2054     l_attribute3                     PA_PROJECT_ASSET_ASSIGNMENTS.attribute3%TYPE;
2055     l_attribute4                     PA_PROJECT_ASSET_ASSIGNMENTS.attribute4%TYPE;
2056     l_attribute5                     PA_PROJECT_ASSET_ASSIGNMENTS.attribute5%TYPE;
2057     l_attribute6                     PA_PROJECT_ASSET_ASSIGNMENTS.attribute6%TYPE;
2058     l_attribute7                     PA_PROJECT_ASSET_ASSIGNMENTS.attribute7%TYPE;
2059     l_attribute8                     PA_PROJECT_ASSET_ASSIGNMENTS.attribute8%TYPE;
2060     l_attribute9                     PA_PROJECT_ASSET_ASSIGNMENTS.attribute9%TYPE;
2061     l_attribute10                    PA_PROJECT_ASSET_ASSIGNMENTS.attribute10%TYPE;
2062     l_attribute11                    PA_PROJECT_ASSET_ASSIGNMENTS.attribute11%TYPE;
2063     l_attribute12                    PA_PROJECT_ASSET_ASSIGNMENTS.attribute12%TYPE;
2064     l_attribute13                    PA_PROJECT_ASSET_ASSIGNMENTS.attribute13%TYPE;
2065     l_attribute14                    PA_PROJECT_ASSET_ASSIGNMENTS.attribute14%TYPE;
2066     l_attribute15                    PA_PROJECT_ASSET_ASSIGNMENTS.attribute15%TYPE;
2067 
2068 
2069  BEGIN
2070 
2071     --  Standard begin of API savepoint
2072     SAVEPOINT add_asset_assignment_pub;
2073 
2074 
2075     --  Standard call to check for call compatibility.
2076     IF NOT FND_API.Compatible_API_Call ( g_api_version_number	,
2077     	    	    	    	    	 p_api_version_number	,
2078     	    	    	    	    	 l_api_name 	    	,
2079     	    	    	    	    	 G_PKG_NAME 	    	) THEN
2080 	    RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2081     END IF;
2082 
2083 
2084     --	Initialize the message table if requested.
2085     IF FND_API.TO_BOOLEAN( p_init_msg_list ) THEN
2086     	FND_MSG_PUB.initialize;
2087     END IF;
2088 
2089 
2090     --  Set API return status to success
2091     p_return_status := FND_API.G_RET_STS_SUCCESS;
2092 
2093 
2094     --  pm_product_code is mandatory
2095     IF p_pm_product_code IS NULL OR p_pm_product_code = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
2096 
2097 	    IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
2098             pa_interface_utils_pub.map_new_amg_msg
2099                 ( p_old_message_code => 'PA_PRODUCT_CODE_IS_MISSING'
2100                 ,p_msg_attribute    => 'CHANGE'
2101                 ,p_resize_flag      => 'N'
2102                 ,p_msg_context      => 'GENERAL'
2103                 ,p_attribute1       => ''
2104                 ,p_attribute2       => ''
2105                 ,p_attribute3       => ''
2106                 ,p_attribute4       => ''
2107                 ,p_attribute5       => '');
2108 	    END IF;
2109 
2110         RAISE FND_API.G_EXC_ERROR;
2111     END IF;
2112 
2113 
2114     --Initialize variables
2115     l_resp_id := FND_GLOBAL.Resp_id;
2116     l_user_id := FND_GLOBAL.User_id;
2117     l_module_name := 'PA_PM_ADD_ASSET_ASSIGNMENT';
2118 
2119 
2120 
2121     --Get Project ID from Project Reference
2122     PA_PROJECT_PVT.Convert_pm_projref_to_id
2123         (        p_pm_project_reference =>      p_pm_project_reference
2124                  ,  p_pa_project_id     =>      p_pa_project_id
2125                  ,  p_out_project_id    =>      l_project_id
2126                  ,  p_return_status     =>      l_return_status
2127         );
2128 
2129     IF (l_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
2130         RAISE  FND_API.G_EXC_UNEXPECTED_ERROR;
2131     ELSIF  (l_return_status = FND_API.G_RET_STS_ERROR) THEN
2132         RAISE  FND_API.G_EXC_ERROR;
2133     END IF;
2134 
2135     PA_INTERFACE_UTILS_PUB.G_PROJECT_ID := l_project_id;
2136 
2137 
2138     -- Get project number for AMG messages
2139     OPEN l_amg_project_csr( l_project_id );
2140     FETCH l_amg_project_csr INTO l_amg_project_number;
2141     CLOSE l_amg_project_csr;
2142 
2143 
2144     --Validate that the project is CAPITAL project type class
2145     OPEN capital_project_cur(l_project_id);
2146     FETCH capital_project_cur INTO capital_project_rec;
2147 	IF capital_project_cur%NOTFOUND THEN
2148 
2149         CLOSE capital_project_cur;
2150         -- The project must be CAPITAL. Raise error
2151         pa_interface_utils_pub.map_new_amg_msg
2152            ( p_old_message_code => 'PA_PR_NOT_CAPITAL'
2153             ,p_msg_attribute    => 'CHANGE'
2154             ,p_resize_flag      => 'N'
2155             ,p_msg_context      => 'PROJ'
2156             ,p_attribute1       => l_amg_project_number
2157             ,p_attribute2       => ''
2158             ,p_attribute3       => ''
2159             ,p_attribute4       => ''
2160             ,p_attribute5       => '');
2161 
2162         p_return_status := FND_API.G_RET_STS_ERROR;
2163 
2164         RAISE FND_API.G_EXC_ERROR;
2165 	END IF;
2166 	CLOSE capital_project_cur;
2167 
2168 
2169 
2170     -- As part of enforcing project security, which would determine
2171     -- whether the user has the necessary privileges to update the project
2172     -- need to call the pa_security package
2173 
2174     pa_security.initialize (X_user_id        => l_user_id,
2175                             X_calling_module => l_module_name);
2176 
2177     -- Actions performed using the APIs would be subject to
2178     -- function security. If the responsibility does not allow
2179     -- such functions to be executed, the API should not proceed further
2180     -- since the user does not have access to such functions
2181 
2182     -- Function security procedure check whether user have the
2183     -- privilege to add asset assignment or not
2184 
2185     PA_INTERFACE_UTILS_PUB.G_PROJECT_ID := l_project_id;
2186 
2187     PA_PM_FUNCTION_SECURITY_PUB.check_function_security
2188       (p_api_version_number => p_api_version_number,
2189        p_responsibility_id  => l_resp_id,
2190        p_function_name      => 'PA_PM_ADD_ASSET_ASSIGNMENT',
2191        p_msg_count	        => l_msg_count,
2192        p_msg_data           => l_msg_data,
2193        p_return_status	    => l_return_status,
2194        p_function_allowed   => l_function_allowed);
2195 
2196     IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
2197 		RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2198     ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
2199 		RAISE FND_API.G_EXC_ERROR;
2200     END IF;
2201 
2202     IF l_function_allowed = 'N' THEN
2203          pa_interface_utils_pub.map_new_amg_msg
2204            ( p_old_message_code => 'PA_FUNCTION_SECURITY_ENFORCED'
2205             ,p_msg_attribute    => 'CHANGE'
2206             ,p_resize_flag      => 'Y'
2207             ,p_msg_context      => 'GENERAL'
2208             ,p_attribute1       => ''
2209             ,p_attribute2       => ''
2210             ,p_attribute3       => ''
2211             ,p_attribute4       => ''
2212             ,p_attribute5       => '');
2213 	       p_return_status := FND_API.G_RET_STS_ERROR;
2214 	       RAISE FND_API.G_EXC_ERROR;
2215     END IF;
2216 
2217 
2218     -- Now verify whether project security allows the user to update the project
2219     IF pa_security.allow_query (x_project_id => l_project_id ) = 'N' THEN
2220 
2221         -- The user does not have query privileges on this project
2222         -- Hence, cannot update the project.Raise error
2223         pa_interface_utils_pub.map_new_amg_msg
2224            ( p_old_message_code => 'PA_PROJECT_SECURITY_ENFORCED'
2225             ,p_msg_attribute    => 'CHANGE'
2226             ,p_resize_flag      => 'Y'
2227             ,p_msg_context      => 'GENERAL'
2228             ,p_attribute1       => ''
2229             ,p_attribute2       => ''
2230             ,p_attribute3       => ''
2231             ,p_attribute4       => ''
2232             ,p_attribute5       => '');
2233 
2234         p_return_status := FND_API.G_RET_STS_ERROR;
2235 
2236         RAISE FND_API.G_EXC_ERROR;
2237     ELSE
2238         -- If the user has query privileges, then check whether
2239         -- update privileges are also available
2240         IF pa_security.allow_update (x_project_id => l_project_id ) = 'N' THEN
2241 
2242             -- The user does not have update privileges on this project
2243             -- Hence , raise error
2244 
2245             pa_interface_utils_pub.map_new_amg_msg
2246                 ( p_old_message_code => 'PA_PROJECT_SECURITY_ENFORCED'
2247                 ,p_msg_attribute    => 'CHANGE'
2248                 ,p_resize_flag      => 'Y'
2249                 ,p_msg_context      => 'GENERAL'
2250                 ,p_attribute1       => ''
2251                 ,p_attribute2       => ''
2252                 ,p_attribute3       => ''
2253                 ,p_attribute4       => ''
2254                 ,p_attribute5       => '');
2255 
2256 	        p_return_status := FND_API.G_RET_STS_ERROR;
2257 
2258             RAISE FND_API.G_EXC_ERROR;
2259         END IF;
2260      END IF;
2261 
2262 
2263     --Check for a Project-level assignment (Task ID = 0 or both task references are NULL)
2264     IF p_pa_task_id = 0 OR
2265         ((p_pa_task_id IS NULL OR p_pa_task_id = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM)
2266         AND (p_pm_task_reference IS NULL OR p_pm_task_reference = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR)) THEN
2267 
2268         l_task_id := 0;
2269 
2270     ELSE
2271         --Get task id, if both task references are not NULL and p_pa_task_id <> 0
2272         Pa_project_pvt.Convert_pm_taskref_to_id (
2273             p_pa_project_id       => l_project_id,
2274             p_pa_task_id          => p_pa_task_id,
2275             p_pm_task_reference   => p_pm_task_reference,
2276             p_out_task_id         => l_task_id,
2277             p_return_status       => l_return_status );
2278 
2279         IF l_return_status =  FND_API.G_RET_STS_UNEXP_ERROR THEN
2280             RAISE  FND_API.G_EXC_UNEXPECTED_ERROR;
2281         ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
2282             RAISE  FND_API.G_EXC_ERROR;
2283         END IF;
2284 
2285     END IF;
2286 
2287 
2288     --Check for a "Common" assignment (Project Asset ID = 0 or both asset references are NULL)
2289     IF p_pa_project_asset_id = 0 OR
2290         ((p_pa_project_asset_id IS NULL OR p_pa_project_asset_id = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM)
2291         AND (p_pm_asset_reference IS NULL OR p_pm_asset_reference = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR)) THEN
2292 
2293         l_project_asset_id := 0;
2294 
2295     ELSE
2296         --Get project asset id based on PM Asset Reference
2297         PA_PROJECT_ASSETS_PUB.convert_pm_assetref_to_id (
2298             p_pa_project_id        => l_project_id,
2299             p_pa_project_asset_id  => p_pa_project_asset_id,
2300             p_pm_asset_reference   => p_pm_asset_reference,
2301             p_out_project_asset_id => l_project_asset_id,
2302             p_return_status        => l_return_status );
2303 
2304         IF l_return_status =  FND_API.G_RET_STS_UNEXP_ERROR THEN
2305             RAISE  FND_API.G_EXC_UNEXPECTED_ERROR;
2306         ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
2307             RAISE  FND_API.G_EXC_ERROR;
2308         END IF;
2309 
2310     END IF;
2311 
2312 
2313 
2314     --If new assignment is Project-level, verify that no Task-level assignments exist for project
2315     IF l_task_id = 0 THEN
2316         OPEN task_assign_cur;
2317         FETCH task_assign_cur INTO task_assign_rec;
2318         IF task_assign_cur%FOUND THEN
2319 
2320             CLOSE task_assign_cur;
2321             --Task-level assignments already exist.  Raise error.
2322             pa_interface_utils_pub.map_new_amg_msg
2323                 ( p_old_message_code => 'PA_TASK_ASSIGNMENTS_EXIST'
2324                 ,p_msg_attribute    => 'CHANGE'
2325                 ,p_resize_flag      => 'N'
2326                 ,p_msg_context      => 'PROJ'
2327                 ,p_attribute1       => l_amg_project_number
2328                 ,p_attribute2       => ''
2329                 ,p_attribute3       => ''
2330                 ,p_attribute4       => ''
2331                 ,p_attribute5       => '');
2332 
2333 	        p_return_status := FND_API.G_RET_STS_ERROR;
2334 
2335             RAISE FND_API.G_EXC_ERROR;
2336         END IF;
2337 
2338         CLOSE task_assign_cur;
2339     END IF;
2340 
2341 
2342     --If new assignment is Project-level and Common, verify that no Specific Asset assignments exist
2343     IF l_task_id = 0 AND l_project_asset_id = 0 THEN
2344         OPEN specific_assign_cur;
2345         FETCH specific_assign_cur INTO specific_assign_rec;
2346         IF specific_assign_cur%FOUND THEN
2347 
2348             CLOSE specific_assign_cur;
2349             --Specific asset assignments already exist.  Raise error.
2350             pa_interface_utils_pub.map_new_amg_msg
2351                 ( p_old_message_code => 'PA_ASSET_ASSIGNMENTS_EXIST'
2352                 ,p_msg_attribute    => 'CHANGE'
2353                 ,p_resize_flag      => 'N'
2354                 ,p_msg_context      => 'PROJ'
2355                 ,p_attribute1       => l_amg_project_number
2356                 ,p_attribute2       => ''
2357                 ,p_attribute3       => ''
2358                 ,p_attribute4       => ''
2359                 ,p_attribute5       => '');
2360 
2361 	        p_return_status := FND_API.G_RET_STS_ERROR;
2362 
2363             RAISE FND_API.G_EXC_ERROR;
2364         END IF;
2365 
2366         CLOSE specific_assign_cur;
2367     END IF;
2368 
2369 
2370     --If new assignment is Project-level and Specific, verify that no Common Asset assignments exist
2371     IF l_task_id = 0 AND l_project_asset_id <> 0 THEN
2372         OPEN common_assign_cur;
2373         FETCH common_assign_cur INTO common_assign_rec;
2374         IF common_assign_cur%FOUND THEN
2375 
2376             CLOSE common_assign_cur;
2377             --Common asset assignments already exist.  Raise error.
2378             pa_interface_utils_pub.map_new_amg_msg
2379                 ( p_old_message_code => 'PA_COMMON_ASSIGN_EXISTS'
2380                 ,p_msg_attribute    => 'CHANGE'
2381                 ,p_resize_flag      => 'N'
2382                 ,p_msg_context      => 'PROJ'
2383                 ,p_attribute1       => l_amg_project_number
2384                 ,p_attribute2       => ''
2385                 ,p_attribute3       => ''
2386                 ,p_attribute4       => ''
2387                 ,p_attribute5       => '');
2388 
2389 	        p_return_status := FND_API.G_RET_STS_ERROR;
2390 
2391             RAISE FND_API.G_EXC_ERROR;
2392         END IF;
2393 
2394         CLOSE common_assign_cur;
2395     END IF;
2396 
2397 
2398 
2399     --If new assignment is Task-level, perform task-level validations
2400     IF l_task_id <> 0 THEN
2401 
2402         --Verify that no Project-level assignments exist
2403         OPEN proj_assign_cur;
2404         FETCH proj_assign_cur INTO proj_assign_rec;
2405         IF proj_assign_cur%FOUND THEN
2406 
2407             CLOSE proj_assign_cur;
2408             --Project-level assignments already exist.  Raise error.
2409             pa_interface_utils_pub.map_new_amg_msg
2410                 ( p_old_message_code => 'PA_PROJ_ASSIGNMENTS_EXIST'
2411                 ,p_msg_attribute    => 'CHANGE'
2412                 ,p_resize_flag      => 'N'
2413                 ,p_msg_context      => 'PROJ'
2414                 ,p_attribute1       => l_amg_project_number
2415                 ,p_attribute2       => ''
2416                 ,p_attribute3       => ''
2417                 ,p_attribute4       => ''
2418                 ,p_attribute5       => '');
2419 
2420 	        p_return_status := FND_API.G_RET_STS_ERROR;
2421 
2422             RAISE FND_API.G_EXC_ERROR;
2423         END IF;
2424 
2425         CLOSE proj_assign_cur;
2426 
2427 
2428         --Determine if Task is either Top or Lowest Task, and error if neither
2429         OPEN top_task_cur(l_task_id);
2430         FETCH top_task_cur INTO top_task_rec;
2431         CLOSE top_task_cur;
2432 
2433         IF top_task_rec.top_task_id = l_task_id THEN --Task is a Top Task
2434 
2435             --If new assignment is Top Task-level, verify that no Lowest Task-level assignments exist beneath Top Task
2436             OPEN child_assign_cur(l_task_id);
2437             FETCH child_assign_cur INTO child_assign_rec;
2438             IF child_assign_cur%FOUND THEN
2439 
2440                 CLOSE child_assign_cur;
2441                 --Assignments exist below this Top Task. Raise error.
2442                 pa_interface_utils_pub.map_new_amg_msg
2443                     ( p_old_message_code => 'PA_LOW_TASK_ASSIGN_EXIST'
2444                     ,p_msg_attribute    => 'CHANGE'
2445                     ,p_resize_flag      => 'N'
2446                     ,p_msg_context      => 'PROJ'
2447                     ,p_attribute1       => l_amg_project_number
2448                     ,p_attribute2       => ''
2449                     ,p_attribute3       => ''
2450                     ,p_attribute4       => ''
2451                     ,p_attribute5       => '');
2452 
2453 	            p_return_status := FND_API.G_RET_STS_ERROR;
2454 
2455                 RAISE FND_API.G_EXC_ERROR;
2456 
2457             END IF;
2458             CLOSE child_assign_cur;
2459 
2460 
2461         ELSE
2462             OPEN child_task_cur(l_task_id);
2463             FETCH child_task_cur INTO child_task_rec;
2464             IF child_task_cur%FOUND THEN
2465 
2466                 CLOSE child_task_cur;
2467                 --Task is neither top nor lowest task. Raise error.
2468                 pa_interface_utils_pub.map_new_amg_msg
2469                     ( p_old_message_code => 'PA_ASSET_ASSIGNMENTS_EXIST'
2470                     ,p_msg_attribute    => 'CHANGE'
2471                     ,p_resize_flag      => 'N'
2472                     ,p_msg_context      => 'PROJ'
2473                     ,p_attribute1       => l_amg_project_number
2474                     ,p_attribute2       => ''
2475                     ,p_attribute3       => ''
2476                     ,p_attribute4       => ''
2477                     ,p_attribute5       => '');
2478 
2479 	            p_return_status := FND_API.G_RET_STS_ERROR;
2480 
2481                 RAISE FND_API.G_EXC_ERROR;
2482 
2483             END IF;
2484             CLOSE child_task_cur;
2485 
2486             --Task is lowest task
2487 
2488             --If new assignment is Lowest Task-level, verify that no Top Task-level assignments exist above Lowest Task
2489             OPEN top_assign_cur(l_task_id);
2490             FETCH top_assign_cur INTO top_assign_rec;
2491             IF top_assign_cur%FOUND THEN
2492 
2493                 CLOSE top_assign_cur;
2494                 --Assignments exist above this Lowest Task. Raise error.
2495                 pa_interface_utils_pub.map_new_amg_msg
2496                     ( p_old_message_code => 'PA_TOP_TASK_ASSIGN_EXIST'
2497                     ,p_msg_attribute    => 'CHANGE'
2498                     ,p_resize_flag      => 'N'
2499                     ,p_msg_context      => 'PROJ'
2500                     ,p_attribute1       => l_amg_project_number
2501                     ,p_attribute2       => ''
2502                     ,p_attribute3       => ''
2503                     ,p_attribute4       => ''
2504                     ,p_attribute5       => '');
2505 
2506 	            p_return_status := FND_API.G_RET_STS_ERROR;
2507 
2508                 RAISE FND_API.G_EXC_ERROR;
2509 
2510             END IF;
2511             CLOSE top_assign_cur;
2512 
2513         END IF;
2514 
2515 
2516 
2517         --If new assignment is Task-level and Common, verify that no Specific Asset assignments exist for the task
2518         IF l_project_asset_id = 0 THEN
2519 
2520             OPEN task_specific_assign_cur(l_task_id);
2521             FETCH task_specific_assign_cur INTO task_specific_assign_rec;
2522             IF task_specific_assign_cur%FOUND THEN
2523 
2524                 CLOSE task_specific_assign_cur;
2525                 --Specific asset assignments already exist.  Raise error.
2526                 pa_interface_utils_pub.map_new_amg_msg
2527                     ( p_old_message_code => 'PA_ASSET_ASSIGNMENTS_EXIST'
2528                     ,p_msg_attribute    => 'CHANGE'
2529                     ,p_resize_flag      => 'N'
2530                     ,p_msg_context      => 'PROJ'
2531                     ,p_attribute1       => l_amg_project_number
2532                     ,p_attribute2       => ''
2533                     ,p_attribute3       => ''
2534                     ,p_attribute4       => ''
2535                     ,p_attribute5       => '');
2536 
2537 	            p_return_status := FND_API.G_RET_STS_ERROR;
2538 
2539                 RAISE FND_API.G_EXC_ERROR;
2540             END IF;
2541 
2542             CLOSE task_specific_assign_cur;
2543         END IF;
2544 
2545 
2546         --If new assignment is Task-level and Specific, verify that no Common assignment exists for the task
2547         IF l_project_asset_id <> 0 THEN
2548 
2549             OPEN task_common_assign_cur(l_task_id);
2550             FETCH task_common_assign_cur INTO task_common_assign_rec;
2551             IF task_common_assign_cur%FOUND THEN
2552 
2553                 CLOSE task_common_assign_cur;
2554                 --Common asset assignments already exist.  Raise error.
2555                 pa_interface_utils_pub.map_new_amg_msg
2556                     ( p_old_message_code => 'PA_COMMON_ASSIGN_EXISTS'
2557                     ,p_msg_attribute    => 'CHANGE'
2558                     ,p_resize_flag      => 'N'
2559                     ,p_msg_context      => 'PROJ'
2560                     ,p_attribute1       => l_amg_project_number
2561                     ,p_attribute2       => ''
2562                     ,p_attribute3       => ''
2563                     ,p_attribute4       => ''
2564                     ,p_attribute5       => '');
2565 
2566 	            p_return_status := FND_API.G_RET_STS_ERROR;
2567 
2568                 RAISE FND_API.G_EXC_ERROR;
2569             END IF;
2570 
2571             CLOSE task_common_assign_cur;
2572         END IF;
2573 
2574     END IF; --Task-Level Validations
2575 
2576 
2577     --Populate attributes for insert
2578     l_attribute_category := p_attribute_category;
2579     l_attribute1 := p_attribute1;
2580     l_attribute2 := p_attribute2;
2581     l_attribute3 := p_attribute3;
2582     l_attribute4 := p_attribute4;
2583     l_attribute5 := p_attribute5;
2584     l_attribute6 := p_attribute6;
2585     l_attribute7 := p_attribute7;
2586     l_attribute8 := p_attribute8;
2587     l_attribute9 := p_attribute9;
2588     l_attribute10 := p_attribute10;
2589     l_attribute11 := p_attribute11;
2590     l_attribute12 := p_attribute12;
2591     l_attribute13 := p_attribute13;
2592     l_attribute14 := p_attribute14;
2593     l_attribute15 := p_attribute15;
2594 
2595 
2596     --Set any unspecified values to NULL
2597     IF p_attribute_category = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
2598         l_attribute_category := NULL;
2599     END IF;
2600 
2601     IF p_attribute1 = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
2602         l_attribute1 := NULL;
2603     END IF;
2604 
2605     IF p_attribute2 = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
2606         l_attribute2 := NULL;
2607     END IF;
2608 
2609     IF p_attribute3 = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
2610         l_attribute3 := NULL;
2611     END IF;
2612 
2613     IF p_attribute4 = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
2614         l_attribute4 := NULL;
2615     END IF;
2616 
2617     IF p_attribute5 = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
2618         l_attribute5 := NULL;
2619     END IF;
2620 
2621     IF p_attribute6 = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
2622         l_attribute6 := NULL;
2623     END IF;
2624 
2625     IF p_attribute7 = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
2626         l_attribute7 := NULL;
2627     END IF;
2628 
2629     IF p_attribute8 = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
2630         l_attribute8 := NULL;
2631     END IF;
2632 
2633     IF p_attribute9 = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
2634         l_attribute9 := NULL;
2635     END IF;
2636 
2637     IF p_attribute10 = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
2638         l_attribute10 := NULL;
2639     END IF;
2640 
2641     IF p_attribute11 = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
2642         l_attribute11 := NULL;
2643     END IF;
2644 
2645     IF p_attribute12 = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
2646         l_attribute12 := NULL;
2647     END IF;
2648 
2649     IF p_attribute13 = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
2650         l_attribute13 := NULL;
2651     END IF;
2652 
2653     IF p_attribute14 = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
2654         l_attribute14 := NULL;
2655     END IF;
2656 
2657     IF p_attribute15 = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
2658         l_attribute15 := NULL;
2659     END IF;
2660 
2661 
2662 
2663     --Before inserting, check if an assignment exists which matches the current assignment exactly
2664     OPEN existing_assignment_cur(l_project_id, l_task_id, l_project_asset_id);
2665     FETCH existing_assignment_cur INTO existing_assignment_rec;
2666     IF existing_assignment_cur%NOTFOUND THEN
2667 
2668         --Insert new assignment
2669         INSERT INTO pa_project_asset_assignments
2670             (project_asset_id,
2671             task_id,
2672             project_id,
2673             last_update_date,
2674             last_updated_by,
2675             creation_date,
2676             created_by,
2677             last_update_login,
2678             attribute_category,
2679             attribute1,
2680             attribute2,
2681             attribute3,
2682             attribute4,
2683             attribute5,
2684             attribute6,
2685             attribute7,
2686             attribute8,
2687             attribute9,
2688             attribute10,
2689             attribute11,
2690             attribute12,
2691             attribute13,
2692             attribute14,
2693             attribute15
2694             )
2695         VALUES
2696             (l_project_asset_id,
2697             l_task_id,
2698             l_project_id,
2699             SYSDATE, --last_update_date
2700             FND_GLOBAL.user_id, --last_updated_by
2701             SYSDATE, --creation_date
2702             FND_GLOBAL.user_id, --created_by
2703             FND_GLOBAL.login_id, --last_update_login
2704             l_attribute_category,
2705             l_attribute1,
2706             l_attribute2,
2707             l_attribute3,
2708             l_attribute4,
2709             l_attribute5,
2710             l_attribute6,
2711             l_attribute7,
2712             l_attribute8,
2713             l_attribute9,
2714             l_attribute10,
2715             l_attribute11,
2716             l_attribute12,
2717             l_attribute13,
2718             l_attribute14,
2719             l_attribute15
2720             );
2721     END IF; --No matching assignment currently exists
2722     CLOSE existing_assignment_cur;
2723 
2724 
2725     --Populate OUT parameters
2726     p_pa_task_id_out := l_task_id;
2727     p_pa_project_asset_id_out := l_project_asset_id;
2728 
2729 
2730     --Perform commit if indicated
2731     IF FND_API.to_boolean( p_commit ) THEN
2732 	    COMMIT;
2733     END IF;
2734 
2735 
2736 
2737  EXCEPTION
2738   	WHEN FND_API.G_EXC_ERROR THEN
2739 		ROLLBACK TO add_asset_assignment_pub;
2740 
2741 		p_return_status := FND_API.G_RET_STS_ERROR;
2742 
2743 		FND_MSG_PUB.Count_And_Get
2744 			(   p_count		=>	p_msg_count	,
2745 			    p_data		=>	p_msg_data	);
2746 
2747 	WHEN FND_API.G_EXC_UNEXPECTED_ERROR	THEN
2748 	   ROLLBACK TO add_asset_assignment_pub;
2749 
2750 	   p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2751 
2752 	   FND_MSG_PUB.Count_And_Get
2753 			(   p_count		=>	p_msg_count	,
2754 			    p_data		=>	p_msg_data	);
2755 
2756  	WHEN OTHERS	THEN
2757 	   ROLLBACK TO add_asset_assignment_pub;
2758 
2759 	   p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2760 
2761 	   IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
2762 		  FND_MSG_PUB.add_exc_msg
2763 				( p_pkg_name		=> G_PKG_NAME
2764 				, p_procedure_name	=> l_api_name	);
2765 
2766 	   END IF;
2767 
2768 	   FND_MSG_PUB.Count_And_Get
2769 			(   p_count		=>	p_msg_count	,
2770 			    p_data		=>	p_msg_data	);
2771 
2772  END add_asset_assignment;
2773 
2774 
2775 
2776 --------------------------------------------------------------------------------
2777 --Name:               update_project_asset
2778 --Type:               Procedure
2779 --Description:        This procedure updates a project asset to an OP project, when this is allowed.
2780 --
2781 --
2782 --
2783 --Called subprograms:
2784 --
2785 --
2786 --
2787 --History:
2788 --    15-JAN-2003    JPULTORAK       Created
2789 --    15-Mar-2005    ANIGAM          Bug 4228421: Added an if condition to handle the case when the following attributes are null:
2790 --                                   ASSET NUMBER, ASSET UNITS, MANUFACTURER_NAME,MODEL_NUMBER,SERIAL_NUMBER, attribute_category,
2791 --				     attribute1, attribute2, attribute3, attribute4, attribute5, attribute6, attribute7, attribute8,
2792 --				     attribute9, attribute10, attribute11, attribute12, attribute13, attribute14, attribute15,
2793 --				     while performing validations and checks to see if fields have been changed.
2794 --
2795 PROCEDURE update_project_asset
2796 ( p_api_version_number		IN	NUMBER
2797  ,p_commit					IN	VARCHAR2	:= FND_API.G_FALSE
2798  ,p_init_msg_list		    IN	VARCHAR2	:= FND_API.G_FALSE
2799  ,p_msg_count				OUT NOCOPY	NUMBER
2800  ,p_msg_data				OUT NOCOPY	VARCHAR2
2801  ,p_return_status		    OUT	 NOCOPY VARCHAR2
2802  ,p_pm_product_code			IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2803  ,p_pm_project_reference	IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2804  ,p_pa_project_id			IN	NUMBER      := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
2805  ,p_pm_asset_reference		IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2806  ,p_pa_project_asset_id	    IN	NUMBER      := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
2807  ,p_pa_asset_name			IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2808  ,p_asset_number			IN	VARCHAR2	:= PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2809  ,p_asset_description		IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2810  ,p_project_asset_type		IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2811  ,p_location_id				IN	NUMBER      := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
2812  ,p_assigned_to_person_id	IN 	NUMBER      := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
2813  ,p_date_placed_in_service	IN 	DATE        := PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE
2814  ,p_asset_category_id		IN	NUMBER      := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
2815  ,p_book_type_code			IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2816  ,p_asset_units				IN	NUMBER      := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
2817  ,p_estimated_asset_units	IN	NUMBER      := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
2818  ,p_estimated_cost			IN	NUMBER      := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
2819  ,p_depreciate_flag			IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2820  ,p_depreciation_expense_ccid IN	NUMBER  := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
2821  ,p_amortize_flag			IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2822  ,p_estimated_in_service_date IN	DATE    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE
2823  ,p_asset_key_ccid			IN	NUMBER      := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
2824  ,p_attribute_category		IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2825  ,p_attribute1				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2826  ,p_attribute2				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2827  ,p_attribute3				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2828  ,p_attribute4				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2829  ,p_attribute5				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2830  ,p_attribute6				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2831  ,p_attribute7				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2832  ,p_attribute8				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2833  ,p_attribute9				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2834  ,p_attribute10				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2835  ,p_attribute11				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2836  ,p_attribute12				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2837  ,p_attribute13				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2838  ,p_attribute14				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2839  ,p_attribute15				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2840  ,p_parent_asset_id		    IN	NUMBER      := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
2841  ,p_manufacturer_name		IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2842  ,p_model_number			IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2843  ,p_serial_number			IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2844  ,p_tag_number				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2845  ,p_ret_target_asset_id		IN	NUMBER      := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
2846  ,p_pa_project_id_out		OUT NOCOPY	NUMBER
2847  ,p_pa_project_number_out	OUT NOCOPY	VARCHAR2
2848  ,p_pa_project_asset_id_out	OUT	NOCOPY NUMBER
2849  ,p_pm_asset_reference_out  OUT NOCOPY VARCHAR2) IS
2850 
2851 
2852      --Used to get the project number for AMG messages
2853     CURSOR l_amg_project_csr(x_project_id   NUMBER) IS
2854     SELECT  segment1
2855     FROM    pa_projects p
2856     WHERE   p.project_id = x_project_id;
2857 
2858     l_amg_project_number             pa_projects_all.segment1%TYPE;
2859 
2860 
2861     --Used to get the asset number for AMG messages
2862     CURSOR l_amg_asset_csr(x_project_asset_id   NUMBER) IS
2863     SELECT  asset_name
2864     FROM    pa_project_assets p
2865     WHERE   p.project_asset_id = x_project_asset_id;
2866 
2867     l_amg_pa_asset_name              pa_project_assets_all.asset_name%TYPE;
2868 
2869 
2870     --Used to determine if the project is CAPITAL
2871     CURSOR capital_project_cur(x_project_id   NUMBER) IS
2872     SELECT  'Project is CAPITAL'
2873     FROM    pa_projects p,
2874             pa_project_types t
2875     WHERE   p.project_id = x_project_id
2876     AND     p.project_type = t.project_type
2877     AND     t.project_type_class_code = 'CAPITAL';
2878 
2879     capital_project_rec      capital_project_cur%ROWTYPE;
2880 
2881 
2882     CURSOR l_lock_rows_csr( x_project_asset_id NUMBER) IS
2883     SELECT  'x'
2884     FROM	pa_project_assets_all
2885     WHERE   project_asset_id = x_project_asset_id
2886     FOR UPDATE NOWAIT;
2887 
2888 
2889     CURSOR  l_asset_cur (x_project_id NUMBER, x_project_asset_id NUMBER) IS
2890     SELECT  *
2891     FROM    pa_project_assets_all
2892     WHERE   project_id = x_project_id
2893     AND     project_asset_id = x_project_asset_id;
2894 
2895     l_asset_rec         l_asset_cur%ROWTYPE;
2896 
2897 
2898     --USed to determine if Project Asset Type is valid
2899     CURSOR  valid_type_cur IS
2900     SELECT  meaning
2901     FROM    pa_lookups
2902     WHERE   lookup_type = 'PROJECT_ASSET_TYPES'
2903     AND     lookup_code = p_project_asset_type;
2904 
2905     valid_type_rec      valid_type_cur%ROWTYPE;
2906 
2907     --Used to determine if asset ref is unique within project
2908     CURSOR  unique_ref_cur(x_project_id  NUMBER) IS
2909     SELECT  'Asset Ref Exists'
2910     FROM    pa_project_assets_all
2911     WHERE   project_id = x_project_id
2912     AND     pm_asset_reference = p_pm_asset_reference;
2913 
2914     unique_ref_rec      unique_ref_cur%ROWTYPE;
2915 
2916 
2917     --Used to determine if asset name is unique within project
2918     CURSOR  unique_name_cur(x_project_id  NUMBER) IS
2919     SELECT  'Asset Name Exists'
2920     FROM    pa_project_assets_all
2921     WHERE   project_id = x_project_id
2922     AND     asset_name = p_pa_asset_name;
2923 
2924     unique_name_rec      unique_name_cur%ROWTYPE;
2925 
2926 
2927     --Used to determine if asset number is unique
2928     CURSOR  unique_number_cur IS
2929     SELECT  'Asset Number Exists'
2930     FROM    pa_project_assets_all
2931     WHERE   asset_number = p_asset_number;
2932 
2933     unique_number_rec      unique_number_cur%ROWTYPE;
2934 
2935 
2936     --Used to determine if Tag Number is unique in Oracle Assets
2937     CURSOR  unique_tag_number_fa_cur IS
2938     SELECT  'Tag Number Exists'
2939     FROM    fa_additions
2940     WHERE   tag_number = p_tag_number;
2941 
2942     unique_tag_number_fa_rec      unique_tag_number_fa_cur%ROWTYPE;
2943 
2944 
2945     --Used to determine if Tag Number is unique in Oracle Projects
2946     CURSOR  unique_tag_number_pa_cur IS
2947     SELECT  'Tag Number Exists'
2948     FROM    pa_project_assets_all
2949     WHERE   tag_number = p_tag_number;
2950 
2951     unique_tag_number_pa_rec      unique_tag_number_pa_cur%ROWTYPE;
2952 
2953 
2954     --Used to determine if asset location is valid
2955     CURSOR  asset_location_cur IS
2956     SELECT  'Asset Location Exists'
2957     FROM    fa_locations
2958     WHERE   location_id = p_location_id
2959     AND     enabled_flag = 'Y';
2960 
2961     asset_location_rec      asset_location_cur%ROWTYPE;
2962 
2963 
2964     --Used to determine if assigned to person is valid
2965     CURSOR  people_cur IS
2966     SELECT  'Person Exists'
2967     FROM    per_people_x
2968     WHERE   person_id = p_assigned_to_person_id
2969     --CWK changes, added the below condition
2970     AND     nvl(current_employee_flag, 'N') = 'Y';
2971 
2972     people_rec      people_cur%ROWTYPE;
2973 
2974 
2975     --Used to determine if the book type code is valid for the current SOB
2976     CURSOR  book_type_code_cur IS
2977     SELECT  'Book Type Code is valid'
2978     FROM    fa_book_controls fb,
2979             pa_implementations pi
2980     WHERE   fb.set_of_books_id = pi.set_of_books_id
2981     AND     fb.book_type_code = p_book_type_code
2982     AND     fb.book_class = 'CORPORATE';
2983 
2984     book_type_code_rec      book_type_code_cur%ROWTYPE;
2985 
2986 
2987     --Used to identify default book type code, if specified
2988     CURSOR  default_book_type_code_cur IS
2989     SELECT  pi.book_type_code
2990     FROM    pa_implementations pi
2991     WHERE   pi.book_type_code IS NOT NULL;
2992 
2993 
2994     --Used to determine if the asset category is valid
2995     CURSOR  asset_category_cur IS
2996     SELECT  'Asset Category is valid'
2997     FROM    fa_categories
2998     WHERE   category_id = p_asset_category_id
2999     AND     enabled_flag = 'Y';
3000 
3001     asset_category_rec      asset_category_cur%ROWTYPE;
3002 
3003 
3004     l_book_type_code                 FA_BOOK_CONTROLS.book_type_code%TYPE;
3005     l_date_placed_in_service         DATE;
3006     l_estimated_in_service_date      DATE;
3007     l_depreciate_flag                FA_CATEGORY_BOOK_DEFAULTS.depreciate_flag%TYPE := NULL;
3008     l_amortize_flag                  FA_BOOK_CONTROLS.amortize_flag%TYPE := NULL;
3009 
3010 
3011     --Used to determine if Parent Asset ID is valid in Oracle Assets
3012     CURSOR  parent_asset_cur IS
3013     SELECT  'Parent Asset Number Exists'
3014     FROM    fa_additions
3015     WHERE   asset_id = p_parent_asset_id
3016     AND     asset_type <> 'GROUP';
3017 
3018     parent_asset_rec      parent_asset_cur%ROWTYPE;
3019 
3020 
3021     --Used to determine if Parent Asset ID is valid for Book specified
3022     CURSOR  parent_asset_book_cur(x_parent_asset_id  NUMBER) IS
3023     SELECT  'Parent Asset Number Exists in Book'
3024     FROM    fa_additions fa,
3025             fa_books fb
3026     WHERE   fa.asset_id = x_parent_asset_id
3027     AND     fa.asset_type <> 'GROUP'
3028     AND     fa.asset_id = fb.asset_id
3029     AND     fb.book_type_code = l_book_type_code
3030     AND     fb.date_ineffective IS NULL;
3031 
3032     parent_asset_book_rec      parent_asset_book_cur%ROWTYPE;
3033 
3034 
3035     --Used to determine if the category/books combination is valid
3036     CURSOR  category_books_cur(x_asset_category_id  NUMBER) IS
3037     SELECT  'Category/Books combination is valid'
3038     FROM    fa_category_books
3039     WHERE   category_id = x_asset_category_id
3040     AND     book_type_code = l_book_type_code;
3041 
3042     category_books_rec      category_books_cur%ROWTYPE;
3043 
3044 
3045     --Used to default the depreciate_flag from category book defaults
3046     CURSOR  depreciate_flag_cur IS
3047     SELECT  SUBSTR(depreciate_flag,1,1)
3048     FROM    fa_category_book_defaults
3049     WHERE   category_id = p_asset_category_id
3050     AND     book_type_code = l_book_type_code
3051     AND     NVL(l_date_placed_in_service,NVL(l_estimated_in_service_date,TRUNC(SYSDATE)))
3052         BETWEEN start_dpis AND NVL(end_dpis,NVL(l_date_placed_in_service,NVL(l_estimated_in_service_date,TRUNC(SYSDATE))));
3053 
3054 
3055     l_depreciation_expense_ccid      NUMBER;
3056 
3057     --Used to determine if the Depreciation Expense CCID is valid for the current COA
3058     CURSOR  deprn_expense_cur IS
3059     SELECT  'Deprn Expense Acct code combination is valid'
3060     FROM    gl_code_combinations gcc,
3061             gl_sets_of_books gsob,
3062             pa_implementations pi
3063     WHERE   gcc.code_combination_id = l_depreciation_expense_ccid
3064     AND     gcc.chart_of_accounts_id = gsob.chart_of_accounts_id
3065     AND     gsob.set_of_books_id = pi.set_of_books_id
3066     AND     gcc.account_type = 'E';
3067 
3068     deprn_expense_rec      deprn_expense_cur%ROWTYPE;
3069 
3070 
3071     --Used to determine if the asset key is valid
3072     CURSOR  asset_key_cur IS
3073     SELECT  'Asset Key is valid'
3074     FROM    fa_asset_keywords
3075     WHERE   code_combination_id = p_asset_key_ccid
3076     AND     enabled_flag = 'Y';
3077 
3078     asset_key_rec      asset_key_cur%ROWTYPE;
3079 
3080 
3081     --Used to determine if the Ret Target Asset ID is a valid GROUP asset in the book
3082     CURSOR  ret_target_cur IS
3083     SELECT  fa.asset_category_id
3084     FROM    fa_books fb,
3085             fa_additions fa
3086     WHERE   fa.asset_id = p_ret_target_asset_id
3087     AND     fa.asset_type = 'GROUP'
3088     AND     fa.asset_id = fb.asset_id
3089     AND     fb.book_type_code = l_book_type_code
3090     AND     fb.date_ineffective IS NULL;
3091 
3092     ret_target_rec      ret_target_cur%ROWTYPE;
3093 
3094 
3095 
3096 
3097     l_api_name			   CONSTANT	 VARCHAR2(30) 		:= 'update_project_asset';
3098     l_update_yes_flag                VARCHAR2(1) := 'N';
3099     l_updated_dpis                   VARCHAR2(1) := 'N';
3100     l_updated_category_id            VARCHAR2(1) := 'N';
3101     l_updated_book_type_code         VARCHAR2(1) := 'N';
3102     l_updated_proj_asset_type        VARCHAR2(1) := 'N';
3103     l_updated_deprn_expense_ccid     VARCHAR2(1) := 'N';
3104     l_updated_location_id            VARCHAR2(1) := 'N';
3105     l_updated_asset_key_ccid         VARCHAR2(1) := 'N';
3106     l_statement                      VARCHAR2(2000);
3107     l_cursor                         INTEGER;
3108     l_rows                           INTEGER;
3109     l_project_asset_id               NUMBER := 0;
3110     l_pm_asset_reference             PA_PROJECT_ASSETS_ALL.pm_asset_reference%TYPE;
3111     l_project_id                     NUMBER;
3112     l_return_status                  VARCHAR2(1);
3113     l_function_allowed				 VARCHAR2(1);
3114     l_resp_id					     NUMBER := 0;
3115     l_user_id		                 NUMBER := 0;
3116     l_module_name                    VARCHAR2(80);
3117     l_msg_count					     NUMBER ;
3118     l_msg_data					     VARCHAR2(2000);
3119     v_intf_complete_asset_flag       VARCHAR2(1);
3120     v_asset_key_required             VARCHAR2(1);
3121     v_depreciation_expense_ccid      NUMBER;
3122     l_ovr_deprn_expense_ccid         NUMBER;
3123     l_asset_category_id              NUMBER;
3124     l_dpis                           DATE;
3125 
3126     --Variables used for validation of required Asset KFF segments
3127     fftype          FND_FLEX_KEY_API.FLEXFIELD_TYPE;
3128     numstruct       NUMBER;
3129     structnum       NUMBER;
3130     liststruct      FND_FLEX_KEY_API.STRUCTURE_LIST;
3131     thestruct       FND_FLEX_KEY_API.STRUCTURE_TYPE;
3132     numsegs         NUMBER;
3133     listsegs        FND_FLEX_KEY_API.SEGMENT_LIST;
3134     segtype         FND_FLEX_KEY_API.SEGMENT_TYPE;
3135     segname         FND_ID_FLEX_SEGMENTS.SEGMENT_NAME%TYPE;
3136 
3137     --Variables used as Bind Parameters for the Dynamic SQL Construct
3138     b_pm_asset_reference            PA_PROJECT_ASSETS_ALL.pm_asset_reference%TYPE;
3139     b_pa_asset_name                 PA_PROJECT_ASSETS_ALL.asset_name%TYPE;
3140     b_asset_description             PA_PROJECT_ASSETS_ALL.asset_description%TYPE;
3141     b_date_placed_in_service        PA_PROJECT_ASSETS_ALL.date_placed_in_service%TYPE;
3142     b_project_asset_type            PA_PROJECT_ASSETS_ALL.project_asset_type%TYPE;
3143     b_asset_number                  PA_PROJECT_ASSETS_ALL.asset_number%TYPE;
3144     b_location_id                   PA_PROJECT_ASSETS_ALL.location_id%TYPE;
3145     b_assigned_to_person_id         PA_PROJECT_ASSETS_ALL.assigned_to_person_id%TYPE;
3146     b_book_type_code                PA_PROJECT_ASSETS_ALL.book_type_code%TYPE;
3147     b_parent_asset_id               PA_PROJECT_ASSETS_ALL.parent_asset_id%TYPE;
3148     b_asset_category_id             PA_PROJECT_ASSETS_ALL.asset_category_id%TYPE;
3149     b_amortize_flag                 PA_PROJECT_ASSETS_ALL.amortize_flag%TYPE;
3150     b_depreciate_flag               PA_PROJECT_ASSETS_ALL.depreciate_flag%TYPE;
3151     b_depreciation_expense_ccid     PA_PROJECT_ASSETS_ALL.depreciation_expense_ccid%TYPE;
3152     b_asset_key_ccid                PA_PROJECT_ASSETS_ALL.asset_key_ccid%TYPE;
3153     b_ret_target_asset_id           PA_PROJECT_ASSETS_ALL.ret_target_asset_id%TYPE;
3154     b_asset_units                   PA_PROJECT_ASSETS_ALL.asset_units%TYPE;
3155     b_estimated_asset_units         PA_PROJECT_ASSETS_ALL.estimated_asset_units%TYPE;
3156     b_estimated_cost                PA_PROJECT_ASSETS_ALL.estimated_cost%TYPE;
3157     b_estimated_in_service_date     PA_PROJECT_ASSETS_ALL.estimated_in_service_date%TYPE; --Added for bug 4744574
3158     b_manufacturer_name             PA_PROJECT_ASSETS_ALL.manufacturer_name%TYPE;
3159     b_model_number                  PA_PROJECT_ASSETS_ALL.model_number%TYPE;
3160     b_tag_number                    PA_PROJECT_ASSETS_ALL.tag_number%TYPE;
3161     b_serial_number                 PA_PROJECT_ASSETS_ALL.serial_number%TYPE;
3162     b_attribute_category            PA_PROJECT_ASSETS_ALL.attribute_category%TYPE;
3163     b_attribute1                    PA_PROJECT_ASSETS_ALL.attribute1%TYPE;
3164     b_attribute2                    PA_PROJECT_ASSETS_ALL.attribute2%TYPE;
3165     b_attribute3                    PA_PROJECT_ASSETS_ALL.attribute3%TYPE;
3166     b_attribute4                    PA_PROJECT_ASSETS_ALL.attribute4%TYPE;
3167     b_attribute5                    PA_PROJECT_ASSETS_ALL.attribute5%TYPE;
3168     b_attribute6                    PA_PROJECT_ASSETS_ALL.attribute6%TYPE;
3169     b_attribute7                    PA_PROJECT_ASSETS_ALL.attribute7%TYPE;
3170     b_attribute8                    PA_PROJECT_ASSETS_ALL.attribute8%TYPE;
3171     b_attribute9                    PA_PROJECT_ASSETS_ALL.attribute9%TYPE;
3172     b_attribute10                   PA_PROJECT_ASSETS_ALL.attribute10%TYPE;
3173     b_attribute11                   PA_PROJECT_ASSETS_ALL.attribute11%TYPE;
3174     b_attribute12                   PA_PROJECT_ASSETS_ALL.attribute12%TYPE;
3175     b_attribute13                   PA_PROJECT_ASSETS_ALL.attribute13%TYPE;
3176     b_attribute14                   PA_PROJECT_ASSETS_ALL.attribute14%TYPE;
3177     b_attribute15                   PA_PROJECT_ASSETS_ALL.attribute15%TYPE;
3178 
3179 
3180  BEGIN
3181 
3182     --  Standard begin of API savepoint
3183     SAVEPOINT update_project_asset_pub;
3184 
3185 
3186     --  Standard call to check for call compatibility.
3187     IF NOT FND_API.Compatible_API_Call ( g_api_version_number	,
3188     	    	    	    	    	 p_api_version_number	,
3189     	    	    	    	    	 l_api_name 	    	,
3190     	    	    	    	    	 G_PKG_NAME 	    	) THEN
3191 	    RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3192     END IF;
3193 
3194 
3195     --	Initialize the message table if requested.
3196     IF FND_API.TO_BOOLEAN( p_init_msg_list ) THEN
3197     	FND_MSG_PUB.initialize;
3198     END IF;
3199 
3200 
3201     --  Set API return status to success
3202     p_return_status := FND_API.G_RET_STS_SUCCESS;
3203 
3204 
3205     --  pm_product_code is mandatory
3206     IF p_pm_product_code IS NULL OR p_pm_product_code = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
3207 
3208 	    IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
3209             pa_interface_utils_pub.map_new_amg_msg
3210                 ( p_old_message_code => 'PA_PRODUCT_CODE_IS_MISSING'
3211                 ,p_msg_attribute    => 'CHANGE'
3212                 ,p_resize_flag      => 'N'
3213                 ,p_msg_context      => 'GENERAL'
3214                 ,p_attribute1       => ''
3215                 ,p_attribute2       => ''
3216                 ,p_attribute3       => ''
3217                 ,p_attribute4       => ''
3218                 ,p_attribute5       => '');
3219 	    END IF;
3220 
3221         RAISE FND_API.G_EXC_ERROR;
3222     END IF;
3223 
3224 
3225     --Initialize variables
3226     l_resp_id := FND_GLOBAL.Resp_id;
3227     l_user_id := FND_GLOBAL.User_id;
3228     l_module_name := 'PA_PM_UPDATE_PROJECT_ASSET';
3229 
3230 
3231     --Get Project ID from Project Reference
3232     PA_PROJECT_PVT.Convert_pm_projref_to_id
3233         (        p_pm_project_reference =>      p_pm_project_reference
3234                  ,  p_pa_project_id     =>      p_pa_project_id
3235                  ,  p_out_project_id    =>      l_project_id
3236                  ,  p_return_status     =>      l_return_status
3237         );
3238 
3239     IF (l_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
3240         RAISE  FND_API.G_EXC_UNEXPECTED_ERROR;
3241     ELSIF  (l_return_status = FND_API.G_RET_STS_ERROR) THEN
3242         RAISE  FND_API.G_EXC_ERROR;
3243     END IF;
3244 
3245     PA_INTERFACE_UTILS_PUB.G_PROJECT_ID := l_project_id;
3246 
3247 
3248     -- Get project number for AMG messages
3249     OPEN l_amg_project_csr( l_project_id );
3250     FETCH l_amg_project_csr INTO l_amg_project_number;
3251     CLOSE l_amg_project_csr;
3252 
3253 
3254     --Validate that the project is CAPITAL project type class
3255     OPEN capital_project_cur(l_project_id);
3256     FETCH capital_project_cur INTO capital_project_rec;
3257 	IF capital_project_cur%NOTFOUND THEN
3258 
3259         CLOSE capital_project_cur;
3260         -- The project must be CAPITAL. Raise error
3261         pa_interface_utils_pub.map_new_amg_msg
3262            ( p_old_message_code => 'PA_PR_NOT_CAPITAL'
3263             ,p_msg_attribute    => 'CHANGE'
3264             ,p_resize_flag      => 'N'
3265             ,p_msg_context      => 'PROJ'
3266             ,p_attribute1       => l_amg_project_number
3267             ,p_attribute2       => ''
3268             ,p_attribute3       => ''
3269             ,p_attribute4       => ''
3270             ,p_attribute5       => '');
3271 
3272         p_return_status := FND_API.G_RET_STS_ERROR;
3273 
3274         RAISE FND_API.G_EXC_ERROR;
3275 	END IF;
3276 	CLOSE capital_project_cur;
3277 
3278 
3279 
3280     -- As part of enforcing project security, which would determine
3281     -- whether the user has the necessary privileges to update the project
3282     -- need to call the pa_security package
3283 
3284     pa_security.initialize (X_user_id        => l_user_id,
3285                             X_calling_module => l_module_name);
3286 
3287     -- Actions performed using the APIs would be subject to
3288     -- function security. If the responsibility does not allow
3289     -- such functions to be executed, the API should not proceed further
3290     -- since the user does not have access to such functions
3291 
3292     -- Function security procedure check whether user have the
3293     -- privilege to update project asset or not
3294 
3295     PA_INTERFACE_UTILS_PUB.G_PROJECT_ID := l_project_id;
3296 
3297     PA_PM_FUNCTION_SECURITY_PUB.check_function_security
3298       (p_api_version_number => p_api_version_number,
3299        p_responsibility_id  => l_resp_id,
3300        p_function_name      => 'PA_PM_UPDATE_PROJECT_ASSET',
3301        p_msg_count	        => l_msg_count,
3302        p_msg_data           => l_msg_data,
3303        p_return_status	    => l_return_status,
3304        p_function_allowed   => l_function_allowed);
3305 
3306     IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
3307 		RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3308     ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
3309 		RAISE FND_API.G_EXC_ERROR;
3310     END IF;
3311 
3312     IF l_function_allowed = 'N' THEN
3313          pa_interface_utils_pub.map_new_amg_msg
3314            ( p_old_message_code => 'PA_FUNCTION_SECURITY_ENFORCED'
3315             ,p_msg_attribute    => 'CHANGE'
3316             ,p_resize_flag      => 'Y'
3317             ,p_msg_context      => 'GENERAL'
3318             ,p_attribute1       => ''
3319             ,p_attribute2       => ''
3320             ,p_attribute3       => ''
3321             ,p_attribute4       => ''
3322             ,p_attribute5       => '');
3323 	       p_return_status := FND_API.G_RET_STS_ERROR;
3324 	       RAISE FND_API.G_EXC_ERROR;
3325     END IF;
3326 
3327 
3328 
3329     -- Now verify whether project security allows the user to update the project
3330     IF pa_security.allow_query (x_project_id => l_project_id ) = 'N' THEN
3331 
3332         -- The user does not have query privileges on this project
3333         -- Hence, cannot update the project.Raise error
3334         pa_interface_utils_pub.map_new_amg_msg
3335            ( p_old_message_code => 'PA_PROJECT_SECURITY_ENFORCED'
3336             ,p_msg_attribute    => 'CHANGE'
3337             ,p_resize_flag      => 'Y'
3338             ,p_msg_context      => 'GENERAL'
3339             ,p_attribute1       => ''
3340             ,p_attribute2       => ''
3341             ,p_attribute3       => ''
3342             ,p_attribute4       => ''
3343             ,p_attribute5       => '');
3344 
3345         p_return_status := FND_API.G_RET_STS_ERROR;
3346 
3347         RAISE FND_API.G_EXC_ERROR;
3348     ELSE
3349         -- If the user has query privileges, then check whether
3350         -- update privileges are also available
3351         IF pa_security.allow_update (x_project_id => l_project_id ) = 'N' THEN
3352 
3353             -- The user does not have update privileges on this project
3354             -- Hence , raise error
3355 
3356             pa_interface_utils_pub.map_new_amg_msg
3357                 ( p_old_message_code => 'PA_PROJECT_SECURITY_ENFORCED'
3358                 ,p_msg_attribute    => 'CHANGE'
3359                 ,p_resize_flag      => 'Y'
3360                 ,p_msg_context      => 'GENERAL'
3361                 ,p_attribute1       => ''
3362                 ,p_attribute2       => ''
3363                 ,p_attribute3       => ''
3364                 ,p_attribute4       => ''
3365                 ,p_attribute5       => '');
3366 
3367 	        p_return_status := FND_API.G_RET_STS_ERROR;
3368 
3369             RAISE FND_API.G_EXC_ERROR;
3370         END IF;
3371      END IF;
3372 
3373 
3374     --Get project asset id based on PM Asset Reference
3375     PA_PROJECT_ASSETS_PUB.convert_pm_assetref_to_id (
3376         p_pa_project_id        => l_project_id,
3377         p_pa_project_asset_id  => p_pa_project_asset_id,
3378         p_pm_asset_reference   => p_pm_asset_reference,
3379         p_out_project_asset_id => l_project_asset_id,
3380         p_return_status        => l_return_status );
3381 
3382     IF l_return_status =  FND_API.G_RET_STS_UNEXP_ERROR THEN
3383         RAISE  FND_API.G_EXC_UNEXPECTED_ERROR;
3384     ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
3385         RAISE  FND_API.G_EXC_ERROR;
3386     END IF;
3387 
3388 
3389     --Get asset name for AMG messages
3390     IF p_pa_asset_name = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR OR p_pa_asset_name IS NULL THEN
3391         OPEN l_amg_asset_csr(l_project_asset_id);
3392         FETCH l_amg_asset_csr into l_amg_pa_asset_name;
3393         CLOSE l_amg_asset_csr;
3394     ELSE
3395         l_amg_pa_asset_name := p_pa_asset_name;
3396     END IF;
3397 
3398 
3399     --Lock the asset for update
3400 	OPEN l_lock_rows_csr( l_project_asset_id );
3401 
3402 
3403     --Get the current data of this project asset
3404     OPEN l_asset_cur (l_project_id,l_project_asset_id );
3405     FETCH l_asset_cur INTO l_asset_rec;
3406     CLOSE l_asset_cur;
3407 
3408 
3409     --Initialize update variables
3410     l_update_yes_flag := 'N';
3411     l_statement := 'UPDATE PA_PROJECT_ASSETS SET ';
3412 
3413     --Set the date variables which are used in processing and cursors
3414     l_date_placed_in_service := NVL(p_date_placed_in_service, l_asset_rec.date_placed_in_service);
3415     l_estimated_in_service_date := NVL(p_estimated_in_service_date, l_asset_rec.estimated_in_service_date);
3416 
3417 
3418 
3419     --Perform validations and checks to see if fields have been changed
3420 
3421     --Fields where the PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR (_NUM, _DATE) is specified are
3422     --never updated, since this implies the parameter was not passed at all.
3423     --
3424     --Standard validation functionality in AMG seems to be inconsistent when a NULL value
3425     --is passed as a parameter.  In some instances AMG will update the field with a NULL, and
3426     --in other instances AMG will ignore fields for which NULL has been specified.  This
3427     --implies that the AMG user can never "NULL out" a field once it has a value using AMG.
3428     --It does have the benefit that the user can specify only the fields they wish to change,
3429     --and send NULL for all other fields.  However it would seem to be more "correct" if NULL
3430     --values sent in were actually updated with NULL, where valid and not required.  The AMG
3431     --user could then send the PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR (_NUM, _DATE) value when
3432     --they intend for no update of that field.
3433     --
3434     --For now I will follow this standard and not update fields with NULL when NULL is sent in
3435     --the parameter unless otherwise indicated.  Since no updates with NULLs will be done, I will
3436     --also not validate NULL values or issue errors when required fields have NULL specified.
3437 
3438 
3439     --	ASSET REFERENCE
3440     IF  p_pm_asset_reference <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
3441         AND  NVL(p_pm_asset_reference,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
3442 		     NVL(l_asset_rec.pm_asset_reference, PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR )
3443         AND  p_pm_asset_reference IS NOT NULL THEN
3444 
3445             --Verify that the new PM_ASSET_REFERENCE value is unique within the project
3446             OPEN unique_ref_cur(l_project_id);
3447             FETCH unique_ref_cur INTO unique_ref_rec;
3448 	        IF unique_ref_cur%FOUND THEN
3449                 CLOSE unique_ref_cur;
3450                 -- The Asset Reference must be unique in the project. Raise error
3451                 pa_interface_utils_pub.map_new_amg_msg
3452                 ( p_old_message_code => 'PA_ASSET_REF_NOT_UNIQUE_AS'
3453                 ,p_msg_attribute    => 'CHANGE'
3454                 ,p_resize_flag      => 'N'
3455                 ,p_msg_context      => 'ASSET'
3456                 ,p_attribute1       => l_amg_project_number
3457                 ,p_attribute2       => l_amg_pa_asset_name
3458                 ,p_attribute3       => ''
3459                 ,p_attribute4       => ''
3460                 ,p_attribute5       => '');
3461 
3462                 p_return_status := FND_API.G_RET_STS_ERROR;
3463 
3464                 RAISE FND_API.G_EXC_ERROR;
3465 	        END IF;
3466 	        CLOSE unique_ref_cur;
3467 
3468 
3469             l_statement := l_statement ||
3470                            ' PM_ASSET_REFERENCE = :b_pm_asset_reference'||',';
3471             l_update_yes_flag := 'Y';
3472 
3473             b_pm_asset_reference := p_pm_asset_reference;
3474             l_pm_asset_reference := p_pm_asset_reference;
3475     ELSE
3476        	    l_pm_asset_reference := l_asset_rec.pm_asset_reference;
3477     END IF;
3478 
3479 
3480     --	ASSET NAME
3481     IF  p_pa_asset_name <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
3482         AND  NVL(p_pa_asset_name,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
3483 		     NVL(l_asset_rec.asset_name, PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR )
3484         AND  p_pa_asset_name IS NOT NULL THEN
3485 
3486             --Verify that the new ASSET_NAME value is unique within the project
3487             OPEN unique_name_cur(l_project_id);
3488             FETCH unique_name_cur INTO unique_name_rec;
3489 	        IF unique_name_cur%FOUND THEN
3490                 CLOSE unique_name_cur;
3491                 -- The Asset Name must be unique in the project. Raise error
3492                 pa_interface_utils_pub.map_new_amg_msg
3493                 ( p_old_message_code => 'PA_ASSET_NAME_NOT_UNIQ_AS'
3494                 ,p_msg_attribute    => 'CHANGE'
3495                 ,p_resize_flag      => 'N'
3496                 ,p_msg_context      => 'ASSET'
3497                 ,p_attribute1       => l_amg_project_number
3498                 ,p_attribute2       => l_amg_pa_asset_name
3499                 ,p_attribute3       => ''
3500                 ,p_attribute4       => ''
3501                 ,p_attribute5       => '');
3502 
3503                 p_return_status := FND_API.G_RET_STS_ERROR;
3504 
3505                 RAISE FND_API.G_EXC_ERROR;
3506 	        END IF;
3507 	        CLOSE unique_name_cur;
3508 
3509 
3510             l_statement := l_statement ||
3511                            ' ASSET_NAME = :b_pa_asset_name'||',';
3512             l_update_yes_flag := 'Y';
3513             b_pa_asset_name := p_pa_asset_name;
3514     END IF;
3515 
3516 
3517     --  ASSET DESCRIPTION
3518     IF (p_asset_description <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR AND p_asset_description IS NOT NULL)
3519         AND nvl(p_asset_description,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
3520             nvl(l_asset_rec.asset_description,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR ) THEN
3521 
3522             l_statement := l_statement ||
3523                            ' ASSET_DESCRIPTION = :b_asset_description'||',';
3524             l_update_yes_flag := 'Y';
3525             b_asset_description := p_asset_description;
3526     END IF;
3527 
3528 
3529     --  PROJECT ASSET TYPE
3530     -- When Project Asset Type is being MODIFIED:
3531     IF (p_project_asset_type <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR AND p_project_asset_type IS NOT NULL)
3532         AND nvl(p_project_asset_type,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
3533             nvl(l_asset_rec.project_asset_type,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR ) THEN
3534 
3535 
3536         OPEN valid_type_cur;
3537         FETCH valid_type_cur INTO valid_type_rec;
3538 	    IF valid_type_cur%NOTFOUND THEN
3539 
3540             CLOSE valid_type_cur;
3541             -- The Project Asset Type is invalid. Raise error
3542             pa_interface_utils_pub.map_new_amg_msg
3543                ( p_old_message_code => 'PA_ASSET_TYPE_INVALID_AS'
3544                 ,p_msg_attribute    => 'CHANGE'
3545                 ,p_resize_flag      => 'N'
3546                 ,p_msg_context      => 'ASSET'
3547                 ,p_attribute1       => l_amg_project_number
3548                 ,p_attribute2       => l_amg_pa_asset_name
3549                 ,p_attribute3       => ''
3550                 ,p_attribute4       => ''
3551                 ,p_attribute5       => '');
3552 
3553             p_return_status := FND_API.G_RET_STS_ERROR;
3554 
3555             RAISE FND_API.G_EXC_ERROR;
3556 	    END IF;
3557 	    CLOSE valid_type_cur;
3558 
3559 
3560         --Retirement Target Assets may not have their Project Asset Type modified
3561         IF p_project_asset_type <> 'RETIREMENT_ADJUSTMENT' AND l_asset_rec.project_asset_type = 'RETIREMENT_ADJUSTMENT' THEN
3562 
3563             -- Cannot change from or to RETIREMENT_ADJUSTMENT project type. Raise error
3564             pa_interface_utils_pub.map_new_amg_msg
3565                 ( p_old_message_code => 'PA_CANNOT_UPDATE_RET_AS'
3566                 ,p_msg_attribute    => 'CHANGE'
3567                 ,p_resize_flag      => 'N'
3568                 ,p_msg_context      => 'ASSET'
3569                 ,p_attribute1       => l_amg_project_number
3570                 ,p_attribute2       => l_amg_pa_asset_name
3571                 ,p_attribute3       => ''
3572                 ,p_attribute4       => ''
3573                 ,p_attribute5       => '');
3574 
3575             p_return_status := FND_API.G_RET_STS_ERROR;
3576 
3577             RAISE FND_API.G_EXC_ERROR;
3578 
3579         END IF;
3580 
3581         --Cannot change Estimated or As-Built Assets to Retirement Adjustment Targets
3582         IF p_project_asset_type = 'RETIREMENT_ADJUSTMENT' AND l_asset_rec.project_asset_type <> 'RETIREMENT_ADJUSTMENT' THEN
3583 
3584             -- Cannot change from or to RETIREMENT_ADJUSTMENT project type. Raise error
3585             pa_interface_utils_pub.map_new_amg_msg
3586                 ( p_old_message_code => 'PA_CANNOT_UPDATE_RET_AS'
3587                 ,p_msg_attribute    => 'CHANGE'
3588                 ,p_resize_flag      => 'N'
3589                 ,p_msg_context      => 'ASSET'
3590                 ,p_attribute1       => l_amg_project_number
3591                 ,p_attribute2       => l_amg_pa_asset_name
3592                 ,p_attribute3       => ''
3593                 ,p_attribute4       => ''
3594                 ,p_attribute5       => '');
3595 
3596             p_return_status := FND_API.G_RET_STS_ERROR;
3597 
3598             RAISE FND_API.G_EXC_ERROR;
3599 
3600         END IF;
3601 
3602 
3603         --Estimated Assets must specify an Actual DPIS and Asset Units if changing to 'AS-BUILT'
3604         IF p_project_asset_type = 'AS-BUILT' AND l_asset_rec.project_asset_type = 'ESTIMATED' THEN
3605 
3606             IF (p_date_placed_in_service IS NULL OR p_date_placed_in_service = PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE)
3607                 AND l_asset_rec.date_placed_in_service IS NULL THEN
3608 
3609                 -- The Actual DPIS is required for 'AS-BUILT' assets. Raise error
3610                 pa_interface_utils_pub.map_new_amg_msg
3611                     ( p_old_message_code => 'PA_ASSET_DPIS_MISSING_AS'
3612                     ,p_msg_attribute    => 'CHANGE'
3613                     ,p_resize_flag      => 'N'
3614                     ,p_msg_context      => 'ASSET'
3615                     ,p_attribute1       => l_amg_project_number
3616                     ,p_attribute2       => l_amg_pa_asset_name
3617                     ,p_attribute3       => ''
3618                     ,p_attribute4       => ''
3619                     ,p_attribute5       => '');
3620 
3621                 p_return_status := FND_API.G_RET_STS_ERROR;
3622 
3623                 RAISE FND_API.G_EXC_ERROR;
3624             END IF;
3625 
3626             IF (p_asset_units IS NULL OR p_asset_units = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM)
3627                 AND l_asset_rec.asset_units IS NULL THEN
3628 
3629                 -- The Asset Units are required for 'AS-BUILT' assets. Raise error
3630                 pa_interface_utils_pub.map_new_amg_msg
3631                     ( p_old_message_code => 'PA_ASSET_UNITS_MISSING_AS'
3632                     ,p_msg_attribute    => 'CHANGE'
3633                     ,p_resize_flag      => 'N'
3634                     ,p_msg_context      => 'ASSET'
3635                     ,p_attribute1       => l_amg_project_number
3636                     ,p_attribute2       => l_amg_pa_asset_name
3637                     ,p_attribute3       => ''
3638                     ,p_attribute4       => ''
3639                     ,p_attribute5       => '');
3640 
3641                 p_return_status := FND_API.G_RET_STS_ERROR;
3642 
3643                 RAISE FND_API.G_EXC_ERROR;
3644             END IF;
3645 
3646 
3647             --Set DPIS to value specified
3648             l_statement := l_statement ||
3649                            ' DATE_PLACED_IN_SERVICE = :b_date_placed_in_service'||',';
3650             l_update_yes_flag := 'Y';
3651             b_date_placed_in_service := p_date_placed_in_service;
3652             l_updated_dpis := 'Y';
3653             l_date_placed_in_service := p_date_placed_in_service;
3654 
3655         END IF;
3656 
3657         --As-Built Assets Assets can only be changed to Estimated if not in an Event and not capitalized
3658         IF p_project_asset_type = 'ESTIMATED' AND l_asset_rec.project_asset_type = 'AS-BUILT' THEN
3659 
3660             --Capital Event ID must be NULL for the asset
3661             IF l_asset_rec.capital_event_id IS NOT NULL THEN
3662 
3663                 -- The Asset has been processed.  Raise error
3664                 pa_interface_utils_pub.map_new_amg_msg
3665                     ( p_old_message_code => 'PA_ASSET_EVENT_NOT_NULL_AS'
3666                     ,p_msg_attribute    => 'CHANGE'
3667                     ,p_resize_flag      => 'N'
3668                     ,p_msg_context      => 'ASSET'
3669                     ,p_attribute1       => l_amg_project_number
3670                     ,p_attribute2       => l_amg_pa_asset_name
3671                     ,p_attribute3       => ''
3672                     ,p_attribute4       => ''
3673                     ,p_attribute5       => '');
3674 
3675                 p_return_status := FND_API.G_RET_STS_ERROR;
3676 
3677                 RAISE FND_API.G_EXC_ERROR;
3678 
3679             END IF;
3680 
3681 
3682             --Date Placed in Service must be NULL
3683             IF (p_date_placed_in_service IS NOT NULL OR p_date_placed_in_service <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE)
3684                 AND l_asset_rec.date_placed_in_service IS NOT NULL THEN
3685 
3686                 -- The Actual DPIS must be NULL for 'ESTIMATED' assets. Raise error
3687                 pa_interface_utils_pub.map_new_amg_msg
3688                     ( p_old_message_code => 'PA_ASSET_DPIS_MB_NULL_AS'
3689                     ,p_msg_attribute    => 'CHANGE'
3690                     ,p_resize_flag      => 'N'
3691                     ,p_msg_context      => 'ASSET'
3692                     ,p_attribute1       => l_amg_project_number
3693                     ,p_attribute2       => l_amg_pa_asset_name
3694                     ,p_attribute3       => ''
3695                     ,p_attribute4       => ''
3696                     ,p_attribute5       => '');
3697 
3698                 p_return_status := FND_API.G_RET_STS_ERROR;
3699 
3700                 RAISE FND_API.G_EXC_ERROR;
3701             END IF;
3702 
3703             --Set DPIS to NULL
3704             l_statement := l_statement ||
3705                            ' DATE_PLACED_IN_SERVICE = NULL,';
3706             l_update_yes_flag := 'Y';
3707             l_updated_dpis := 'Y';
3708             l_date_placed_in_service := NULL;
3709 
3710         END IF;
3711 
3712 
3713         l_statement := l_statement ||
3714                            ' PROJECT_ASSET_TYPE = :b_project_asset_type'||',';
3715         l_update_yes_flag := 'Y';
3716         b_project_asset_type := p_project_asset_type;
3717         l_updated_proj_asset_type := 'Y';
3718 
3719     END IF; --Project Asset Type is being modified
3720 
3721 
3722     -- When Project Asset Type is NOT being modified
3723     IF (p_project_asset_type = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR OR p_project_asset_type IS NULL)
3724         OR nvl(p_project_asset_type,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) =
3725            nvl(l_asset_rec.project_asset_type,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR )THEN
3726 
3727 
3728         --AS-BUILT Assets must specify an Actual DPIS and Asset Units
3729         IF l_asset_rec.project_asset_type = 'AS-BUILT' THEN
3730 
3731             IF (p_date_placed_in_service IS NULL) THEN
3732 
3733                 -- The Actual DPIS is required for 'AS-BUILT' assets. Raise error
3734                 pa_interface_utils_pub.map_new_amg_msg
3735                     ( p_old_message_code => 'PA_ASSET_DPIS_MISSING_AS'
3736                     ,p_msg_attribute    => 'CHANGE'
3737                     ,p_resize_flag      => 'N'
3738                     ,p_msg_context      => 'ASSET'
3739                     ,p_attribute1       => l_amg_project_number
3740                     ,p_attribute2       => l_amg_pa_asset_name
3741                     ,p_attribute3       => ''
3742                     ,p_attribute4       => ''
3743                     ,p_attribute5       => '');
3744 
3745                 p_return_status := FND_API.G_RET_STS_ERROR;
3746 
3747                 RAISE FND_API.G_EXC_ERROR;
3748             END IF;
3749 
3750             IF (p_asset_units IS NULL) THEN
3751 
3752                 -- The Asset Units are required for 'AS-BUILT' assets. Raise error
3753                 pa_interface_utils_pub.map_new_amg_msg
3754                     ( p_old_message_code => 'PA_ASSET_UNITS_MISSING_AS'
3755                     ,p_msg_attribute    => 'CHANGE'
3756                     ,p_resize_flag      => 'N'
3757                     ,p_msg_context      => 'ASSET'
3758                     ,p_attribute1       => l_amg_project_number
3759                     ,p_attribute2       => l_amg_pa_asset_name
3760                     ,p_attribute3       => ''
3761                     ,p_attribute4       => ''
3762                     ,p_attribute5       => '');
3763 
3764                 p_return_status := FND_API.G_RET_STS_ERROR;
3765 
3766                 RAISE FND_API.G_EXC_ERROR;
3767             END IF;
3768 
3769         END IF;
3770 
3771         --ESTIMATED Assets must have a NULL DPIS
3772         IF l_asset_rec.project_asset_type = 'ESTIMATED' THEN
3773 
3774             --Date Placed in Service must be NULL
3775             -- Added and condition for bug 4744574
3776             IF (p_date_placed_in_service IS NOT NULL and
3777                  p_date_placed_in_service<>PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE) THEN
3778 
3779                 -- The Actual DPIS must be NULL for 'ESTIMATED' assets. Raise error
3780                 pa_interface_utils_pub.map_new_amg_msg
3781                     ( p_old_message_code => 'PA_ASSET_DPIS_MB_NULL_AS'
3782                     ,p_msg_attribute    => 'CHANGE'
3783                     ,p_resize_flag      => 'N'
3784                     ,p_msg_context      => 'ASSET'
3785                     ,p_attribute1       => l_amg_project_number
3786                     ,p_attribute2       => l_amg_pa_asset_name
3787                     ,p_attribute3       => ''
3788                     ,p_attribute4       => ''
3789                     ,p_attribute5       => '');
3790 
3791                 p_return_status := FND_API.G_RET_STS_ERROR;
3792 
3793                 RAISE FND_API.G_EXC_ERROR;
3794             END IF;
3795 
3796         END IF;
3797 
3798     END IF;  --Validations when Project Asset Type is NOT being modified
3799 
3800 
3801 
3802     --  DPIS
3803     IF l_updated_dpis = 'N' --DPIS may have already been processed in the previous validations
3804         AND (p_date_placed_in_service <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE OR p_date_placed_in_service IS NULL)
3805         AND nvl(p_date_placed_in_service,PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE) <>
3806             nvl(l_asset_rec.date_placed_in_service,PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE ) THEN
3807 
3808 
3809         l_statement := l_statement ||
3810                            ' DATE_PLACED_IN_SERVICE = :b_date_placed_in_service'||',';
3811         l_update_yes_flag := 'Y';
3812         b_date_placed_in_service := p_date_placed_in_service;
3813     END IF;
3814 
3815 
3816     --  ASSET NUMBER
3817     IF (p_asset_number <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR OR p_asset_number IS NOT NULL) -- code change for bug 4228421
3818         AND nvl(p_asset_number,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
3819             nvl(l_asset_rec.asset_number,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR ) THEN
3820 
3821         --Asset Number must be unique
3822         OPEN unique_number_cur;
3823         FETCH unique_number_cur INTO unique_number_rec;
3824         IF unique_number_cur%FOUND THEN
3825 
3826             CLOSE unique_number_cur;
3827             -- The Asset Number must be unique. Raise error
3828             pa_interface_utils_pub.map_new_amg_msg
3829                     ( p_old_message_code => 'PA_ASSET_NUM_NOT_UNIQUE_AS'
3830                     ,p_msg_attribute    => 'CHANGE'
3831                     ,p_resize_flag      => 'N'
3832                     ,p_msg_context      => 'ASSET'
3833                     ,p_attribute1       => l_amg_project_number
3834                     ,p_attribute2       => l_amg_pa_asset_name
3835                     ,p_attribute3       => ''
3836                     ,p_attribute4       => ''
3837                     ,p_attribute5       => '');
3838 
3839             p_return_status := FND_API.G_RET_STS_ERROR;
3840 
3841             RAISE FND_API.G_EXC_ERROR;
3842         END IF;
3843         CLOSE unique_number_cur;
3844 
3845         l_statement := l_statement ||
3846                            ' ASSET_NUMBER = :b_asset_number'||',';
3847         l_update_yes_flag := 'Y';
3848         b_asset_number := p_asset_number;
3849 -- Start of code addition for bug 4228421
3850     ELSIF (p_asset_number IS NULL) --Changing value to NULL
3851         AND nvl(p_asset_number,PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM) <>
3852             nvl(l_asset_rec.asset_number,PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM ) THEN
3853 
3854         l_statement := l_statement ||
3855                            ' ASSET_NUMBER = NULL,';
3856         l_update_yes_flag := 'Y';
3857 -- End of code addition for bug 4228421
3858     END IF;
3859 
3860 
3861     -- ASSET LOCATION ID
3862     IF (p_location_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM AND p_location_id IS NOT NULL)
3863         AND nvl(p_location_id,PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM) <>
3864             nvl(l_asset_rec.location_id,PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM ) THEN
3865 
3866         --Location ID must be valid
3867         OPEN asset_location_cur;
3868         FETCH asset_location_cur INTO asset_location_rec;
3869         IF asset_location_cur%NOTFOUND THEN
3870 
3871             CLOSE asset_location_cur;
3872             -- The Asset Location is not valid. Raise error
3873             pa_interface_utils_pub.map_new_amg_msg
3874                     ( p_old_message_code => 'PA_ASSET_LOC_INVALID_AS'
3875                     ,p_msg_attribute    => 'CHANGE'
3876                     ,p_resize_flag      => 'N'
3877                     ,p_msg_context      => 'ASSET'
3878                     ,p_attribute1       => l_amg_project_number
3879                     ,p_attribute2       => l_amg_pa_asset_name
3880                     ,p_attribute3       => ''
3881                     ,p_attribute4       => ''
3882                     ,p_attribute5       => '');
3883 
3884             p_return_status := FND_API.G_RET_STS_ERROR;
3885 
3886             RAISE FND_API.G_EXC_ERROR;
3887         END IF;
3888         CLOSE asset_location_cur;
3889 
3890 
3891         l_statement := l_statement ||
3892                            ' LOCATION_ID = :b_location_id'||',';
3893         l_update_yes_flag := 'Y';
3894         b_location_id := p_location_id;
3895         l_updated_location_id := 'Y';
3896 
3897     ELSIF (p_location_id IS NULL) --Changing value to NULL
3898         AND nvl(p_location_id,PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM) <>
3899             nvl(l_asset_rec.location_id,PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM ) THEN
3900 
3901         l_statement := l_statement ||
3902                            ' LOCATION_ID = NULL,';
3903         l_update_yes_flag := 'Y';
3904         l_updated_location_id := 'Y';
3905 
3906     END IF;
3907 
3908 
3909     -- ASSIGNED TO PERSON ID
3910     IF (p_assigned_to_person_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM AND p_assigned_to_person_id IS NOT NULL)
3911         AND nvl(p_assigned_to_person_id,PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM) <>
3912             nvl(l_asset_rec.assigned_to_person_id,PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM ) THEN
3913 
3914         --Assigned to Person must be a valid Person
3915         OPEN people_cur;
3916         FETCH people_cur INTO people_rec;
3917         IF people_cur%NOTFOUND THEN
3918 
3919             CLOSE people_cur;
3920             -- The Assign to Person is not valid. Raise error
3921             pa_interface_utils_pub.map_new_amg_msg
3922                     ( p_old_message_code => 'PA_ASSGN_TO_PER_INVALID_AS'
3923                     ,p_msg_attribute    => 'CHANGE'
3924                     ,p_resize_flag      => 'N'
3925                     ,p_msg_context      => 'ASSET'
3926                     ,p_attribute1       => l_amg_project_number
3927                     ,p_attribute2       => l_amg_pa_asset_name
3928                     ,p_attribute3       => ''
3929                     ,p_attribute4       => ''
3930                     ,p_attribute5       => '');
3931 
3932             p_return_status := FND_API.G_RET_STS_ERROR;
3933 
3934             RAISE FND_API.G_EXC_ERROR;
3935         END IF;
3936         CLOSE people_cur;
3937 
3938         l_statement := l_statement ||
3939                            ' ASSIGNED_TO_PERSON_ID = :b_assigned_to_person_id'||',';
3940         l_update_yes_flag := 'Y';
3941         b_assigned_to_person_id := p_assigned_to_person_id;
3942 
3943     ELSIF (p_assigned_to_person_id IS NULL) --Changing value to NULL
3944         AND nvl(p_assigned_to_person_id,PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM) <>
3945             nvl(l_asset_rec.assigned_to_person_id,PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM ) THEN
3946 
3947         l_statement := l_statement ||
3948                            ' ASSIGNED_TO_PERSON_ID = NULL,';
3949         l_update_yes_flag := 'Y';
3950 
3951     END IF;
3952 
3953 
3954     -- BOOK TYPE CODE
3955     IF (p_book_type_code <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR AND p_book_type_code IS NOT NULL)
3956         AND nvl(p_book_type_code,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
3957             nvl(l_asset_rec.book_type_code,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR ) THEN
3958 
3959         --Book Type Code must be valid for the current SOB
3960         OPEN book_type_code_cur;
3961         FETCH book_type_code_cur INTO book_type_code_rec;
3962 	    IF book_type_code_cur%NOTFOUND THEN
3963 
3964             CLOSE book_type_code_cur;
3965             -- The book_type_code is not valid. Raise error
3966             pa_interface_utils_pub.map_new_amg_msg
3967                 ( p_old_message_code => 'PA_BOOK_TYPE_INVALID_AS'
3968                 ,p_msg_attribute    => 'CHANGE'
3969                 ,p_resize_flag      => 'N'
3970                 ,p_msg_context      => 'ASSET'
3971                 ,p_attribute1       => l_amg_project_number
3972                 ,p_attribute2       => l_amg_pa_asset_name
3973                 ,p_attribute3       => ''
3974                 ,p_attribute4       => ''
3975                 ,p_attribute5       => '');
3976 
3977             p_return_status := FND_API.G_RET_STS_ERROR;
3978 
3979             RAISE FND_API.G_EXC_ERROR;
3980         ELSE
3981             l_book_type_code := p_book_type_code;
3982 	    END IF;
3983 	    CLOSE book_type_code_cur;
3984 
3985         l_statement := l_statement ||
3986                            ' BOOK_TYPE_CODE = :b_book_type_code'||',';
3987         l_update_yes_flag := 'Y';
3988         b_book_type_code := p_book_type_code;
3989         l_updated_book_type_code := 'Y';
3990 
3991     ELSIF (p_book_type_code IS NULL)
3992         AND nvl(p_book_type_code,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
3993             nvl(l_asset_rec.book_type_code,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR ) THEN
3994 
3995         l_statement := l_statement ||
3996                            ' BOOK_TYPE_CODE = NULL,';
3997         l_update_yes_flag := 'Y';
3998         l_updated_book_type_code := 'Y';
3999         l_book_type_code := NULL;
4000 
4001     ELSE
4002         l_book_type_code := l_asset_rec.book_type_code;
4003     END IF;
4004 
4005 
4006 
4007     -- BOOK TYPE CODE Cross-Validations with existing Parent Asset ID
4008     IF l_updated_book_type_code = 'Y' AND l_book_type_code IS NOT NULL
4009         AND p_parent_asset_id = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
4010         AND l_asset_rec.parent_asset_id IS NOT NULL THEN
4011 
4012         OPEN parent_asset_book_cur(l_asset_rec.parent_asset_id);
4013         FETCH parent_asset_book_cur INTO parent_asset_book_rec;
4014 	    IF parent_asset_book_cur%NOTFOUND THEN
4015 
4016             CLOSE parent_asset_book_cur;
4017             -- The parent asset/books combination is not valid. Raise error
4018             pa_interface_utils_pub.map_new_amg_msg
4019                     ( p_old_message_code => 'PA_PARENT_BOOK_INVALID_AS'
4020                     ,p_msg_attribute    => 'CHANGE'
4021                     ,p_resize_flag      => 'N'
4022                     ,p_msg_context      => 'ASSET'
4023                     ,p_attribute1       => l_amg_project_number
4024                     ,p_attribute2       => l_amg_pa_asset_name
4025                     ,p_attribute3       => ''
4026                     ,p_attribute4       => ''
4027                     ,p_attribute5       => '');
4028 
4029             p_return_status := FND_API.G_RET_STS_ERROR;
4030 
4031             RAISE FND_API.G_EXC_ERROR;
4032         END IF;
4033         CLOSE parent_asset_book_cur;
4034 
4035     END IF; --Book Type Code Cross-Validation with existing Parent Asset ID
4036 
4037 
4038 
4039     -- BOOK TYPE CODE Cross-Validations with existing Category
4040     IF l_updated_book_type_code = 'Y' AND l_book_type_code IS NOT NULL
4041         AND p_asset_category_id = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
4042         AND l_asset_rec.asset_category_id IS NOT NULL THEN
4043 
4044         OPEN category_books_cur(l_asset_rec.asset_category_id);
4045         FETCH category_books_cur INTO category_books_rec;
4046 	    IF category_books_cur%NOTFOUND THEN
4047 
4048             CLOSE category_books_cur;
4049             -- The category/books combination is not valid. Raise error
4050             pa_interface_utils_pub.map_new_amg_msg
4051                     ( p_old_message_code => 'PA_CAT_BOOKS_INVALID_AS'
4052                     ,p_msg_attribute    => 'CHANGE'
4053                     ,p_resize_flag      => 'N'
4054                     ,p_msg_context      => 'ASSET'
4055                     ,p_attribute1       => l_amg_project_number
4056                     ,p_attribute2       => l_amg_pa_asset_name
4057                     ,p_attribute3       => ''
4058                     ,p_attribute4       => ''
4059                     ,p_attribute5       => '');
4060 
4061             p_return_status := FND_API.G_RET_STS_ERROR;
4062 
4063             RAISE FND_API.G_EXC_ERROR;
4064         END IF;
4065         CLOSE category_books_cur;
4066 
4067     END IF; --Book Type Code Cross-Validation with existing Category
4068 
4069 
4070     -- PARENT ASSET ID
4071     IF (p_parent_asset_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM AND p_parent_asset_id IS NOT NULL)
4072         AND nvl(p_parent_asset_id,PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM) <>
4073             nvl(l_asset_rec.parent_asset_id,PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM ) THEN
4074 
4075         --Parent Asset must be valid in Oracle Assets
4076         OPEN parent_asset_cur;
4077         FETCH parent_asset_cur INTO parent_asset_rec;
4078 	    IF parent_asset_cur%NOTFOUND THEN
4079 
4080             CLOSE parent_asset_cur;
4081             -- The parent_asset_id is not valid. Raise error
4082             pa_interface_utils_pub.map_new_amg_msg
4083                 ( p_old_message_code => 'PA_PARENT_ASSET_INVALID_AS'
4084                 ,p_msg_attribute    => 'CHANGE'
4085                 ,p_resize_flag      => 'N'
4086                 ,p_msg_context      => 'ASSET'
4087                 ,p_attribute1       => l_amg_project_number
4088                 ,p_attribute2       => l_amg_pa_asset_name
4089                 ,p_attribute3       => ''
4090                 ,p_attribute4       => ''
4091                 ,p_attribute5       => '');
4092 
4093             p_return_status := FND_API.G_RET_STS_ERROR;
4094 
4095             RAISE FND_API.G_EXC_ERROR;
4096 	    END IF;
4097 	    CLOSE parent_asset_cur;
4098 
4099 
4100         --If l_book_type_code has a value, then the Parent Asset/Book combination must be valid
4101         IF l_book_type_code IS NOT NULL THEN
4102             OPEN parent_asset_book_cur(p_parent_asset_id);
4103             FETCH parent_asset_book_cur INTO parent_asset_book_rec;
4104 	        IF parent_asset_book_cur%NOTFOUND THEN
4105 
4106                 CLOSE parent_asset_book_cur;
4107                 -- The parent asset/books combination is not valid. Raise error
4108                 pa_interface_utils_pub.map_new_amg_msg
4109                     ( p_old_message_code => 'PA_PARENT_BOOK_INVALID_AS'
4110                     ,p_msg_attribute    => 'CHANGE'
4111                     ,p_resize_flag      => 'N'
4112                     ,p_msg_context      => 'ASSET'
4113                     ,p_attribute1       => l_amg_project_number
4114                     ,p_attribute2       => l_amg_pa_asset_name
4115                     ,p_attribute3       => ''
4116                     ,p_attribute4       => ''
4117                     ,p_attribute5       => '');
4118 
4119                 p_return_status := FND_API.G_RET_STS_ERROR;
4120 
4121                 RAISE FND_API.G_EXC_ERROR;
4122 	        END IF;
4123 	        CLOSE parent_asset_book_cur;
4124         END IF; --Book Type Code populated
4125 
4126 
4127         l_statement := l_statement ||
4128                            ' PARENT_ASSET_ID = :b_parent_asset_id'||',';
4129         l_update_yes_flag := 'Y';
4130         b_parent_asset_id := p_parent_asset_id;
4131 
4132     ELSIF (p_parent_asset_id IS NULL) --Changing value to NULL
4133         AND nvl(p_parent_asset_id,PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM) <>
4134             nvl(l_asset_rec.parent_asset_id,PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM ) THEN
4135 
4136         l_statement := l_statement ||
4137                            ' PARENT_ASSET_ID = NULL,';
4138         l_update_yes_flag := 'Y';
4139 
4140     END IF; --Parent Asset ID is being changed
4141 
4142 
4143     -- ASSET CATEGORY ID
4144     IF (p_asset_category_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM AND p_asset_category_id IS NOT NULL)
4145         AND nvl(p_asset_category_id,PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM) <>
4146             nvl(l_asset_rec.asset_category_id,PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM ) THEN
4147 
4148         --Asset Category must be a valid Category ID value
4149         OPEN asset_category_cur;
4150         FETCH asset_category_cur INTO asset_category_rec;
4151 	    IF asset_category_cur%NOTFOUND THEN
4152 
4153             CLOSE asset_category_cur;
4154             -- The asset_category is not valid. Raise error
4155             pa_interface_utils_pub.map_new_amg_msg
4156                 ( p_old_message_code => 'PA_CATEGORY_INVALID_AS'
4157                 ,p_msg_attribute    => 'CHANGE'
4158                 ,p_resize_flag      => 'N'
4159                 ,p_msg_context      => 'ASSET'
4160                 ,p_attribute1       => l_amg_project_number
4161                 ,p_attribute2       => l_amg_pa_asset_name
4162                 ,p_attribute3       => ''
4163                 ,p_attribute4       => ''
4164                 ,p_attribute5       => '');
4165 
4166             p_return_status := FND_API.G_RET_STS_ERROR;
4167 
4168             RAISE FND_API.G_EXC_ERROR;
4169 	    END IF;
4170 	    CLOSE asset_category_cur;
4171 
4172 
4173         --If l_book_type_code has a value, then the Category/Book combination must be valid
4174         IF l_book_type_code IS NOT NULL THEN
4175             OPEN category_books_cur(p_asset_category_id);
4176             FETCH category_books_cur INTO category_books_rec;
4177 	        IF category_books_cur%NOTFOUND THEN
4178 
4179                 CLOSE category_books_cur;
4180                 -- The category/books combination is not valid. Raise error
4181                 pa_interface_utils_pub.map_new_amg_msg
4182                     ( p_old_message_code => 'PA_CAT_BOOKS_INVALID_AS'
4183                     ,p_msg_attribute    => 'CHANGE'
4184                     ,p_resize_flag      => 'N'
4185                     ,p_msg_context      => 'ASSET'
4186                     ,p_attribute1       => l_amg_project_number
4187                     ,p_attribute2       => l_amg_pa_asset_name
4188                     ,p_attribute3       => ''
4189                     ,p_attribute4       => ''
4190                     ,p_attribute5       => '');
4191 
4192                 p_return_status := FND_API.G_RET_STS_ERROR;
4193 
4194                 RAISE FND_API.G_EXC_ERROR;
4195 	        END IF;
4196 	        CLOSE category_books_cur;
4197 
4198 
4199             --Default depreciate_flag from category book defaults if not specified
4200             IF p_depreciate_flag IS NULL OR p_depreciate_flag = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
4201                 OPEN depreciate_flag_cur;
4202                 FETCH depreciate_flag_cur INTO l_depreciate_flag;
4203 	            IF depreciate_flag_cur%NOTFOUND THEN
4204                     l_depreciate_flag := NULL;
4205 	            END IF;
4206 	            CLOSE depreciate_flag_cur;
4207 
4208             END IF; --Depreciate Flag not specified
4209 
4210 
4211             --Default amortize_flag to 'N' if not specified
4212             IF p_amortize_flag IS NULL OR p_amortize_flag = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
4213 
4214                 l_amortize_flag := 'N';
4215 
4216             END IF; --Amortize Flag not specified
4217 
4218         END IF; --l_book_type_code populated
4219 
4220 
4221 
4222         l_statement := l_statement ||
4223                            ' ASSET_CATEGORY_ID = :b_asset_category_id'||',';
4224         l_update_yes_flag := 'Y';
4225         b_asset_category_id := p_asset_category_id;
4226         l_updated_category_id := 'Y';
4227 
4228     ELSIF (p_asset_category_id IS NULL) --Changing value to NULL
4229         AND nvl(p_asset_category_id,PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM) <>
4230             nvl(l_asset_rec.asset_category_id,PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM ) THEN
4231 
4232         l_statement := l_statement ||
4233                            ' ASSET_CATEGORY_ID = NULL,';
4234         l_update_yes_flag := 'Y';
4235         l_updated_category_id := 'Y';
4236 
4237     END IF; --Asset Category is being changed
4238 
4239 
4240     -- AMORTIZE FLAG
4241     IF l_amortize_flag IS NOT NULL THEN
4242 
4243         l_statement := l_statement ||
4244                            ' AMORTIZE_FLAG = :b_amortize_flag'||',';
4245         l_update_yes_flag := 'Y';
4246         b_amortize_flag := l_amortize_flag;
4247 
4248     ELSIF (p_amortize_flag <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR AND p_amortize_flag IS NOT NULL)
4249         AND nvl(p_amortize_flag,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
4250             nvl(l_asset_rec.amortize_flag,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR ) THEN
4251 
4252         --Amortize Flag must be 'Y' or 'N'
4253         IF p_amortize_flag NOT IN ('Y','N') THEN
4254             -- The amortize_flag is not valid. Raise error
4255             pa_interface_utils_pub.map_new_amg_msg
4256                 ( p_old_message_code => 'PA_AMORT_FLAG_INVALID_AS'
4257                 ,p_msg_attribute    => 'CHANGE'
4258                 ,p_resize_flag      => 'N'
4259                 ,p_msg_context      => 'ASSET'
4260                 ,p_attribute1       => l_amg_project_number
4261                 ,p_attribute2       => l_amg_pa_asset_name
4262                 ,p_attribute3       => ''
4263                 ,p_attribute4       => ''
4264                 ,p_attribute5       => '');
4265 
4266             p_return_status := FND_API.G_RET_STS_ERROR;
4267 
4268             RAISE FND_API.G_EXC_ERROR;
4269         END IF;
4270 
4271 
4272         l_statement := l_statement ||
4273                            ' AMORTIZE_FLAG = :b_amortize_flag'||',';
4274         l_update_yes_flag := 'Y';
4275         b_amortize_flag := p_amortize_flag;
4276 
4277     END IF;
4278 
4279 
4280     -- DEPRECIATE FLAG
4281     IF l_depreciate_flag IS NOT NULL THEN
4282 
4283         l_statement := l_statement ||
4284                            ' DEPRECIATE_FLAG = :b_depreciate_flag'||',';
4285         l_update_yes_flag := 'Y';
4286         b_depreciate_flag := l_depreciate_flag;
4287 
4288     ELSIF (p_depreciate_flag <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR AND p_depreciate_flag IS NOT NULL)
4289         AND nvl(p_depreciate_flag,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
4290             nvl(l_asset_rec.depreciate_flag,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR ) THEN
4291 
4292         --Depreciate Flag must be 'Y' or 'N'
4293         IF p_depreciate_flag NOT IN ('Y','N') THEN
4294             -- The depreciate_flag is not valid. Raise error
4295             pa_interface_utils_pub.map_new_amg_msg
4296                 ( p_old_message_code => 'PA_DEPR_FLAG_INVALID_AS'
4297                 ,p_msg_attribute    => 'CHANGE'
4298                 ,p_resize_flag      => 'N'
4299                 ,p_msg_context      => 'ASSET'
4300                 ,p_attribute1       => l_amg_project_number
4301                 ,p_attribute2       => l_amg_pa_asset_name
4302                 ,p_attribute3       => ''
4303                 ,p_attribute4       => ''
4304                 ,p_attribute5       => '');
4305 
4306             p_return_status := FND_API.G_RET_STS_ERROR;
4307 
4308             RAISE FND_API.G_EXC_ERROR;
4309         END IF;
4310 
4311         l_statement := l_statement ||
4312                            ' DEPRECIATE_FLAG = :b_depreciate_flag'||',';
4313         l_update_yes_flag := 'Y';
4314         b_depreciate_flag := p_depreciate_flag;
4315 
4316     END IF;
4317 
4318 
4319     -- DEPRECIATION EXPENSE CCID
4320     l_depreciation_expense_ccid := p_depreciation_expense_ccid;
4321 
4322     -- Call the Depreciation Expense CCID override client extension whenever Book Type Code,
4323     -- Asset Category, DPIS or Deprn Expense CCID are being modified and the project asset type is 'AS-BUILT'
4324     IF ((l_updated_proj_asset_type = 'Y' AND p_project_asset_type = 'AS-BUILT')
4325         OR (l_updated_proj_asset_type = 'N' AND l_asset_rec.project_asset_type = 'AS-BUILT')) THEN
4326 
4327         --Determine parameters for client extension call
4328         IF l_updated_dpis = 'Y' THEN
4329             l_dpis := p_date_placed_in_service;
4330         ELSE
4331             l_dpis := l_asset_rec.date_placed_in_service;
4332         END IF;
4333 
4334         IF l_updated_category_id = 'Y' THEN
4335             l_asset_category_id := p_asset_category_id;
4336         ELSE
4337             l_asset_category_id := l_asset_rec.asset_category_id;
4338         END IF;
4339 
4340         IF p_depreciation_expense_ccid IS NULL THEN
4341             v_depreciation_expense_ccid := NULL;
4342         ELSIF p_depreciation_expense_ccid = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM THEN
4343             v_depreciation_expense_ccid := l_asset_rec.depreciation_expense_ccid;
4344         ELSE
4345             v_depreciation_expense_ccid := p_depreciation_expense_ccid;
4346         END IF;
4347 
4348 
4349 
4350         IF l_asset_category_id IS NOT NULL
4351             AND l_book_type_code IS NOT NULL
4352             AND l_date_placed_in_service IS NOT NULL THEN
4353 
4354             l_ovr_deprn_expense_ccid := PA_CLIENT_EXTN_DEPRN_EXP_OVR.DEPRN_EXPENSE_ACCT_OVERRIDE
4355                                         (p_project_asset_id        => l_project_asset_id,
4356                                          p_book_type_code          => l_book_type_code,
4357 			                             p_asset_category_id       => l_asset_category_id,
4358                                          p_date_placed_in_service  => l_dpis,
4359                                          p_deprn_expense_acct_ccid => v_depreciation_expense_ccid);
4360 
4361 
4362             IF NVL(l_ovr_deprn_expense_ccid,PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM) <>
4363                 NVL(p_depreciation_expense_ccid,PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM ) THEN
4364 
4365                 l_depreciation_expense_ccid := l_ovr_deprn_expense_ccid;
4366 
4367             END IF;  --Override value must be used during update
4368         END IF;
4369     END IF;
4370 
4371 
4372 
4373     -- DEPRECIATION EXPENSE CCID
4374     IF (l_depreciation_expense_ccid <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM AND l_depreciation_expense_ccid IS NOT NULL)
4375         AND nvl(l_depreciation_expense_ccid,PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM) <>
4376             nvl(l_asset_rec.depreciation_expense_ccid,PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM ) THEN
4377 
4378         --Depreciation Expense CCID must be a valid Code Combination
4379         OPEN deprn_expense_cur;
4380         FETCH deprn_expense_cur INTO deprn_expense_rec;
4381 	    IF deprn_expense_cur%NOTFOUND THEN
4382 
4383             CLOSE deprn_expense_cur;
4384             -- The depreciation_expense_ccid is not valid. Raise error
4385             pa_interface_utils_pub.map_new_amg_msg
4386                 ( p_old_message_code => 'PA_DEPRN_EXP_INVALID_AS'
4387                 ,p_msg_attribute    => 'CHANGE'
4388                 ,p_resize_flag      => 'N'
4389                 ,p_msg_context      => 'ASSET'
4390                 ,p_attribute1       => l_amg_project_number
4391                 ,p_attribute2       => l_amg_pa_asset_name
4392                 ,p_attribute3       => ''
4393                 ,p_attribute4       => ''
4394                 ,p_attribute5       => '');
4395 
4396             p_return_status := FND_API.G_RET_STS_ERROR;
4397 
4398             RAISE FND_API.G_EXC_ERROR;
4399 	    END IF;
4400 	    CLOSE deprn_expense_cur;
4401 
4402 
4403         l_statement := l_statement ||
4404                            ' DEPRECIATION_EXPENSE_CCID = :b_depreciation_expense_ccid'||',';
4405         l_update_yes_flag := 'Y';
4406         b_depreciation_expense_ccid := l_depreciation_expense_ccid;
4407         l_updated_deprn_expense_ccid := 'Y';
4408 
4409     ELSIF (l_depreciation_expense_ccid IS NULL) --Changing value to NULL
4410         AND nvl(p_depreciation_expense_ccid,PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM) <>
4411             nvl(l_asset_rec.depreciation_expense_ccid,PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM ) THEN
4412 
4413         l_statement := l_statement ||
4414                            ' DEPRECIATION_EXPENSE_CCID = NULL,';
4415         l_update_yes_flag := 'Y';
4416         l_updated_deprn_expense_ccid := 'Y';
4417 
4418     END IF;
4419 
4420 
4421     -- ASSET KEY CCID
4422     IF (p_asset_key_ccid <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM AND p_asset_key_ccid IS NOT NULL)
4423         AND nvl(p_asset_key_ccid,PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM) <>
4424             nvl(l_asset_rec.asset_key_ccid,PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM ) THEN
4425 
4426         --Asset Key CCID must be a valid FA Keywords combination
4427         OPEN asset_key_cur;
4428         FETCH asset_key_cur INTO asset_key_rec;
4429 	    IF asset_key_cur%NOTFOUND THEN
4430 
4431             CLOSE asset_key_cur;
4432             -- The asset_key_ccid is not valid. Raise error
4433             pa_interface_utils_pub.map_new_amg_msg
4434                 ( p_old_message_code => 'PA_ASSET_KEY_INVALID_AS'
4435                 ,p_msg_attribute    => 'CHANGE'
4436                 ,p_resize_flag      => 'N'
4437                 ,p_msg_context      => 'ASSET'
4438                 ,p_attribute1       => l_amg_project_number
4439                 ,p_attribute2       => l_amg_pa_asset_name
4440                 ,p_attribute3       => ''
4441                 ,p_attribute4       => ''
4442                 ,p_attribute5       => '');
4443 
4444             p_return_status := FND_API.G_RET_STS_ERROR;
4445 
4446             RAISE FND_API.G_EXC_ERROR;
4447 	    END IF;
4448 	    CLOSE asset_key_cur;
4449 
4450 
4451         l_statement := l_statement ||
4452                            ' ASSET_KEY_CCID = :b_asset_key_ccid'||',';
4453         l_update_yes_flag := 'Y';
4454         b_asset_key_ccid := p_asset_key_ccid;
4455         l_updated_asset_key_ccid := 'Y';
4456 
4457     ELSIF (p_asset_key_ccid IS NULL) --Changing value to NULL
4458         AND nvl(p_asset_key_ccid,PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM) <>
4459             nvl(l_asset_rec.asset_key_ccid,PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM ) THEN
4460 
4461         l_statement := l_statement ||
4462                            ' ASSET_KEY_CCID = NULL,';
4463         l_update_yes_flag := 'Y';
4464         l_updated_asset_key_ccid := 'Y';
4465 
4466     END IF;
4467 
4468 
4469     --If current project_asset_type is 'RETIREMENT_ADJUSTMENT', the Ret Target Asset ID must be specified
4470     IF l_asset_rec.project_asset_type = 'RETIREMENT_ADJUSTMENT' THEN
4471         IF (p_ret_target_asset_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM AND p_ret_target_asset_id IS NOT NULL)
4472             AND nvl(p_ret_target_asset_id,PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM) <>
4473                 nvl(l_asset_rec.ret_target_asset_id,PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM ) THEN
4474 
4475             --Ret Target Asset ID must be a valid Group Asset for the Book
4476             OPEN ret_target_cur;
4477             FETCH ret_target_cur INTO ret_target_rec;
4478 	        IF ret_target_cur%NOTFOUND THEN
4479 
4480                 CLOSE ret_target_cur;
4481                 -- The Ret Target Asset ID is not valid. Raise error
4482                 pa_interface_utils_pub.map_new_amg_msg
4483                     ( p_old_message_code => 'PA_RET_ASSET_ID_INVALID_AS'
4484                     ,p_msg_attribute    => 'CHANGE'
4485                     ,p_resize_flag      => 'N'
4486                     ,p_msg_context      => 'ASSET'
4487                     ,p_attribute1       => l_amg_project_number
4488                     ,p_attribute2       => l_amg_pa_asset_name
4489                     ,p_attribute3       => ''
4490                     ,p_attribute4       => ''
4491                     ,p_attribute5       => '');
4492 
4493                 p_return_status := FND_API.G_RET_STS_ERROR;
4494 
4495                 RAISE FND_API.G_EXC_ERROR;
4496 	        END IF;
4497 	        CLOSE ret_target_cur;
4498 
4499             --If Asset Category ID is NULL and has not been updated, default it to the Category of the Ret Target Asset
4500             IF l_updated_category_id = 'N'
4501                 AND (p_asset_category_id IS NULL OR p_asset_category_id = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM) THEN
4502 
4503                 l_statement := l_statement ||
4504                            ' ASSET_CATEGORY_ID = :b_asset_category_id'||',';
4505                 l_update_yes_flag := 'Y';
4506                 b_asset_category_id := ret_target_rec.asset_category_id;
4507             END IF;
4508 
4509 
4510             l_statement := l_statement ||
4511                            ' RET_TARGET_ASSET_ID = :b_ret_target_asset_id'||',';
4512             l_update_yes_flag := 'Y';
4513             b_ret_target_asset_id := p_ret_target_asset_id;
4514 
4515         ELSIF (p_ret_target_asset_id IS NULL)
4516             AND nvl(p_ret_target_asset_id,PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM) <>
4517                 nvl(l_asset_rec.ret_target_asset_id,PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM ) THEN
4518 
4519             --Ret Target Asset ID must be specified for RETIREMENT_ADJUSTMENT assets
4520             pa_interface_utils_pub.map_new_amg_msg
4521                 ( p_old_message_code => 'PA_RET_ASSET_ID_MISSING_AS'
4522                 ,p_msg_attribute    => 'CHANGE'
4523                 ,p_resize_flag      => 'N'
4524                 ,p_msg_context      => 'ASSET'
4525                 ,p_attribute1       => l_amg_project_number
4526                 ,p_attribute2       => l_amg_pa_asset_name
4527                 ,p_attribute3       => ''
4528                 ,p_attribute4       => ''
4529                 ,p_attribute5       => '');
4530 
4531             p_return_status := FND_API.G_RET_STS_ERROR;
4532 
4533             RAISE FND_API.G_EXC_ERROR;
4534 
4535         END IF;
4536 
4537     ELSE
4538         IF (p_ret_target_asset_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM AND p_ret_target_asset_id IS NOT NULL) THEN
4539 
4540             --Ret Target Asset ID must be not specified for ESTIMATED or AS-BUILT assets
4541             pa_interface_utils_pub.map_new_amg_msg
4542                 ( p_old_message_code => 'PA_RET_ASSET_ID_MB_NULL_AS'
4543                 ,p_msg_attribute    => 'CHANGE'
4544                 ,p_resize_flag      => 'N'
4545                 ,p_msg_context      => 'ASSET'
4546                 ,p_attribute1       => l_amg_project_number
4547                 ,p_attribute2       => l_amg_pa_asset_name
4548                 ,p_attribute3       => ''
4549                 ,p_attribute4       => ''
4550                 ,p_attribute5       => '');
4551 
4552             p_return_status := FND_API.G_RET_STS_ERROR;
4553 
4554             RAISE FND_API.G_EXC_ERROR;
4555          END IF;
4556     END IF; --Project Asset Type = RETIREMENT_ADJUSTMENT
4557 
4558 
4559     -- ASSET UNITS
4560     IF (p_asset_units <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM AND p_asset_units IS NOT NULL)
4561         AND nvl(p_asset_units,PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM) <>
4562             nvl(l_asset_rec.asset_units,PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM ) THEN
4563 
4564         l_statement := l_statement ||
4565                            ' ASSET_UNITS = :b_asset_units'||',';
4566         l_update_yes_flag := 'Y';
4567 --        b_asset_units := p_asset_units;
4568 
4569 -- Adding TRUNC Logic until Oracle Assets Allows fractional asset units
4570           b_asset_units := GREATEST(TRUNC(p_asset_units),1);
4571 -- Start of code addition for bug 4228421
4572     ELSIF (p_asset_units IS NULL) --Changing value to NULL
4573         AND nvl(p_asset_units,PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM) <>
4574             nvl(l_asset_rec.asset_units,PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM ) THEN
4575 
4576         l_statement := l_statement ||
4577                            ' ASSET_UNITS = NULL,';
4578         l_update_yes_flag := 'Y';
4579 -- End of code addition for bug 4228421
4580     END IF;
4581 
4582 
4583    --Added for bug 4744574
4584    IF((p_estimated_in_service_date <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE
4585         OR  p_estimated_in_service_date IS NULL)
4586        AND
4587       (nvl(p_estimated_in_service_date,PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE) <>
4588             nvl(l_asset_rec.estimated_in_service_date,PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE ))
4589        ) THEN
4590         l_statement := l_statement ||
4591                            ' ESTIMATED_IN_SERVICE_DATE = :b_estimated_in_service_date'||',';
4592         l_update_yes_flag := 'Y';
4593         b_estimated_in_service_date := p_estimated_in_service_date;
4594     END IF;
4595     --End changes for 4744574
4596 
4597     -- ESTIMATED_ASSET_UNITS
4598     IF (p_estimated_asset_units <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM AND p_estimated_asset_units IS NOT NULL)
4599         AND nvl(p_estimated_asset_units,PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM) <>
4600             nvl(l_asset_rec.estimated_asset_units,PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM ) THEN
4601 
4602         l_statement := l_statement ||
4603                            ' ESTIMATED_ASSET_UNITS = :b_estimated_asset_units'||',';
4604         l_update_yes_flag := 'Y';
4605 --        b_estimated_asset_units := p_estimated_asset_units;
4606 
4607 -- Adding TRUNC Logic until Oracle Assets Allows fractional asset units
4608           b_estimated_asset_units := GREATEST(TRUNC(p_estimated_asset_units),1);
4609 
4610 
4611     ELSIF (p_estimated_asset_units IS NULL) --Changing value to NULL
4612         AND nvl(p_estimated_asset_units,PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM) <>
4613             nvl(l_asset_rec.estimated_asset_units,PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM ) THEN
4614 
4615         l_statement := l_statement ||
4616                            ' ESTIMATED_ASSET_UNITS = NULL,';
4617         l_update_yes_flag := 'Y';
4618 
4619     END IF;
4620 
4621 
4622     -- ESTIMATED COST
4623     IF (p_estimated_cost <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM AND p_estimated_cost IS NOT NULL)
4624         AND nvl(p_estimated_cost,PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM) <>
4625             nvl(l_asset_rec.estimated_cost,PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM ) THEN
4626 
4627         l_statement := l_statement ||
4628                            ' ESTIMATED_COST = :b_estimated_cost'||',';
4629         l_update_yes_flag := 'Y';
4630         b_estimated_cost := p_estimated_cost;
4631 
4632     ELSIF (p_estimated_cost IS NULL) --Changing value to NULL
4633         AND nvl(p_estimated_cost,PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM) <>
4634             nvl(l_asset_rec.estimated_cost,PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM ) THEN
4635 
4636         l_statement := l_statement ||
4637                            ' ESTIMATED_COST = NULL,';
4638         l_update_yes_flag := 'Y';
4639 
4640     END IF;
4641 
4642 
4643     -- MANUFACTURER_NAME
4644 
4645     IF (p_manufacturer_name <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR AND p_manufacturer_name IS NOT NULL) -- changed IS NULL condition to IS NOT NULL for bug 4228421
4646         AND nvl(p_manufacturer_name,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
4647             nvl(l_asset_rec.manufacturer_name,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR ) THEN
4648 
4649         l_statement := l_statement ||
4650                            ' MANUFACTURER_NAME = :b_manufacturer_name'||',';
4651         l_update_yes_flag := 'Y';
4652         b_manufacturer_name := p_manufacturer_name;
4653 -- Added following code for bug 4228421
4654     ELSIF (p_manufacturer_name IS NULL) --Changing value to NULL
4655         AND nvl(p_manufacturer_name,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
4656             nvl(l_asset_rec.manufacturer_name,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR ) THEN
4657 
4658         l_statement := l_statement ||
4659                            ' MANUFACTURER_NAME = NULL,';
4660         l_update_yes_flag := 'Y';
4661 -- End of code addtion for bug 4228421
4662     END IF;
4663 
4664     -- MODEL_NUMBER
4665 
4666     IF (p_model_number <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR AND p_model_number IS NOT NULL) -- changed IS NULL condition to IS NOT NULL for bug 4228421
4667         AND nvl(p_model_number,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
4668             nvl(l_asset_rec.model_number,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR ) THEN
4669 
4670         l_statement := l_statement ||
4671                            ' MODEL_NUMBER = :b_model_number'||',';
4672         l_update_yes_flag := 'Y';
4673         b_model_number := p_model_number;
4674 -- Added following code for bug 4228421
4675     ELSIF (p_model_number IS NULL) --Changing value to NULL
4676         AND nvl(p_model_number,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
4677             nvl(l_asset_rec.model_number,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR ) THEN
4678 
4679         l_statement := l_statement ||
4680                            ' MODEL_NUMBER = NULL,';
4681         l_update_yes_flag := 'Y';
4682 -- End of code addtion for bug 4228421
4683     END IF;
4684 
4685 
4686 
4687     -- TAG_NUMBER
4688     IF (p_tag_number <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR AND p_tag_number IS NOT NULL)
4689         AND nvl(p_tag_number,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
4690             nvl(l_asset_rec.tag_number,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR ) THEN
4691 
4692 
4693         --If Tag Number is specified, it must not exist on other project assets or in Oracle Assets
4694 
4695         --Test for uniqueness in Oracle Assets
4696         OPEN unique_tag_number_fa_cur;
4697         FETCH unique_tag_number_fa_cur INTO unique_tag_number_fa_rec;
4698 	    IF unique_tag_number_fa_cur%FOUND THEN
4699 
4700             CLOSE unique_tag_number_fa_cur;
4701             -- The Tag Number must be unique. Raise error
4702             pa_interface_utils_pub.map_new_amg_msg
4703                 ( p_old_message_code => 'PA_TAG_NUM_FA_NOT_UNIQ_AS'
4704                 ,p_msg_attribute    => 'CHANGE'
4705                 ,p_resize_flag      => 'N'
4706                 ,p_msg_context      => 'ASSET'
4707                 ,p_attribute1       => l_amg_project_number
4708                 ,p_attribute2       => l_amg_pa_asset_name
4709                 ,p_attribute3       => ''
4710                 ,p_attribute4       => ''
4711                 ,p_attribute5       => '');
4712 
4713             p_return_status := FND_API.G_RET_STS_ERROR;
4714 
4715             RAISE FND_API.G_EXC_ERROR;
4716 	    END IF;
4717 	    CLOSE unique_tag_number_fa_cur;
4718 
4719         --Test for uniqueness in Oracle Projects
4720         OPEN unique_tag_number_pa_cur;
4721         FETCH unique_tag_number_pa_cur INTO unique_tag_number_pa_rec;
4722 	    IF unique_tag_number_pa_cur%FOUND THEN
4723 
4724             CLOSE unique_tag_number_pa_cur;
4725             -- The Tag Number must be unique. Raise error
4726             pa_interface_utils_pub.map_new_amg_msg
4727                 ( p_old_message_code => 'PA_TAG_NUM_PA_NOT_UNIQ_AS'
4728                 ,p_msg_attribute    => 'CHANGE'
4729                 ,p_resize_flag      => 'N'
4730                 ,p_msg_context      => 'ASSET'
4731                 ,p_attribute1       => l_amg_project_number
4732                 ,p_attribute2       => l_amg_pa_asset_name
4733                 ,p_attribute3       => ''
4734                 ,p_attribute4       => ''
4735                 ,p_attribute5       => '');
4736 
4737             p_return_status := FND_API.G_RET_STS_ERROR;
4738 
4739             RAISE FND_API.G_EXC_ERROR;
4740 	    END IF;
4741 	    CLOSE unique_tag_number_pa_cur;
4742 
4743 
4744         l_statement := l_statement ||
4745                            ' TAG_NUMBER = :b_tag_number'||',';
4746         l_update_yes_flag := 'Y';
4747         b_tag_number := p_tag_number;
4748 
4749     ELSIF (p_tag_number IS NULL) --Changing value to NULL
4750         AND nvl(p_tag_number,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
4751             nvl(l_asset_rec.tag_number,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR ) THEN
4752 
4753         l_statement := l_statement ||
4754                            ' TAG_NUMBER = NULL,';
4755         l_update_yes_flag := 'Y';
4756 
4757     END IF;
4758 
4759 
4760     -- SERIAL_NUMBER
4761 
4762     IF (p_serial_number <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR AND p_serial_number IS NOT NULL)  -- changed IS NULL condition to IS NOT NULL for bug 4228421
4763         AND nvl(p_serial_number,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
4764             nvl(l_asset_rec.serial_number,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR ) THEN
4765 
4766         l_statement := l_statement ||
4767                            ' SERIAL_NUMBER = :b_serial_number'||',';
4768         l_update_yes_flag := 'Y';
4769          b_serial_number := p_serial_number;
4770 -- Added following code for bug 4228421
4771     ELSIF (p_serial_number IS NULL) --Changing value to NULL
4772         AND nvl(p_serial_number,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
4773             nvl(l_asset_rec.serial_number,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR ) THEN
4774 
4775         l_statement := l_statement ||
4776                            ' SERIAL_NUMBER = NULL,';
4777         l_update_yes_flag := 'Y';
4778 -- End of code addition for bug  4228421
4779     END IF;
4780 
4781   --  Update the DFF fields
4782     IF (p_attribute_category <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR AND p_attribute_category IS NOT NULL)  -- changed IS NULL condition to IS NOT NULL for bug 4228421
4783         AND nvl(p_attribute_category,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
4784             nvl(l_asset_rec.attribute_category,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR ) THEN
4785 
4786         l_statement := l_statement ||
4787                            ' ATTRIBUTE_CATEGORY = :b_attribute_category'||',';
4788         l_update_yes_flag := 'Y';
4789          b_attribute_category := p_attribute_category;
4790 -- Added following code for bug 4228421
4791 
4792     ELSIF (p_attribute_category IS NULL) --Changing value to NULL
4793         AND nvl(p_attribute_category,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
4794             nvl(l_asset_rec.attribute_category,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR ) THEN
4795 
4796         l_statement := l_statement ||
4797                            ' ATTRIBUTE_CATEGORY = NULL,';
4798         l_update_yes_flag := 'Y';
4799 -- End of code addition for bug  4228421
4800     END IF;
4801 
4802     IF (p_attribute1 <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR AND p_attribute1 IS NOT NULL)  -- changed IS NULL condition to IS NOT NULL for bug 4228421
4803         AND nvl(p_attribute1,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
4804             nvl(l_asset_rec.attribute1,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR ) THEN
4805 
4806         l_statement := l_statement ||
4807                            ' ATTRIBUTE1 = :b_attribute1'||',';
4808         l_update_yes_flag := 'Y';
4809          b_attribute1 := p_attribute1;
4810 -- Added following code for bug 4228421
4811     ELSIF (p_attribute1 IS NULL) --Changing value to NULL
4812         AND nvl(p_attribute1,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
4813             nvl(l_asset_rec.attribute1,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR ) THEN
4814 
4815         l_statement := l_statement ||
4816                            ' ATTRIBUTE1 = NULL,';
4817         l_update_yes_flag := 'Y';
4818 -- End of code addition for bug  4228421
4819     END IF;
4820 
4821     IF (p_attribute2 <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR AND p_attribute2 IS NOT NULL)  -- changed IS NULL condition to IS NOT NULL for bug 4228421
4822         AND nvl(p_attribute2,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
4823             nvl(l_asset_rec.attribute2,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR ) THEN
4824 
4825         l_statement := l_statement ||
4826                            ' ATTRIBUTE2 = :b_attribute2'||',';
4827         l_update_yes_flag := 'Y';
4828          b_attribute2 := p_attribute2;
4829  -- Added following code for bug 4228421
4830     ELSIF (p_attribute2 IS NULL) --Changing value to NULL
4831         AND nvl(p_attribute2,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
4832             nvl(l_asset_rec.attribute2,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR ) THEN
4833 
4834         l_statement := l_statement ||
4835                            ' ATTRIBUTE2 = NULL,';
4836         l_update_yes_flag := 'Y';
4837 -- End of code addition for bug  4228421
4838     END IF;
4839 
4840     IF (p_attribute3 <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR AND p_attribute3 IS NOT NULL)  -- changed IS NULL condition to IS NOT NULL for bug 4228421
4841         AND nvl(p_attribute3,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
4842             nvl(l_asset_rec.attribute3,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR ) THEN
4843 
4844         l_statement := l_statement ||
4845                            ' ATTRIBUTE3 = :b_attribute3'||',';
4846         l_update_yes_flag := 'Y';
4847          b_attribute3 := p_attribute3;
4848 -- Added following code for bug 4228421
4849     ELSIF (p_attribute3 IS NULL) --Changing value to NULL
4850         AND nvl(p_attribute3,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
4851             nvl(l_asset_rec.attribute3,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR ) THEN
4852 
4853         l_statement := l_statement ||
4854                            ' ATTRIBUTE3 = NULL,';
4855         l_update_yes_flag := 'Y';
4856 -- End of code addition for bug  4228421
4857     END IF;
4858 
4859     IF (p_attribute4 <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR AND p_attribute4 IS NOT NULL)  -- changed IS NULL condition to IS NOT NULL for bug 4228421
4860         AND nvl(p_attribute4,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
4861             nvl(l_asset_rec.attribute4,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR ) THEN
4862 
4863         l_statement := l_statement ||
4864                            ' ATTRIBUTE4 = :b_attribute4'||',';
4865         l_update_yes_flag := 'Y';
4866          b_attribute4 := p_attribute4;
4867 -- Added following code for bug 4228421
4868     ELSIF (p_attribute4 IS NULL) --Changing value to NULL
4869         AND nvl(p_attribute4,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
4870             nvl(l_asset_rec.attribute4,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR ) THEN
4871 
4872         l_statement := l_statement ||
4873                            ' ATTRIBUTE4 = NULL,';
4874         l_update_yes_flag := 'Y';
4875 -- End of code addition for bug  4228421
4876     END IF;
4877 
4878     IF (p_attribute5 <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR AND p_attribute5 IS NOT NULL)  -- changed IS NULL condition to IS NOT NULL for bug 4228421
4879         AND nvl(p_attribute5,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
4880             nvl(l_asset_rec.attribute5,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR ) THEN
4881 
4882         l_statement := l_statement ||
4883                            ' ATTRIBUTE5 = :b_attribute5'||',';
4884         l_update_yes_flag := 'Y';
4885          b_attribute5 := p_attribute5;
4886 -- Added following code for bug 4228421
4887     ELSIF (p_attribute5 IS NULL) --Changing value to NULL
4888         AND nvl(p_attribute5,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
4889             nvl(l_asset_rec.attribute5,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR ) THEN
4890 
4891         l_statement := l_statement ||
4892                            ' ATTRIBUTE5 = NULL,';
4893         l_update_yes_flag := 'Y';
4894 -- End of code addition for bug  4228421
4895     END IF;
4896 
4897     IF (p_attribute6 <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR AND p_attribute6 IS NOT NULL)  -- changed IS NULL condition to IS NOT NULL for bug 4228421
4898         AND nvl(p_attribute6,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
4899             nvl(l_asset_rec.attribute6,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR ) THEN
4900 
4901         l_statement := l_statement ||
4902                            ' ATTRIBUTE6 = :b_attribute6'||',';
4903         l_update_yes_flag := 'Y';
4904          b_attribute6 := p_attribute6;
4905 -- Added following code for bug 4228421
4906     ELSIF (p_attribute6 IS NULL) --Changing value to NULL
4907         AND nvl(p_attribute6,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
4908             nvl(l_asset_rec.attribute6,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR ) THEN
4909 
4910         l_statement := l_statement ||
4911                            ' ATTRIBUTE6 = NULL,';
4912         l_update_yes_flag := 'Y';
4913 -- End of code addition for bug  4228421
4914     END IF;
4915 
4916     IF (p_attribute7 <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR AND p_attribute7 IS NOT NULL)  -- changed IS NULL condition to IS NOT NULL for bug 4228421
4917         AND nvl(p_attribute7,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
4918             nvl(l_asset_rec.attribute7,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR ) THEN
4919 
4920         l_statement := l_statement ||
4921                            ' ATTRIBUTE7 = :b_attribute7'||',';
4922         l_update_yes_flag := 'Y';
4923          b_attribute7 := p_attribute7;
4924 -- Added following code for bug 4228421
4925     ELSIF (p_attribute7 IS NULL) --Changing value to NULL
4926         AND nvl(p_attribute7,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
4927             nvl(l_asset_rec.attribute7,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR ) THEN
4928 
4929         l_statement := l_statement ||
4930                            ' ATTRIBUTE7 = NULL,';
4931         l_update_yes_flag := 'Y';
4932 -- End of code addition for bug  4228421
4933     END IF;
4934 
4935     IF (p_attribute8 <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR AND p_attribute8 IS NOT NULL)  -- changed IS NULL condition to IS NOT NULL for bug 4228421
4936         AND nvl(p_attribute8,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
4937             nvl(l_asset_rec.attribute8,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR ) THEN
4938 
4939         l_statement := l_statement ||
4940                            ' ATTRIBUTE8 = :b_attribute8'||',';
4941         l_update_yes_flag := 'Y';
4942          b_attribute8 := p_attribute8;
4943 -- Added following code for bug 4228421
4944     ELSIF (p_attribute8 IS NULL) --Changing value to NULL
4945         AND nvl(p_attribute8,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
4946             nvl(l_asset_rec.attribute8,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR ) THEN
4947 
4948         l_statement := l_statement ||
4949                            ' ATTRIBUTE8 = NULL,';
4950         l_update_yes_flag := 'Y';
4951 -- End of code addition for bug  4228421
4952     END IF;
4953 
4954     IF (p_attribute9 <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR AND p_attribute9 IS NOT NULL)  -- changed IS NULL condition to IS NOT NULL for bug 4228421
4955         AND nvl(p_attribute9,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
4956             nvl(l_asset_rec.attribute9,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR ) THEN
4957 
4958         l_statement := l_statement ||
4959                            ' ATTRIBUTE9 = :b_attribute9'||',';
4960         l_update_yes_flag := 'Y';
4961          b_attribute9 := p_attribute9;
4962 -- Added following code for bug 4228421
4963     ELSIF (p_attribute9 IS NULL) --Changing value to NULL
4964         AND nvl(p_attribute9,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
4965             nvl(l_asset_rec.attribute9,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR ) THEN
4966 
4967         l_statement := l_statement ||
4968                            ' ATTRIBUTE9 = NULL,';
4969         l_update_yes_flag := 'Y';
4970 -- End of code addition for bug  4228421
4971     END IF;
4972 
4973     IF (p_attribute10 <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR AND p_attribute10 IS NOT NULL)  -- changed IS NULL condition to IS NOT NULL for bug 4228421
4974         AND nvl(p_attribute10,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
4975             nvl(l_asset_rec.attribute10,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR ) THEN
4976 
4977         l_statement := l_statement ||
4978                            ' ATTRIBUTE10 = :b_attribute10'||',';
4979         l_update_yes_flag := 'Y';
4980          b_attribute10 := p_attribute10;
4981 -- Added following code for bug 4228421
4982     ELSIF (p_attribute10 IS NULL) --Changing value to NULL
4983         AND nvl(p_attribute10,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
4984             nvl(l_asset_rec.attribute10,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR ) THEN
4985 
4986         l_statement := l_statement ||
4987                            ' ATTRIBUTE10 = NULL,';
4988         l_update_yes_flag := 'Y';
4989 -- End of code addition for bug  4228421
4990     END IF;
4991 
4992     IF (p_attribute11 <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR AND p_attribute11 IS NOT NULL)  -- changed IS NULL condition to IS NOT NULL for bug 4228421
4993         AND nvl(p_attribute11,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
4994             nvl(l_asset_rec.attribute11,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR ) THEN
4995 
4996         l_statement := l_statement ||
4997                            ' ATTRIBUTE11 = :b_attribute11'||',';
4998         l_update_yes_flag := 'Y';
4999          b_attribute11 := p_attribute11;
5000 -- Added following code for bug 4228421
5001     ELSIF (p_attribute11 IS NULL) --Changing value to NULL
5002         AND nvl(p_attribute11,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
5003             nvl(l_asset_rec.attribute11,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR ) THEN
5004 
5005         l_statement := l_statement ||
5006                            ' ATTRIBUTE11 = NULL,';
5007         l_update_yes_flag := 'Y';
5008 -- End of code addition for bug  4228421
5009     END IF;
5010 
5011     IF (p_attribute12 <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR AND p_attribute12 IS NOT NULL)  -- changed IS NULL condition to IS NOT NULL for bug 4228421
5012         AND nvl(p_attribute12,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
5013             nvl(l_asset_rec.attribute12,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR ) THEN
5014 
5015         l_statement := l_statement ||
5016                            ' ATTRIBUTE12 = :b_attribute12'||',';
5017         l_update_yes_flag := 'Y';
5018          b_attribute12 := p_attribute12;
5019 -- Added following code for bug 4228421
5020     ELSIF (p_attribute12 IS NULL) --Changing value to NULL
5021         AND nvl(p_attribute12,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
5022             nvl(l_asset_rec.attribute12,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR ) THEN
5023 
5024         l_statement := l_statement ||
5025                            ' ATTRIBUTE12 = NULL,';
5026         l_update_yes_flag := 'Y';
5027 -- End of code addition for bug  4228421
5028     END IF;
5029 
5030     IF (p_attribute13 <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR AND p_attribute13 IS NOT NULL)  -- changed IS NULL condition to IS NOT NULL for bug 4228421
5031         AND nvl(p_attribute13,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
5032             nvl(l_asset_rec.attribute13,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR ) THEN
5033 
5034         l_statement := l_statement ||
5035                            ' ATTRIBUTE13 = :b_attribute13'||',';
5036         l_update_yes_flag := 'Y';
5037          b_attribute13 := p_attribute13;
5038 -- Added following code for bug 4228421
5039     ELSIF (p_attribute13 IS NULL) --Changing value to NULL
5040         AND nvl(p_attribute13,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
5041             nvl(l_asset_rec.attribute13,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR ) THEN
5042 
5043         l_statement := l_statement ||
5044                            ' ATTRIBUTE13 = NULL,';
5045         l_update_yes_flag := 'Y';
5046 -- End of code addition for bug  4228421
5047     END IF;
5048 
5049     IF (p_attribute14 <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR AND p_attribute14 IS NOT NULL)  -- changed IS NULL condition to IS NOT NULL for bug 4228421
5050         AND nvl(p_attribute14,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
5051             nvl(l_asset_rec.attribute14,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR ) THEN
5052 
5053         l_statement := l_statement ||
5054                            ' ATTRIBUTE14 = :b_attribute14'||',';
5055         l_update_yes_flag := 'Y';
5056          b_attribute14 := p_attribute14;
5057 -- Added following code for bug 4228421
5058     ELSIF (p_attribute14 IS NULL) --Changing value to NULL
5059         AND nvl(p_attribute14,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
5060             nvl(l_asset_rec.attribute14,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR ) THEN
5061 
5062         l_statement := l_statement ||
5063                            ' ATTRIBUTE14 = NULL,';
5064         l_update_yes_flag := 'Y';
5065 -- End of code addition for bug  4228421
5066     END IF;
5067 
5068     IF (p_attribute15 <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR AND p_attribute15 IS NOT NULL)  -- changed IS NULL condition to IS NOT NULL for bug 4228421
5069         AND nvl(p_attribute15,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
5070             nvl(l_asset_rec.attribute15,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR ) THEN
5071 
5072         l_statement := l_statement ||
5073                            ' ATTRIBUTE15 = :b_attribute15'||',';
5074         l_update_yes_flag := 'Y';
5075          b_attribute15 := p_attribute15;
5076 -- Added following code for bug 4228421
5077     ELSIF (p_attribute15 IS NULL) --Changing value to NULL
5078         AND nvl(p_attribute15,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
5079             nvl(l_asset_rec.attribute15,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR ) THEN
5080 
5081         l_statement := l_statement ||
5082                            ' ATTRIBUTE15 = NULL,';
5083         l_update_yes_flag := 'Y';
5084 -- End of code addition for bug  4228421
5085     END IF;
5086 
5087 
5088     --No attributes may be updated for Capitalized assets or retirement adjustment targets
5089     IF l_update_yes_flag = 'Y' AND l_asset_rec.project_asset_type IN ('AS-BUILT','RETIREMENT_ADJUSTMENT')
5090         AND l_asset_rec.capitalized_flag = 'Y' THEN
5091 
5092         -- No asset attributes may be updated after capitalization. Raise error
5093         pa_interface_utils_pub.map_new_amg_msg
5094             ( p_old_message_code => 'PA_CANNOT_UPDATE_ASSET_AS'
5095             ,p_msg_attribute    => 'CHANGE'
5096             ,p_resize_flag      => 'N'
5097             ,p_msg_context      => 'ASSET'
5098             ,p_attribute1       => l_amg_project_number
5099             ,p_attribute2       => l_amg_pa_asset_name
5100             ,p_attribute3       => ''
5101             ,p_attribute4       => ''
5102             ,p_attribute5       => '');
5103 
5104         p_return_status := FND_API.G_RET_STS_ERROR;
5105 
5106         RAISE FND_API.G_EXC_ERROR;
5107 
5108     END IF;
5109 
5110 
5111 
5112     --Validate that the Asset Category, Book Type Code, Location, Asset Key, Depreciate Flag and Deprn Expense CCID
5113     --are NOT NULL if the Project Asset Type is AS-BUILT and Complete Asset Definition is required
5114 
5115     SELECT  NVL(pt.interface_complete_asset_flag,'N')
5116     INTO    v_intf_complete_asset_flag
5117     FROM    pa_project_types pt,
5118             pa_projects p
5119     WHERE   p.project_type = pt.project_type
5120     AND     p.project_id = l_project_id;
5121 
5122 
5123     IF v_intf_complete_asset_flag = 'Y' AND
5124         ((l_updated_proj_asset_type = 'Y' AND p_project_asset_type = 'AS-BUILT')
5125             OR (l_updated_proj_asset_type = 'N' AND l_asset_rec.project_asset_type = 'AS-BUILT')) THEN
5126 
5127 
5128         IF (l_updated_category_id = 'Y' AND (p_asset_category_id IS NULL OR p_asset_category_id = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM))
5129             OR (l_updated_category_id = 'N' AND l_asset_rec.asset_category_id IS NULL) THEN
5130 
5131             -- The Asset Category is required for 'AS-BUILT' assets. Raise error
5132             pa_interface_utils_pub.map_new_amg_msg
5133                 ( p_old_message_code => 'PA_CATEGORY_MISSING_AS'
5134                 ,p_msg_attribute    => 'CHANGE'
5135                 ,p_resize_flag      => 'N'
5136                 ,p_msg_context      => 'ASSET'
5137                 ,p_attribute1       => l_amg_project_number
5138                 ,p_attribute2       => l_amg_pa_asset_name
5139                 ,p_attribute3       => ''
5140                 ,p_attribute4       => ''
5141                 ,p_attribute5       => '');
5142 
5143             p_return_status := FND_API.G_RET_STS_ERROR;
5144 
5145             RAISE FND_API.G_EXC_ERROR;
5146         END IF;
5147 
5148 
5149 
5150         IF (l_updated_location_id = 'Y' AND (p_location_id IS NULL OR p_location_id = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM))
5151             OR (l_updated_location_id = 'N' AND l_asset_rec.location_id IS NULL) THEN
5152 
5153             -- The Asset Location is required for 'AS-BUILT' assets. Raise error
5154             pa_interface_utils_pub.map_new_amg_msg
5155                 ( p_old_message_code => 'PA_ASSET_LOC_MISSING_AS'
5156                 ,p_msg_attribute    => 'CHANGE'
5157                 ,p_resize_flag      => 'N'
5158                 ,p_msg_context      => 'ASSET'
5159                 ,p_attribute1       => l_amg_project_number
5160                 ,p_attribute2       => l_amg_pa_asset_name
5161                 ,p_attribute3       => ''
5162                 ,p_attribute4       => ''
5163                 ,p_attribute5       => '');
5164 
5165             p_return_status := FND_API.G_RET_STS_ERROR;
5166 
5167             RAISE FND_API.G_EXC_ERROR;
5168         END IF;
5169 
5170 
5171         IF l_book_type_code IS NULL OR l_book_type_code = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
5172 
5173             -- The Book Type Code is required for 'AS-BUILT' assets. Raise error
5174             pa_interface_utils_pub.map_new_amg_msg
5175                 ( p_old_message_code => 'PA_BOOK_TYPE_IS_MISSING_AS'
5176                 ,p_msg_attribute    => 'CHANGE'
5177                 ,p_resize_flag      => 'N'
5178                 ,p_msg_context      => 'ASSET'
5179                 ,p_attribute1       => l_amg_project_number
5180                 ,p_attribute2       => l_amg_pa_asset_name
5181                 ,p_attribute3       => ''
5182                 ,p_attribute4       => ''
5183                 ,p_attribute5       => '');
5184 
5185             p_return_status := FND_API.G_RET_STS_ERROR;
5186 
5187             RAISE FND_API.G_EXC_ERROR;
5188         END IF;
5189 
5190 
5191         IF (l_updated_deprn_expense_ccid = 'Y' AND (l_depreciation_expense_ccid IS NULL OR l_depreciation_expense_ccid = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM))
5192             OR (l_updated_deprn_expense_ccid = 'N' AND l_asset_rec.depreciation_expense_ccid IS NULL) THEN
5193 
5194             -- The Depreciation Expense CCID is required for 'AS-BUILT' assets. Raise error
5195             pa_interface_utils_pub.map_new_amg_msg
5196                 ( p_old_message_code => 'PA_DEPRN_EXP_MISSING_AS'
5197                 ,p_msg_attribute    => 'CHANGE'
5198                 ,p_resize_flag      => 'N'
5199                 ,p_msg_context      => 'ASSET'
5200                 ,p_attribute1       => l_amg_project_number
5201                 ,p_attribute2       => l_amg_pa_asset_name
5202                 ,p_attribute3       => ''
5203                 ,p_attribute4       => ''
5204                 ,p_attribute5       => '');
5205 
5206             p_return_status := FND_API.G_RET_STS_ERROR;
5207 
5208             RAISE FND_API.G_EXC_ERROR;
5209         END IF;
5210 
5211 
5212         IF (l_updated_asset_key_ccid = 'Y' AND (p_asset_key_ccid IS NULL OR p_asset_key_ccid = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM))
5213             OR (l_updated_asset_key_ccid = 'N' AND l_asset_rec.asset_key_ccid IS NULL) THEN
5214 
5215 
5216             --Asset Key CCID must be specified if any of the segments are specified
5217             BEGIN
5218                 SELECT  asset_key_flex_structure
5219                 INTO    structnum
5220                 FROM    fa_system_controls;
5221 
5222             EXCEPTION
5223                 WHEN NO_DATA_FOUND THEN
5224                     NULL;
5225             END;
5226 
5227             IF structnum IS NOT NULL THEN
5228 
5229                 FND_FLEX_KEY_API.SET_SESSION_MODE('seed_data');
5230 
5231                 fftype := FND_FLEX_KEY_API.FIND_FLEXFIELD
5232                                 (appl_short_name =>'OFA',
5233                                 flex_code =>'KEY#');
5234 
5235                 thestruct := FND_FLEX_KEY_API.FIND_STRUCTURE(fftype,structnum);
5236 
5237                 FND_FLEX_KEY_API.GET_SEGMENTS(fftype,thestruct,TRUE,numsegs,listsegs);
5238 
5239                 v_asset_key_required := 'N';
5240 
5241                 FOR i IN 1 .. numsegs LOOP
5242                     segtype := FND_FLEX_KEY_API.FIND_SEGMENT(fftype,thestruct,listsegs(i));
5243 
5244                     IF (segtype.required_flag = 'Y' and segtype.enabled_flag = 'Y') THEN
5245                         v_asset_key_required := 'Y';
5246                     END IF;
5247                 END LOOP;
5248 
5249 
5250                 IF v_asset_key_required = 'Y' THEN
5251 
5252                     -- The Asset Key CCID is required. Raise error
5253                     pa_interface_utils_pub.map_new_amg_msg
5254                         ( p_old_message_code => 'PA_ASSET_KEY_MISSING_AS'
5255                         ,p_msg_attribute    => 'CHANGE'
5256                         ,p_resize_flag      => 'N'
5257                         ,p_msg_context      => 'ASSET'
5258                         ,p_attribute1       => l_amg_project_number
5259                         ,p_attribute2       => l_amg_pa_asset_name
5260                         ,p_attribute3       => ''
5261                         ,p_attribute4       => ''
5262                         ,p_attribute5       => '');
5263 
5264                     p_return_status := FND_API.G_RET_STS_ERROR;
5265 
5266                     RAISE FND_API.G_EXC_ERROR;
5267                 END IF; --Asset Key is required
5268             END IF; --Structnum was determined
5269         END IF; --Asset Key was not specified
5270     END IF; --AS-BUILT asset with Complete Asset Info required
5271 
5272 
5273 
5274 
5275 
5276     --Validations complete.  If any fields have been changed, update is required
5277 
5278     --Perform update if required
5279     IF l_update_yes_flag = 'Y' THEN
5280 
5281         l_statement := l_statement ||
5282                             ' LAST_UPDATE_DATE = SYSDATE'||',';
5283 
5284        	l_statement := 	l_statement ||
5285                            	' LAST_UPDATED_BY = '||FND_GLOBAL.USER_ID||',';
5286 
5287         l_statement := 	l_statement ||
5288                            	' LAST_UPDATE_LOGIN = '||FND_GLOBAL.LOGIN_ID;
5289 
5290        	l_statement := 	l_statement ||
5291                 			' WHERE PROJECT_ASSET_ID = '|| TO_CHAR(l_project_asset_id);
5292 
5293 
5294 
5295         --Create and execute UPDATE statement
5296        	l_cursor := dbms_sql.open_cursor;
5297        	dbms_sql.parse(l_cursor, l_statement, dbms_sql.native);
5298 
5299         --Populate Bind Variables if used
5300         IF b_pm_asset_reference IS NOT NULL THEN
5301             DBMS_SQL.BIND_VARIABLE(l_cursor, ':b_pm_asset_reference', RTRIM(b_pm_asset_reference));
5302         END IF;
5303 
5304         IF b_pa_asset_name IS NOT NULL THEN
5305             DBMS_SQL.BIND_VARIABLE(l_cursor, ':b_pa_asset_name', RTRIM(b_pa_asset_name));
5306         END IF;
5307 
5308         IF b_asset_description IS NOT NULL THEN
5309             DBMS_SQL.BIND_VARIABLE(l_cursor, ':b_asset_description', RTRIM(b_asset_description));
5310         END IF;
5311 
5312         IF b_date_placed_in_service IS NOT NULL THEN
5313             DBMS_SQL.BIND_VARIABLE(l_cursor, ':b_date_placed_in_service', b_date_placed_in_service);
5314         END IF;
5315 
5316         IF b_project_asset_type IS NOT NULL THEN
5317             DBMS_SQL.BIND_VARIABLE(l_cursor, ':b_project_asset_type', RTRIM(b_project_asset_type));
5318         END IF;
5319 
5320         IF b_asset_number IS NOT NULL THEN
5321             DBMS_SQL.BIND_VARIABLE(l_cursor, ':b_asset_number', RTRIM(b_asset_number));
5322         END IF;
5323 
5324         IF b_location_id IS NOT NULL THEN
5325             DBMS_SQL.BIND_VARIABLE(l_cursor, ':b_location_id', b_location_id);
5326         END IF;
5327 
5328         IF b_assigned_to_person_id IS NOT NULL THEN
5329             DBMS_SQL.BIND_VARIABLE(l_cursor, ':b_assigned_to_person_id', b_assigned_to_person_id);
5330         END IF;
5331 
5332         IF b_book_type_code IS NOT NULL THEN
5333             DBMS_SQL.BIND_VARIABLE(l_cursor, ':b_book_type_code', RTRIM(b_book_type_code));
5334         END IF;
5335 
5336         IF b_parent_asset_id IS NOT NULL THEN
5337             DBMS_SQL.BIND_VARIABLE(l_cursor, ':b_parent_asset_id', b_parent_asset_id);
5338         END IF;
5339 
5340         IF b_asset_category_id IS NOT NULL THEN
5341             DBMS_SQL.BIND_VARIABLE(l_cursor, ':b_asset_category_id', b_asset_category_id);
5342         END IF;
5343 
5344         IF b_amortize_flag IS NOT NULL THEN
5345             DBMS_SQL.BIND_VARIABLE(l_cursor, ':b_amortize_flag', RTRIM(b_amortize_flag));
5346         END IF;
5347 
5348         IF b_depreciate_flag IS NOT NULL THEN
5349             DBMS_SQL.BIND_VARIABLE(l_cursor, ':b_depreciate_flag', RTRIM(b_depreciate_flag));
5350         END IF;
5351 
5352         IF b_depreciation_expense_ccid IS NOT NULL THEN
5353             DBMS_SQL.BIND_VARIABLE(l_cursor, ':b_depreciation_expense_ccid', b_depreciation_expense_ccid);
5354         END IF;
5355 
5356         IF b_asset_key_ccid IS NOT NULL THEN
5357             DBMS_SQL.BIND_VARIABLE(l_cursor, ':b_asset_key_ccid', b_asset_key_ccid);
5358         END IF;
5359 
5360         IF b_ret_target_asset_id IS NOT NULL THEN
5361             DBMS_SQL.BIND_VARIABLE(l_cursor, ':b_ret_target_asset_id', b_ret_target_asset_id);
5362         END IF;
5363 
5364         IF b_asset_units IS NOT NULL THEN
5365             DBMS_SQL.BIND_VARIABLE(l_cursor, ':b_asset_units', b_asset_units);
5366         END IF;
5367          --Added for bug 4744574
5368         IF b_estimated_in_service_date IS NOT NULL THEN
5369             DBMS_SQL.BIND_VARIABLE(l_cursor, ':b_estimated_in_service_date', b_estimated_in_service_date);
5370         END IF;
5371          --End changes for 4744574
5372 
5373         IF b_estimated_asset_units IS NOT NULL THEN
5374             DBMS_SQL.BIND_VARIABLE(l_cursor, ':b_estimated_asset_units', b_estimated_asset_units);
5375         END IF;
5376 
5377         IF b_estimated_cost IS NOT NULL THEN
5378             DBMS_SQL.BIND_VARIABLE(l_cursor, ':b_estimated_cost', b_estimated_cost);
5379         END IF;
5380 
5381         IF b_manufacturer_name IS NOT NULL THEN
5382             DBMS_SQL.BIND_VARIABLE(l_cursor, ':b_manufacturer_name', RTRIM(b_manufacturer_name));
5383         END IF;
5384 
5385         IF b_model_number IS NOT NULL THEN
5386             DBMS_SQL.BIND_VARIABLE(l_cursor, ':b_model_number', RTRIM(b_model_number));
5387         END IF;
5388 
5389         IF b_tag_number IS NOT NULL THEN
5390             DBMS_SQL.BIND_VARIABLE(l_cursor, ':b_tag_number', RTRIM(b_tag_number));
5391         END IF;
5392 
5393         IF b_serial_number IS NOT NULL THEN
5394             DBMS_SQL.BIND_VARIABLE(l_cursor, ':b_serial_number', RTRIM(b_serial_number));
5395         END IF;
5396 
5397         IF b_attribute_category IS NOT NULL THEN
5398             DBMS_SQL.BIND_VARIABLE(l_cursor, ':b_attribute_category', RTRIM(b_attribute_category));
5399         END IF;
5400 
5401         IF b_attribute1 IS NOT NULL THEN
5402             DBMS_SQL.BIND_VARIABLE(l_cursor, ':b_attribute1', RTRIM(b_attribute1));
5403         END IF;
5404 
5405         IF b_attribute2 IS NOT NULL THEN
5406             DBMS_SQL.BIND_VARIABLE(l_cursor, ':b_attribute2', RTRIM(b_attribute2));
5407         END IF;
5408 
5409         IF b_attribute3 IS NOT NULL THEN
5410             DBMS_SQL.BIND_VARIABLE(l_cursor, ':b_attribute3', RTRIM(b_attribute3));
5411         END IF;
5412 
5413         IF b_attribute4 IS NOT NULL THEN
5414             DBMS_SQL.BIND_VARIABLE(l_cursor, ':b_attribute4', RTRIM(b_attribute4));
5415         END IF;
5416 
5417         IF b_attribute5 IS NOT NULL THEN
5418             DBMS_SQL.BIND_VARIABLE(l_cursor, ':b_attribute5', RTRIM(b_attribute5));
5419         END IF;
5420 
5421         IF b_attribute6 IS NOT NULL THEN
5422             DBMS_SQL.BIND_VARIABLE(l_cursor, ':b_attribute6', RTRIM(b_attribute6));
5423         END IF;
5424 
5425         IF b_attribute7 IS NOT NULL THEN
5426             DBMS_SQL.BIND_VARIABLE(l_cursor, ':b_attribute7', RTRIM(b_attribute7));
5427         END IF;
5428 
5429         IF b_attribute8 IS NOT NULL THEN
5430             DBMS_SQL.BIND_VARIABLE(l_cursor, ':b_attribute8', RTRIM(b_attribute8));
5431         END IF;
5432 
5433         IF b_attribute9 IS NOT NULL THEN
5434             DBMS_SQL.BIND_VARIABLE(l_cursor, ':b_attribute9', RTRIM(b_attribute9));
5435         END IF;
5436 
5437         IF b_attribute10 IS NOT NULL THEN
5438             DBMS_SQL.BIND_VARIABLE(l_cursor, ':b_attribute10', RTRIM(b_attribute10));
5439         END IF;
5440 
5441         IF b_attribute11 IS NOT NULL THEN
5442             DBMS_SQL.BIND_VARIABLE(l_cursor, ':b_attribute11', RTRIM(b_attribute11));
5443         END IF;
5444 
5445         IF b_attribute12 IS NOT NULL THEN
5446             DBMS_SQL.BIND_VARIABLE(l_cursor, ':b_attribute12', RTRIM(b_attribute12));
5447         END IF;
5448 
5449         IF b_attribute13 IS NOT NULL THEN
5450             DBMS_SQL.BIND_VARIABLE(l_cursor, ':b_attribute13', RTRIM(b_attribute13));
5451         END IF;
5452 
5453         IF b_attribute14 IS NOT NULL THEN
5454             DBMS_SQL.BIND_VARIABLE(l_cursor, ':b_attribute14', RTRIM(b_attribute14));
5455         END IF;
5456 
5457         IF b_attribute15 IS NOT NULL THEN
5458             DBMS_SQL.BIND_VARIABLE(l_cursor, ':b_attribute15', RTRIM(b_attribute15));
5459         END IF;
5460 
5461         --Execute SQL Statement
5462        	l_rows   := dbms_sql.execute(l_cursor);
5463 
5464        	IF dbms_sql.is_open (l_cursor) THEN
5465        		dbms_sql.close_cursor (l_cursor);
5466        	END IF;
5467     END IF; --update flag = yes
5468 
5469 
5470     --Set output parameters
5471     p_pa_project_id_out := l_project_id;
5472     p_pa_project_number_out := l_amg_project_number;
5473     p_pa_project_asset_id_out := l_project_asset_id;
5474     p_pm_asset_reference_out := l_pm_asset_reference;
5475 
5476 
5477     CLOSE l_lock_rows_csr;  --FYI: doesn't remove locks
5478 
5479     IF FND_API.to_boolean( p_commit ) THEN
5480 	    COMMIT;
5481     END IF;
5482 
5483 
5484  EXCEPTION
5485   	WHEN FND_API.G_EXC_ERROR THEN
5486 		ROLLBACK TO update_project_asset_pub;
5487 
5488 		p_return_status := FND_API.G_RET_STS_ERROR;
5489 
5490 		FND_MSG_PUB.Count_And_Get
5491 			(   p_count		=>	p_msg_count	,
5492 			    p_data		=>	p_msg_data	);
5493 
5494 	WHEN FND_API.G_EXC_UNEXPECTED_ERROR	THEN
5495 	    ROLLBACK TO update_project_asset_pub;
5496 
5497   	    p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5498 
5499 	    FND_MSG_PUB.Count_And_Get
5500 			(   p_count		=>	p_msg_count	,
5501 			    p_data		=>	p_msg_data	);
5502 
5503 
5504     WHEN ROW_ALREADY_LOCKED THEN
5505 	   ROLLBACK TO update_project_asset_pub;
5506 
5507 	   p_return_status := FND_API.G_RET_STS_ERROR;
5508 
5509        IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
5510            FND_MESSAGE.SET_NAME('PA','PA_ROW_ALREADY_LOCKED_AS_AMG');
5511            FND_MESSAGE.SET_TOKEN('PROJECT', l_amg_project_number);
5512            FND_MESSAGE.SET_TOKEN('ASSET',    l_amg_pa_asset_name);
5513            FND_MESSAGE.SET_TOKEN('ENTITY', G_ASSET_CODE);
5514            FND_MSG_PUB.ADD;
5515 	   END IF;
5516 
5517 	   FND_MSG_PUB.Count_And_Get
5518 			(   p_count		=>	p_msg_count	,
5519 			    p_data		=>	p_msg_data	);
5520 
5521 
5522  	WHEN OTHERS	THEN
5523 	    ROLLBACK TO update_project_asset_pub;
5524 
5525 	    p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5526 
5527 	    IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
5528 		    FND_MSG_PUB.add_exc_msg
5529 				( p_pkg_name		=> G_PKG_NAME
5530 				, p_procedure_name	=> l_api_name	);
5531 
5532 	    END IF;
5533 
5534 	    FND_MSG_PUB.Count_And_Get
5535 			(   p_count		=>	p_msg_count	,
5536 			    p_data		=>	p_msg_data	);
5537 
5538  END update_project_asset;
5539 
5540 
5541 
5542 
5543 
5544 --====================================================================================
5545 --Name:               convert_pm_assetref_to_id
5546 --Type:               Procedure
5547 --Description:        This procedure can be used to convert an incoming
5548 --                    asset reference to a project asset ID.
5549 --
5550 --Called subprograms: none
5551 --
5552 --
5553 --
5554 --History:
5555 --	20-JAN-2003	JPultorak    	Created
5556 --
5557 --Put this in PA_PROJECT_PVT if desired
5558 
5559 PROCEDURE convert_pm_assetref_to_id (
5560  p_pa_project_id        IN NUMBER,
5561  p_pa_project_asset_id  IN NUMBER    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM,
5562  p_pm_asset_reference   IN VARCHAR2  := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR,
5563  p_out_project_asset_id OUT NOCOPY NUMBER,
5564  p_return_status        OUT NOCOPY VARCHAR2 ) IS
5565 
5566 CURSOR 	l_project_id_csr
5567 IS
5568 SELECT 	'X'
5569 FROM	pa_projects
5570 where   project_id = p_pa_project_id;
5571 
5572 
5573 CURSOR 	l_project_asset_id_csr
5574 IS
5575 SELECT 	'X'
5576 FROM	pa_project_assets
5577 WHERE   project_asset_id = p_pa_project_asset_id
5578 AND 	project_id = p_pa_project_id;
5579 
5580 
5581 CURSOR  l_asset_csr IS
5582 SELECT  project_asset_id
5583 FROM    pa_project_assets_all
5584 WHERE   project_id           = p_pa_project_id
5585 AND     pm_asset_reference   = p_pm_asset_reference;
5586 
5587 l_asset_rec      l_asset_csr%ROWTYPE;
5588 
5589 
5590 
5591 l_api_name	CONSTANT	VARCHAR2(30) := 'Convert_pm_assetref_to_id';
5592 l_dummy				    VARCHAR2(1);
5593 
5594 
5595    --Used to get the field values associated to a AMG message
5596    CURSOR   l_amg_project_csr
5597       (p_pa_project_id pa_projects.project_id%type)
5598    IS
5599    SELECT   segment1
5600    FROM     pa_projects p
5601    WHERE p.project_id = p_pa_project_id;
5602 
5603    l_amg_segment1       VARCHAR2(25);
5604 
5605 BEGIN
5606 
5607     p_return_status :=  FND_API.G_RET_STS_SUCCESS;
5608 
5609     IF p_pa_project_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
5610         AND p_pa_project_id IS NOT NULL THEN
5611 
5612       	OPEN l_project_id_csr;
5613       	FETCH l_project_id_csr INTO l_dummy;
5614 
5615       	IF l_project_id_csr%NOTFOUND THEN
5616             IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
5617                 pa_interface_utils_pub.map_new_amg_msg
5618                     ( p_old_message_code => 'PA_INVALID_PROJECT_ID'
5619                     ,p_msg_attribute    => 'CHANGE'
5620                     ,p_resize_flag      => 'N'
5621                     ,p_msg_context      => 'GENERAL'
5622                     ,p_attribute1       => ''
5623                     ,p_attribute2       => ''
5624                     ,p_attribute3       => ''
5625                     ,p_attribute4       => ''
5626                     ,p_attribute5       => '');
5627             END IF;
5628 
5629             CLOSE l_project_id_csr;
5630 	        RAISE FND_API.G_EXC_ERROR;
5631       	END IF;
5632 
5633       	CLOSE l_project_id_csr;
5634     ELSE --p_pa_project_id has not been specified
5635       	IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
5636 
5637             pa_interface_utils_pub.map_new_amg_msg
5638               ( p_old_message_code => 'PA_PROJECT_ID_MISSING'
5639                ,p_msg_attribute    => 'CHANGE'
5640                ,p_resize_flag      => 'N'
5641                ,p_msg_context      => 'GENERAL'
5642                ,p_attribute1       => ''
5643                ,p_attribute2       => ''
5644                ,p_attribute3       => ''
5645                ,p_attribute4       => ''
5646                ,p_attribute5       => '');
5647         END IF;
5648 
5649         RAISE FND_API.G_EXC_ERROR;
5650 
5651     END IF; --p_pa_project_id has a value
5652 
5653 
5654     IF p_pa_project_asset_id <>  PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
5655        AND p_pa_project_asset_id IS NOT NULL THEN
5656 
5657         -- Get segment1 for AMG messages
5658         OPEN l_amg_project_csr( p_pa_project_id );
5659         FETCH l_amg_project_csr INTO l_amg_segment1;
5660         CLOSE l_amg_project_csr;
5661 
5662         OPEN l_project_asset_id_csr;
5663         FETCH l_project_asset_id_csr INTO l_dummy;
5664 
5665         IF l_project_asset_id_csr%NOTFOUND THEN
5666             IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
5667                 pa_interface_utils_pub.map_new_amg_msg
5668                     ( p_old_message_code => 'PA_PROJ_ASSET_ID_INVALID'
5669                     ,p_msg_attribute    => 'CHANGE'
5670                     ,p_resize_flag      => 'N'
5671                     ,p_msg_context      => 'PROJ'
5672                     ,p_attribute1       => l_amg_segment1
5673                     ,p_attribute2       => ''
5674                     ,p_attribute3       => ''
5675                     ,p_attribute4       => ''
5676                     ,p_attribute5       => '');
5677             END IF;
5678 
5679     		CLOSE l_project_asset_id_csr;
5680 	       	RAISE FND_API.G_EXC_ERROR;
5681    	    END IF;
5682 
5683    	    CLOSE l_project_asset_id_csr;
5684 
5685         p_out_project_asset_id := p_pa_project_asset_id;
5686 
5687     ELSIF p_pm_asset_reference <>  PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
5688         AND p_pm_asset_reference IS NOT NULL THEN
5689 
5690         OPEN l_asset_csr;
5691         FETCH l_asset_csr INTO l_asset_rec;
5692         IF l_asset_csr%NOTFOUND THEN
5693             CLOSE l_asset_csr;
5694 
5695             IF FND_MSG_PUB.check_msg_level (FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
5696                 FND_MESSAGE.SET_NAME('PA','PA_API_CONV_ERROR_AMG'); -- bug 2257612
5697                 FND_MESSAGE.SET_TOKEN('ATTR_NAME','Pm Asset Reference');
5698                 FND_MESSAGE.SET_TOKEN('ATTR_VALUE',p_pm_asset_reference);
5699                 FND_MSG_PUB.add;
5700 
5701 		        RAISE FND_API.G_EXC_ERROR;
5702             END IF;
5703         ELSE
5704             p_out_project_asset_id := l_asset_rec.project_asset_id;
5705             CLOSE l_asset_csr;
5706         END IF;
5707 
5708     ELSE --Neither Project Asset ID nor PM Asset Reference Specified
5709 		IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
5710             pa_interface_utils_pub.map_new_amg_msg
5711               ( p_old_message_code => 'PA_ASSET_REF_ID_MISSING'
5712                ,p_msg_attribute    => 'CHANGE'
5713                ,p_resize_flag      => 'N'
5714                ,p_msg_context      => 'PROJ'
5715                ,p_attribute1       => l_amg_segment1
5716                ,p_attribute2       => ''
5717                ,p_attribute3       => ''
5718                ,p_attribute4       => ''
5719                ,p_attribute5       => '');
5720      	END IF;
5721 
5722    		RAISE FND_API.G_EXC_ERROR;
5723 
5724     END IF; -- Project Asset ID or PM Asset Reference Specified
5725 
5726 
5727 EXCEPTION
5728 
5729 	WHEN FND_API.G_EXC_ERROR THEN
5730         /* dbms_output.put_line('handling an G_EXC_ERROR exception'); */
5731 
5732 	    p_return_status := FND_API.G_RET_STS_ERROR;
5733 
5734 	WHEN FND_API.G_EXC_UNEXPECTED_ERROR	THEN
5735         /* dbms_output.put_line('handling an G_EXC_UNEXPECTED_ERROR exception'); */
5736 
5737 	    p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5738 
5739 	WHEN OTHERS THEN
5740         /* dbms_output.put_line('handling an OTHERS exception'); */
5741 
5742 	    p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5743 
5744 	    IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
5745 		    FND_MSG_PUB.add_exc_msg
5746 				( p_pkg_name		=> G_PKG_NAME
5747 				, p_procedure_name	=> l_api_name	);
5748 
5749 	    END IF;
5750 
5751 END Convert_pm_assetref_to_id;
5752 
5753 
5754 
5755 --====================================================================================
5756 --
5757 --Name:               fetch_project_asset_id
5758 --Type:               Function
5759 --Description:        This function will return the Project Asset ID based on the
5760 --                    asset reference.  If not found, it will return NULL.
5761 --
5762 --
5763 --Called subprograms: none
5764 --
5765 --
5766 --
5767 --History:
5768 --    01-MAR-2003     J. Pultorak    Created
5769 --
5770 --Put this in PA_PROJECT_PVT if desired
5771 --
5772 
5773 FUNCTION fetch_project_asset_id
5774 ( p_pa_project_id        IN NUMBER
5775  ,p_pm_asset_reference   IN VARCHAR2 ) RETURN NUMBER
5776 
5777 IS
5778 
5779 CURSOR c_asset_csr IS
5780 SELECT  project_asset_id
5781 FROM    pa_project_assets
5782 WHERE   project_id = p_pa_project_id
5783 AND     pm_asset_reference = p_pm_asset_reference;
5784 
5785 l_asset_rec      c_asset_csr%ROWTYPE;
5786 
5787 BEGIN
5788 
5789       OPEN c_asset_csr;
5790       FETCH  c_asset_csr INTO l_asset_rec.project_asset_id;
5791       IF c_asset_csr%NOTFOUND THEN
5792          CLOSE c_asset_csr;
5793          RETURN NULL;
5794       ELSE
5795          CLOSE c_asset_csr;
5796          RETURN l_asset_rec.project_asset_id;
5797       END IF;
5798 
5799 END fetch_project_asset_id;
5800 
5801 
5802 
5803 
5804 --------------------------------------------------------------------------------
5805 --Name:               load_asset_assignment
5806 --Type:               Procedure
5807 --Description:        This procedure can be used to move a project asset assignment
5808 -- 		              from the client side to a PL/SQL table on the server side,
5809 --                    where it will be used by a LOAD/EXECUTE/FETCH cycle.
5810 --
5811 --Called subprograms:
5812 --
5813 --
5814 --
5815 --History:
5816 --    01-MAR-2003    J. Pultorak    Created
5817 --
5818 
5819 PROCEDURE load_asset_assignment
5820  ( p_api_version_number		IN	NUMBER
5821   ,p_init_msg_list		    IN	VARCHAR2	:= FND_API.G_FALSE
5822   ,p_return_status		    OUT	NOCOPY VARCHAR2
5823   ,p_pm_task_reference	    IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
5824   ,p_pa_task_id			    IN	NUMBER      := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
5825   ,p_pm_asset_reference		IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
5826   ,p_pa_project_asset_id	IN	NUMBER      := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
5827   ,p_attribute_category		IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
5828   ,p_attribute1				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
5829   ,p_attribute2				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
5830   ,p_attribute3				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
5831   ,p_attribute4				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
5832   ,p_attribute5				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
5833   ,p_attribute6				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
5834   ,p_attribute7				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
5835   ,p_attribute8				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
5836   ,p_attribute9				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
5837   ,p_attribute10			IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
5838   ,p_attribute11			IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
5839   ,p_attribute12			IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
5840   ,p_attribute13			IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
5841   ,p_attribute14			IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
5842   ,p_attribute15			IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR )
5843 
5844   IS
5845 
5846    l_api_name			CONSTANT	VARCHAR2(30) 		:= 'load_asset_assignment';
5847    i						NUMBER;
5848 
5849 
5850 BEGIN
5851 
5852     --  Standard begin of API savepoint
5853     SAVEPOINT load_asset_assignment_pub;
5854 
5855 
5856     --  Standard call to check for call compatibility.
5857     IF NOT FND_API.Compatible_API_Call ( g_api_version_number	,
5858     	    	    	    	    	 p_api_version_number	,
5859     	    	    	    	    	 l_api_name 	    	,
5860     	    	    	    	    	 G_PKG_NAME 	    ) THEN
5861 
5862     	RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5863     END IF;
5864 
5865 
5866     --  Initialize the message table if requested.
5867     IF FND_API.TO_BOOLEAN( p_init_msg_list ) THEN
5868     	FND_MSG_PUB.initialize;
5869     END IF;
5870 
5871 
5872     --  Set API return status to success
5873     p_return_status := FND_API.G_RET_STS_SUCCESS;
5874 
5875 
5876     -- assign a value to the global counter for this table
5877     G_asset_assignments_tbl_count	:= G_asset_assignments_tbl_count + 1;
5878 
5879 
5880     -- assign incoming parameters to the global table fields
5881     G_asset_assignments_in_tbl(G_asset_assignments_tbl_count).pa_task_id              := p_pa_task_id;
5882     G_asset_assignments_in_tbl(G_asset_assignments_tbl_count).pm_task_reference       := p_pm_task_reference;
5883     G_asset_assignments_in_tbl(G_asset_assignments_tbl_count).pa_project_asset_id     := p_pa_project_asset_id;
5884     G_asset_assignments_in_tbl(G_asset_assignments_tbl_count).pm_asset_reference      := p_pm_asset_reference;
5885     G_asset_assignments_in_tbl(G_asset_assignments_tbl_count).attribute_category      := p_attribute_category;
5886     G_asset_assignments_in_tbl(G_asset_assignments_tbl_count).attribute1              := p_attribute1;
5887     G_asset_assignments_in_tbl(G_asset_assignments_tbl_count).attribute2              := p_attribute2;
5888     G_asset_assignments_in_tbl(G_asset_assignments_tbl_count).attribute3              := p_attribute3;
5889     G_asset_assignments_in_tbl(G_asset_assignments_tbl_count).attribute4              := p_attribute4;
5890     G_asset_assignments_in_tbl(G_asset_assignments_tbl_count).attribute5              := p_attribute5;
5891     G_asset_assignments_in_tbl(G_asset_assignments_tbl_count).attribute6              := p_attribute6;
5892     G_asset_assignments_in_tbl(G_asset_assignments_tbl_count).attribute7              := p_attribute7;
5893     G_asset_assignments_in_tbl(G_asset_assignments_tbl_count).attribute8              := p_attribute8;
5894     G_asset_assignments_in_tbl(G_asset_assignments_tbl_count).attribute9              := p_attribute9;
5895     G_asset_assignments_in_tbl(G_asset_assignments_tbl_count).attribute10             := p_attribute10;
5896     G_asset_assignments_in_tbl(G_asset_assignments_tbl_count).attribute11             := p_attribute11;
5897     G_asset_assignments_in_tbl(G_asset_assignments_tbl_count).attribute12             := p_attribute12;
5898     G_asset_assignments_in_tbl(G_asset_assignments_tbl_count).attribute13             := p_attribute13;
5899     G_asset_assignments_in_tbl(G_asset_assignments_tbl_count).attribute14             := p_attribute14;
5900     G_asset_assignments_in_tbl(G_asset_assignments_tbl_count).attribute15             := p_attribute15;
5901 
5902 
5903 
5904 EXCEPTION
5905 
5906 	WHEN FND_API.G_EXC_ERROR THEN
5907         ROLLBACK TO load_asset_assignment_pub;
5908         p_return_status := FND_API.G_RET_STS_ERROR;
5909 
5910 	WHEN FND_API.G_EXC_UNEXPECTED_ERROR	THEN
5911         ROLLBACK TO load_asset_assignment_pub;
5912         p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5913 
5914 
5915 	WHEN OTHERS THEN
5916         ROLLBACK TO load_asset_assignment_pub;
5917         p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5918 
5919     	IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
5920 
5921             FND_MSG_PUB.add_exc_msg
5922 				( p_pkg_name		=> G_PKG_NAME
5923 				, p_procedure_name	=> l_api_name	);
5924     	END IF;
5925 
5926 END load_asset_assignment;
5927 
5928 
5929 
5930 
5931 
5932 
5933 --------------------------------------------------------------------------------
5934 --Name:               load_project_asset
5935 --Type:               Procedure
5936 --Description:        This procedure can be used to move a project asset
5937 -- 		              from the client side to a PL/SQL table on the server side,
5938 --                    where it will be used by a LOAD/EXECUTE/FETCH cycle.
5939 --
5940 --Called subprograms:
5941 --
5942 --
5943 --
5944 --History:
5945 --    01-MAR-2003    J. Pultorak    Created
5946 --
5947 
5948 PROCEDURE load_project_asset
5949 ( p_api_version_number	    IN	NUMBER
5950  ,p_init_msg_list		    IN	VARCHAR2	:= FND_API.G_FALSE
5951  ,p_return_status		    OUT	NOCOPY VARCHAR2
5952  ,p_pm_asset_reference		IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
5953  ,p_pa_asset_name			IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
5954  ,p_asset_number			IN	VARCHAR2	:= PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
5955  ,p_asset_description		IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
5956  ,p_project_asset_type		IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
5957  ,p_location_id				IN	NUMBER      := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
5958  ,p_assigned_to_person_id	IN 	NUMBER      := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
5959  ,p_date_placed_in_service	IN 	DATE        := PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE
5960  ,p_asset_category_id		IN	NUMBER      := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
5961  ,p_book_type_code			IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
5962  ,p_asset_units				IN	NUMBER      := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
5963  ,p_estimated_asset_units	IN	NUMBER      := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
5964  ,p_estimated_cost			IN	NUMBER      := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
5965  ,p_depreciate_flag			IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
5966  ,p_depreciation_expense_ccid IN	NUMBER  := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
5967  ,p_amortize_flag			IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
5968  ,p_estimated_in_service_date IN	DATE    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE
5969  ,p_asset_key_ccid			IN	NUMBER      := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
5970  ,p_attribute_category		IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
5971  ,p_attribute1				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
5972  ,p_attribute2				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
5973  ,p_attribute3				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
5974  ,p_attribute4				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
5975  ,p_attribute5				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
5976  ,p_attribute6				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
5977  ,p_attribute7				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
5978  ,p_attribute8				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
5979  ,p_attribute9				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
5980  ,p_attribute10				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
5981  ,p_attribute11				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
5982  ,p_attribute12				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
5983  ,p_attribute13				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
5984  ,p_attribute14				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
5985  ,p_attribute15				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
5986  ,p_parent_asset_id		    IN	NUMBER      := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
5987  ,p_manufacturer_name		IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
5988  ,p_model_number			IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
5989  ,p_serial_number			IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
5990  ,p_tag_number				IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
5991  ,p_ret_target_asset_id		IN	NUMBER      := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM  )
5992 
5993 IS
5994 
5995    l_api_name			CONSTANT	VARCHAR2(30) 		:= 'load_project_asset';
5996    i						NUMBER;
5997 
5998 
5999 BEGIN
6000 
6001     --  Standard begin of API savepoint
6002     SAVEPOINT load_project_asset_pub;
6003 
6004 
6005     --  Standard call to check for call compatibility.
6006     IF NOT FND_API.Compatible_API_Call ( g_api_version_number	,
6007     	    	    	    	    	 p_api_version_number	,
6008     	    	    	    	    	 l_api_name 	    	,
6009     	    	    	    	    	 G_PKG_NAME 	    ) THEN
6010 
6011     	RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6012     END IF;
6013 
6014 
6015     --  Initialize the message table if requested.
6016     IF FND_API.TO_BOOLEAN( p_init_msg_list ) THEN
6017     	FND_MSG_PUB.initialize;
6018     END IF;
6019 
6020 
6021     --  Set API return status to success
6022     p_return_status := FND_API.G_RET_STS_SUCCESS;
6023 
6024 
6025     -- assign a value to the global counter for this table
6026     G_assets_tbl_count	:= G_assets_tbl_count + 1;
6027 
6028     -- assign incoming parameters to the global table fields
6029     G_assets_in_tbl(G_assets_tbl_count).pm_asset_reference      := p_pm_asset_reference;
6030     G_assets_in_tbl(G_assets_tbl_count).pa_asset_name           := p_pa_asset_name;
6031     G_assets_in_tbl(G_assets_tbl_count).asset_number            := p_asset_number;
6032     G_assets_in_tbl(G_assets_tbl_count).asset_description       := p_asset_description;
6033     G_assets_in_tbl(G_assets_tbl_count).project_asset_type      := p_project_asset_type;
6034     G_assets_in_tbl(G_assets_tbl_count).location_id	            := p_location_id;
6035     G_assets_in_tbl(G_assets_tbl_count).assigned_to_person_id   := p_assigned_to_person_id;
6036     G_assets_in_tbl(G_assets_tbl_count).date_placed_in_service  := p_date_placed_in_service;
6037     G_assets_in_tbl(G_assets_tbl_count).asset_category_id       := p_asset_category_id;
6038     G_assets_in_tbl(G_assets_tbl_count).book_type_code          := p_book_type_code;
6039     G_assets_in_tbl(G_assets_tbl_count).asset_units             := p_asset_units;
6040     G_assets_in_tbl(G_assets_tbl_count).estimated_asset_units   := p_estimated_asset_units;
6041     G_assets_in_tbl(G_assets_tbl_count).estimated_cost          := p_estimated_cost;
6042     G_assets_in_tbl(G_assets_tbl_count).depreciate_flag         := p_depreciate_flag;
6043     G_assets_in_tbl(G_assets_tbl_count).depreciation_expense_ccid := p_depreciation_expense_ccid;
6044     G_assets_in_tbl(G_assets_tbl_count).amortize_flag           := p_amortize_flag;
6045     G_assets_in_tbl(G_assets_tbl_count).estimated_in_service_date := p_estimated_in_service_date;
6046     G_assets_in_tbl(G_assets_tbl_count).asset_key_ccid          := p_asset_key_ccid;
6047     G_assets_in_tbl(G_assets_tbl_count).attribute_category      := p_attribute_category;
6048     G_assets_in_tbl(G_assets_tbl_count).attribute1              := p_attribute1;
6049     G_assets_in_tbl(G_assets_tbl_count).attribute2              := p_attribute2;
6050     G_assets_in_tbl(G_assets_tbl_count).attribute3              := p_attribute3;
6051     G_assets_in_tbl(G_assets_tbl_count).attribute4              := p_attribute4;
6052     G_assets_in_tbl(G_assets_tbl_count).attribute5              := p_attribute5;
6053     G_assets_in_tbl(G_assets_tbl_count).attribute6              := p_attribute6;
6054     G_assets_in_tbl(G_assets_tbl_count).attribute7              := p_attribute7;
6055     G_assets_in_tbl(G_assets_tbl_count).attribute8              := p_attribute8;
6056     G_assets_in_tbl(G_assets_tbl_count).attribute9              := p_attribute9;
6057     G_assets_in_tbl(G_assets_tbl_count).attribute10             := p_attribute10;
6058     G_assets_in_tbl(G_assets_tbl_count).attribute11             := p_attribute11;
6059     G_assets_in_tbl(G_assets_tbl_count).attribute12             := p_attribute12;
6060     G_assets_in_tbl(G_assets_tbl_count).attribute13             := p_attribute13;
6061     G_assets_in_tbl(G_assets_tbl_count).attribute14             := p_attribute14;
6062     G_assets_in_tbl(G_assets_tbl_count).attribute15             := p_attribute15;
6063     G_assets_in_tbl(G_assets_tbl_count).parent_asset_id	        := p_parent_asset_id;
6064     G_assets_in_tbl(G_assets_tbl_count).manufacturer_name       := p_manufacturer_name;
6065     G_assets_in_tbl(G_assets_tbl_count).model_number            := p_model_number;
6066     G_assets_in_tbl(G_assets_tbl_count).serial_number           := p_serial_number;
6067     G_assets_in_tbl(G_assets_tbl_count).tag_number              := p_tag_number;
6068     G_assets_in_tbl(G_assets_tbl_count).ret_target_asset_id     := p_ret_target_asset_id;
6069 
6070 
6071 
6072 EXCEPTION
6073 
6074 	WHEN FND_API.G_EXC_ERROR THEN
6075         ROLLBACK TO load_project_asset_pub;
6076         p_return_status := FND_API.G_RET_STS_ERROR;
6077 
6078 	WHEN FND_API.G_EXC_UNEXPECTED_ERROR	THEN
6079         ROLLBACK TO load_project_asset_pub;
6080         p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6081 
6082 
6083 	WHEN OTHERS THEN
6084         ROLLBACK TO load_project_asset_pub;
6085         p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6086 
6087     	IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
6088 
6089             FND_MSG_PUB.add_exc_msg
6090 				( p_pkg_name		=> G_PKG_NAME
6091 				, p_procedure_name	=> l_api_name	);
6092     	END IF;
6093 
6094 END load_project_asset;
6095 
6096 
6097 
6098 
6099 --------------------------------------------------------------------------------
6100 --Name:               execute_add_project_asset
6101 --Type:               Procedure
6102 --Description:        This procedure can be used to create or update project
6103 --                    assets for a project using global PL/SQL tables.  Asset
6104 --                    assignments for a project can also be created here.
6105 --
6106 --Called subprograms:
6107 --                    add_project_asset
6108 --                    update_project_asset
6109 --                    add_asset_assignment
6110 --
6111 --History:
6112 --    	01-MAR-2003   J. Pultorak    Created
6113 
6114 --
6115 
6116 PROCEDURE execute_add_project_asset
6117 ( p_api_version_number		IN	NUMBER
6118  ,p_commit				    IN	VARCHAR2	:= FND_API.G_FALSE
6119  ,p_init_msg_list			IN	VARCHAR2	:= FND_API.G_FALSE
6120  ,p_msg_count				OUT NOCOPY	NUMBER
6121  ,p_msg_data				OUT NOCOPY	VARCHAR2
6122  ,p_return_status			OUT NOCOPY	VARCHAR2
6123  ,p_pm_product_code			IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
6124  ,p_pm_project_reference	IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
6125  ,p_pa_project_id			IN	NUMBER      := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
6126  ,p_assets_in               IN  asset_in_tbl_type
6127  ,p_assets_out              OUT NOCOPY asset_out_tbl_type
6128  ,p_asset_assignments_in    IN  asset_assignment_in_tbl_type
6129  ,p_asset_assignments_out   OUT NOCOPY asset_assignment_out_tbl_type )
6130 
6131 IS
6132 
6133 
6134 
6135    --Used to get the project number for AMG messages
6136    CURSOR l_amg_project_csr(x_project_id   NUMBER) IS
6137    SELECT  segment1
6138    FROM    pa_projects p
6139    WHERE   p.project_id = x_project_id;
6140 
6141    l_amg_project_number             pa_projects_all.segment1%TYPE;
6142 
6143 
6144    --Used to get the asset number for output parameter
6145    CURSOR l_amg_asset_csr(x_project_asset_id   NUMBER,
6146                           x_project_id         NUMBER) IS
6147    SELECT  asset_name
6148    FROM    pa_project_assets p
6149    WHERE   p.project_asset_id = x_project_asset_id
6150    AND     p.project_id = x_project_id;
6151 
6152    l_amg_pa_asset_name              pa_project_assets_all.asset_name%TYPE;
6153 
6154 
6155    --Used to get the Task number for output parameter
6156    CURSOR l_amg_task_csr (l_project_id NUMBER ,l_task_id NUMBER) IS
6157    SELECT  task_number
6158    FROM    pa_tasks
6159    WHERE   project_id = l_project_id
6160    AND     task_id    = l_task_id;
6161 
6162    l_amg_pa_task_number              pa_tasks.task_number%TYPE;
6163 
6164 
6165    l_api_name				CONSTANT	VARCHAR2(30) 		:= 'execute_add_project_asset';
6166 
6167    i						NUMBER;
6168    l_return_status			VARCHAR2(1);
6169    l_err_stage				VARCHAR2(120);
6170 
6171    l_project_asset_id       NUMBER;
6172    l_project_id             NUMBER;
6173    l_task_id                NUMBER;
6174    l_pm_asset_reference     PA_PROJECT_ASSETS_ALL.pm_asset_reference%TYPE;
6175    l_project_number         PA_PROJECTS_ALL.segment1%TYPE;
6176    l_msg_data               VARCHAR2(2000);
6177    v_assignment_count       NUMBER := 0;
6178 
6179 
6180 BEGIN
6181 
6182     --  Standard begin of API savepoint
6183     SAVEPOINT execute_add_project_asset_pub;
6184 
6185 
6186     --  Standard call to check for call compatibility.
6187     IF NOT FND_API.Compatible_API_Call ( g_api_version_number	,
6188     	    	    	    	    	 p_api_version_number	,
6189     	    	    	    	    	 l_api_name 	    	,
6190     	    	    	    	    	 G_PKG_NAME 	    	) THEN
6191 
6192     	RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6193     END IF;
6194 
6195 
6196     --  Initialize the message table if requested.
6197     IF FND_API.TO_BOOLEAN( p_init_msg_list ) THEN
6198 	   FND_MSG_PUB.initialize;
6199     END IF;
6200 
6201 
6202     --  Set API return status to success
6203     p_return_status := FND_API.G_RET_STS_SUCCESS;
6204 
6205 
6206     -- Get the Project ID
6207     PA_PROJECT_PVT.Convert_pm_projref_to_id
6208         (p_pm_project_reference =>      p_pm_project_reference
6209         ,p_pa_project_id        =>      p_pa_project_id
6210         ,p_out_project_id       =>      l_project_id
6211         ,p_return_status        =>      l_return_status
6212         );
6213 
6214 
6215     IF (l_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
6216         RAISE  FND_API.G_EXC_UNEXPECTED_ERROR;
6217     ELSIF  (l_return_status = FND_API.G_RET_STS_ERROR) THEN
6218         RAISE  FND_API.G_EXC_ERROR;
6219     END IF;
6220 
6221 
6222     -- Get project number for AMG messages
6223     OPEN l_amg_project_csr( l_project_id );
6224     FETCH l_amg_project_csr INTO l_amg_project_number;
6225     CLOSE l_amg_project_csr;
6226 
6227 
6228 
6229     --Process Project Assets first, then Asset Assignments
6230 
6231     --Loop through all assets in the IN table
6232     i := p_assets_in.FIRST;
6233 
6234     WHILE i IS NOT NULL LOOP
6235 
6236         --Initialize local variables
6237         l_project_asset_id := NULL;
6238 
6239 
6240         --Format output record
6241         p_assets_out(i).pm_asset_reference  := p_assets_in(i).pm_asset_reference;
6242         p_assets_out(i).pa_project_asset_id := p_assets_in(i).pa_project_asset_id;
6243         p_assets_out(i).return_status       := FND_API.G_RET_STS_SUCCESS;
6244 
6245 
6246         --Determine if the Project Asset already exists, and if so perform Update,
6247         --otherwise Add Project Asset
6248 
6249         --If the project asset id is not specified, determine
6250         --the project asset id based on the pm_asset_reference
6251 
6252         IF p_assets_in(i).pa_project_asset_id = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
6253             OR p_assets_in(i).pa_project_asset_id IS NULL THEN
6254 
6255             --Get project asset id based on PM Asset Reference
6256             l_project_asset_id := fetch_project_asset_id
6257                                   (p_pa_project_id        => l_project_id,
6258                                    p_pm_asset_reference   => p_assets_in(i).pm_asset_reference);
6259 
6260         ELSE
6261             l_project_asset_id := p_assets_in(i).pa_project_asset_id;
6262         END IF;
6263 
6264 
6265         --Get asset name for AMG messages and validate that specified project_asset_id is valid for project
6266         IF l_project_asset_id IS NULL THEN
6267             l_amg_pa_asset_name := NVL(p_assets_in(i).pa_asset_name,p_assets_in(i).pm_asset_reference);
6268         ELSE
6269 
6270             OPEN l_amg_asset_csr(l_project_asset_id, l_project_id);
6271             FETCH l_amg_asset_csr into l_amg_pa_asset_name;
6272             IF l_amg_asset_csr%NOTFOUND THEN
6273 
6274                 CLOSE l_amg_asset_csr;
6275                 --Project Asset ID specified is not valid for Project
6276                 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
6277                     pa_interface_utils_pub.map_new_amg_msg
6278                         ( p_old_message_code => 'PA_PROJ_ASSET_ID_INVALID'
6279                         ,p_msg_attribute    => 'CHANGE'
6280                         ,p_resize_flag      => 'N'
6281                         ,p_msg_context      => 'PROJ'
6282                         ,p_attribute1       => l_amg_project_number
6283                         ,p_attribute2       => ''
6284                         ,p_attribute3       => ''
6285                         ,p_attribute4       => ''
6286                         ,p_attribute5       => '');
6287                 END IF;
6288 
6289                 p_assets_out(i).return_status := FND_API.G_RET_STS_ERROR;
6290                 RAISE FND_API.G_EXC_ERROR;
6291             END IF;
6292             CLOSE l_amg_asset_csr;
6293         END IF;
6294 
6295 
6296         IF l_project_asset_id IS NULL THEN
6297 
6298             add_project_asset
6299                 (p_api_version_number		=>   p_api_version_number
6300                 ,p_commit					=>   p_commit
6301                 ,p_init_msg_list		    =>   p_init_msg_list
6302                 ,p_msg_count				=>   p_msg_count
6303                 ,p_msg_data				    =>   l_msg_data
6304                 ,p_return_status		    =>   l_return_status
6305                 ,p_pm_product_code			=>   p_pm_product_code
6306                 ,p_pm_project_reference	    =>   p_pm_project_reference
6307                 ,p_pa_project_id			=>   l_project_id
6308                 ,p_pm_asset_reference		=>   p_assets_in(i).pm_asset_reference
6309                 ,p_pa_asset_name			=>   p_assets_in(i).pa_asset_name
6310                 ,p_asset_number			    =>   p_assets_in(i).asset_number
6311                 ,p_asset_description		=>   p_assets_in(i).asset_description
6312                 ,p_project_asset_type		=>   p_assets_in(i).project_asset_type
6313                 ,p_location_id				=>   p_assets_in(i).location_id
6314                 ,p_assigned_to_person_id	=>   p_assets_in(i).assigned_to_person_id
6315                 ,p_date_placed_in_service	=>   p_assets_in(i).date_placed_in_service
6316                 ,p_asset_category_id		=>   p_assets_in(i).asset_category_id
6317                 ,p_book_type_code			=>   p_assets_in(i).book_type_code
6318                 ,p_asset_units				=>   p_assets_in(i).asset_units
6319                 ,p_estimated_asset_units	=>   p_assets_in(i).estimated_asset_units
6320                 ,p_estimated_cost			=>   p_assets_in(i).estimated_cost
6321                 ,p_depreciate_flag			=>   p_assets_in(i).depreciate_flag
6322                 ,p_depreciation_expense_ccid =>  p_assets_in(i).depreciation_expense_ccid
6323                 ,p_amortize_flag			=>   p_assets_in(i).amortize_flag
6324                 ,p_estimated_in_service_date =>  p_assets_in(i).estimated_in_service_date
6325                 ,p_asset_key_ccid			=>   p_assets_in(i).asset_key_ccid
6326                 ,p_attribute_category		=>   p_assets_in(i).attribute_category
6327                 ,p_attribute1				=>   p_assets_in(i).attribute1
6328                 ,p_attribute2				=>   p_assets_in(i).attribute2
6329                 ,p_attribute3				=>   p_assets_in(i).attribute3
6330                 ,p_attribute4				=>   p_assets_in(i).attribute4
6331                 ,p_attribute5				=>   p_assets_in(i).attribute5
6332                 ,p_attribute6				=>   p_assets_in(i).attribute6
6333                 ,p_attribute7				=>   p_assets_in(i).attribute7
6334                 ,p_attribute8				=>   p_assets_in(i).attribute8
6335                 ,p_attribute9				=>   p_assets_in(i).attribute9
6336                 ,p_attribute10				=>   p_assets_in(i).attribute10
6337                 ,p_attribute11				=>   p_assets_in(i).attribute11
6338                 ,p_attribute12				=>   p_assets_in(i).attribute12
6339                 ,p_attribute13				=>   p_assets_in(i).attribute13
6340                 ,p_attribute14				=>   p_assets_in(i).attribute14
6341                 ,p_attribute15				=>   p_assets_in(i).attribute15
6342                 ,p_parent_asset_id		    =>   p_assets_in(i).parent_asset_id
6343                 ,p_manufacturer_name		=>   p_assets_in(i).manufacturer_name
6344                 ,p_model_number			    =>   p_assets_in(i).model_number
6345                 ,p_serial_number			=>   p_assets_in(i).serial_number
6346                 ,p_tag_number				=>   p_assets_in(i).tag_number
6347                 ,p_ret_target_asset_id		=>   p_assets_in(i).ret_target_asset_id
6348                 ,p_pa_project_id_out		=>   l_project_id
6349                 ,p_pa_project_number_out	=>   l_project_number
6350                 ,p_pa_project_asset_id_out	=>   l_project_asset_id
6351                 ,p_pm_asset_reference_out   =>   l_pm_asset_reference );
6352 
6353 
6354    	        IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
6355         		RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6356            	ELSIF l_return_status = FND_API.G_RET_STS_ERROR	THEN
6357         		p_assets_out(i).return_status := FND_API.G_RET_STS_ERROR;
6358                 RAISE FND_API.G_EXC_ERROR;
6359            	ELSIF l_return_status = FND_API.G_RET_STS_SUCCESS THEN
6360                 p_assets_out(i).pa_project_asset_id := l_project_asset_id;
6361                 p_assets_out(i).pm_asset_reference := l_pm_asset_reference;
6362            	END IF;
6363         ELSE
6364 
6365             update_project_asset
6366                 (p_api_version_number		=>   p_api_version_number
6367                 ,p_commit					=>   p_commit
6368                 ,p_init_msg_list		    =>   p_init_msg_list
6369                 ,p_msg_count				=>   p_msg_count
6370                 ,p_msg_data				    =>   l_msg_data
6371                 ,p_return_status		    =>   l_return_status
6372                 ,p_pm_product_code			=>   p_pm_product_code
6373                 ,p_pm_project_reference	    =>   p_pm_project_reference
6374                 ,p_pa_project_id			=>   l_project_id
6375                 ,p_pm_asset_reference		=>   p_assets_in(i).pm_asset_reference
6376                 ,p_pa_project_asset_id      =>   p_assets_in(i).pa_project_asset_id
6377                 ,p_pa_asset_name			=>   p_assets_in(i).pa_asset_name
6378                 ,p_asset_number			    =>   p_assets_in(i).asset_number
6379                 ,p_asset_description		=>   p_assets_in(i).asset_description
6380                 ,p_project_asset_type		=>   p_assets_in(i).project_asset_type
6381                 ,p_location_id				=>   p_assets_in(i).location_id
6382                 ,p_assigned_to_person_id	=>   p_assets_in(i).assigned_to_person_id
6383                 ,p_date_placed_in_service	=>   p_assets_in(i).date_placed_in_service
6384                 ,p_asset_category_id		=>   p_assets_in(i).asset_category_id
6385                 ,p_book_type_code			=>   p_assets_in(i).book_type_code
6386                 ,p_asset_units				=>   p_assets_in(i).asset_units
6387                 ,p_estimated_asset_units	=>   p_assets_in(i).estimated_asset_units
6388                 ,p_estimated_cost			=>   p_assets_in(i).estimated_cost
6389                 ,p_depreciate_flag			=>   p_assets_in(i).depreciate_flag
6390                 ,p_depreciation_expense_ccid =>  p_assets_in(i).depreciation_expense_ccid
6391                 ,p_amortize_flag			=>   p_assets_in(i).amortize_flag
6392                 ,p_estimated_in_service_date =>  p_assets_in(i).estimated_in_service_date
6393                 ,p_asset_key_ccid			=>   p_assets_in(i).asset_key_ccid
6394                 ,p_attribute_category		=>   p_assets_in(i).attribute_category
6395                 ,p_attribute1				=>   p_assets_in(i).attribute1
6396                 ,p_attribute2				=>   p_assets_in(i).attribute2
6397                 ,p_attribute3				=>   p_assets_in(i).attribute3
6398                 ,p_attribute4				=>   p_assets_in(i).attribute4
6399                 ,p_attribute5				=>   p_assets_in(i).attribute5
6400                 ,p_attribute6				=>   p_assets_in(i).attribute6
6401                 ,p_attribute7				=>   p_assets_in(i).attribute7
6402                 ,p_attribute8				=>   p_assets_in(i).attribute8
6403                 ,p_attribute9				=>   p_assets_in(i).attribute9
6404                 ,p_attribute10				=>   p_assets_in(i).attribute10
6405                 ,p_attribute11				=>   p_assets_in(i).attribute11
6406                 ,p_attribute12				=>   p_assets_in(i).attribute12
6407                 ,p_attribute13				=>   p_assets_in(i).attribute13
6408                 ,p_attribute14				=>   p_assets_in(i).attribute14
6409                 ,p_attribute15				=>   p_assets_in(i).attribute15
6410                 ,p_parent_asset_id		    =>   p_assets_in(i).parent_asset_id
6411                 ,p_manufacturer_name		=>   p_assets_in(i).manufacturer_name
6412                 ,p_model_number			    =>   p_assets_in(i).model_number
6413                 ,p_serial_number			=>   p_assets_in(i).serial_number
6414                 ,p_tag_number				=>   p_assets_in(i).tag_number
6415                 ,p_ret_target_asset_id		=>   p_assets_in(i).ret_target_asset_id
6416                 ,p_pa_project_id_out		=>   l_project_id
6417                 ,p_pa_project_number_out	=>   l_project_number
6418                 ,p_pa_project_asset_id_out	=>   l_project_asset_id
6419                 ,p_pm_asset_reference_out   =>   l_pm_asset_reference );
6420 
6421 
6422             IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
6423         		RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6424            	ELSIF l_return_status = FND_API.G_RET_STS_ERROR	THEN
6425         		p_assets_out(i).return_status := FND_API.G_RET_STS_ERROR;
6426                 RAISE FND_API.G_EXC_ERROR;
6427            	ELSIF l_return_status = FND_API.G_RET_STS_SUCCESS THEN
6428                 p_assets_out(i).pa_project_asset_id := l_project_asset_id;
6429                 p_assets_out(i).pm_asset_reference := l_pm_asset_reference;
6430            	END IF;
6431         END IF;
6432 
6433 	   i := p_assets_in.NEXT(i);
6434 
6435     END LOOP; --Project Assets
6436 
6437 
6438 
6439     --Now process Asset Assignments
6440 
6441     --Loop through all asset assignments in the IN table
6442     i := p_asset_assignments_in.FIRST;
6443 
6444     WHILE i IS NOT NULL LOOP
6445 
6446         --Initialize local variables
6447         l_task_id := NULL;
6448         l_project_asset_id := NULL;
6449 
6450 
6451         --Format output record
6452         p_asset_assignments_out(i).pa_task_id          := p_asset_assignments_in(i).pa_task_id;
6453         p_asset_assignments_out(i).pm_task_reference   := p_asset_assignments_in(i).pm_task_reference;
6454         p_asset_assignments_out(i).pa_project_asset_id := p_asset_assignments_in(i).pa_project_asset_id;
6455         p_asset_assignments_out(i).pm_asset_reference  := p_asset_assignments_in(i).pm_asset_reference;
6456         p_asset_assignments_out(i).pa_task_number      := NULL;
6457         p_asset_assignments_out(i).pa_asset_name       := NULL;
6458         p_asset_assignments_out(i).return_status       := FND_API.G_RET_STS_SUCCESS;
6459 
6460 
6461         --If the task id is not specified, determine the task id based on the pm_task_reference
6462         IF p_asset_assignments_in(i).pa_task_id = 0 THEN
6463             --Assignment is Project-Level
6464             l_task_id := 0;
6465             l_amg_pa_task_number := NULL;
6466 
6467         ELSIF p_asset_assignments_in(i).pa_task_id = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
6468             OR p_asset_assignments_in(i).pa_task_id IS NULL THEN
6469 
6470             --Determine the Task ID based on the pm_task_reference info (or pa_task_id, if specified)
6471             Pa_project_pvt.Convert_pm_taskref_to_id
6472                 ( p_pa_project_id       => l_project_id,
6473                   p_pa_task_id          => p_asset_assignments_in(i).pa_task_id,
6474                   p_pm_task_reference   => p_asset_assignments_in(i).pm_task_reference,
6475                   p_out_task_id         => l_task_id,
6476                   p_return_status       => l_return_status );
6477 
6478 
6479             IF l_return_status =  FND_API.G_RET_STS_UNEXP_ERROR THEN
6480                 RAISE  FND_API.G_EXC_UNEXPECTED_ERROR;
6481             ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
6482                 RAISE  FND_API.G_EXC_ERROR;
6483             END IF;
6484         ELSE
6485             l_task_id := p_asset_assignments_in(i).pa_task_id;
6486         END IF;
6487 
6488 
6489         IF l_task_id <> 0 THEN
6490 
6491             --Get Task Number for Output Parameter
6492             OPEN l_amg_task_csr( l_project_id, l_task_id );
6493             FETCH l_amg_task_csr INTO l_amg_pa_task_number;
6494             IF l_amg_task_csr%NOTFOUND THEN
6495                 --Task is not valid for Project specified
6496                 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
6497                     pa_interface_utils_pub.map_new_amg_msg
6498                         (p_old_message_code => 'PA_TASK_ID_INVALID'
6499                         ,p_msg_attribute    => 'CHANGE'
6500                         ,p_resize_flag      => 'N'
6501                         ,p_msg_context      => 'PROJ'
6502                         ,p_attribute1       => l_amg_project_number
6503                         ,p_attribute2       => ''
6504                         ,p_attribute3       => ''
6505                         ,p_attribute4       => ''
6506                         ,p_attribute5       => '');
6507 		        END IF;
6508 
6509 
6510                 p_asset_assignments_out(i).return_status := FND_API.G_RET_STS_ERROR;
6511                 RAISE FND_API.G_EXC_ERROR;
6512             END IF;
6513             CLOSE l_amg_task_csr;
6514 
6515         END IF;
6516 
6517 
6518         --If the project asset id is not specified, determine
6519         --the project asset id based on the pm_asset_reference
6520         IF p_asset_assignments_in(i).pa_project_asset_id = 0 THEN
6521             --Assignment is Common
6522             l_project_asset_id := 0;
6523             l_amg_pa_asset_name := NULL;
6524 
6525         ELSIF p_asset_assignments_in(i).pa_project_asset_id = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
6526             OR p_asset_assignments_in(i).pa_project_asset_id IS NULL THEN
6527 
6528             --Get project asset id based on PM Asset Reference
6529             l_project_asset_id := fetch_project_asset_id
6530                                   (p_pa_project_id        => l_project_id,
6531                                    p_pm_asset_reference   => p_asset_assignments_in(i).pm_asset_reference);
6532 
6533         ELSE
6534             l_project_asset_id := p_asset_assignments_in(i).pa_project_asset_id;
6535         END IF;
6536 
6537 
6538         IF l_project_asset_id <> 0 THEN  --Assignment is to a specific Asset
6539 
6540             --Get asset name for AMG messages and validate that specified project_asset_id is valid for project
6541             OPEN l_amg_asset_csr(l_project_asset_id, l_project_id);
6542             FETCH l_amg_asset_csr into l_amg_pa_asset_name;
6543             IF l_amg_asset_csr%NOTFOUND THEN
6544 
6545                 CLOSE l_amg_asset_csr;
6546                 --Project Asset ID specified is not valid for Project
6547                 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
6548                     pa_interface_utils_pub.map_new_amg_msg
6549                         ( p_old_message_code => 'PA_PROJ_ASSET_ID_INVALID'
6550                         ,p_msg_attribute    => 'CHANGE'
6551                         ,p_resize_flag      => 'N'
6552                         ,p_msg_context      => 'PROJ'
6553                         ,p_attribute1       => l_amg_project_number
6554                         ,p_attribute2       => ''
6555                         ,p_attribute3       => ''
6556                         ,p_attribute4       => ''
6557                         ,p_attribute5       => '');
6558                 END IF;
6559 
6560                 p_asset_assignments_out(i).return_status := FND_API.G_RET_STS_ERROR;
6561                 RAISE FND_API.G_EXC_ERROR;
6562             END IF;
6563             CLOSE l_amg_asset_csr;
6564 
6565         END IF;
6566 
6567 
6568         --Check if Assignment already exists
6569         SELECT  COUNT(*)
6570         INTO    v_assignment_count
6571         FROM    pa_project_asset_assignments
6572         WHERE   project_id = l_project_id
6573         AND     task_id = l_task_id
6574         AND     project_asset_id = l_project_asset_id;
6575 
6576 
6577         --Add Assignment if it does not already exist
6578         IF v_assignment_count = 0 THEN
6579 
6580             add_asset_assignment
6581                 (p_api_version_number		=>   p_api_version_number
6582                 ,p_commit					=>   p_commit
6583                 ,p_init_msg_list		    =>   p_init_msg_list
6584                 ,p_msg_count				=>   p_msg_count
6585                 ,p_msg_data				    =>   l_msg_data
6586                 ,p_return_status		    =>   l_return_status
6587                 ,p_pm_product_code			=>   p_pm_product_code
6588                 ,p_pm_project_reference	    =>   p_pm_project_reference
6589                 ,p_pa_project_id			=>   l_project_id
6590                 ,p_pm_task_reference	    =>   p_asset_assignments_in(i).pm_task_reference
6591                 ,p_pa_task_id			    =>   l_task_id
6592                 ,p_pm_asset_reference		=>   p_asset_assignments_in(i).pm_asset_reference
6593                 ,p_pa_project_asset_id		=>   l_project_asset_id
6594                 ,p_attribute_category		=>   p_asset_assignments_in(i).attribute_category
6595                 ,p_attribute1				=>   p_asset_assignments_in(i).attribute1
6596                 ,p_attribute2				=>   p_asset_assignments_in(i).attribute2
6597                 ,p_attribute3				=>   p_asset_assignments_in(i).attribute3
6598                 ,p_attribute4				=>   p_asset_assignments_in(i).attribute4
6599                 ,p_attribute5				=>   p_asset_assignments_in(i).attribute5
6600                 ,p_attribute6				=>   p_asset_assignments_in(i).attribute6
6601                 ,p_attribute7				=>   p_asset_assignments_in(i).attribute7
6602                 ,p_attribute8				=>   p_asset_assignments_in(i).attribute8
6603                 ,p_attribute9				=>   p_asset_assignments_in(i).attribute9
6604                 ,p_attribute10				=>   p_asset_assignments_in(i).attribute10
6605                 ,p_attribute11				=>   p_asset_assignments_in(i).attribute11
6606                 ,p_attribute12				=>   p_asset_assignments_in(i).attribute12
6607                 ,p_attribute13				=>   p_asset_assignments_in(i).attribute13
6608                 ,p_attribute14				=>   p_asset_assignments_in(i).attribute14
6609                 ,p_attribute15				=>   p_asset_assignments_in(i).attribute15
6610                 ,p_pa_task_id_out		    =>   l_task_id
6611                 ,p_pa_project_asset_id_out	=>   l_project_asset_id);
6612 
6613 
6614             IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
6615         		RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6616            	ELSIF l_return_status = FND_API.G_RET_STS_ERROR	THEN
6617         		p_asset_assignments_out(i).return_status := FND_API.G_RET_STS_ERROR;
6618                 RAISE FND_API.G_EXC_ERROR;
6619            	ELSIF l_return_status = FND_API.G_RET_STS_SUCCESS THEN
6620                 p_asset_assignments_out(i).pa_task_number      := l_amg_pa_task_number;
6621                 p_asset_assignments_out(i).pa_asset_name       := l_amg_pa_asset_name;
6622            	END IF;
6623 
6624         ELSE
6625             --Assignment already exists, do nothing
6626             p_asset_assignments_out(i).pa_task_id          := l_task_id;
6627             p_asset_assignments_out(i).pa_task_number      := l_amg_pa_task_number;
6628             p_asset_assignments_out(i).pa_project_asset_id := l_project_asset_id;
6629             p_asset_assignments_out(i).pa_asset_name       := l_amg_pa_asset_name;
6630         END IF;
6631 
6632 	    i := p_asset_assignments_in.NEXT(i);
6633 
6634     END LOOP; --Asset Assignments
6635 
6636 
6637 	IF FND_API.to_boolean( p_commit ) THEN
6638 		COMMIT;
6639 	END IF;
6640 
6641 
6642 EXCEPTION
6643 
6644 	WHEN FND_API.G_EXC_ERROR THEN
6645     	ROLLBACK TO execute_add_project_asset_pub;
6646         p_return_status := FND_API.G_RET_STS_ERROR;
6647 
6648         FND_MSG_PUB.Count_And_Get
6649 			(   p_count		=>	p_msg_count	,
6650 			    p_data		=>	p_msg_data	);
6651 
6652 	WHEN FND_API.G_EXC_UNEXPECTED_ERROR	THEN
6653     	ROLLBACK TO execute_add_project_asset_pub;
6654     	p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6655 
6656     	FND_MSG_PUB.Count_And_Get
6657 			(   p_count		=>	p_msg_count	,
6658 			    p_data		=>	p_msg_data	);
6659 
6660 	WHEN OTHERS THEN
6661     	ROLLBACK TO execute_add_project_asset_pub;
6662     	p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6663 
6664     	IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
6665 	       	FND_MSG_PUB.add_exc_msg
6666 				( p_pkg_name		=> G_PKG_NAME
6667 				, p_procedure_name	=> l_api_name	);
6668 	    END IF;
6669 
6670 	    FND_MSG_PUB.Count_And_Get
6671 			(   p_count		=>	p_msg_count	,
6672 			    p_data		=>	p_msg_data	);
6673 
6674 END execute_add_project_asset;
6675 
6676 
6677 
6678 PROCEDURE delete_project_asset
6679 ( p_api_version_number		IN	NUMBER
6680  ,p_commit					IN	VARCHAR2	:= FND_API.G_FALSE
6681  ,p_init_msg_list		    IN	VARCHAR2	:= FND_API.G_FALSE
6682  ,p_msg_count				OUT NOCOPY	NUMBER
6683  ,p_msg_data				OUT NOCOPY	VARCHAR2
6684  ,p_return_status		    OUT	 NOCOPY VARCHAR2
6685  ,p_pm_product_code			IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
6686  ,p_pm_project_reference	IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
6687  ,p_pa_project_id			IN	NUMBER      := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
6688  ,p_pm_asset_reference		IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
6689  ,p_pa_project_asset_id		IN	NUMBER      := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM ) IS
6690 
6691 
6692     --Used to get the project number for AMG messages
6693     CURSOR l_amg_project_csr(x_project_id   NUMBER) IS
6694     SELECT  segment1
6695     FROM    pa_projects p
6696     WHERE   p.project_id = x_project_id;
6697 
6698     l_amg_project_number             pa_projects_all.segment1%TYPE;
6699 
6700 
6701     --Used to get the asset number for AMG messages
6702     CURSOR l_amg_asset_csr(x_project_asset_id   NUMBER) IS
6703     SELECT  asset_name
6704     FROM    pa_project_assets p
6705     WHERE   p.project_asset_id = x_project_asset_id;
6706 
6707     l_amg_pa_asset_name              pa_project_assets_all.asset_name%TYPE;
6708 
6709 
6710     --Used to determine if the project is CAPITAL
6711     CURSOR capital_project_cur(x_project_id   NUMBER) IS
6712     SELECT  'Project is CAPITAL'
6713     FROM    pa_projects p,
6714             pa_project_types t
6715     WHERE   p.project_id = x_project_id
6716     AND     p.project_type = t.project_type
6717     AND     t.project_type_class_code = 'CAPITAL';
6718 
6719     capital_project_rec      capital_project_cur%ROWTYPE;
6720 
6721 
6722     --Used to determine if the new assignment already exists
6723     CURSOR lock_assignment_cur (x_project_id        NUMBER,
6724                                 x_project_asset_id  NUMBER) IS
6725     SELECT  'x'
6726     FROM    pa_project_asset_assignments
6727     WHERE   project_id = x_project_id
6728     AND     project_asset_id = x_project_asset_id
6729     FOR UPDATE NOWAIT;
6730 
6731 
6732     --Used to determine if the new assignment already exists
6733     CURSOR lock_asset_cur (x_project_id        NUMBER,
6734                            x_project_asset_id  NUMBER) IS
6735     SELECT  'x'
6736     FROM    pa_project_assets
6737     WHERE   project_id = x_project_id
6738     AND     project_asset_id = x_project_asset_id
6739     FOR UPDATE NOWAIT;
6740 
6741 
6742     l_api_name			   CONSTANT	 VARCHAR2(30) 		:= 'delete_project_asset';
6743     l_return_status                  VARCHAR2(1);
6744     l_function_allowed				 VARCHAR2(1);
6745     l_resp_id					     NUMBER := 0;
6746     l_user_id		                 NUMBER := 0;
6747     l_module_name                    VARCHAR2(80);
6748     l_msg_count					     NUMBER ;
6749     l_msg_data					     VARCHAR2(2000);
6750     l_task_id                        NUMBER;
6751     l_project_asset_id               NUMBER;
6752     l_project_id                     NUMBER;
6753     v_asset_can_be_deleted           NUMBER := 0;
6754 
6755  BEGIN
6756 
6757     --  Standard begin of API savepoint
6758     SAVEPOINT delete_project_asset_pub;
6759 
6760 
6761     --  Standard call to check for call compatibility.
6762     IF NOT FND_API.Compatible_API_Call ( g_api_version_number	,
6763     	    	    	    	    	 p_api_version_number	,
6764     	    	    	    	    	 l_api_name 	    	,
6765     	    	    	    	    	 G_PKG_NAME 	    	) THEN
6766 	    RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6767     END IF;
6768 
6769 
6770     --	Initialize the message table if requested.
6771     IF FND_API.TO_BOOLEAN( p_init_msg_list ) THEN
6772     	FND_MSG_PUB.initialize;
6773     END IF;
6774 
6775 
6776     --  Set API return status to success
6777     p_return_status := FND_API.G_RET_STS_SUCCESS;
6778 
6779 
6780     --  pm_product_code is mandatory
6781     IF p_pm_product_code IS NULL OR p_pm_product_code = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
6782 
6783 	    IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
6784             pa_interface_utils_pub.map_new_amg_msg
6785                 ( p_old_message_code => 'PA_PRODUCT_CODE_IS_MISSING'
6786                 ,p_msg_attribute    => 'CHANGE'
6787                 ,p_resize_flag      => 'N'
6788                 ,p_msg_context      => 'GENERAL'
6789                 ,p_attribute1       => ''
6790                 ,p_attribute2       => ''
6791                 ,p_attribute3       => ''
6792                 ,p_attribute4       => ''
6793                 ,p_attribute5       => '');
6794 	    END IF;
6795 
6796         RAISE FND_API.G_EXC_ERROR;
6797     END IF;
6798 
6799 
6800     --Initialize variables
6801     l_resp_id := FND_GLOBAL.Resp_id;
6802     l_user_id := FND_GLOBAL.User_id;
6803     l_module_name := 'PA_PM_DELETE_PROJECT_ASSET';
6804 
6805 
6806 
6807     --Get Project ID from Project Reference
6808     PA_PROJECT_PVT.Convert_pm_projref_to_id
6809         (        p_pm_project_reference =>      p_pm_project_reference
6810                  ,  p_pa_project_id     =>      p_pa_project_id
6811                  ,  p_out_project_id    =>      l_project_id
6812                  ,  p_return_status     =>      l_return_status
6813         );
6814 
6815     IF (l_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
6816         RAISE  FND_API.G_EXC_UNEXPECTED_ERROR;
6817     ELSIF  (l_return_status = FND_API.G_RET_STS_ERROR) THEN
6818         RAISE  FND_API.G_EXC_ERROR;
6819     END IF;
6820 
6821     PA_INTERFACE_UTILS_PUB.G_PROJECT_ID := l_project_id;
6822 
6823 
6824     -- Get project number for AMG messages
6825     OPEN l_amg_project_csr( l_project_id );
6826     FETCH l_amg_project_csr INTO l_amg_project_number;
6827     CLOSE l_amg_project_csr;
6828 
6829 
6830     --Validate that the project is CAPITAL project type class
6831     OPEN capital_project_cur(l_project_id);
6832     FETCH capital_project_cur INTO capital_project_rec;
6833 	IF capital_project_cur%NOTFOUND THEN
6834 
6835         CLOSE capital_project_cur;
6836         -- The project must be CAPITAL. Raise error
6837         pa_interface_utils_pub.map_new_amg_msg
6838            ( p_old_message_code => 'PA_PR_NOT_CAPITAL'
6839             ,p_msg_attribute    => 'CHANGE'
6840             ,p_resize_flag      => 'N'
6841             ,p_msg_context      => 'PROJ'
6842             ,p_attribute1       => l_amg_project_number
6843             ,p_attribute2       => ''
6844             ,p_attribute3       => ''
6845             ,p_attribute4       => ''
6846             ,p_attribute5       => '');
6847 
6848         p_return_status := FND_API.G_RET_STS_ERROR;
6849 
6850         RAISE FND_API.G_EXC_ERROR;
6851 	END IF;
6852 	CLOSE capital_project_cur;
6853 
6854 
6855 
6856     -- As part of enforcing project security, which would determine
6857     -- whether the user has the necessary privileges to update the project
6858     -- need to call the pa_security package
6859 
6860     pa_security.initialize (X_user_id        => l_user_id,
6861                             X_calling_module => l_module_name);
6862 
6863     -- Actions performed using the APIs would be subject to
6864     -- function security. If the responsibility does not allow
6865     -- such functions to be executed, the API should not proceed further
6866     -- since the user does not have access to such functions
6867 
6868     -- Function security procedure check whether user have the
6869     -- privilege to delete project asset or not
6870 
6871     PA_INTERFACE_UTILS_PUB.G_PROJECT_ID := l_project_id;
6872 
6873     PA_PM_FUNCTION_SECURITY_PUB.check_function_security
6874       (p_api_version_number => p_api_version_number,
6875        p_responsibility_id  => l_resp_id,
6876        p_function_name      => 'PA_PM_DELETE_PROJECT_ASSET',
6877        p_msg_count	        => l_msg_count,
6878        p_msg_data           => l_msg_data,
6879        p_return_status	    => l_return_status,
6880        p_function_allowed   => l_function_allowed);
6881 
6882     IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
6883 		RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6884     ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
6885 		RAISE FND_API.G_EXC_ERROR;
6886     END IF;
6887 
6888     IF l_function_allowed = 'N' THEN
6889          pa_interface_utils_pub.map_new_amg_msg
6890            ( p_old_message_code => 'PA_FUNCTION_SECURITY_ENFORCED'
6891             ,p_msg_attribute    => 'CHANGE'
6892             ,p_resize_flag      => 'Y'
6893             ,p_msg_context      => 'GENERAL'
6894             ,p_attribute1       => ''
6895             ,p_attribute2       => ''
6896             ,p_attribute3       => ''
6897             ,p_attribute4       => ''
6898             ,p_attribute5       => '');
6899 	       p_return_status := FND_API.G_RET_STS_ERROR;
6900 	       RAISE FND_API.G_EXC_ERROR;
6901     END IF;
6902 
6903 
6904     -- Now verify whether project security allows the user to update the project
6905     IF pa_security.allow_query (x_project_id => l_project_id ) = 'N' THEN
6906 
6907         -- The user does not have query privileges on this project
6908         -- Hence, cannot update the project.Raise error
6909         pa_interface_utils_pub.map_new_amg_msg
6910            ( p_old_message_code => 'PA_PROJECT_SECURITY_ENFORCED'
6911             ,p_msg_attribute    => 'CHANGE'
6912             ,p_resize_flag      => 'Y'
6913             ,p_msg_context      => 'GENERAL'
6914             ,p_attribute1       => ''
6915             ,p_attribute2       => ''
6916             ,p_attribute3       => ''
6917             ,p_attribute4       => ''
6918             ,p_attribute5       => '');
6919 
6920         p_return_status := FND_API.G_RET_STS_ERROR;
6921 
6922         RAISE FND_API.G_EXC_ERROR;
6923     ELSE
6924         -- If the user has query privileges, then check whether
6925         -- update privileges are also available
6926         IF pa_security.allow_update (x_project_id => l_project_id ) = 'N' THEN
6927 
6928             -- The user does not have update privileges on this project
6929             -- Hence , raise error
6930 
6931             pa_interface_utils_pub.map_new_amg_msg
6932                 ( p_old_message_code => 'PA_PROJECT_SECURITY_ENFORCED'
6933                 ,p_msg_attribute    => 'CHANGE'
6934                 ,p_resize_flag      => 'Y'
6935                 ,p_msg_context      => 'GENERAL'
6936                 ,p_attribute1       => ''
6937                 ,p_attribute2       => ''
6938                 ,p_attribute3       => ''
6939                 ,p_attribute4       => ''
6940                 ,p_attribute5       => '');
6941 
6942 	        p_return_status := FND_API.G_RET_STS_ERROR;
6943 
6944             RAISE FND_API.G_EXC_ERROR;
6945         END IF;
6946      END IF;
6947 
6948 
6949 
6950     --Determine the Project Asset ID
6951     IF ((p_pa_project_asset_id IS NULL OR p_pa_project_asset_id = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM)
6952         AND (p_pm_asset_reference IS NULL OR p_pm_asset_reference = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR)) THEN
6953 
6954         --Cannot determine asset to delete
6955         IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
6956             pa_interface_utils_pub.map_new_amg_msg
6957                 (p_old_message_code => 'PA_DELETE_ASSET_FAILED_AS'
6958                 ,p_msg_attribute    => 'CHANGE'
6959                 ,p_resize_flag      => 'N'
6960                 ,p_msg_context      => 'ASSET'
6961                 ,p_attribute1       => l_amg_project_number
6962                 ,p_attribute2       => ''
6963                 ,p_attribute3       => ''
6964                 ,p_attribute4       => ''
6965                 ,p_attribute5       => '');
6966         END IF;
6967 
6968         RAISE FND_API.G_EXC_ERROR;
6969 
6970     ELSE
6971         --Get project asset id based on PM Asset Reference
6972         PA_PROJECT_ASSETS_PUB.convert_pm_assetref_to_id (
6973             p_pa_project_id        => l_project_id,
6974             p_pa_project_asset_id  => p_pa_project_asset_id,
6975             p_pm_asset_reference   => p_pm_asset_reference,
6976             p_out_project_asset_id => l_project_asset_id,
6977             p_return_status        => l_return_status );
6978 
6979         IF l_return_status =  FND_API.G_RET_STS_UNEXP_ERROR THEN
6980             RAISE  FND_API.G_EXC_UNEXPECTED_ERROR;
6981         ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
6982             RAISE  FND_API.G_EXC_ERROR;
6983         END IF;
6984 
6985     END IF;
6986 
6987 
6988     --Get the asset name for AMG messages
6989     OPEN l_amg_asset_csr(l_project_asset_id);
6990     FETCH l_amg_asset_csr into l_amg_pa_asset_name;
6991     CLOSE l_amg_asset_csr;
6992 
6993 
6994     --Determine if the Project Asset can be deleted.  A value of 1 means it can be deleted,
6995     --a value of 0 means that asset lines exist.
6996 
6997     v_asset_can_be_deleted := PA_ASSET_UTILS.CHECK_ASSET_REFERENCES(l_project_asset_id);
6998 
6999 
7000     IF v_asset_can_be_deleted = 0 THEN
7001 
7002         --Cannot delete asset, since asset lines exist
7003         IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
7004             pa_interface_utils_pub.map_new_amg_msg
7005                 (p_old_message_code => 'PA_ASSET_CANNOT_DELETE_AS'
7006                 ,p_msg_attribute    => 'CHANGE'
7007                 ,p_resize_flag      => 'N'
7008                 ,p_msg_context      => 'ASSET'
7009                 ,p_attribute1       => l_amg_project_number
7010                 ,p_attribute2       => l_amg_pa_asset_name
7011                 ,p_attribute3       => ''
7012                 ,p_attribute4       => ''
7013                 ,p_attribute5       => '');
7014         END IF;
7015 
7016         RAISE FND_API.G_EXC_ERROR;
7017 
7018     ELSE --Delete asset and assignments
7019 
7020         --Delete all associated asset assignments prior to deleting the project asset
7021         OPEN lock_assignment_cur(l_project_id, l_project_asset_id);
7022         CLOSE lock_assignment_cur;
7023 
7024 
7025         DELETE  pa_project_asset_assignments
7026         WHERE   project_id = l_project_id
7027         AND     project_asset_id = l_project_asset_id;
7028 
7029 
7030         --Delete the project asset
7031         OPEN lock_asset_cur(l_project_id, l_project_asset_id);
7032         CLOSE lock_asset_cur;
7033 
7034 
7035         DELETE  pa_project_assets
7036         WHERE   project_id = l_project_id
7037         AND     project_asset_id = l_project_asset_id;
7038 
7039     END IF;
7040 
7041 
7042     --Perform commit if indicated
7043     IF FND_API.to_boolean( p_commit ) THEN
7044 	    COMMIT;
7045     END IF;
7046 
7047 
7048 
7049  EXCEPTION
7050   	WHEN FND_API.G_EXC_ERROR THEN
7051 		ROLLBACK TO delete_project_asset_pub;
7052 
7053 		p_return_status := FND_API.G_RET_STS_ERROR;
7054 
7055 		FND_MSG_PUB.Count_And_Get
7056 			(   p_count		=>	p_msg_count	,
7057 			    p_data		=>	p_msg_data	);
7058 
7059 	WHEN FND_API.G_EXC_UNEXPECTED_ERROR	THEN
7060 	   ROLLBACK TO delete_project_asset_pub;
7061 
7062 	   p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7063 
7064 	   FND_MSG_PUB.Count_And_Get
7065 			(   p_count		=>	p_msg_count	,
7066 			    p_data		=>	p_msg_data	);
7067 
7068  	WHEN OTHERS	THEN
7069 	   ROLLBACK TO delete_project_asset_pub;
7070 
7071 	   p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7072 
7073 	   IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
7074 		  FND_MSG_PUB.add_exc_msg
7075 				( p_pkg_name		=> G_PKG_NAME
7076 				, p_procedure_name	=> l_api_name	);
7077 
7078 	   END IF;
7079 
7080 	   FND_MSG_PUB.Count_And_Get
7081 			(   p_count		=>	p_msg_count	,
7082 			    p_data		=>	p_msg_data	);
7083 
7084  END delete_project_asset;
7085 
7086 
7087 
7088 PROCEDURE delete_asset_assignment
7089 ( p_api_version_number		IN	NUMBER
7090  ,p_commit					IN	VARCHAR2	:= FND_API.G_FALSE
7091  ,p_init_msg_list		    IN	VARCHAR2	:= FND_API.G_FALSE
7092  ,p_msg_count				OUT NOCOPY	NUMBER
7093  ,p_msg_data				OUT NOCOPY	VARCHAR2
7094  ,p_return_status		    OUT	 NOCOPY VARCHAR2
7095  ,p_pm_product_code			IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
7096  ,p_pm_project_reference	IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
7097  ,p_pa_project_id			IN	NUMBER      := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
7098  ,p_pm_task_reference	    IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
7099  ,p_pa_task_id			    IN	NUMBER      := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
7100  ,p_pm_asset_reference		IN	VARCHAR2    := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
7101  ,p_pa_project_asset_id		IN	NUMBER      := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM ) IS
7102 
7103 
7104     --Used to get the project number for AMG messages
7105     CURSOR l_amg_project_csr(x_project_id   NUMBER) IS
7106     SELECT  segment1
7107     FROM    pa_projects p
7108     WHERE   p.project_id = x_project_id;
7109 
7110     l_amg_project_number             pa_projects_all.segment1%TYPE;
7111 
7112 
7113     --Used to determine if the project is CAPITAL
7114     CURSOR capital_project_cur(x_project_id   NUMBER) IS
7115     SELECT  'Project is CAPITAL'
7116     FROM    pa_projects p,
7117             pa_project_types t
7118     WHERE   p.project_id = x_project_id
7119     AND     p.project_type = t.project_type
7120     AND     t.project_type_class_code = 'CAPITAL';
7121 
7122     capital_project_rec      capital_project_cur%ROWTYPE;
7123 
7124 
7125     --Used to determine if the new assignment already exists
7126     CURSOR existing_assignment_cur (x_project_id        NUMBER,
7127                                     x_task_id           NUMBER,
7128                                     x_project_asset_id  NUMBER) IS
7129     SELECT  'Assignment Already Exists'
7130     FROM    pa_project_asset_assignments
7131     WHERE   project_id = x_project_id
7132     AND     task_id = x_task_id
7133     AND     project_asset_id = x_project_asset_id;
7134 
7135     existing_assignment_rec      existing_assignment_cur%ROWTYPE;
7136 
7137 
7138     --Used to determine if the new assignment already exists
7139     CURSOR lock_assignment_cur (x_project_id        NUMBER,
7140                                 x_task_id           NUMBER,
7141                                 x_project_asset_id  NUMBER) IS
7142     SELECT  'x'
7143     FROM    pa_project_asset_assignments
7144     WHERE   project_id = x_project_id
7145     AND     task_id = x_task_id
7146     AND     project_asset_id = x_project_asset_id
7147     FOR UPDATE NOWAIT;
7148 
7149 
7150     l_api_name			   CONSTANT	 VARCHAR2(30) 		:= 'delete_asset_assignment';
7151     l_return_status                  VARCHAR2(1);
7152     l_function_allowed				 VARCHAR2(1);
7153     l_resp_id					     NUMBER := 0;
7154     l_user_id		                 NUMBER := 0;
7155     l_module_name                    VARCHAR2(80);
7156     l_msg_count					     NUMBER ;
7157     l_msg_data					     VARCHAR2(2000);
7158     l_task_id                        NUMBER;
7159     l_project_asset_id               NUMBER;
7160     l_project_id                     NUMBER;
7161 
7162 
7163  BEGIN
7164 
7165     --  Standard begin of API savepoint
7166     SAVEPOINT delete_asset_assignment_pub;
7167 
7168 
7169     --  Standard call to check for call compatibility.
7170     IF NOT FND_API.Compatible_API_Call ( g_api_version_number	,
7171     	    	    	    	    	 p_api_version_number	,
7172     	    	    	    	    	 l_api_name 	    	,
7173     	    	    	    	    	 G_PKG_NAME 	    	) THEN
7174 	    RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
7175     END IF;
7176 
7177 
7178     --	Initialize the message table if requested.
7179     IF FND_API.TO_BOOLEAN( p_init_msg_list ) THEN
7180     	FND_MSG_PUB.initialize;
7181     END IF;
7182 
7183 
7184     --  Set API return status to success
7185     p_return_status := FND_API.G_RET_STS_SUCCESS;
7186 
7187 
7188     --  pm_product_code is mandatory
7189     IF p_pm_product_code IS NULL OR p_pm_product_code = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
7190 
7191 	    IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
7192             pa_interface_utils_pub.map_new_amg_msg
7193                 ( p_old_message_code => 'PA_PRODUCT_CODE_IS_MISSING'
7194                 ,p_msg_attribute    => 'CHANGE'
7195                 ,p_resize_flag      => 'N'
7196                 ,p_msg_context      => 'GENERAL'
7197                 ,p_attribute1       => ''
7198                 ,p_attribute2       => ''
7199                 ,p_attribute3       => ''
7200                 ,p_attribute4       => ''
7201                 ,p_attribute5       => '');
7202 	    END IF;
7203 
7204         RAISE FND_API.G_EXC_ERROR;
7205     END IF;
7206 
7207 
7208     --Initialize variables
7209     l_resp_id := FND_GLOBAL.Resp_id;
7210     l_user_id := FND_GLOBAL.User_id;
7211     l_module_name := 'PA_PM_DELETE_ASSET_ASSIGNMENT';
7212 
7213 
7214 
7215     --Get Project ID from Project Reference
7216     PA_PROJECT_PVT.Convert_pm_projref_to_id
7217         (        p_pm_project_reference =>      p_pm_project_reference
7218                  ,  p_pa_project_id     =>      p_pa_project_id
7219                  ,  p_out_project_id    =>      l_project_id
7220                  ,  p_return_status     =>      l_return_status
7221         );
7222 
7223     IF (l_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
7224         RAISE  FND_API.G_EXC_UNEXPECTED_ERROR;
7225     ELSIF  (l_return_status = FND_API.G_RET_STS_ERROR) THEN
7226         RAISE  FND_API.G_EXC_ERROR;
7227     END IF;
7228 
7229     PA_INTERFACE_UTILS_PUB.G_PROJECT_ID := l_project_id;
7230 
7231 
7232     -- Get project number for AMG messages
7233     OPEN l_amg_project_csr( l_project_id );
7234     FETCH l_amg_project_csr INTO l_amg_project_number;
7235     CLOSE l_amg_project_csr;
7236 
7237 
7238     --Validate that the project is CAPITAL project type class
7239     OPEN capital_project_cur(l_project_id);
7240     FETCH capital_project_cur INTO capital_project_rec;
7241 	IF capital_project_cur%NOTFOUND THEN
7242 
7243         CLOSE capital_project_cur;
7244         -- The project must be CAPITAL. Raise error
7245         pa_interface_utils_pub.map_new_amg_msg
7246            ( p_old_message_code => 'PA_PR_NOT_CAPITAL'
7247             ,p_msg_attribute    => 'CHANGE'
7248             ,p_resize_flag      => 'N'
7249             ,p_msg_context      => 'PROJ'
7250             ,p_attribute1       => l_amg_project_number
7251             ,p_attribute2       => ''
7252             ,p_attribute3       => ''
7253             ,p_attribute4       => ''
7254             ,p_attribute5       => '');
7255 
7256         p_return_status := FND_API.G_RET_STS_ERROR;
7257 
7258         RAISE FND_API.G_EXC_ERROR;
7259 	END IF;
7260 	CLOSE capital_project_cur;
7261 
7262 
7263 
7264     -- As part of enforcing project security, which would determine
7265     -- whether the user has the necessary privileges to update the project
7266     -- need to call the pa_security package
7267 
7268     pa_security.initialize (X_user_id        => l_user_id,
7269                             X_calling_module => l_module_name);
7270 
7271     -- Actions performed using the APIs would be subject to
7272     -- function security. If the responsibility does not allow
7273     -- such functions to be executed, the API should not proceed further
7274     -- since the user does not have access to such functions
7275 
7276     -- Function security procedure check whether user have the
7277     -- privilege to delete asset assignment or not
7278 
7279     PA_INTERFACE_UTILS_PUB.G_PROJECT_ID := l_project_id;
7280 
7281     PA_PM_FUNCTION_SECURITY_PUB.check_function_security
7282       (p_api_version_number => p_api_version_number,
7283        p_responsibility_id  => l_resp_id,
7284        p_function_name      => 'PA_PM_DELETE_ASSET_ASSIGNMENT',
7285        p_msg_count	        => l_msg_count,
7286        p_msg_data           => l_msg_data,
7287        p_return_status	    => l_return_status,
7288        p_function_allowed   => l_function_allowed);
7289 
7290     IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
7291 		RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
7292     ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
7293 		RAISE FND_API.G_EXC_ERROR;
7294     END IF;
7295 
7296     IF l_function_allowed = 'N' THEN
7297          pa_interface_utils_pub.map_new_amg_msg
7298            ( p_old_message_code => 'PA_FUNCTION_SECURITY_ENFORCED'
7299             ,p_msg_attribute    => 'CHANGE'
7300             ,p_resize_flag      => 'Y'
7301             ,p_msg_context      => 'GENERAL'
7302             ,p_attribute1       => ''
7303             ,p_attribute2       => ''
7304             ,p_attribute3       => ''
7305             ,p_attribute4       => ''
7306             ,p_attribute5       => '');
7307 	       p_return_status := FND_API.G_RET_STS_ERROR;
7308 	       RAISE FND_API.G_EXC_ERROR;
7309     END IF;
7310 
7311 
7312     -- Now verify whether project security allows the user to update the project
7313     IF pa_security.allow_query (x_project_id => l_project_id ) = 'N' THEN
7314 
7315         -- The user does not have query privileges on this project
7316         -- Hence, cannot update the project.Raise error
7317         pa_interface_utils_pub.map_new_amg_msg
7318            ( p_old_message_code => 'PA_PROJECT_SECURITY_ENFORCED'
7319             ,p_msg_attribute    => 'CHANGE'
7320             ,p_resize_flag      => 'Y'
7321             ,p_msg_context      => 'GENERAL'
7322             ,p_attribute1       => ''
7323             ,p_attribute2       => ''
7324             ,p_attribute3       => ''
7325             ,p_attribute4       => ''
7326             ,p_attribute5       => '');
7327 
7328         p_return_status := FND_API.G_RET_STS_ERROR;
7329 
7330         RAISE FND_API.G_EXC_ERROR;
7331     ELSE
7332         -- If the user has query privileges, then check whether
7333         -- update privileges are also available
7334         IF pa_security.allow_update (x_project_id => l_project_id ) = 'N' THEN
7335 
7336             -- The user does not have update privileges on this project
7337             -- Hence , raise error
7338 
7339             pa_interface_utils_pub.map_new_amg_msg
7340                 ( p_old_message_code => 'PA_PROJECT_SECURITY_ENFORCED'
7341                 ,p_msg_attribute    => 'CHANGE'
7342                 ,p_resize_flag      => 'Y'
7343                 ,p_msg_context      => 'GENERAL'
7344                 ,p_attribute1       => ''
7345                 ,p_attribute2       => ''
7346                 ,p_attribute3       => ''
7347                 ,p_attribute4       => ''
7348                 ,p_attribute5       => '');
7349 
7350 	        p_return_status := FND_API.G_RET_STS_ERROR;
7351 
7352             RAISE FND_API.G_EXC_ERROR;
7353         END IF;
7354      END IF;
7355 
7356 
7357     --Determine the Task ID for the Assignment
7358     IF p_pa_task_id = 0 OR
7359         ((p_pa_task_id IS NULL OR p_pa_task_id = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM)
7360         AND (p_pm_task_reference IS NULL OR p_pm_task_reference = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR)) THEN
7361 
7362         l_task_id := 0;
7363 
7364     ELSE
7365         --Get task id, if both task references are not NULL and p_pa_task_id <> 0
7366         Pa_project_pvt.Convert_pm_taskref_to_id (
7367             p_pa_project_id       => l_project_id,
7368             p_pa_task_id          => p_pa_task_id,
7369             p_pm_task_reference   => p_pm_task_reference,
7370             p_out_task_id         => l_task_id,
7371             p_return_status       => l_return_status );
7372 
7373         IF l_return_status =  FND_API.G_RET_STS_UNEXP_ERROR THEN
7374             RAISE  FND_API.G_EXC_UNEXPECTED_ERROR;
7375         ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
7376             RAISE  FND_API.G_EXC_ERROR;
7377         END IF;
7378 
7379     END IF;
7380 
7381 
7382     --Determine the Project Asset ID for the Assignment
7383     IF p_pa_project_asset_id = 0 OR
7384         ((p_pa_project_asset_id IS NULL OR p_pa_project_asset_id = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM)
7385         AND (p_pm_asset_reference IS NULL OR p_pm_asset_reference = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR)) THEN
7386 
7387         l_project_asset_id := 0;
7388 
7389     ELSE
7390         --Get project asset id based on PM Asset Reference
7391         PA_PROJECT_ASSETS_PUB.convert_pm_assetref_to_id (
7392             p_pa_project_id        => l_project_id,
7393             p_pa_project_asset_id  => p_pa_project_asset_id,
7394             p_pm_asset_reference   => p_pm_asset_reference,
7395             p_out_project_asset_id => l_project_asset_id,
7396             p_return_status        => l_return_status );
7397 
7398         IF l_return_status =  FND_API.G_RET_STS_UNEXP_ERROR THEN
7399             RAISE  FND_API.G_EXC_UNEXPECTED_ERROR;
7400         ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
7401             RAISE  FND_API.G_EXC_ERROR;
7402         END IF;
7403 
7404     END IF;
7405 
7406 
7407 
7408     --Before deleting, check if an assignment exists which matches the current assignment exactly
7409     OPEN existing_assignment_cur(l_project_id, l_task_id, l_project_asset_id);
7410     FETCH existing_assignment_cur INTO existing_assignment_rec;
7411     IF existing_assignment_cur%NOTFOUND THEN
7412 
7413         CLOSE existing_assignment_cur;
7414         --No matching assignment currently exists
7415         IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
7416             pa_interface_utils_pub.map_new_amg_msg
7417                 (p_old_message_code => 'PA_DELETE_AS_ASSIGN_FAILED'
7418                 ,p_msg_attribute    => 'CHANGE'
7419                 ,p_resize_flag      => 'N'
7420                 ,p_msg_context      => 'PROJ'
7421                 ,p_attribute1       => l_amg_project_number
7422                 ,p_attribute2       => ''
7423                 ,p_attribute3       => ''
7424                 ,p_attribute4       => ''
7425                 ,p_attribute5       => '');
7426         END IF;
7427 
7428         RAISE FND_API.G_EXC_ERROR;
7429 
7430     END IF; --No matching assignment currently exists
7431     CLOSE existing_assignment_cur;
7432 
7433 
7434     OPEN lock_assignment_cur(l_project_id, l_task_id, l_project_asset_id);
7435     CLOSE lock_assignment_cur;
7436 
7437 
7438     DELETE  pa_project_asset_assignments
7439     WHERE   project_id = l_project_id
7440     AND     task_id = l_task_id
7441     AND     project_asset_id = l_project_asset_id;
7442 
7443 
7444     --Perform commit if indicated
7445     IF FND_API.to_boolean( p_commit ) THEN
7446 	    COMMIT;
7447     END IF;
7448 
7449 
7450 
7451  EXCEPTION
7452   	WHEN FND_API.G_EXC_ERROR THEN
7453 		ROLLBACK TO delete_asset_assignment_pub;
7454 
7455 		p_return_status := FND_API.G_RET_STS_ERROR;
7456 
7457 		FND_MSG_PUB.Count_And_Get
7458 			(   p_count		=>	p_msg_count	,
7459 			    p_data		=>	p_msg_data	);
7460 
7461 	WHEN FND_API.G_EXC_UNEXPECTED_ERROR	THEN
7462 	   ROLLBACK TO delete_asset_assignment_pub;
7463 
7464 	   p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7465 
7466 	   FND_MSG_PUB.Count_And_Get
7467 			(   p_count		=>	p_msg_count	,
7468 			    p_data		=>	p_msg_data	);
7469 
7470  	WHEN OTHERS	THEN
7471 	   ROLLBACK TO delete_asset_assignment_pub;
7472 
7473 	   p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7474 
7475 	   IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
7476 		  FND_MSG_PUB.add_exc_msg
7477 				( p_pkg_name		=> G_PKG_NAME
7478 				, p_procedure_name	=> l_api_name	);
7479 
7480 	   END IF;
7481 
7482 	   FND_MSG_PUB.Count_And_Get
7483 			(   p_count		=>	p_msg_count	,
7484 			    p_data		=>	p_msg_data	);
7485 
7486  END delete_asset_assignment;
7487 
7488 
7489 
7490 --JPULTORAK Project Asset Creation
7491 
7492 --------------------------------------------------------------------------------
7493 
7494 END PA_PROJECT_ASSETS_PUB;