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