1 PACKAGE BODY csi_Item_Instance_Vld_pvt AS
2 /* $Header: csiviivb.pls 120.48.12020000.8 2013/03/22 10:58:22 mvaradam ship $ */
3
4 -- ------------------------------------------------------------
5 -- Define global variables
6 -- ------------------------------------------------------------
7
8 G_PKG_NAME CONSTANT VARCHAR2(30):= 'CSI_ITEM_INSTANCE_VLD_PVT';
9 G_FILE_NAME CONSTANT VARCHAR2(12) := 'csiviivb.pls';
10
11 /*-----------------------------------------------------------*/
12 /* Procedure name: Check_Reqd_Param */
13 /* Description : To Check if the reqd parameter is passed */
14 /*-----------------------------------------------------------*/
15
16 PROCEDURE Check_Reqd_Param_num
17 (
18 p_number IN NUMBER,
19 p_param_name IN VARCHAR2,
20 p_api_name IN VARCHAR2
21 ) IS
22 BEGIN
23 IF (NVL(p_number,FND_API.G_MISS_NUM) = FND_API.G_MISS_NUM) THEN
24 FND_MESSAGE.SET_NAME('CSI','CSI_API_REQD_PARAM_MISSING');
25 FND_MESSAGE.SET_TOKEN('API_NAME',p_api_name);
26 FND_MESSAGE.SET_TOKEN('MISSING_PARAM',p_param_name);
27 FND_MSG_PUB.Add;
28 RAISE FND_API.G_EXC_ERROR;
29 END IF;
30 END Check_Reqd_Param_num;
31
32 /*-----------------------------------------------------------*/
33 /* Procedure name: Check_Reqd_Param */
34 /* Description : To Check if the reqd parameter is passed */
35 /*-----------------------------------------------------------*/
36
37 PROCEDURE Check_Reqd_Param_char
38 (
39 p_variable IN VARCHAR2,
40 p_param_name IN VARCHAR2,
41 p_api_name IN VARCHAR2
42 ) IS
43 BEGIN
44 IF (NVL(p_variable,FND_API.G_MISS_CHAR) = FND_API.G_MISS_CHAR) THEN
45 FND_MESSAGE.SET_NAME('CSI','CSI_API_REQD_PARAM_MISSING');
46 FND_MESSAGE.SET_TOKEN('API_NAME',p_api_name);
47 FND_MESSAGE.SET_TOKEN('MISSING_PARAM',p_param_name);
48 FND_MSG_PUB.Add;
49 RAISE FND_API.G_EXC_ERROR;
50 END IF;
51 END Check_Reqd_Param_char;
52
53 /*-----------------------------------------------------------*/
54 /* Procedure name: Check_Reqd_Param */
55 /* Description : To Check if the reqd parameter is passed */
56 /*-----------------------------------------------------------*/
57
58 PROCEDURE Check_Reqd_Param_date
59 (
60 p_date IN DATE,
61 p_param_name IN VARCHAR2,
62 p_api_name IN VARCHAR2
63 ) IS
64 BEGIN
65 IF (NVL(p_date,FND_API.G_MISS_DATE) = FND_API.G_MISS_DATE) THEN
66 FND_MESSAGE.SET_NAME('CSI','CSI_API_REQD_PARAM_MISSING');
67 FND_MESSAGE.SET_TOKEN('API_NAME',p_api_name);
68 FND_MESSAGE.SET_TOKEN('MISSING_PARAM',p_param_name);
69 FND_MSG_PUB.Add;
70 RAISE FND_API.G_EXC_ERROR;
71 END IF;
72 END Check_Reqd_Param_date;
73
74 /*-----------------------------------------------------*/
75 /* Validates the item instance id */
76 /*-----------------------------------------------------*/
77
78 FUNCTION InstanceExists
79 ( p_item_instance_id IN NUMBER,
80 p_stack_err_msg IN BOOLEAN
81 ) RETURN BOOLEAN IS
82
83 l_dummy VARCHAR2(2);
84 l_return_value BOOLEAN := TRUE;
85 l_instance_number VARCHAR2(30):= substr(to_char(p_item_instance_id),1,30);
86 BEGIN
87 SELECT 'x'
88 INTO l_dummy
89 FROM csi_item_instances
90 WHERE instance_id = p_item_instance_id
91 OR instance_number = l_instance_number;
92 l_return_value := TRUE;
93 IF ( p_stack_err_msg = TRUE ) THEN
94 FND_MESSAGE.SET_NAME('CSI','CSI_API_INSTANCE_EXISTS');
95 FND_MESSAGE.SET_TOKEN('INSTANCE_ID',p_item_instance_id);
96 FND_MESSAGE.SET_TOKEN('INSTANCE_NUMBER',p_item_instance_id);
97 FND_MSG_PUB.Add;
98 END IF;
99 -- Bug 9744517 (FP 9691025)
100 RETURN l_return_value;
101 EXCEPTION
102 WHEN NO_DATA_FOUND THEN
103 l_return_value := FALSE;
104 RETURN l_return_value;
105 END InstanceExists;
106 --
107 /*-----------------------------------------------------*/
108 /* Validates the termination status */
109 /* Modified this routine to look at terminated_flag */
110 /* instead of service_order_allowed_flag since OKS call*/
111 /* with TRM transaction_type should depend on this. */
112 /*-----------------------------------------------------*/
113
114 FUNCTION termination_status
115 ( p_instance_status_id IN NUMBER
116 ) RETURN BOOLEAN IS
117 l_flag VARCHAR2(1);
118 l_return_value BOOLEAN := FALSE;
119 BEGIN
120 BEGIN
121 IF p_instance_status_id IS NOT NULL
122 THEN
123 SELECT terminated_flag -- service_order_allowed_flag Bug # 3945813 srramakr
124 INTO l_flag
125 FROM csi_instance_statuses
126 WHERE instance_status_id = p_instance_status_id;
127 -- IF upper(l_flag)='N' -- check for N while selecting service_order_allowed_flag
128 IF upper(l_flag)='Y' -- check for Y while selecting terminated_flag
129 THEN
130 l_return_value := TRUE;
131 ELSE
132 l_return_value := FALSE;
133 END IF;
134 ELSE
135 l_return_value := FALSE;
136 END IF;
137 EXCEPTION
138 WHEN OTHERS THEN
139 l_return_value := FALSE;
140 END;
141 RETURN l_return_value;
142 END termination_status;
143
144 /*-----------------------------------------------------*/
145 /* Validates the item instance number */
146 /*-----------------------------------------------------*/
147
148 FUNCTION Is_InstanceNum_Valid
149 ( p_item_instance_id IN NUMBER,
150 p_instance_number IN VARCHAR2,
151 p_mode IN VARCHAR2,
152 p_stack_err_msg IN BOOLEAN
153 ) RETURN BOOLEAN IS
154 l_instance_id NUMBER;
155 l_return_value BOOLEAN := TRUE;
156 l_instance_number VARCHAR2(30);
157 BEGIN
158 IF p_mode='CREATE'
159 THEN
160 IF ((p_item_instance_id IS NULL) OR
161 (p_item_instance_id = FND_API.G_MISS_NUM)) THEN
162 l_return_value := FALSE;
163 ELSE
164 IF ((p_instance_number IS NULL) OR
165 (p_instance_number = FND_API.G_MISS_CHAR)) THEN
166 l_return_value := TRUE;
167 ELSE
168 -- Added for eam integration
169 BEGIN
170 SELECT instance_number
171 INTO l_instance_number
172 FROM csi_item_instances
173 WHERE instance_number=p_instance_number;
174 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_INSTANCE_NUM');
175 FND_MESSAGE.SET_TOKEN('INSTANCE_NUMBER',p_instance_number);
176 FND_MSG_PUB.Add;
177 l_return_value := FALSE;
178 EXCEPTION
179 WHEN NO_DATA_FOUND THEN
180 l_return_value := TRUE;
181 WHEN TOO_MANY_ROWS THEN
182 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_INSTANCE_NUM');
183 FND_MESSAGE.SET_TOKEN('INSTANCE_NUMBER',p_instance_number);
184 FND_MSG_PUB.Add;
185 l_return_value := FALSE;
186 END;
187 -- End addition for eam integration
188 -- Start commentation for eam integration
189 /*
190 IF (to_char(p_item_instance_id) <> p_instance_number) THEN
191 IF ( p_stack_err_msg = TRUE ) THEN
192 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_INSTANCE_NUM');
193 FND_MESSAGE.SET_TOKEN('INSTANCE_NUMBER',p_instance_number);
194 FND_MSG_PUB.Add;
195 l_return_value := FALSE;
196 END IF;
197 END IF;
198 */
199 -- End commentation for eam integration
200 END IF;
201 END IF;
202 ELSIF p_mode='UPDATE'
203 THEN
204 -- Added for eam integration
205 BEGIN
206 SELECT instance_number
207 INTO l_instance_number
208 FROM csi_item_instances
209 WHERE instance_number = p_instance_number
210 AND instance_id <> p_item_instance_id;
211 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_INSTANCE_NUM');
212 FND_MESSAGE.SET_TOKEN('INSTANCE_NUMBER',p_instance_number);
213 FND_MSG_PUB.Add;
214 l_return_value := FALSE;
215 EXCEPTION
216 WHEN NO_DATA_FOUND THEN
217 l_return_value := TRUE;
218 WHEN TOO_MANY_ROWS THEN
219 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_INSTANCE_NUM');
220 FND_MESSAGE.SET_TOKEN('INSTANCE_NUMBER',p_instance_number);
221 FND_MSG_PUB.Add;
222 l_return_value := FALSE;
223 END;
224 -- End addition for eam integration
225 END IF;
226 RETURN l_return_value;
227 END Is_InstanceNum_Valid;
228
229 --instance_id and instance_number are same at this point of time.
230
231 /*------------------------------------------------------------*/
232 /* This function verifies that the item is a valid inventory */
233 /* item and is marked as 'Trackable' */
234 /*------------------------------------------------------------*/
235
236 FUNCTION Is_Trackable
237 (
238 p_inv_item_id IN NUMBER,
239 p_org_id IN NUMBER,
240 p_trackable_flag IN VARCHAR2,
241 p_stack_err_msg IN BOOLEAN
242 )
243 RETURN BOOLEAN IS
244
245 l_temp_string VARCHAR2(1);
246 l_return_value BOOLEAN := TRUE;
247 l_description VARCHAR2(240);
248
249
250 --changed for bug 6327810 to return description -somitra
251
252 BEGIN
253
254 SELECT NVL(comms_nl_trackable_flag,'N') ,NVL(description,' ')
255 INTO l_temp_string,l_description
256 FROM mtl_system_items
257 WHERE inventory_item_id = p_inv_item_id
258 AND organization_id = p_org_id
259 AND enabled_flag = 'Y'
260 AND nvl (start_date_active, sysdate) <= sysdate
261 AND nvl (end_date_active, sysdate+1) > sysdate;
262
263
264
265 If p_trackable_flag <> FND_API.G_MISS_CHAR then
266 if nvl(p_trackable_flag,'N') <> 'Y' then
267 l_return_value := FALSE;
268 IF (p_stack_err_msg = TRUE) THEN
269 FND_MESSAGE.SET_NAME('CSI','CSI_API_NOT_TRACKABLE');
270 FND_MESSAGE.SET_TOKEN('ITEM_DESCRIPTION',l_description) ;
271 FND_MESSAGE.SET_TOKEN('INVENTORY_ITEM_ID',p_inv_item_id);
272 FND_MESSAGE.SET_TOKEN('ORGANIZATION_ID',p_org_id);
273
274 FND_MSG_PUB.Add;
275 END IF;
276 else
277 l_return_value := TRUE;
278 end if;
279 RETURN l_return_value;
280 End if;
281 --
282 -- Check for inventory item id and Org id values
283 IF ((p_inv_item_id IS NOT NULL) AND (p_inv_item_id <> FND_API.G_MISS_NUM)) AND
284 ((p_org_id IS NOT NULL) AND (p_org_id <> FND_API.G_MISS_NUM)) THEN
285
286
287 IF UPPER(l_temp_string) = 'Y' THEN
288 l_return_value := TRUE;
289 ELSE
290 l_return_value := FALSE;
291 IF (p_stack_err_msg = TRUE) THEN
292 FND_MESSAGE.SET_NAME('CSI','CSI_API_NOT_TRACKABLE');
293 FND_MESSAGE.SET_TOKEN('ITEM_DESCRIPTION',l_description) ;
294 FND_MESSAGE.SET_TOKEN('INVENTORY_ITEM_ID',p_inv_item_id);
295 FND_MESSAGE.SET_TOKEN('ORGANIZATION_ID',p_org_id);
296 FND_MSG_PUB.Add;
297 END IF;
298 END IF;
299
300
301 ELSE
302 l_return_value := FALSE;
303 IF (p_stack_err_msg = TRUE) THEN
304 FND_MESSAGE.SET_NAME('CSI','CSI_API_NOT_TRACKABLE');
305 FND_MESSAGE.SET_TOKEN('ITEM_DESCRIPTION',l_description) ;
306 FND_MESSAGE.SET_TOKEN('INVENTORY_ITEM_ID',p_inv_item_id);
307 FND_MESSAGE.SET_TOKEN('ORGANIZATION_ID',p_org_id);
308 FND_MSG_PUB.Add;
309 End IF;
310 END IF;
311
312
313 RETURN l_return_value;
314 END Is_Trackable;
315
316
317 /*----------------------------------------------------*/
318 /* This Procedure verifies validity of serial number */
319 /* ,lot number and revision when vld_organization_id */
320 /* is changing. */
321 /*----------------------------------------------------*/
322
323 PROCEDURE Validate_org_dependent_params
324 (
325 p_instance_rec IN OUT NOCOPY csi_datastructures_pub.instance_rec,
326 p_txn_rec IN csi_datastructures_pub.transaction_rec,
327 l_return_value IN OUT NOCOPY BOOLEAN
328 ) IS
329
330 BEGIN
331 IF p_instance_rec.serial_number <> fnd_api.g_miss_char
332 AND p_instance_rec.serial_number IS NOT NULL
333 THEN
334 csi_item_instance_vld_pvt.Validate_Serial_Number
335 (
336 p_inv_org_id => p_instance_rec.vld_organization_id,
337 p_inv_item_id => p_instance_rec.inventory_item_id ,
338 p_serial_number => p_instance_rec.serial_number,
339 p_mfg_serial_number_flag => p_instance_rec.mfg_serial_number_flag,
340 p_txn_rec => p_txn_rec,
341 p_creation_complete_flag => p_instance_rec.creation_complete_flag,
342 p_location_type_code => p_instance_rec.location_type_code,
343 p_instance_id => p_instance_rec.instance_id, -- Bug 2342885
344 p_instance_usage_code => p_instance_rec.instance_usage_code,
345 l_return_value => l_return_value
346 );
347 END IF;
348
349 IF p_instance_rec.lot_number <> fnd_api.g_miss_char
350 AND p_instance_rec.lot_number IS NOT NULL
351 AND l_return_value
352 THEN
353 csi_item_instance_vld_pvt.Validate_Lot_Number
354 (
355 p_inv_org_id => p_instance_rec.vld_organization_id,
356 p_inv_item_id => p_instance_rec.inventory_item_id ,
357 p_lot_number => p_instance_rec.lot_number,
358 p_mfg_serial_number_flag => p_instance_rec.mfg_serial_number_flag,
359 p_txn_rec => p_txn_rec,
360 p_creation_complete_flag => p_instance_rec.creation_complete_flag,
361 l_return_value => l_return_value
362 );
363 END IF;
364
365 IF p_instance_rec.inventory_revision <> fnd_api.g_miss_char
366 AND p_instance_rec.inventory_revision IS NOT NULL
367 AND l_return_value
368 THEN
369 csi_item_instance_vld_pvt.Validate_Revision
370 (
371 p_inv_item_id => p_instance_rec.inventory_item_id ,
372 p_inv_org_id => p_instance_rec.vld_organization_id,
373 p_creation_complete_flag => p_instance_rec.creation_complete_flag,
374 p_revision => p_instance_rec.inventory_revision,
375 l_return_value => l_return_value
376 );
377 END IF;
378
379 END Validate_org_dependent_params;
380
381
382
383 /*------------------------------------------------------------*/
384 /* This Procedure verifies that the item revision is valid */
385 /* by looking into the mtl revision table */
386 /*------------------------------------------------------------*/
387
388 PROCEDURE Validate_Revision
389 (
390 p_inv_item_id IN NUMBER,
391 p_inv_org_id IN NUMBER,
392 p_revision IN VARCHAR2,
393 p_creation_complete_flag IN OUT NOCOPY VARCHAR2,
394 l_return_value IN OUT NOCOPY BOOLEAN,
395 p_rev_control_code IN NUMBER
396 ) IS
397 l_dummy number; --varchar2(1);
398 l_stack_err_msg BOOLEAN DEFAULT TRUE;
399
400 CURSOR c1 is
401 SELECT revision_qty_control_code
402 FROM mtl_system_items
403 WHERE inventory_item_id = p_inv_item_id
404 AND organization_id = p_inv_org_id
405 AND enabled_flag = 'Y'
406 AND nvl (start_date_active, sysdate) <= sysdate
407 AND nvl (end_date_active, sysdate+1) > sysdate;
408
409 BEGIN
410 If p_rev_control_code <> FND_API.G_MISS_NUM Then
411 l_dummy := p_rev_control_code;
412 else
413 OPEN c1;
414 FETCH c1 into l_dummy;
415 CLOSE c1;
416 end if;
417 -- If Revision controlled
418 IF l_dummy is not null THEN
419 -- Item is under revision control but revision_number is NULL
420 -- '1' stands for - No revision control
421 -- '2' stands for - Full revision control
422 IF NVL(l_dummy,0) = 2 THEN
423 IF ((p_revision IS NULL) OR
424 (p_revision = FND_API.G_MISS_CHAR)) THEN
425 IF (p_creation_complete_flag = 'Y') THEN
426 l_return_value := FALSE;
427 IF ( l_stack_err_msg = TRUE ) THEN
428 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_REVISION');
429 FND_MESSAGE.SET_TOKEN('INVENTORY_REVISION',p_revision);
430 FND_MSG_PUB.Add;
431 END IF;
432 ELSE
433 p_creation_complete_flag := 'N';
434 l_return_value := TRUE;
435 END IF;
436
437 ELSE
438 BEGIN
439 SELECT 1
440 INTO l_dummy
441 FROM mtl_item_revisions
442 WHERE inventory_item_id = p_inv_item_id
443 AND organization_id = p_inv_org_id
444 AND revision = p_revision;
445 l_return_value := TRUE;
446 EXCEPTION
447 WHEN NO_DATA_FOUND THEN
448 l_return_value := FALSE;
449 IF ( l_stack_err_msg = TRUE ) THEN
450 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_REVISION');
451 FND_MESSAGE.SET_TOKEN('INVENTORY_REVISION',p_revision);
452 FND_MSG_PUB.Add;
453 END IF;
454 END;
455 END IF;
456 ELSE
457 -- Item is not under revision control but inventory_revision is not NULL
458 IF ((p_revision IS NOT NULL) AND (p_revision <> FND_API.G_MISS_CHAR)) THEN
459 BEGIN
460 SELECT 1
461 INTO l_dummy
462 FROM mtl_item_revisions
463 WHERE inventory_item_id = p_inv_item_id
464 AND organization_id = p_inv_org_id
465 AND revision = p_revision;
466 l_return_value := TRUE;
467 EXCEPTION
468 WHEN NO_DATA_FOUND THEN
469 l_return_value := FALSE;
470 IF ( l_stack_err_msg = TRUE ) THEN
471 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_REVISION');
472 FND_MESSAGE.SET_TOKEN('INVENTORY_REVISION',p_revision);
473 FND_MSG_PUB.Add;
474 END IF;
475 END;
476 ELSE
477 l_return_value := TRUE;
478 END IF;
479
480 END IF;
481 ELSE
482 l_return_value := FALSE;
483 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_ITEM'); -- Item does not exist in the inventory organization provided
484 FND_MESSAGE.SET_TOKEN('INVENTORY_ITEM_ID',p_inv_item_id);
485 FND_MESSAGE.SET_TOKEN('INVENTORY_ORGANIZATION_ID',p_inv_org_id);
486 FND_MSG_PUB.Add;
487 END IF;
488 END Validate_Revision;
489
490 /*------------------------------------------------------------*/
491 /* This Procedure verifies that the item revision is valid */
492 /* by looking into the mtl revision table */
493 /*------------------------------------------------------------*/
494
495 PROCEDURE Update_Revision
496 (
497 p_inv_item_id IN NUMBER,
498 p_inv_org_id IN NUMBER,
499 p_revision IN VARCHAR2,
500 l_return_value IN OUT NOCOPY BOOLEAN,
501 p_rev_control_code IN NUMBER
502 ) IS
503 l_dummy number; --varchar2(1);
504 l_stack_err_msg BOOLEAN DEFAULT TRUE;
505
506 CURSOR c1 is
507 SELECT revision_qty_control_code
508 FROM mtl_system_items
509 WHERE inventory_item_id = p_inv_item_id
510 AND organization_id = p_inv_org_id
511 AND enabled_flag = 'Y'
512 AND nvl (start_date_active, sysdate) <= sysdate
513 AND nvl (end_date_active, sysdate+1) > sysdate;
514
515 BEGIN
516 l_return_value := TRUE;
517 If p_rev_control_code <> FND_API.G_MISS_NUM Then
518 l_dummy := p_rev_control_code;
519 else
520 OPEN c1;
521 FETCH c1 into l_dummy;
522 CLOSE c1;
523 end if;
524 -- If Revision controlled
525 IF l_dummy is not null THEN
526 -- Item is under revision control but revision_number is NULL
527 -- '1' stands for - No revision control
528 -- '2' stands for - Full revision control
529 IF NVL(l_dummy,0) = 2 THEN
530 IF ((p_revision IS NULL) OR
531 (p_revision = FND_API.G_MISS_CHAR)) THEN
532 l_return_value := FALSE;
533 IF ( l_stack_err_msg = TRUE ) THEN
534 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_REVISION');
535 FND_MESSAGE.SET_TOKEN('INVENTORY_REVISION',p_revision);
536 FND_MSG_PUB.Add;
537 END IF;
538 ELSE
539 BEGIN
540 SELECT 1
541 INTO l_dummy
542 FROM mtl_item_revisions
543 WHERE inventory_item_id = p_inv_item_id
544 AND organization_id = p_inv_org_id
545 AND revision = p_revision;
546 l_return_value := TRUE;
547 EXCEPTION
548 WHEN NO_DATA_FOUND THEN
549 l_return_value := FALSE;
550 IF ( l_stack_err_msg = TRUE ) THEN
551 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_REVISION');
552 FND_MESSAGE.SET_TOKEN('INVENTORY_REVISION',p_revision);
553 FND_MSG_PUB.Add;
554 END IF;
555 END;
556 END IF;
557 ELSE
558 -- Item is not under revision control but inventory_revision is not NULL
559 IF ((p_revision IS NOT NULL) AND (p_revision <> FND_API.G_MISS_CHAR)) THEN
560 BEGIN
561 SELECT 1
562 INTO l_dummy
563 FROM mtl_item_revisions
564 WHERE inventory_item_id = p_inv_item_id
565 AND organization_id = p_inv_org_id
566 AND revision = p_revision;
567 l_return_value := TRUE;
568 EXCEPTION
569 WHEN NO_DATA_FOUND THEN
570 l_return_value := FALSE;
571 IF ( l_stack_err_msg = TRUE ) THEN
572 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_REVISION');
573 FND_MESSAGE.SET_TOKEN('INVENTORY_REVISION',p_revision);
574 FND_MSG_PUB.Add;
575 END IF;
576 END;
577 ELSE
578 l_return_value := TRUE;
579 END IF;
580 END IF;
581 ELSE
582 l_return_value := FALSE;
583 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_ITEM'); -- Item does not exist in the inventory organization provided
584 FND_MESSAGE.SET_TOKEN('INVENTORY_ITEM_ID',p_inv_item_id);
585 FND_MESSAGE.SET_TOKEN('INVENTORY_ORGANIZATION_ID',p_inv_org_id);
586 FND_MSG_PUB.Add;
587 END IF;
588 END Update_Revision;
589
590 /*----------------------------------------------------*/
591 /* This function verifies that the item */
592 /* is under serial control or not */
593 /*----------------------------------------------------*/
594
595 FUNCTION Is_treated_serialized
596 ( p_serial_control_code IN NUMBER ,
597 p_location_type_code IN VARCHAR2,
598 p_transaction_type_id IN NUMBER -- Added parameter for bug 5374068
599 ) RETURN BOOLEAN IS
600 l_return_value BOOLEAN := FALSE;
601 BEGIN
602 -- Item is under serial control but serial_number is NULL
603 -- '1' stands for - No serial number control
604 -- '2' stands for - Predefined serial numbers
605 -- '5' stands for - Dynamic entry at inventory receipt
606 -- '6' stands for - Dynamic entry at sales order issue
607
608 IF p_serial_control_code IN (2,5)
609 THEN
610 l_return_value := TRUE;
611 ELSIF p_serial_control_code = 1
612 THEN
613 l_return_value := FALSE;
614 ELSIF p_serial_control_code = 6
615 THEN
616 IF (p_location_type_code IN ('INTERNAL_SITE','WIP','PROJECT','INVENTORY') )
617 THEN
618 -- Added the following code for bug 5374068
619 IF p_location_type_code='INTERNAL_SITE' AND
620 (p_transaction_type_id IS NOT NULL AND
621 p_transaction_type_id=130)
622 THEN
623 l_return_value := TRUE ;
624 ELSE
625 l_return_value := FALSE ;
626 END IF;
627 ELSE
628 l_return_value := TRUE ;
629 END IF;
630 END IF;
631 RETURN l_return_value;
632 END Is_treated_serialized;
633
634
635 /*----------------------------------------------------------------*/
636 /* This Procedure is specifically used for the IB instances that */
637 /* are created manually. When called this procedure creates a */
638 /* serial number in INVENTORY for manually created CP's */
639 /*----------------------------------------------------------------*/
640
641 PROCEDURE Create_Serial
642 (
643 p_inv_org_id IN NUMBER,
644 p_inv_item_id IN NUMBER,
645 p_serial_number IN VARCHAR2,
646 p_mfg_srl_num_flag IN OUT NOCOPY VARCHAR2,
647 p_location_type_code IN VARCHAR2,
648 p_ins_flag OUT NOCOPY VARCHAR2,
649 p_lot_number IN VARCHAR2,
650 p_gen_object_id OUT NOCOPY NUMBER,
651 l_return_value IN OUT NOCOPY BOOLEAN
652 ) IS
653
654 l_exists NUMBER;
655 l_return_status VARCHAR2(1);
656 l_msg_count NUMBER;
657 l_msg_data VARCHAR2(2000);
658 l_object_id NUMBER;
659 l_current_status NUMBER;
660 l_serial_type NUMBER;
661 l_temp VARCHAR2(1);
662 l_item_id NUMBER;
663 l_base_item_id NUMBER;
664 l_lot_number VARCHAR2(80);
665 l_cst_grp_id NUMBER;
666 --
667 CURSOR CTO_CUR(p_base_model IN NUMBER) IS
668 select distinct inventory_item_id
669 from MTL_SYSTEM_ITEMS_B
670 where base_item_id = p_base_model
671 and inventory_item_id <> p_inv_item_id;
672 --
673 process_next EXCEPTION;
674 comp_error EXCEPTION;
675
676 CURSOR ser_upd_csr (p_inv_id IN NUMBER
677 ,p_ser_number IN VARCHAR2) IS
678 SELECT *
679 FROM mtl_serial_numbers
680 WHERE inventory_item_id = p_inv_id
681 AND serial_number = p_ser_number;
682 l_ser_upd_csr ser_upd_csr%ROWTYPE;
683 l_status NUMBER;
684 BEGIN
685 --
686 -- Serial control codes:
687 -----------------------
688 -- No Serial control (status = 1)
689 -- Pre-defined (status = 2)
690 -- Serialized at SO Issue (status = 5)
691 -- Serialized at Receipt (status = 6)
692
693 -- serial statuses:
694 ------------------
695 -- Defined but not used (status = 1)
696 -- Resides in stores (status = 3)
697 -- Issued out of stores (status = 4)
698 -- Resides in Intransit (status = 5)
699
700 -- Serial uniqueness codes:
701 --------------------------
702 -- within inventory items (status = 1)
703 -- within organization (status = 2)
704 -- Across organizations (status = 3)
705 --
706 --
707 l_return_value := TRUE;
708 p_ins_flag := FND_API.G_FALSE;
709 --
710
711 IF nvl(p_lot_number,FND_API.G_MISS_CHAR) = FND_API.G_MISS_CHAR THEN
712 l_lot_number := NULL;
713 ELSE
714 l_lot_number := p_lot_number;
715 END IF;
716 --
717 BEGIN
718 SELECT serial_number_type, -- serial number uniqueness control
719 default_cost_group_id
720 INTO l_serial_type,
721 l_cst_grp_id
722 FROM mtl_parameters
723 WHERE organization_id = p_inv_org_id;
724 EXCEPTION
725 WHEN no_data_found THEN
726 l_return_value := FALSE;
727 fnd_message.set_name('CSI','CSI_NO_ORG_SET');
728 fnd_message.set_token('ORGANIZATION_ID',p_inv_org_id);
729 fnd_msg_pub.add;
730 RAISE comp_error;
731 END;
732 --
733 -- srramakr IB should just check for serial number existence in MSN and if it does not exist
734 -- the same should get created with current_status = 4 (out of stores). All other statuses should be
735 -- driven by Inventory.
736 --
737 /****** COMMENTED
738 IF ((p_location_type_code IS NOT NULL) AND (p_location_type_code <> FND_API.G_MISS_CHAR))
739 THEN
740 IF p_location_type_code = 'IN_TRANSIT'
741 THEN
742 l_current_status := 5;
743 ELSIF p_location_type_code = 'INVENTORY'
744 THEN
745 l_current_status := 3;
746 ELSE
747 l_current_status := 4;
748 END IF;
749 END IF;
750 ******* END OF COMMENT ******/
751 l_current_status := 4;
752 l_temp := NULL;
753 l_status := NULL;
754 --
755 IF l_serial_type IS NOT NULL
756 THEN
757 -- Check for the fundamental combination
758 BEGIN
759 SELECT 'x'
760 ,current_status
761 ,gen_object_id
762 INTO l_temp
763 ,l_status
764 ,p_gen_object_id
765 FROM mtl_serial_numbers
766 WHERE inventory_item_id = p_inv_item_id
767 AND serial_number = p_serial_number;
768 -- AND ROWNUM = 1; -- Commenting as inv_id and serial_number is unique in MSN
769 EXCEPTION
770 WHEN NO_DATA_FOUND THEN
771 l_temp := null;
772 l_status := null;
773 END;
774 --
775 IF l_status IS NOT NULL
776 THEN
777 l_exists := 0;
778 IF l_status = 1 --serial number defined but not used
779 THEN
780 -- If current status is 1 then check for transactions
781 select count(*)
782 into l_exists
783 from mtl_unit_transactions
784 where inventory_item_id = p_inv_item_id
785 and serial_number = p_serial_number
786 and ROWNUM = 1;
787 --
788 IF l_exists > 0 THEN
789 -- Since transactions were found so we will not update the current status
790 RAISE process_next;
791 ELSE
792 l_current_status := 4;
793 END IF;
794 ELSE
795 -- For all other current status values we will not update the status
796 RAISE process_next;
797 END IF;
798 --
799 IF l_exists = 0
800 THEN
801 -- Since transactions were not found so we will update the current status
802 OPEN ser_upd_csr (p_inv_id => p_inv_item_id
803 ,p_ser_number => p_serial_number);
804 FETCH ser_upd_csr INTO l_ser_upd_csr;
805 CLOSE ser_upd_csr;
806 csi_gen_utility_pvt.put_line('Calling INV API to update Serial Number...');
807 inv_serial_number_pub.updateserial(
808 p_api_version => 1.0
809 ,p_init_msg_list => fnd_api.g_false
810 ,p_commit => fnd_api.g_false
811 ,p_validation_level => fnd_api.g_valid_level_full
812 ,p_inventory_item_id => p_inv_item_id
813 ,p_organization_id => p_inv_org_id
814 ,p_serial_number => p_serial_number
815 ,p_initialization_date => l_ser_upd_csr.initialization_date
816 ,p_completion_date => l_ser_upd_csr.completion_date
817 ,p_ship_date => l_ser_upd_csr.ship_date
818 ,p_revision => l_ser_upd_csr.revision
819 ,p_lot_number => l_ser_upd_csr.lot_number
820 ,p_current_locator_id => l_ser_upd_csr.current_locator_id
821 ,p_subinventory_code => l_ser_upd_csr.current_subinventory_code
822 ,p_trx_src_id => l_ser_upd_csr.original_wip_entity_id
823 ,p_unit_vendor_id => l_ser_upd_csr.original_unit_vendor_id
824 ,p_vendor_lot_number => l_ser_upd_csr.vendor_lot_number
825 ,p_vendor_serial_number => l_ser_upd_csr.vendor_serial_number
826 ,p_receipt_issue_type => l_ser_upd_csr.last_receipt_issue_type
827 ,p_txn_src_id => l_ser_upd_csr.last_txn_source_id
828 ,p_txn_src_name => l_ser_upd_csr.last_txn_source_name
829 ,p_txn_src_type_id => l_ser_upd_csr.last_txn_source_type_id
830 ,p_current_status => l_current_status
831 ,p_parent_item_id => l_ser_upd_csr.parent_item_id
832 ,p_parent_serial_number => l_ser_upd_csr.parent_serial_number
833 ,p_serial_temp_id => NULL
834 ,p_last_status => l_status
835 ,p_status_id => NULL
836 ,x_object_id => l_object_id
837 ,x_return_status => l_return_status
838 ,x_msg_count => l_msg_count
839 ,x_msg_data => l_msg_data
840 ,p_organization_type => NULL
841 ,p_owning_org_id => NULL
842 ,p_owning_tp_type => NULL
843 ,p_planning_org_id => NULL
844 ,p_planning_tp_type => NULL
845 ,p_transaction_action_id => NULL
846 );
847 p_gen_object_id := l_object_id;
848 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
849 l_return_value := FALSE;
850 FND_MESSAGE.Set_Name('CSI', 'CSI_API_INVALID_UPD_SERIAL');
851 FND_MESSAGE.Set_token('ERR_TEXT' , 'Error returned from inv_serial_number_pub.updateserial');
852 FND_MSG_PUB.ADD;
853 RAISE comp_error;
854 ELSE
855 l_return_value := TRUE;
856 csi_gen_utility_pvt.put_line('Serial Number updated successfully in MTL_SERIAL_NUMBERS..');
857 RAISE comp_error;
858 END IF;
859 END IF;
860 ELSIF l_temp IS NULL -- Record is not found in MSN so we will validate and create a record in MSN
861 THEN
862 --
863 -- Case 1 unique serial number within Models and inventory items
864 l_temp := null;
865 IF l_serial_type = 1
866 THEN
867 l_base_item_id := NULL;
868 Begin
869 select base_item_id
870 into l_base_item_id
871 from MTL_SYSTEM_ITEMS_B
872 where inventory_item_id = p_inv_item_id
873 and organization_id = p_inv_org_id;
874 Exception
875 when others then
876 l_base_item_id := null;
877 End;
878 --
879 IF l_base_item_id IS NOT NULL THEN
880 l_temp := NULL;
881 FOR base_rec in CTO_CUR(l_base_item_id) LOOP
882 Begin
883 SELECT 'x'
884 INTO l_temp
885 FROM mtl_serial_numbers
886 WHERE inventory_item_id = base_rec.inventory_item_id
887 AND serial_number = p_serial_number;
888 -- AND ROWNUM = 1; -- Commenting as inv_id and serial_number is unique in MSN
889 exit;
890 Exception
891 WHEN NO_DATA_FOUND THEN
892 l_temp := null;
893 WHEN OTHERS THEN
894 l_return_value := TRUE;
895 End;
896 END LOOP;
897 -- If l_temp has a value then the uniqueness within Models and Inventory Items is violated.
898 -- Hence error out.
899 IF l_temp IS NOT NULL THEN
900 l_return_value := FALSE;
901 fnd_message.set_name('CSI','CSI_SER_CASE4');
902 fnd_message.set_token('SERIAL_NUMBER',p_serial_number);
903 fnd_msg_pub.add;
904 RAISE comp_error;
905 END IF;
906 END IF; -- base model exists
907 END IF; -- case 1
908 -- case4 unique serial number within inventory items
909 -- Since the fundamental uniqueness is checked upfront, no need to check for serial type 4
910 --
911 -- case2 unique serial number within particular organization
912 l_item_id := null;
913 IF l_serial_type = 2
914 THEN
915 BEGIN
916 SELECT inventory_item_id
917 INTO l_item_id
918 FROM mtl_serial_numbers
919 WHERE serial_number = p_serial_number
920 AND current_organization_id = p_inv_org_id;
921 --
922 EXCEPTION
923 WHEN NO_DATA_FOUND THEN
924 l_temp := null;
925 l_item_id := null;
926 WHEN TOO_MANY_ROWS THEN
927 l_temp := 'x';
928 l_return_value := FALSE;
929 fnd_message.set_name('CSI','CSI_SER_CASE2');
930 fnd_message.set_token('SERIAL_NUMBER',p_serial_number);
931 fnd_msg_pub.add;
932 RAISE comp_error;
933 END;
934 --
935 IF l_item_id IS NOT NULL THEN
936 l_temp := 'x';
937 IF l_item_id <> p_inv_item_id THEN
938 l_return_value := FALSE;
939 fnd_message.set_name('CSI','CSI_SER_CASE2');
940 fnd_message.set_token('SERIAL_NUMBER',p_serial_number);
941 fnd_msg_pub.add;
942 RAISE comp_error;
943 ELSE
944 RAISE Process_next;
945 END IF;
946 END IF;
947 -- Also check if it has been already defined as
948 -- unique serial number accross organizations i.e entire system
949 IF l_return_value
950 THEN
951 BEGIN
952 SELECT 'x'
953 INTO l_temp
954 FROM mtl_serial_numbers s,
955 mtl_parameters p
956 WHERE s.current_organization_id = p.organization_id
957 AND s.serial_number = p_serial_number
958 AND p.serial_number_type = 3
959 AND ROWNUM = 1;
960 EXCEPTION
961 WHEN NO_DATA_FOUND THEN
962 l_temp := null;
963 END;
964 --
965 IF l_temp IS NOT NULL THEN
966 l_return_value := FALSE;
967 fnd_message.set_name('CSI','CSI_SER_CASE3');
968 fnd_message.set_token('SERIAL_NUMBER',p_serial_number);
969 fnd_msg_pub.add;
970 RAISE comp_error;
971 END IF;
972 END IF; --l_return_value
973 END IF; -- l_serial_type = 2
974 -- case3 unique serial number accross organizations i.e entire system
975 IF l_serial_type = 3
976 THEN
977 BEGIN
978 SELECT inventory_item_id
979 INTO l_item_id
980 FROM mtl_serial_numbers
981 WHERE serial_number = p_serial_number;
982 EXCEPTION
983 WHEN NO_DATA_FOUND THEN
984 l_temp := null;
985 l_item_id := null;
986 WHEN TOO_MANY_ROWS THEN
987 l_temp := 'x';
988 l_return_value := FALSE;
989 fnd_message.set_name('CSI','CSI_SER_CASE3');
990 fnd_message.set_token('SERIAL_NUMBER',p_serial_number);
991 fnd_msg_pub.add;
992 RAISE comp_error;
993 END;
994 --
995 IF l_item_id IS NOT NULL THEN
996 l_temp := 'x';
997 IF l_item_id <> p_inv_item_id THEN
998 l_return_value := FALSE;
999 fnd_message.set_name('CSI','CSI_SER_CASE3');
1000 fnd_message.set_token('SERIAL_NUMBER',p_serial_number);
1001 fnd_msg_pub.add;
1002 RAISE comp_error;
1003 ELSE
1004 RAISE Process_next;
1005 END IF;
1006 END IF;
1007 END IF; -- l_serial_type = 3
1008 END IF;
1009 --
1010 -- If there is no corresonding serial# in INV,
1011 IF l_temp IS NULL
1012 THEN
1013 -- call the Inventory API to insert serial no. into the MSN table
1014 csi_gen_utility_pvt.put_line('Calling INV API to create Serial Number...');
1015 inv_serial_number_pub.insertSerial(
1016 p_api_version => 1.0,
1017 p_init_msg_list => fnd_api.g_false,
1018 p_commit => fnd_api.g_false,
1019 p_validation_level => fnd_api.g_valid_level_full,
1020 p_inventory_item_id => p_inv_item_id,
1021 p_organization_id => p_inv_org_id,
1022 p_serial_number => p_serial_number,
1023 p_initialization_date => SYSDATE,
1024 p_completion_date => SYSDATE, --NULL,
1025 p_ship_date => NULL,
1026 p_revision => NULL, --'A',
1027 p_lot_number => l_lot_number, --NULL,
1028 p_current_locator_id => NULL,
1029 p_subinventory_code => NULL,
1030 p_trx_src_id => NULL,
1031 p_unit_vendor_id => NULL,
1032 p_vendor_lot_number => NULL,
1033 p_vendor_serial_number => NULL,
1034 p_receipt_issue_type => NULL,
1035 p_txn_src_id => NULL,
1036 p_txn_src_name => NULL,
1037 p_txn_src_type_id => NULL,
1038 p_transaction_id => NULL,
1039 p_current_status => l_current_status,
1040 p_parent_item_id => NULL,
1041 p_parent_serial_number => NULL,
1042 p_cost_group_id => l_cst_grp_id,
1043 p_transaction_action_id => NULL,
1044 p_transaction_temp_id => NULL,
1045 p_status_id => NULL,
1046 x_object_id => l_object_id,
1047 x_return_status => l_return_status,
1048 x_msg_count => l_msg_count,
1049 x_msg_data => l_msg_data,
1050 p_organization_type => NULL,
1051 p_owning_org_id => NULL,
1052 p_owning_tp_type => NULL,
1053 p_planning_org_id => NULL,
1054 p_planning_tp_type => NULL,
1055 p_wip_entity_id => NULL,
1056 p_operation_seq_num => NULL,
1057 p_intraoperation_step_type => NULL );
1058
1059 p_gen_object_id := l_object_id;
1060 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1061 l_return_value := FALSE;
1062 FND_MESSAGE.Set_Name('CSI', 'CSI_API_INVALID_INV_SERIAL');
1063 FND_MESSAGE.Set_token('ERR_TEXT' , 'Error returned from inv_serial_number_pub.insertserial');
1064 FND_MSG_PUB.ADD;
1065 ELSE
1066 l_return_value := TRUE;
1067 p_ins_flag := FND_API.G_TRUE;
1068 csi_gen_utility_pvt.put_line('Serial Number created successfully in MTL_SERIAL_NUMBERS..');
1069 END IF;
1070 END IF; -- (l_temp is null)
1071 END IF;
1072
1073 EXCEPTION
1074 WHEN process_next THEN
1075 l_return_value := TRUE;
1076 WHEN comp_error THEN
1077 null;
1078 END Create_Serial;
1079 --
1080
1081 /*------------------------------------------------------------*/
1082 /* This procedure verifies that the item serial number is */
1083 /* valid by looking into the mtl serial #s table */
1084 /*------------------------------------------------------------*/
1085
1086 PROCEDURE Validate_Serial_Number
1087 (
1088 p_inv_org_id IN NUMBER,
1089 p_inv_item_id IN NUMBER,
1090 p_serial_number IN VARCHAR2,
1091 p_mfg_serial_number_flag IN VARCHAR2,
1092 p_txn_rec IN csi_datastructures_pub.transaction_rec,
1093 p_creation_complete_flag IN OUT NOCOPY VARCHAR2,
1094 p_location_type_code IN VARCHAR2, -- Added by sk on 09/13/01
1095 p_srl_control_code IN NUMBER,
1096 p_instance_id IN NUMBER, -- Bug # 2342885
1097 p_instance_usage_code IN VARCHAR2,
1098 l_return_value IN OUT NOCOPY BOOLEAN
1099 ) IS
1100 l_dummy varchar2(30);
1101 l_temp varchar2(30);
1102 p_stack_err_msg BOOLEAN DEFAULT TRUE;
1103 l_serial_tagged VARCHAR2(1) := 'N';
1104 l_inv_txn_typeid_from_cs NUMBER := -1;
1105
1106 -- If item is under serial control, then serial number MUST be a non-NULL
1107 -- value. If it is not under serial_control, then serial number MUST be
1108 -- NULL.
1109
1110 CURSOR C1 is
1111 SELECT serial_number_control_code
1112 FROM mtl_system_items
1113 WHERE inventory_item_id = p_inv_item_id
1114 AND organization_id = p_inv_org_id
1115 AND enabled_flag = 'Y'
1116 AND nvl (start_date_active, sysdate) <= sysdate
1117 AND nvl (end_date_active, sysdate+1) > sysdate;
1118
1119 Serialized NUMBER;
1120 l_found VARCHAR2(1);
1121 BEGIN
1122 l_return_value := TRUE;
1123 If p_srl_control_code <> FND_API.G_MISS_NUM then
1124 serialized := p_srl_control_code;
1125 else
1126 OPEN c1;
1127 FETCH c1 into serialized;
1128 CLOSE c1;
1129 end if;
1130
1131 -- Bug 12574008
1132 -- If the transaction is a Field Service Transaction
1133 -- Then assign p_txn_rec.ATTRIBUTE15
1134 IF NVL(p_txn_rec.ATTRIBUTE14, FND_API.G_MISS_CHAR) = 'FIELD_SERVICE_TXN' THEN
1135 l_inv_txn_typeid_from_cs := to_number(p_txn_rec.ATTRIBUTE15);
1136 END IF;
1137
1138 -- Get serial tagging control 9977630
1139 --
1140 csi_process_txn_pvt.get_serial_tagging_control (
1141 p_inventory_item_id => p_inv_item_id,
1142 p_organization_id => p_inv_org_id,
1143 p_mtl_transaction_id => p_txn_rec.inv_material_transaction_id,
1144 p_serial_tagged => l_serial_tagged,
1145 p_inv_txn_typeid_from_cs => l_inv_txn_typeid_from_cs);
1146
1147 csi_gen_utility_pvt.put_line('Serial Tagging Control - '||l_serial_tagged);
1148 -- End 9977630
1149
1150 IF serialized is not null THEN
1151 -- Item is under serial control but serial_number is NULL
1152 -- '1' stands for - No serial number control
1153 -- '2' stands for - Predefined serial numbers
1154 -- '5' stands for - Dynamic entry at inventory receipt
1155 -- '6' stands for - Dynamic entry at sales order issue
1156 --IF NVL(serialized,0) IN (2,5,6) THEN
1157 IF Is_treated_serialized( p_serial_control_code => serialized
1158 ,p_location_type_code => p_location_type_code
1159 ,p_transaction_type_id => p_txn_rec.transaction_type_id
1160 )
1161 OR NVL(l_serial_tagged,'N') = 'Y' --Modified to OR from AND for Bug 12631458
1162 THEN
1163 IF ((p_serial_number IS NULL) OR
1164 (p_serial_number = FND_API.G_MISS_CHAR)) THEN
1165 IF (p_creation_complete_flag = 'Y') THEN
1166 l_return_value := FALSE;
1167 IF (p_stack_err_msg = TRUE) THEN
1168 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_SERIAL_NUM');
1169 FND_MESSAGE.SET_TOKEN('SERIAL_NUMBER',p_serial_number);
1170 FND_MSG_PUB.Add;
1171 END IF;
1172 ELSE
1173 p_creation_complete_flag := 'N';
1174 l_return_value := TRUE;
1175 END IF;
1176 ELSE
1177 l_return_value := TRUE; --added for bug 2143008
1178 END IF;
1179 ELSE
1180 -- Item is not under serial control but serial_number is not NULL
1181 -- IF NVL(serialized,0) NOT IN (2,5,6) THEN
1182 IF NOT Is_treated_serialized( p_serial_control_code => serialized
1183 ,p_location_type_code => p_location_type_code
1184 ,p_transaction_type_id => p_txn_rec.transaction_type_id
1185 )
1186 AND NVL(l_serial_tagged,'N') <> 'Y'
1187 THEN
1188 IF ((p_serial_number IS NOT NULL) AND (p_serial_number <> FND_API.G_MISS_CHAR))
1189 THEN
1190 l_found := NULL;
1191 IF serialized IS NOT NULL
1192 AND serialized=6
1193 AND p_instance_usage_code='RETURNED'
1194 AND p_location_type_code='INVENTORY'
1195 THEN
1196 BEGIN
1197 SELECT 'x'
1198 INTO l_found
1199 FROM mtl_serial_numbers
1200 WHERE inventory_item_id = p_inv_item_id
1201 AND serial_number = p_serial_number;
1202 l_return_value := TRUE;
1203 EXCEPTION
1204 WHEN OTHERS THEN
1205 NULL;
1206 END;
1207 END IF;
1208 IF l_found IS NULL
1209 THEN
1210 l_return_value := FALSE;
1211 FND_MESSAGE.SET_NAME('CSI','CSI_API_NOT_SER_CONTROLLED');
1212 FND_MESSAGE.SET_TOKEN('SERIAL_NUMBER',p_serial_number);
1213 FND_MSG_PUB.Add;
1214 END IF;
1215 ELSE
1216 l_return_value := TRUE;
1217 END IF;
1218 END IF;
1219 END IF;
1220 ELSE
1221 l_return_value := FALSE;
1222 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_ITEM'); -- Item does not exist in the inventory organization provided
1223 FND_MESSAGE.SET_TOKEN('INVENTORY_ITEM_ID',p_inv_item_id);
1224 FND_MESSAGE.SET_TOKEN('INVENTORY_ORGANIZATION_ID',p_inv_org_id);
1225 FND_MSG_PUB.Add;
1226 END IF;
1227
1228 IF l_return_value = TRUE AND
1229 p_serial_number IS NOT NULL AND
1230 p_serial_number <> fnd_api.g_miss_char
1231 THEN
1232 Validate_ser_uniqueness
1233 ( p_inv_org_id => p_inv_org_id
1234 ,p_inv_item_id => p_inv_item_id
1235 ,p_serial_number => p_serial_number
1236 ,l_return_value => l_return_value
1237 ,p_instance_id => p_instance_id
1238 );
1239 --Commented out code for bug 7657438, no need to raise more than one error message
1240 /*IF l_return_value = FALSE THEN
1241 fnd_message.set_name('CSI','CSI_FAIL_UNIQUENESS');
1242 fnd_msg_pub.add;
1243 END IF;*/
1244 END IF;
1245
1246 END Validate_Serial_Number;
1247
1248
1249 /*----------------------------------------------------*/
1250 /* This procedure verifies that the serial number */
1251 /* uniqueness */
1252 /*----------------------------------------------------*/
1253 PROCEDURE Validate_ser_uniqueness
1254 (
1255 p_inv_org_id IN NUMBER,
1256 p_inv_item_id IN NUMBER,
1257 p_serial_number IN VARCHAR2,
1258 p_instance_id IN NUMBER, -- Bug # 2342885
1259 l_return_value IN OUT NOCOPY BOOLEAN
1260 ) IS
1261 l_serial_type NUMBER;
1262 l_temp VARCHAR2(1);
1263 l_instance_id NUMBER;
1264 l_base_item_id NUMBER;
1265 l_item_id NUMBER;
1266 l_master_organization_id NUMBER; --added for 12952143
1267 l_return_status VARCHAR2(1); --added for 12952143
1268 l_error_message VARCHAR2(4000);
1269 --
1270 /* CURSOR CTO_CUR(p_base_model IN NUMBER) IS
1271 select distinct inventory_item_id
1272 from MTL_SYSTEM_ITEMS_B
1273 where base_item_id = p_base_model
1274 and inventory_item_id <> p_inv_item_id;
1275 --
1276 */--Commented for bug 12952143
1277 comp_error EXCEPTION;
1278 BEGIN
1279 -- srramakr Bug # 2342885. p_instance_id will be passed only from Validate_Org_Dependent_params
1280 -- API. This is basically to validate the serial number when the vld_organization_id changes.
1281 -- In this, the uniqueness check should ignore the current instance.
1282 --
1283 IF p_instance_id IS NULL OR
1284 p_instance_id = FND_API.G_MISS_NUM THEN
1285 l_instance_id := -99999;
1286 ELSE
1287 l_instance_id := p_instance_id;
1288 END IF;
1289 --
1290 l_return_value := TRUE;
1291 BEGIN
1292 SELECT serial_number_type -- serial number uniqueness control
1293 INTO l_serial_type
1294 FROM mtl_parameters
1295 WHERE organization_id = p_inv_org_id;
1296 EXCEPTION
1297 WHEN no_data_found THEN
1298 l_return_value := FALSE;
1299 fnd_message.set_name('CSI','CSI_NO_ORG_SET');
1300 fnd_message.set_token('ORGANIZATION_ID',p_inv_org_id);
1301 fnd_msg_pub.add;
1302 RAISE comp_error;
1303 END;
1304 --
1305 IF l_serial_type IS NOT NULL
1306 THEN
1307 -- Check for fundamental uniqueness
1308 BEGIN
1309 SELECT 'x'
1310 INTO l_temp
1311 FROM csi_item_instances
1312 WHERE serial_number = p_serial_number
1313 AND inventory_item_id = p_inv_item_id
1314 AND instance_id <> l_instance_id
1315 AND ROWNUM = 1;
1316 EXCEPTION
1317 WHEN NO_DATA_FOUND THEN
1318 l_temp := null;
1319 END;
1320 IF l_temp IS NOT NULL THEN
1321 l_return_value := FALSE;
1322 fnd_message.set_name('CSI','CSI_SER_CASE1');
1323 fnd_message.set_token('SERIAL_NUMBER',p_serial_number);
1324 fnd_msg_pub.add;
1325 RAISE comp_error;
1326 END IF;
1327 --
1328 -- case1 Unique Serial Number within Models and Inventory Items
1329 IF l_serial_type = 1
1330 THEN
1331 select base_item_id
1332 into l_base_item_id
1333 from MTL_SYSTEM_ITEMS_B
1334 where inventory_item_id = p_inv_item_id
1335 and organization_id = p_inv_org_id;
1336
1337 CSI_INV_TRXS_PKG.get_master_organization(p_inv_org_id, --added call for 12942740
1338 l_master_organization_id,
1339 l_return_status,
1340 l_error_message);
1341
1342 --
1343 IF l_base_item_id IS NOT NULL THEN
1344 l_temp := null;
1345 -- FOR base_rec in CTO_CUR(l_base_item_id) LOOP --Modified for bug 12952143 start
1346 Begin
1347 select 'x'
1348 into l_temp
1349 from CSI_ITEM_INSTANCES
1350 where serial_number = p_serial_number
1351 and inventory_item_id in
1352 (
1353 select inventory_item_id
1354 from MTL_SYSTEM_ITEMS_B
1355 where base_item_id = l_base_item_id
1356 and inventory_item_id <> p_inv_item_id
1357 and organization_id = l_master_organization_id
1358 );
1359
1360 Exception
1361 when no_data_found then
1362 l_temp := null;
1363 when too_many_rows then
1364 l_temp := 'x';
1365 End;
1366 -- END LOOP; --Modified for bug 12952143 end
1367 --
1368 IF l_temp IS NOT NULL THEN
1369 l_return_value := FALSE;
1370 fnd_message.set_name('CSI','CSI_SER_CASE4');
1371 fnd_message.set_token('SERIAL_NUMBER',p_serial_number);
1372 fnd_msg_pub.add;
1373 RAISE comp_error;
1374 END IF;
1375 END IF; -- Base Model check
1376 END IF; -- Case1
1377 -- case4 unique serial number with in inventory items
1378 -- No need to check for serial type 4 as the fundamental uniqueness is checked upfront
1379 --
1380 -- case2 unique serial number with in particular organization
1381 l_item_id := null;
1382 IF l_serial_type = 2
1383 THEN
1384 BEGIN
1385 SELECT 'x'
1386 INTO l_temp
1387 FROM csi_item_instances
1388 WHERE serial_number = p_serial_number
1389 AND last_vld_organization_id = p_inv_org_id
1390 AND instance_id <> l_instance_id
1391 AND ROWNUM = 1;
1392 EXCEPTION
1393 WHEN OTHERS THEN
1394 l_return_value := TRUE;
1395 END;
1396 --
1397 IF l_temp IS NOT NULL THEN
1398 l_return_value := FALSE;
1399 fnd_message.set_name('CSI','CSI_SER_CASE2');
1400 fnd_message.set_token('SERIAL_NUMBER',p_serial_number);
1401 fnd_msg_pub.add;
1402 RAISE comp_error;
1403 END IF;
1404 --
1405 IF l_return_value THEN
1406 BEGIN
1407 SELECT inventory_item_id
1408 INTO l_item_id
1409 FROM mtl_serial_numbers
1410 WHERE serial_number = p_serial_number
1411 AND current_organization_id = p_inv_org_id;
1412 --
1413 EXCEPTION
1414 WHEN NO_DATA_FOUND THEN
1415 l_item_id := null;
1416 WHEN TOO_MANY_ROWS THEN
1417 l_return_value := FALSE;
1418 fnd_message.set_name('CSI','CSI_SER_CASE2');
1419 fnd_message.set_token('SERIAL_NUMBER',p_serial_number);
1420 fnd_msg_pub.add;
1421 RAISE comp_error;
1422 END;
1423 --
1424 IF l_item_id IS NOT NULL THEN
1425 IF l_item_id <> p_inv_item_id THEN
1426 l_return_value := FALSE;
1427 fnd_message.set_name('CSI','CSI_SER_CASE2');
1428 fnd_message.set_token('SERIAL_NUMBER',p_serial_number);
1429 fnd_msg_pub.add;
1430 RAISE comp_error;
1431 END IF;
1432 END IF;
1433 END IF;
1434 --
1435 -- Also check if it has been already defined as
1436 -- unique serial number accross organizations i.e entire system
1437 IF l_return_value
1438 THEN
1439 BEGIN
1440 SELECT 'x'
1441 INTO l_temp
1442 FROM mtl_serial_numbers s,
1443 mtl_parameters p
1444 WHERE s.current_organization_id = p.organization_id
1445 AND s.serial_number = p_serial_number
1446 AND p.serial_number_type = 3
1447 AND ROWNUM = 1;
1448 EXCEPTION
1449 WHEN NO_DATA_FOUND THEN
1450 l_temp := null;
1451 END;
1452 --
1453 IF l_temp IS NOT NULL THEN
1454 l_return_value := FALSE;
1455 fnd_message.set_name('CSI','CSI_SER_CASE3');
1456 fnd_message.set_token('SERIAL_NUMBER',p_serial_number);
1457 fnd_msg_pub.add;
1458 RAISE comp_error;
1459 END IF;
1460 END IF; --l_return_value
1461 END IF; -- l_serial_type = 2
1462 --
1463 -- case3 unique serial number accross organizations i.e entire system
1464 IF l_serial_type = 3
1465 THEN
1466 BEGIN
1467 SELECT 'x'
1468 INTO l_temp
1469 FROM csi_item_instances
1470 WHERE serial_number = p_serial_number
1471 AND instance_id <> l_instance_id
1472 AND ROWNUM=1;
1473 EXCEPTION
1474 WHEN OTHERS THEN
1475 l_return_value := TRUE;
1476 END;
1477 --
1478 IF l_temp IS NOT NULL THEN
1479 l_return_value := FALSE;
1480 fnd_message.set_name('CSI','CSI_SER_CASE3');
1481 fnd_message.set_token('SERIAL_NUMBER',p_serial_number);
1482 fnd_msg_pub.add;
1483 RAISE comp_error;
1484 END IF;
1485 --
1486 IF l_return_value THEN
1487 BEGIN
1488 SELECT inventory_item_id
1489 INTO l_item_id
1490 FROM mtl_serial_numbers
1491 WHERE serial_number = p_serial_number;
1492 EXCEPTION
1493 WHEN NO_DATA_FOUND THEN
1494 l_item_id := null;
1495 WHEN TOO_MANY_ROWS THEN
1496 l_return_value := FALSE;
1497 fnd_message.set_name('CSI','CSI_SER_CASE3');
1498 fnd_message.set_token('SERIAL_NUMBER',p_serial_number);
1499 fnd_msg_pub.add;
1500 RAISE comp_error;
1501 END;
1502 --
1503 IF l_item_id IS NOT NULL THEN
1504 IF l_item_id <> p_inv_item_id THEN
1505 l_return_value := FALSE;
1506 fnd_message.set_name('CSI','CSI_SER_CASE3');
1507 fnd_message.set_token('SERIAL_NUMBER',p_serial_number);
1508 fnd_msg_pub.add;
1509 RAISE comp_error;
1510 END IF;
1511 END IF;
1512 END IF;
1513 END IF;
1514 END IF;
1515 EXCEPTION
1516 when comp_error then
1517 l_return_value := FALSE;
1518 END Validate_ser_uniqueness;
1519
1520 /*----------------------------------------------------------------*/
1521 /* This Procedure is used to check the lot uniqueness in IB and */
1522 /* INV. Also this procedure is used to create lot numbers in */
1523 /* Inventory for manually created IB instances which are lot */
1524 /* controlled. */
1525 /*----------------------------------------------------------------*/
1526
1527 PROCEDURE Create_Lot
1528 (
1529 p_inv_org_id IN NUMBER,
1530 p_inv_item_id IN NUMBER,
1531 p_lot_number IN VARCHAR2,
1532 p_shelf_life_code IN NUMBER,
1533 p_instance_id IN NUMBER,
1534 l_return_value IN OUT NOCOPY BOOLEAN
1535 )IS
1536 --
1537 l_lot_type NUMBER;
1538 l_temp VARCHAR2(1);
1539 l_instance_id NUMBER;
1540 l_return_status VARCHAR2(1);
1541 l_msg_count NUMBER;
1542 l_msg_data VARCHAR2(2000);
1543 l_object_id NUMBER;
1544 l_expiration_date DATE := null;
1545 --
1546 comp_error EXCEPTION;
1547 --
1548 BEGIN
1549 --
1550 IF ((p_instance_id IS NULL) OR
1551 (p_instance_id = FND_API.G_MISS_NUM)) THEN
1552 l_instance_id := -99999;
1553 ELSE
1554 l_instance_id := p_instance_id;
1555 END IF;
1556 --
1557 l_return_value := TRUE;
1558 --
1559 -- Get the lot uniqueness type for the transacting organization
1560 BEGIN
1561 SELECT lot_number_uniqueness -- lot number uniqueness control
1562 INTO l_lot_type
1563 FROM mtl_parameters
1564 WHERE organization_id = p_inv_org_id;
1565 EXCEPTION
1566 WHEN NO_DATA_FOUND THEN
1567 l_return_value := FALSE;
1568 fnd_message.set_name('CSI','CSI_NO_LOT_ORG_SET');
1569 fnd_message.set_token('ORGANIZATION_ID',p_inv_org_id);
1570 fnd_msg_pub.add;
1571 RAISE comp_error;
1572 END;
1573 --
1574 -- Lot Number uniqueness
1575 ------------------------
1576 -- 1 - Across Items
1577 -- 2 - None
1578 --
1579 l_temp := NULL; -- 1st initial..
1580 --
1581 IF l_lot_type = 1
1582 THEN
1583 -- Call the validate_lot_unique routine to check the uniqueness in Inventory
1584 IF NOT Inv_Lot_Api_PUB.validate_unique_lot
1585 ( p_org_id => p_inv_org_id,
1586 p_inventory_item_id => p_inv_item_id,
1587 p_lot_uniqueness => l_lot_type,
1588 p_auto_lot_number => p_lot_number )
1589 THEN
1590 fnd_message.set_name('CSI','CSI_LOT_CASE1');
1591 fnd_message.set_token('LOT_NUMBER',p_lot_number);
1592 fnd_msg_pub.add;
1593 RAISE comp_error;
1594 ELSE
1595 -- Check for the fundamental uniqueness in Install Base
1596 BEGIN
1597 SELECT 'x'
1598 INTO l_temp
1599 FROM CSI_ITEM_INSTANCES
1600 WHERE inventory_item_id <> p_inv_item_id
1601 AND lot_number = p_lot_number
1602 AND instance_id <> p_instance_id;
1603 EXCEPTION
1604 WHEN NO_DATA_FOUND THEN
1605 l_temp := NULL;
1606 WHEN TOO_MANY_ROWS THEN
1607 l_temp := 'x';
1608 END;
1609 --
1610 IF l_temp IS NOT NULL
1611 THEN
1612 fnd_message.set_name('CSI','CSI_LOT_CASE2');
1613 fnd_message.set_token('LOT_NUMBER',p_lot_number);
1614 fnd_msg_pub.add;
1615 RAISE comp_error;
1616 END IF;
1617 END IF; -- validate_unique_lot
1618 END IF; -- l_lot_type = 1
1619 -- Check for the existance of lot number in Inventory for the current item
1620 BEGIN
1621 SELECT 'x'
1622 INTO l_temp
1623 FROM MTL_LOT_NUMBERS
1624 WHERE inventory_item_id = p_inv_item_id
1625 AND organization_id = p_inv_org_id
1626 AND lot_number = p_lot_number;
1627 EXCEPTION
1628 WHEN NO_DATA_FOUND THEN
1629 l_temp := NULL;
1630 WHEN TOO_MANY_ROWS THEN
1631 l_temp := 'x';
1632 END;
1633 --
1634 --
1635 IF l_temp IS NULL
1636 THEN
1637 -- For user defined shelf-life we default the lot expiration as 50 Years from creation date.
1638 -- This can be updated from the Inventory -> Onhand -> Lots UI.
1639 --
1640 IF p_shelf_life_code = 4 THEN
1641 l_expiration_date := sysdate + 18250;
1642 END IF;
1643 --
1644 -- Call the Inventory API to insert the lot number
1645 inv_lot_api_pub.insertlot (
1646 p_api_version => 1.0,
1647 p_init_msg_list => fnd_api.g_false,
1648 p_commit => fnd_api.g_false,
1649 p_validation_level => fnd_api.g_valid_level_full,
1650 p_inventory_item_id => p_inv_item_id,
1651 p_organization_id => p_inv_org_id,
1652 p_lot_number => p_lot_number,
1653 p_expiration_date => l_expiration_date,
1654 p_transaction_temp_id => NULL,
1655 p_transaction_action_id => NULL,
1656 p_transfer_organization_id => NULL,
1657 x_object_id => l_object_id,
1658 x_return_status => l_return_status,
1659 x_msg_count => l_msg_count,
1660 x_msg_data => l_msg_data);
1661
1662 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1663 FND_MESSAGE.Set_Name('CSI', 'CSI_API_INVALID_INV_LOT_NUM');
1664 FND_MESSAGE.Set_token('ERR_TEXT' , 'Error returned from inv_lot_api_pub.InsertLot Procedure');
1665 FND_MSG_PUB.ADD;
1666 RAISE comp_error;
1667 ELSE
1668 l_return_value := TRUE;
1669 csi_gen_utility_pvt.put_line('Lot Number created successfully in MTL_LOT_NUMBERS..');
1670 END IF;
1671 END IF; -- l_temp is null
1672 --
1673 EXCEPTION
1674 WHEN comp_error THEN
1675 l_return_value := FALSE;
1676 END Create_Lot;
1677
1678 /*------------------------------------------------------------*/
1679 /* This procedure verifies that the item lot number is */
1680 /* valid */
1681 /*------------------------------------------------------------*/
1682
1683 PROCEDURE Validate_Lot_Number
1684 (
1685 p_inv_org_id IN NUMBER,
1686 p_inv_item_id IN NUMBER,
1687 p_lot_number IN VARCHAR2,
1688 p_mfg_serial_number_flag IN VARCHAR2,
1689 p_txn_rec IN csi_datastructures_pub.transaction_rec,
1690 p_creation_complete_flag IN OUT NOCOPY VARCHAR2,
1691 p_lot_control_code IN NUMBER,
1692 l_return_value IN OUT NOCOPY BOOLEAN
1693 ) IS
1694 --
1695 l_dummy number; -- varchar2(1);
1696 l_stack_err_msg BOOLEAN DEFAULT TRUE;
1697 --
1698 CURSOR c1 is
1699 SELECT nvl(csi_utl_pkg.get_lot_ctrl_code(p_txn_rec.inv_material_transaction_id),lot_control_code) lot_control_code -- Added for bug#14835893
1700 -- lot_control_code
1701 FROM mtl_system_items
1702 WHERE inventory_item_id = p_inv_item_id
1703 AND organization_id = p_inv_org_id
1704 AND enabled_flag = 'Y'
1705 AND nvl (start_date_active, sysdate) <= sysdate
1706 AND nvl (end_date_active, sysdate+1) > sysdate;
1707
1708 BEGIN
1709 IF p_lot_control_code <> FND_API.G_MISS_NUM
1710 THEN
1711 l_dummy := p_lot_control_code;
1712 ELSE
1713 OPEN c1;
1714 FETCH c1 INTO l_dummy;
1715 CLOSE c1;
1716 END IF;
1717 --
1718 IF l_dummy IS NOT NULL
1719 THEN
1720 -- Lot Control Code
1721 -- '1' stands for - No lot control
1722 -- '2' stands for - Full lot control
1723 IF l_dummy = 2 -- Lot Controlled
1724 THEN
1725 --
1726 IF ((p_lot_number IS NULL) OR
1727 (p_lot_number = FND_API.G_MISS_CHAR))
1728 THEN
1729 IF (p_creation_complete_flag = 'Y')
1730 THEN
1731 l_return_value := FALSE;
1732 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_LOT_NUM');
1733 FND_MESSAGE.SET_TOKEN('LOT_NUMBER',p_lot_number);
1734 FND_MSG_PUB.Add;
1735 ELSE
1736 p_creation_complete_flag := 'N';
1737 l_return_value := TRUE;
1738 END IF;
1739 ELSE
1740 l_return_value := TRUE;
1741 END IF;
1742 --
1743 ELSE -- Item is not under lot control but lot_number is NOT NULL
1744 --
1745 IF ((p_lot_number IS NOT NULL) AND
1746 (p_lot_number <> FND_API.G_MISS_CHAR))
1747 THEN
1748 l_return_value := FALSE;
1749 FND_MESSAGE.SET_NAME('CSI','CSI_API_NOT_LOT_CONTROLLED');
1750 FND_MESSAGE.SET_TOKEN('LOT_NUMBER',p_lot_number);
1751 FND_MSG_PUB.Add;
1752 ELSE
1753 l_return_value := TRUE;
1754 END IF;
1755 --
1756 END IF;
1757 --
1758 ELSE
1759 l_return_value := FALSE;
1760 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_ITEM'); -- Item does not exist in the inventory organization provided
1761 FND_MESSAGE.SET_TOKEN('INVENTORY_ITEM_ID',p_inv_item_id);
1762 FND_MESSAGE.SET_TOKEN('INVENTORY_ORGANIZATION_ID',p_inv_org_id);
1763 FND_MSG_PUB.Add;
1764 END IF;
1765 --
1766 END Validate_Lot_Number;
1767 --
1768 /*------------------------------------------------------------*/
1769 /* This function validates the quantity and also check for */
1770 /* serialized items, quantity =1 */
1771 /*------------------------------------------------------------*/
1772
1773 FUNCTION Is_Quantity_Valid
1774 ( p_instance_id IN NUMBER ,
1775 p_inv_organization_id IN NUMBER ,
1776 p_quantity IN NUMBER ,
1777 p_serial_control_code IN NUMBER ,
1778 p_location_type_code IN VARCHAR2,
1779 p_flag IN VARCHAR2,
1780 p_csi_txn_type_id IN NUMBER,
1781 p_current_qty IN NUMBER,
1782 p_stack_err_msg IN BOOLEAN
1783 )
1784 RETURN BOOLEAN IS
1785
1786 l_quantity NUMBER;
1787 l_dummy NUMBER;
1788 l_override_neg_for_backflush NUMBER;
1789 l_return_value BOOLEAN := TRUE;
1790 l_drive_qty NUMBER := 0;
1791
1792 Cursor c1 is
1793 SELECT negative_inv_receipt_code
1794 FROM mtl_parameters
1795 WHERE organization_id = p_inv_organization_id;
1796
1797 BEGIN
1798
1799 -- IF ((p_serial_number IS NOT NULL) AND (p_serial_number <> FND_API.G_MISS_CHAR)) THEN
1800 IF (csi_Item_Instance_Vld_pvt.Is_treated_serialized
1801 ( p_serial_control_code => p_serial_control_code
1802 ,p_location_type_code => p_location_type_code
1803 ,p_transaction_type_id => p_csi_txn_type_id
1804 ))
1805 THEN
1806 IF p_quantity <> 1 THEN
1807 l_return_value := FALSE;
1808 IF (p_stack_err_msg = TRUE) THEN
1809 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_QUANTITY');
1810 FND_MESSAGE.SET_TOKEN('QUANTITY',p_quantity);
1811 FND_MSG_PUB.Add;
1812 END IF;
1813 END IF;
1814 ELSE
1815 IF p_quantity < 0 THEN
1816 OPEN C1;
1817 FETCH C1 INTO l_dummy;
1818 IF C1%found THEN
1819 IF nvl(l_dummy,0) = 1 THEN
1820 l_return_value := TRUE;
1821 ELSE
1822 -- srramakr Bug # 4137476. Even if Allow (-)ve balance is set to No at org level
1823 -- if the following profile is set to Yes then WIP backflushes are allowed.
1824 -- This is true for both Operation Pull and Assembly Pull.
1825 -- Since they are registered as WIP issues, we use CSI txn Type 71 to identify them.
1826 -- Profile returns 1 for Yes; 2 for No
1827 -- We also need to find where the qty is driven towards. This is because after backflush
1828 -- an INV instance gets created with a (-)ve qty. If a misc receipt or any other receipt
1829 -- tries to update this instance, the txn type will not be 71. This will result in an error.
1830 -- So, we need to find whether the qty is driven towards (+)ve or (-)ve side.
1831 --
1832 l_drive_qty := p_quantity - nvl(p_current_qty,0);
1833 IF l_drive_qty < 0 THEN -- Qty is driven (-)ve
1834 IF nvl(p_csi_txn_type_id,-999) = 71 THEN
1835 l_override_neg_for_backflush := FND_PROFILE.VALUE('INV_OVERRIDE_NEG_FOR_BACKFLUSH');
1836 IF nvl(l_override_neg_for_backflush,2) = 1 THEN
1837 l_return_value := TRUE;
1838 ELSE
1839 l_return_value := FALSE;
1840 IF (p_stack_err_msg = TRUE) THEN
1841 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_NEGATIVE_QTY');
1842 FND_MESSAGE.SET_TOKEN('QUANTITY',p_quantity);
1843 FND_MSG_PUB.Add;
1844 END IF;
1845 END IF;
1846 ELSE -- Non-WIP Issue transactions
1847 l_return_value := FALSE;
1848 IF (p_stack_err_msg = TRUE) THEN
1849 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_NEGATIVE_QTY');
1850 FND_MESSAGE.SET_TOKEN('QUANTITY',p_quantity);
1851 FND_MSG_PUB.Add;
1852 END IF;
1853 END IF;
1854 ELSE -- Qty is driven (+)ve
1855 l_return_value := TRUE;
1856 END IF; -- l_drive_qty check
1857 END IF;
1858 END IF;
1859 CLOSE C1;
1860 ELSIF p_quantity > 1 AND
1861 (p_instance_id IS NOT NULL AND
1862 p_instance_id <> fnd_api.g_miss_num)
1863 THEN
1864 BEGIN
1865 SELECT subject_id
1866 INTO l_dummy
1867 FROM csi_ii_relationships
1868 WHERE object_id = p_instance_id
1869 AND nvl(active_end_date,(sysdate+1)) > sysdate -- rajeevk Bug#5686753
1870 and rownum < 2; -- srramakr Bug # 3647609
1871 --
1872 IF SQL%FOUND THEN
1873 l_return_value := FALSE;
1874 IF (p_stack_err_msg = TRUE) THEN
1875 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_REL_QTY');
1876 FND_MESSAGE.SET_TOKEN('QUANTITY',p_quantity);
1877 FND_MSG_PUB.Add;
1878 END IF;
1879 END IF;
1880 EXCEPTION
1881 WHEN NO_DATA_FOUND THEN
1882 l_return_value := TRUE;
1883 END;
1884 ELSIF p_quantity = 0 AND
1885 p_flag ='CREATE'
1886 THEN
1887 l_return_value := FALSE;
1888 IF (p_stack_err_msg = TRUE) THEN
1889 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_ZERO_QTY');
1890 FND_MESSAGE.SET_TOKEN('QUANTITY',p_quantity);
1891 FND_MSG_PUB.Add;
1892 END IF;
1893 END IF;
1894 END IF;
1895 RETURN l_return_value;
1896 END Is_Quantity_Valid;
1897
1898 -- Added by sguthiva for att enhancements
1899
1900 /*------------------------------------------------------------*/
1901 /* This function validates the uniqueness of config key */
1902 /*------------------------------------------------------------*/
1903 FUNCTION Is_unique_config_key
1904 ( p_config_inst_hdr_id IN NUMBER ,
1905 p_config_inst_item_id IN NUMBER ,
1906 p_instance_id IN NUMBER ,
1907 p_validation_mode IN VARCHAR2
1908 )
1909 RETURN BOOLEAN IS
1910
1911 l_config_found VARCHAR2(1);
1912 l_return_value BOOLEAN := TRUE;
1913
1914 BEGIN
1915 /*
1916 IF p_validation_mode='CREATE'
1917 THEN
1918 l_config_found:=NULL;
1919 BEGIN
1920 SELECT 'x'
1921 INTO l_config_found
1922 FROM csi_item_instances
1923 WHERE config_inst_hdr_id = p_config_inst_hdr_id
1924 AND config_inst_item_id = p_config_inst_item_id
1925 AND (SYSDATE BETWEEN NVL(active_start_date, SYSDATE) AND NVL(active_end_date, SYSDATE));
1926
1927 l_return_value := FALSE;
1928
1929 EXCEPTION
1930 WHEN NO_DATA_FOUND THEN
1931 NULL;
1932 WHEN OTHERS THEN
1933 l_return_value := FALSE;
1934 END;
1935 ELSIF p_validation_mode='UPDATE'
1936 THEN
1937 */
1938 l_config_found:=NULL;
1939 BEGIN
1940 SELECT 'x'
1941 INTO l_config_found
1942 FROM csi_item_instances
1943 WHERE config_inst_hdr_id = p_config_inst_hdr_id
1944 AND config_inst_item_id = p_config_inst_item_id
1945 AND instance_id <> p_instance_id
1946 AND (SYSDATE BETWEEN NVL(active_start_date, SYSDATE) AND NVL(active_end_date, SYSDATE));
1947
1948 l_return_value := FALSE;
1949
1950 EXCEPTION
1951 WHEN NO_DATA_FOUND THEN
1952 NULL;
1953 WHEN OTHERS THEN
1954 l_return_value := FALSE;
1955 END;
1956 -- END IF;
1957 RETURN l_return_value;
1958 END Is_unique_config_key;
1959
1960 -- End addition by sguthiva for att enhancements
1961
1962
1963 /*-------------------------------------------------*/
1964 /* This function verifies that the UOM code is */
1965 /* valid by looking into the mtl table */
1966 /*-------------------------------------------------*/
1967
1968 PROCEDURE Is_Valid_Uom
1969 (
1970 p_inv_org_id IN NUMBER,
1971 p_inv_item_id IN NUMBER,
1972 p_uom_code IN OUT NOCOPY VARCHAR2,
1973 p_quantity IN OUT NOCOPY NUMBER,
1974 p_creation_complete_flag IN OUT NOCOPY VARCHAR2,
1975 l_return_value IN OUT NOCOPY BOOLEAN)
1976 IS
1977 l_quantity NUMBER;
1978 to_unit VARCHAR2(3);
1979 BEGIN
1980 -- check whether the uom class exists for the unit of measure code passed
1981 IF ((p_uom_code IS NULL) OR
1982 (p_uom_code = FND_API.G_MISS_CHAR)) THEN
1983 IF (p_creation_complete_flag = 'Y') THEN
1984 l_return_value := FALSE;
1985 ELSE
1986 p_creation_complete_flag := 'N';
1987 l_return_value := TRUE;
1988 END IF;
1989 ELSE
1990
1991 IF (inv_convert.validate_item_uom
1992 (p_uom_code => p_uom_code ,
1993 p_item_id => p_inv_item_id ,
1994 p_organization_id => p_inv_org_id) ) THEN
1995
1996 -- check for the existance of primary uom code in mtl_system_items for the unit of measure code passed
1997 BEGIN
1998 SELECT primary_uom_code
1999 INTO to_unit
2000 FROM mtl_system_items
2001 WHERE inventory_item_id = p_inv_item_id
2002 AND organization_id = p_inv_org_id
2003 AND enabled_flag = 'Y'
2004 AND nvl (start_date_active, sysdate) <= sysdate
2005 AND nvl (end_date_active, sysdate+1) > sysdate;
2006
2007 EXCEPTION
2008 WHEN OTHERS THEN
2009 FND_MESSAGE.SET_NAME('CSI','CSI_API_NO_PRIMARY_UOM_CODE');
2010 FND_MESSAGE.SET_TOKEN('UNIT_OF_MEASURE',p_uom_code);
2011 FND_MSG_PUB.Add;
2012 l_return_value := FALSE;
2013 END;
2014 -- if primary uom code exists, then check whether it is same as the uom code passed
2015 IF ((to_unit IS NOT NULL) AND (to_unit <> FND_API.G_MISS_CHAR)) THEN
2016 IF to_unit = p_uom_code THEN
2017 p_quantity := p_quantity;
2018 p_uom_code := to_unit;
2019 l_return_value := TRUE;
2020 ELSE
2021 -- getting the conversion rate for the unit of measure, quantity passed
2022 l_quantity := inv_convert.inv_um_convert
2023 (item_id => p_inv_item_id,
2024 precision => 6,
2025 from_quantity => p_quantity,
2026 from_unit => p_uom_code,
2027 to_unit => to_unit,
2028 from_name => NULL,
2029 to_name => NULL );
2030 p_quantity := l_quantity;
2031 p_uom_code := to_unit;
2032 l_return_value := TRUE;
2033 END IF;
2034 END IF;
2035 ELSE
2036 -- raise exception if uom class is invalid
2037 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_UOM_CLASS');
2038 FND_MESSAGE.SET_TOKEN('UNIT_OF_MEASURE',p_uom_code);
2039 FND_MSG_PUB.Add;
2040 l_return_value := FALSE;
2041 END IF;
2042 END IF;
2043 END Is_Valid_Uom;
2044
2045 /*---------------------------------------------------------*/
2046 /* This Procedure validates the item condition by looking */
2047 /* through the mtl material statuses */
2048 /*---------------------------------------------------------*/
2049
2050 PROCEDURE Is_Valid_Condition
2051 (
2052 p_instance_condition_id IN NUMBER,
2053 p_creation_complete_flag IN OUT NOCOPY VARCHAR2,
2054 l_return_value IN OUT NOCOPY BOOLEAN
2055 ) IS
2056 l_dummy VARCHAR2(2);
2057 l_stack_err_msg BOOLEAN DEFAULT TRUE;
2058 BEGIN
2059 -- Verify that the Instance Condition is valid i.e.
2060 -- it exists in inventory material status codes (MTL_MATERIAL_STATUSES_B)
2061
2062 IF ((p_instance_condition_id IS NULL) OR
2063 (p_instance_condition_id = FND_API.G_MISS_NUM)) THEN
2064 l_return_value := TRUE;
2065 ELSE
2066 BEGIN
2067 SELECT '1'
2068 INTO l_dummy
2069 FROM mtl_material_statuses
2070 WHERE status_id = p_instance_condition_id;
2071 l_return_value := TRUE;
2072
2073 EXCEPTION
2074 WHEN NO_DATA_FOUND THEN
2075 l_return_value := FALSE;
2076 IF ( l_stack_err_msg = TRUE ) THEN
2077 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_ITEM_CONDITION');
2078 FND_MESSAGE.SET_TOKEN('INSTANCE_CONDITION_ID',p_instance_condition_id);
2079 FND_MSG_PUB.Add;
2080 END IF;
2081 END;
2082 END IF;
2083 END Is_Valid_Condition;
2084
2085 /*--------------------------------------------------------*/
2086 /* This function validates the instance status by */
2087 /* looking into the IB status tables */
2088 /*--------------------------------------------------------*/
2089
2090 PROCEDURE Is_Valid_Status
2091 (
2092 p_instance_status_id IN NUMBER,
2093 p_creation_complete_flag IN OUT NOCOPY VARCHAR2,
2094 l_return_value IN OUT NOCOPY BOOLEAN
2095 )
2096 IS
2097 l_dummy VARCHAR2(30);
2098 l_stack_err_msg BOOLEAN DEFAULT TRUE;
2099
2100 -- Verify the Instance Status is valid (CSI_INSTANCE_STATUSES) . If not
2101 -- raise the CSI_API_INVALID_INST_STATUS exception.
2102 BEGIN
2103
2104 IF ((p_instance_status_id IS NULL) OR
2105 (p_instance_status_id = FND_API.G_MISS_NUM))THEN
2106 IF (p_creation_complete_flag = 'Y') THEN
2107 l_return_value := FALSE;
2108 IF ( l_stack_err_msg = TRUE ) THEN
2109 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_INST_STATUS');
2110 FND_MESSAGE.SET_TOKEN('INSTANCE_STATUS_ID',p_instance_status_id);
2111 FND_MSG_PUB.Add;
2112 END IF;
2113 ELSE
2114 p_creation_complete_flag := 'N';
2115 l_return_value := TRUE;
2116 END IF;
2117 ELSE
2118 BEGIN
2119 SELECT '1'
2120 INTO l_dummy
2121 FROM csi_instance_statuses
2122 WHERE instance_status_id = p_instance_status_id;
2123
2124 l_return_value := TRUE;
2125 EXCEPTION
2126 WHEN NO_DATA_FOUND THEN
2127 l_return_value := FALSE;
2128 IF ( l_stack_err_msg = TRUE ) THEN
2129 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_INST_STATUS');
2130 FND_MESSAGE.SET_TOKEN('INSTANCE_STATUS_ID',p_instance_status_id);
2131 FND_MSG_PUB.Add;
2132 END IF;
2133
2134 END;
2135 END IF;
2136 END Is_Valid_Status;
2137
2138 /*----------------------------------------------------------*/
2139 /* Function Name : Is_StartDate_Valid */
2140 /* */
2141 /* Description : This function checks if start date */
2142 /* is valid */
2143 /*----------------------------------------------------------*/
2144
2145 FUNCTION Is_StartDate_Valid
2146 ( p_start_date IN DATE,
2147 p_end_date IN DATE,
2148 p_stack_err_msg IN BOOLEAN
2149 ) RETURN BOOLEAN IS
2150
2151 l_return_value BOOLEAN := TRUE;
2152
2153 BEGIN
2154 IF ((p_end_date IS NOT NULL) AND (p_end_date = FND_API.G_MISS_DATE)) THEN
2155
2156 IF to_date(p_start_date,'DD-MM-YY HH24:MI') > to_date(p_end_date,'DD-MM-YY HH24:MI') THEN -- Bug 8586745
2157 l_return_value := FALSE;
2158 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_START_DATE');
2159 FND_MESSAGE.SET_TOKEN('START_DATE_ACTIVE',p_start_date);
2160 FND_MSG_PUB.Add;
2161
2162 ELSIF to_date(p_end_date,'DD-MM-YY HH24:MI') < to_date(SYSDATE,'DD-MM-YY HH24:MI') THEN -- Bug 8586745
2163 l_return_value := FALSE;
2164 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_START_DATE');
2165 FND_MESSAGE.SET_TOKEN('START_DATE_ACTIVE',p_start_date);
2166 FND_MSG_PUB.Add;
2167 ELSE l_return_value := TRUE;
2168 END IF;
2169
2170 ELSE
2171 l_return_value := TRUE;
2172
2173 END IF;
2174 RETURN l_return_value;
2175 END Is_StartDate_Valid;
2176
2177 /*----------------------------------------------------------*/
2178 /* Function Name : Is_EndDate_Valid */
2179 /* */
2180 /* Description : This function checks if end date */
2181 /* is valid */
2182 /*----------------------------------------------------------*/
2183 FUNCTION Is_EndDate_Valid
2184 (
2185 p_start_date IN DATE,
2186 p_end_date IN DATE,
2187 p_stack_err_msg IN BOOLEAN
2188 ) RETURN BOOLEAN IS
2189
2190 l_return_value BOOLEAN := TRUE;
2191
2192 BEGIN
2193
2194 IF ((p_end_date IS NOT NULL) AND (p_end_date <> FND_API.G_MISS_DATE))THEN
2195
2196 IF to_date(p_start_date,'DD-MM-YY HH24:MI') > to_date(p_end_date,'DD-MM-YY HH24:MI') THEN -- Bug 8586745
2197 l_return_value := FALSE;
2198 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_END_DATE');
2199 FND_MESSAGE.SET_TOKEN('END_DATE_ACTIVE',to_char(p_end_date,'dd-mm-yy hh24:mm:ss'));
2200 FND_MSG_PUB.Add;
2201
2202 ELSIF to_date(p_end_date,'DD-MM-YY HH24:MI') < to_date(SYSDATE,'DD-MM-YY HH24:MI') THEN -- Bug 8586745
2203 l_return_value := FALSE;
2204 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_END_DATE');
2205 FND_MESSAGE.SET_TOKEN('END_DATE_ACTIVE',to_char(p_end_date,'dd-mm-yy hh24:mm:ss'));
2206 FND_MSG_PUB.Add;
2207
2208 ELSE l_return_value := TRUE;
2209 End IF;
2210
2211 ELSE
2212 l_return_value := TRUE;
2213
2214 END IF;
2215 RETURN l_return_value;
2216 END Is_EndDate_Valid;
2217
2218 /*-----------------------------------------------------*/
2219 /* This function validates the system id by looking */
2220 /* into the CSI systems table */
2221 /*-----------------------------------------------------*/
2222
2223 FUNCTION Is_Valid_System_Id
2224 (
2225 p_system_id IN NUMBER,
2226 p_stack_err_msg IN BOOLEAN
2227 )
2228 RETURN BOOLEAN IS
2229
2230 l_dummy NUMBER;
2231 l_return_value BOOLEAN := TRUE;
2232
2233 -- Validate the System ID against CSI_SYSTEMS_VL table .
2234 BEGIN
2235
2236 IF ((p_system_id IS NULL) OR
2237 (p_system_id = FND_API.G_MISS_NUM)) THEN
2238 l_return_value := TRUE;
2239 ELSE
2240 BEGIN
2241 SELECT '1'
2242 INTO l_dummy
2243 FROM csi_systems_vl
2244 WHERE system_id = p_system_id
2245 AND ( (end_date_active is null) OR -- Fix for bug # 2783027
2246 (end_date_active > sysdate) );
2247
2248 l_return_value := TRUE;
2249 EXCEPTION
2250 WHEN NO_DATA_FOUND THEN
2251 IF ( p_stack_err_msg = TRUE ) THEN
2252 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_SYSTEM_ID');
2253 FND_MESSAGE.SET_TOKEN('SYSTEM_ID',p_system_id);
2254 FND_MSG_PUB.Add;
2255 END IF;
2256 l_return_value := FALSE;
2257 END;
2258 END IF;
2259 RETURN l_return_value;
2260 END Is_Valid_System_Id;
2261
2262 /*-----------------------------------------------------*/
2263 /* This function checks for the instance type code */
2264 /* by looking through the CSI lookups */
2265 /*-----------------------------------------------------*/
2266
2267 FUNCTION Is_Valid_Instance_Type
2268 (
2269 p_instance_type_code IN VARCHAR2,
2270 p_stack_err_msg IN BOOLEAN
2271 )
2272 RETURN BOOLEAN IS
2273
2274 l_dummy VARCHAR2(30);
2275 l_return_value BOOLEAN := TRUE;
2276 l_inst_lookup_type VARCHAR2(30) := 'CSI_INST_TYPE_CODE';
2277
2278 -- Validate the Instance Type Code against CSI_LOOKUPS table .
2279 BEGIN
2280
2281 IF ((p_instance_type_code IS NULL) OR
2282 (p_instance_type_code = FND_API.G_MISS_CHAR)) THEN
2283 l_return_value := TRUE;
2284 ELSE
2285 BEGIN
2286 SELECT '1'
2287 INTO l_dummy
2288 FROM csi_lookups
2289 WHERE lookup_code = UPPER(p_instance_type_code)
2290 AND lookup_type = l_inst_lookup_type;
2291 l_return_value := TRUE;
2292
2293 EXCEPTION
2294 WHEN NO_DATA_FOUND THEN
2295 IF ( p_stack_err_msg = TRUE ) THEN
2296 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_INSTANCE_TYPE');
2297 FND_MESSAGE.SET_TOKEN('INSTANCE_TYPE_CODE',p_instance_type_code);
2298 FND_MSG_PUB.Add;
2299 END IF;
2300 l_return_value := FALSE;
2301 END;
2302 END IF;
2303 RETURN l_return_value;
2304 END Is_Valid_Instance_Type;
2305
2306 /*-----------------------------------------------------*/
2307 /* This function checks for the instance usage code */
2308 /* by looking through the CSI lookups */
2309 /*-----------------------------------------------------*/
2310
2311 FUNCTION Valid_Inst_Usage_Code
2312 (
2313 p_inst_usage_code IN VARCHAR2,
2314 p_stack_err_msg IN BOOLEAN
2315 )
2316 RETURN BOOLEAN IS
2317
2318 l_dummy VARCHAR2(30);
2319 l_return_value BOOLEAN := TRUE;
2320 l_usage_lookup_type VARCHAR2(30) := 'CSI_INSTANCE_USAGE_CODE';
2321
2322 -- Validate the System ID against CSI_LOOKUPS table .
2323 BEGIN
2324
2325 IF ((p_inst_usage_code IS NULL) OR
2326 (p_inst_usage_code = FND_API.G_MISS_CHAR)) THEN
2327 l_return_value := TRUE;
2328 ELSE
2329 BEGIN
2330 SELECT '1'
2331 INTO l_dummy
2332 FROM csi_lookups
2333 WHERE lookup_code = UPPER(p_inst_usage_code)
2334 AND lookup_type = l_usage_lookup_type;
2335 l_return_value := TRUE;
2336
2337 EXCEPTION
2338 WHEN NO_DATA_FOUND THEN
2339 IF ( p_stack_err_msg = TRUE ) THEN
2340 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_USAGE_CODE');
2341 FND_MESSAGE.SET_TOKEN('INSTANCE_USAGE_CODE',p_inst_usage_code);
2342 FND_MSG_PUB.Add;
2343 END IF;
2344 l_return_value := FALSE;
2345 END;
2346 END IF;
2347 RETURN l_return_value;
2348 END Valid_Inst_Usage_Code;
2349
2350 /*---------------------------------------------------------*/
2351 /* This function checks for the operational status code */
2352 /* by looking through the CSI lookups */
2353 /*---------------------------------------------------------*/
2354
2355 FUNCTION Valid_operational_status
2356 (
2357 p_operational_status IN VARCHAR2
2358 )
2359 RETURN BOOLEAN IS
2360
2361 l_dummy VARCHAR2(30);
2362 l_return_value BOOLEAN := TRUE;
2363 l_operational_lookup_type VARCHAR2(30) := 'CSI_OPERATIONAL_STATUS_CODE';
2364
2365 -- Validate the System ID against CSI_LOOKUPS table .
2366 BEGIN
2367 IF ((p_operational_status IS NULL) OR
2368 (p_operational_status = FND_API.G_MISS_CHAR))
2369 THEN
2370 l_return_value := TRUE;
2371 ELSE
2372 BEGIN
2373 SELECT '1'
2374 INTO l_dummy
2375 FROM csi_lookups
2376 WHERE lookup_code = UPPER(p_operational_status)
2377 AND lookup_type = l_operational_lookup_type;
2378 l_return_value := TRUE;
2379
2380 EXCEPTION
2381 WHEN NO_DATA_FOUND THEN
2382 FND_MESSAGE.SET_NAME('CSI','CSI_OPERATIONAL_STATUS_CODE');
2383 FND_MESSAGE.SET_TOKEN('OPERATIONAL_STATUS_CODE',p_operational_status);
2384 FND_MSG_PUB.Add;
2385 l_return_value := FALSE;
2386 END;
2387 END IF;
2388 RETURN l_return_value;
2389 END Valid_operational_status;
2390
2391 /*---------------------------------------------------------*/
2392 /* This function checks for the currency code */
2393 /* by looking through the fnd_currencies */
2394 /*---------------------------------------------------------*/
2395
2396 FUNCTION Valid_currency_code
2397 (
2398 p_currency_code IN VARCHAR2
2399 )
2400 RETURN BOOLEAN IS
2401
2402 l_dummy VARCHAR2(30);
2403 l_return_value BOOLEAN := TRUE;
2404 BEGIN
2405 IF ((p_currency_code IS NULL) OR
2406 (p_currency_code = FND_API.G_MISS_CHAR))
2407 THEN
2408 l_return_value := TRUE;
2409 ELSE
2410 BEGIN
2411 SELECT '1'
2412 INTO l_dummy
2413 FROM fnd_currencies
2414 WHERE currency_code = UPPER(p_currency_code);
2415 l_return_value := TRUE;
2416
2417 EXCEPTION
2418 WHEN NO_DATA_FOUND THEN
2419 FND_MESSAGE.SET_NAME('CSI','CSI_INVALID_CURRENCY_CODE');
2420 FND_MESSAGE.SET_TOKEN('CURRENCY_CODE',p_currency_code);
2421 FND_MSG_PUB.Add;
2422 l_return_value := FALSE;
2423 END;
2424 END IF;
2425 RETURN l_return_value;
2426 END Valid_currency_code;
2427
2428 /*---------------------------------------------------------*/
2429 /* This function checks if status is updateable */
2430 /* by looking through the csi_instance_statuses */
2431 /*---------------------------------------------------------*/
2432 FUNCTION is_status_updateable
2433 (
2434 p_instance_status IN NUMBER,
2435 p_current_status IN NUMBER
2436 )
2437 RETURN BOOLEAN IS
2438
2439 l_change_allowed VARCHAR2(1);
2440 l_return_value BOOLEAN := TRUE;
2441 BEGIN
2442 BEGIN
2443 SELECT status_change_allowed_flag
2444 INTO l_change_allowed
2445 FROM csi_instance_statuses
2446 WHERE instance_status_id = p_current_status;
2447 IF NVL(l_change_allowed,'Y')='Y'
2448 THEN
2449 l_return_value := TRUE;
2450 ELSE
2451 FND_MESSAGE.SET_NAME('CSI','CSI_NO_STATUS_CHANGE');
2452 FND_MESSAGE.SET_TOKEN('CURRENT_STATUS',p_current_status);
2453 FND_MESSAGE.SET_TOKEN('INSTANCE_STATUS_ID',p_instance_status);
2454 FND_MSG_PUB.Add;
2455 l_return_value := FALSE;
2456 END IF;
2457 EXCEPTION
2458 WHEN NO_DATA_FOUND THEN
2459 FND_MESSAGE.SET_NAME('CSI','CSI_NO_STATUS_CHANGE');
2460 FND_MESSAGE.SET_TOKEN('CURRENT_STATUS',p_current_status);
2461 FND_MESSAGE.SET_TOKEN('INSTANCE_STATUS_ID',p_instance_status);
2462 FND_MSG_PUB.Add;
2463 l_return_value := FALSE;
2464 END;
2465 RETURN l_return_value;
2466 END is_status_updateable;
2467
2468 /*-----------------------------------------------------*/
2469 /* This function checks for the uniqueness of the */
2470 /* party owner */
2471 /*-----------------------------------------------------*/
2472
2473 FUNCTION validate_uniqueness(p_instance_rec csi_datastructures_pub.instance_rec,
2474 p_party_rec csi_datastructures_pub.party_rec,
2475 p_srl_control_code NUMBER,
2476 p_csi_txn_type_id NUMBER )
2477 RETURN BOOLEAN IS
2478
2479 l_serial_code NUMBER;
2480 l_return_value BOOLEAN;
2481 l_count NUMBER;
2482
2483 BEGIN
2484 If p_srl_control_code is not null AND
2485 p_srl_control_code <> FND_API.G_MISS_NUM then
2486 l_serial_code := p_srl_control_code;
2487 l_return_value := TRUE;
2488 Else
2489 select serial_number_control_code
2490 into l_serial_code
2491 from mtl_system_items
2492 where inventory_item_id = p_instance_rec.inventory_item_id
2493 and organization_id = p_instance_rec.vld_organization_id;
2494 l_return_value := TRUE;
2495 End if;
2496 -- added by rtalluri for bugfix 2324745 on 04/23/02
2497 IF NOT Is_treated_serialized(
2498 p_serial_control_code => l_serial_code, --serialized
2499 p_location_type_code => p_instance_rec.location_type_code,
2500 p_transaction_type_id => p_csi_txn_type_id
2501 )
2502 THEN
2503 -- end of addition by rtalluri for bugfix 2324745 on 04/23/02
2504 IF p_instance_rec.location_type_code = 'INVENTORY' AND
2505 p_instance_rec.instance_usage_code NOT IN ('IN_RELATIONSHIP','RETURNED')
2506 THEN
2507 BEGIN
2508 -- srramakr Removed the reference to CSI_I_PARTIES since we have the denormalized
2509 -- columns owner_party_id and owner_party_source_table in CSI_ITEM_INSTANCES
2510 SELECT '1'
2511 INTO l_count
2512 FROM csi_item_instances a
2513 -- ,csi_i_parties b -- Not required as we have the denormalized column in CII
2514 -- WHERE a.instance_id = b.instance_id
2515 WHERE a.inventory_item_id = p_instance_rec.inventory_item_id
2516 AND a.inv_organization_id = p_instance_rec.inv_organization_id
2517 AND a.inv_subinventory_name = p_instance_rec.inv_subinventory_name
2518 --Added location_type_code for bug 5514442--
2519 AND a.location_type_code = p_instance_rec.location_type_code
2520 AND a.instance_id <> p_instance_rec.instance_id
2521 AND a.rowid <> ( SELECT bb.rowid FROM csi_item_instances bb WHERE bb.instance_id = p_instance_rec.instance_id )
2522 AND a.serial_number IS NULL
2523 AND a.instance_usage_code NOT IN ('IN_RELATIONSHIP','RETURNED')
2524 AND a.active_end_date IS NULL --code added for bug 5702911 --
2525 AND (
2526 (a.inventory_revision IS NULL AND p_instance_rec.inventory_revision IS NULL) OR
2527 (a.inventory_revision IS NULL AND p_instance_rec.inventory_revision = FND_API.G_MISS_CHAR) OR
2528 (a.inventory_revision = p_instance_rec.inventory_revision)
2529 )
2530 AND (
2531 (a.lot_number IS NULL AND p_instance_rec.lot_number IS NULL) OR
2532 (a.lot_number IS NULL AND p_instance_rec.lot_number = FND_API.G_MISS_CHAR) OR
2533 (a.lot_number = p_instance_rec.lot_number)
2534 )
2535 AND (
2536 (a.inv_locator_id IS NULL AND p_instance_rec.inv_locator_id IS NULL) OR
2537 (a.inv_locator_id IS NULL AND p_instance_rec.inv_locator_id = FND_API.G_MISS_NUM) OR
2538 (a.inv_locator_id = p_instance_rec.inv_locator_id)
2539 )
2540 AND (
2541 (a.INSTANCE_STATUS_ID IS NULL AND p_instance_rec.INSTANCE_STATUS_ID IS NULL) OR
2542 (a.INSTANCE_STATUS_ID IS NULL AND p_instance_rec.INSTANCE_STATUS_ID = FND_API.G_MISS_NUM) OR
2543 (a.INSTANCE_STATUS_ID = p_instance_rec.INSTANCE_STATUS_ID)
2544 )
2545 AND a.owner_party_id = p_party_rec.party_id
2546 AND a.owner_party_source_table = p_party_rec.party_source_table
2547 AND a.unit_of_measure = p_instance_rec.unit_of_measure;
2548 -- AND b.party_id = p_party_rec.party_id
2549 -- AND b.party_source_table = p_party_rec.party_source_table
2550 -- AND b.relationship_type_code = 'OWNER';
2551
2552 l_return_value := FALSE;
2553 FND_MESSAGE.SET_NAME('CSI','CSI_API_OWNER_NOT_UNIQUE');
2554 FND_MSG_PUB.ADD;
2555
2556 EXCEPTION
2557 WHEN NO_DATA_FOUND THEN
2558 l_return_value := TRUE;
2559 WHEN TOO_MANY_ROWS THEN
2560 FND_MESSAGE.SET_NAME('CSI','CSI_API_OWNER_NOT_UNIQUE');
2561 FND_MSG_PUB.ADD;
2562 l_return_value := FALSE;
2563 WHEN OTHERS THEN
2564 FND_MESSAGE.SET_NAME('CSI','CSI_API_OWNER_OTHERS_EXCEPTION');
2565 FND_MSG_PUB.ADD;
2566 l_return_value := FALSE;
2567 END;
2568 END IF; -- end if for inventory check
2569 END IF; --end if for serial check
2570 RETURN l_Return_Value;
2571 EXCEPTION
2572 WHEN OTHERS THEN
2573 l_Return_Value := TRUE;
2574 RETURN l_Return_Value;
2575
2576 END validate_uniqueness;
2577
2578 /*-----------------------------------------------------*/
2579 /* This function checks for the location type code */
2580 /* by looking through the CSI lookups */
2581 /*-----------------------------------------------------*/
2582
2583
2584 FUNCTION Is_Valid_Location_Source
2585 (
2586 p_loc_source_table IN VARCHAR2,
2587 p_stack_err_msg IN BOOLEAN
2588 )
2589 RETURN BOOLEAN IS
2590
2591 l_dummy VARCHAR2(30);
2592 l_return_value BOOLEAN := TRUE;
2593 l_loc_lookup_type VARCHAR2(30) := 'CSI_INST_LOCATION_SOURCE_CODE';
2594
2595 BEGIN
2596
2597 IF ((p_loc_source_table IS NULL) OR
2598 (p_loc_source_table = FND_API.G_MISS_CHAR)) THEN
2599 l_return_value := TRUE;
2600 ELSE
2601 BEGIN
2602 SELECT '1'
2603 INTO l_dummy
2604 FROM csi_lookups
2605 WHERE lookup_code = UPPER(p_loc_source_table)
2606 AND lookup_type = l_loc_lookup_type;
2607
2608 l_return_value:= TRUE;
2609 EXCEPTION
2610 WHEN NO_DATA_FOUND THEN
2611 IF ( p_stack_err_msg = TRUE ) THEN
2612 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_LOC_SOURCE');
2613 FND_MESSAGE.SET_TOKEN('LOCATION_SOURCE_TABLE',p_loc_source_table);
2614 FND_MSG_PUB.Add;
2615 END IF;
2616 l_return_value := FALSE;
2617 END;
2618 END IF;
2619 RETURN l_return_value;
2620 END Is_Valid_Location_Source;
2621
2622 /*-----------------------------------------------------*/
2623 /* This procedure is used to validate the values */
2624 /* passed to the update_item_instance */
2625 /*-----------------------------------------------------*/
2626
2627 PROCEDURE get_merge_rec (p_instance_rec IN OUT NOCOPY csi_datastructures_pub.instance_rec,
2628 l_curr_instance_rec IN csi_datastructures_pub.instance_rec,
2629 l_get_instance_rec OUT NOCOPY csi_datastructures_pub.instance_rec
2630 )
2631 IS
2632 BEGIN
2633
2634 --
2635 IF ( p_instance_rec.instance_id = fnd_api.g_miss_num )
2636 THEN l_get_instance_rec.instance_id := l_curr_instance_rec.instance_id;
2637 ELSE l_get_instance_rec.instance_id := p_instance_rec.instance_id;
2638 END IF;
2639
2640 IF ( p_instance_rec.instance_number = fnd_api.g_miss_char )
2641 THEN l_get_instance_rec.instance_number := l_curr_instance_rec.instance_number;
2642 ELSE l_get_instance_rec.instance_number := p_instance_rec.instance_number;
2643 END IF;
2644
2645 IF ( p_instance_rec.external_reference = fnd_api.g_miss_char )
2646 THEN l_get_instance_rec.external_reference := l_curr_instance_rec.external_reference;
2647 ELSE l_get_instance_rec.external_reference := p_instance_rec.external_reference;
2648 END IF;
2649 --
2650 IF ( p_instance_rec.inventory_item_id = fnd_api.g_miss_num )
2651 THEN l_get_instance_rec.inventory_item_id := l_curr_instance_rec.inventory_item_id;
2652 ELSE l_get_instance_rec.inventory_item_id := p_instance_rec.inventory_item_id;
2653 END IF;
2654 --
2655 IF ( p_instance_rec.inventory_revision = fnd_api.g_miss_char )
2656 THEN l_get_instance_rec.inventory_revision := l_curr_instance_rec.inventory_revision;
2657 ELSE l_get_instance_rec.inventory_revision := p_instance_rec.inventory_revision;
2658 END IF;
2659 --
2660 IF ( p_instance_rec.inv_master_organization_id = fnd_api.g_miss_num )
2661 THEN l_get_instance_rec.inv_master_organization_id := l_curr_instance_rec.inv_master_organization_id;
2662 ELSE l_get_instance_rec.inv_master_organization_id := p_instance_rec.inv_master_organization_id;
2663 END IF;
2664 --
2665 IF ( p_instance_rec.serial_number = fnd_api.g_miss_char )
2666 THEN l_get_instance_rec.serial_number := l_curr_instance_rec.serial_number;
2667 ELSE l_get_instance_rec.serial_number := p_instance_rec.serial_number;
2668 END IF;
2669 --
2670 IF ( p_instance_rec.mfg_serial_number_flag = fnd_api.g_miss_char )
2671 THEN l_get_instance_rec.mfg_serial_number_flag := l_curr_instance_rec.mfg_serial_number_flag;
2672 ELSE l_get_instance_rec.mfg_serial_number_flag := p_instance_rec.mfg_serial_number_flag;
2673 END IF;
2674 --
2675 IF ( p_instance_rec.lot_number = fnd_api.g_miss_char )
2676 THEN l_get_instance_rec.lot_number := l_curr_instance_rec.lot_number;
2677 ELSE l_get_instance_rec.lot_number := p_instance_rec.lot_number;
2678 END IF;
2679 --
2680 IF ( p_instance_rec.quantity = fnd_api.g_miss_num )
2681 THEN l_get_instance_rec.quantity := l_curr_instance_rec.quantity;
2682 ELSE l_get_instance_rec.quantity := p_instance_rec.quantity;
2683 END IF;
2684 --
2685 IF ( p_instance_rec.unit_of_measure = fnd_api.g_miss_char )
2686 THEN l_get_instance_rec.unit_of_measure := l_curr_instance_rec.unit_of_measure;
2687 ELSE l_get_instance_rec.unit_of_measure := p_instance_rec.unit_of_measure;
2688 END IF;
2689 --
2690 IF ( p_instance_rec.accounting_class_code = fnd_api.g_miss_char )
2691 THEN l_get_instance_rec.accounting_class_code := l_curr_instance_rec.accounting_class_code;
2692 ELSE l_get_instance_rec.accounting_class_code := p_instance_rec.accounting_class_code;
2693 END IF;
2694 --
2695 IF ( p_instance_rec.instance_condition_id = fnd_api.g_miss_num )
2696 THEN l_get_instance_rec.instance_condition_id := l_curr_instance_rec.instance_condition_id;
2697 ELSE l_get_instance_rec.instance_condition_id := p_instance_rec.instance_condition_id;
2698 END IF;
2699 --
2700 IF ( p_instance_rec.instance_status_id = fnd_api.g_miss_num )
2701 THEN l_get_instance_rec.instance_status_id := l_curr_instance_rec.instance_status_id;
2702 ELSE l_get_instance_rec.instance_status_id := p_instance_rec.instance_status_id;
2703 END IF;
2704 --
2705 IF ( p_instance_rec.customer_view_flag = fnd_api.g_miss_char )
2706 THEN l_get_instance_rec.customer_view_flag := l_curr_instance_rec.customer_view_flag;
2707 ELSE l_get_instance_rec.customer_view_flag := p_instance_rec.customer_view_flag;
2708 END IF;
2709 --
2710 IF ( p_instance_rec.merchant_view_flag = fnd_api.g_miss_char )
2711 THEN l_get_instance_rec.merchant_view_flag := l_curr_instance_rec.merchant_view_flag;
2712 ELSE l_get_instance_rec.merchant_view_flag := p_instance_rec.merchant_view_flag;
2713 END IF;
2714 --
2715 IF ( p_instance_rec.sellable_flag = fnd_api.g_miss_char )
2716 THEN l_get_instance_rec.sellable_flag := l_curr_instance_rec.sellable_flag;
2717 ELSE l_get_instance_rec.sellable_flag := p_instance_rec.sellable_flag;
2718 END IF;
2719 --
2720 IF ( p_instance_rec.system_id = fnd_api.g_miss_num )
2721 THEN l_get_instance_rec.system_id := l_curr_instance_rec.system_id;
2722 ELSE l_get_instance_rec.system_id := p_instance_rec.system_id;
2723 END IF;
2724 --
2725 IF ( p_instance_rec.instance_type_code = fnd_api.g_miss_char )
2726 THEN l_get_instance_rec.instance_type_code := l_curr_instance_rec.instance_type_code;
2727 ELSE l_get_instance_rec.instance_type_code := p_instance_rec.instance_type_code;
2728 END IF;
2729 --
2730 IF ( p_instance_rec.active_start_date = fnd_api.g_miss_date )
2731 THEN l_get_instance_rec.active_start_date := l_curr_instance_rec.active_start_date;
2732 ELSE l_get_instance_rec.active_start_date := p_instance_rec.active_start_date;
2733 END IF;
2734 --
2735 IF ( p_instance_rec.active_end_date = fnd_api.g_miss_date )
2736 THEN l_get_instance_rec.active_end_date := l_curr_instance_rec.active_end_date;
2737 ELSE l_get_instance_rec.active_end_date := p_instance_rec.active_end_date;
2738 END IF;
2739 --
2740 IF ( p_instance_rec.location_type_code = fnd_api.g_miss_char )
2741 THEN l_get_instance_rec.location_type_code := l_curr_instance_rec.location_type_code;
2742 ELSE l_get_instance_rec.location_type_code := p_instance_rec.location_type_code;
2743 END IF;
2744 --
2745 IF ( p_instance_rec.location_id = fnd_api.g_miss_num )
2746 THEN l_get_instance_rec.location_id := l_curr_instance_rec.location_id;
2747 ELSE l_get_instance_rec.location_id := p_instance_rec.location_id;
2748 END IF;
2749 --
2750 IF ( p_instance_rec.inv_organization_id = fnd_api.g_miss_num )
2751 THEN l_get_instance_rec.inv_organization_id := l_curr_instance_rec.inv_organization_id;
2752 ELSE l_get_instance_rec.inv_organization_id := p_instance_rec.inv_organization_id;
2753 END IF;
2754 --
2755 IF ( p_instance_rec.inv_subinventory_name = fnd_api.g_miss_char )
2756 THEN l_get_instance_rec.inv_subinventory_name := l_curr_instance_rec.inv_subinventory_name;
2757 ELSE l_get_instance_rec.inv_subinventory_name := p_instance_rec.inv_subinventory_name;
2758 END IF;
2759 --
2760 IF ( p_instance_rec.inv_locator_id = fnd_api.g_miss_num )
2761 THEN l_get_instance_rec.inv_locator_id := l_curr_instance_rec.inv_locator_id;
2762 ELSE l_get_instance_rec.inv_locator_id := p_instance_rec.inv_locator_id;
2763 END IF;
2764 --
2765 IF ( p_instance_rec.pa_project_id = fnd_api.g_miss_num )
2766 THEN l_get_instance_rec.pa_project_id := l_curr_instance_rec.pa_project_id;
2767 ELSE l_get_instance_rec.pa_project_id := p_instance_rec.pa_project_id;
2768 END IF;
2769 --
2770 IF ( p_instance_rec.pa_project_task_id = fnd_api.g_miss_num )
2771 THEN l_get_instance_rec.pa_project_task_id := l_curr_instance_rec.pa_project_task_id;
2772 ELSE l_get_instance_rec.pa_project_task_id := p_instance_rec.pa_project_task_id;
2773 END IF;
2774 --
2775 IF ( p_instance_rec.in_transit_order_line_id = fnd_api.g_miss_num )
2776 THEN l_get_instance_rec.in_transit_order_line_id := l_curr_instance_rec.in_transit_order_line_id;
2777 ELSE l_get_instance_rec.in_transit_order_line_id := p_instance_rec.in_transit_order_line_id;
2778 END IF;
2779 --
2780 IF ( p_instance_rec.wip_job_id = fnd_api.g_miss_num )
2781 THEN l_get_instance_rec.wip_job_id := l_curr_instance_rec.wip_job_id;
2782 ELSE l_get_instance_rec.wip_job_id := p_instance_rec.wip_job_id;
2783 END IF;
2784 --
2785 IF ( p_instance_rec.po_order_line_id = fnd_api.g_miss_num )
2786 THEN l_get_instance_rec.po_order_line_id := l_curr_instance_rec.po_order_line_id;
2787 ELSE l_get_instance_rec.po_order_line_id := p_instance_rec.po_order_line_id;
2788 END IF;
2789 --
2790 IF ( p_instance_rec.last_oe_order_line_id = fnd_api.g_miss_num )
2791 THEN l_get_instance_rec.last_oe_order_line_id := l_curr_instance_rec.last_oe_order_line_id;
2792 ELSE l_get_instance_rec.last_oe_order_line_id := p_instance_rec.last_oe_order_line_id;
2793 END IF;
2794 --
2795 IF ( p_instance_rec.last_oe_rma_line_id = fnd_api.g_miss_num )
2796 THEN l_get_instance_rec.last_oe_rma_line_id := l_curr_instance_rec.last_oe_rma_line_id;
2797 ELSE l_get_instance_rec.last_oe_rma_line_id := p_instance_rec.last_oe_rma_line_id;
2798 END IF;
2799 --
2800 IF ( p_instance_rec.last_po_po_line_id = fnd_api.g_miss_num )
2801 THEN l_get_instance_rec.last_po_po_line_id := l_curr_instance_rec.last_po_po_line_id;
2802 ELSE l_get_instance_rec.last_po_po_line_id := p_instance_rec.last_po_po_line_id;
2803 END IF;
2804 --
2805 IF ( p_instance_rec.last_oe_po_number = fnd_api.g_miss_char )
2806 THEN l_get_instance_rec.last_oe_po_number := l_curr_instance_rec.last_oe_po_number;
2807 ELSE l_get_instance_rec.last_oe_po_number := p_instance_rec.last_oe_po_number;
2808 END IF;
2809 --
2810 IF ( p_instance_rec.last_wip_job_id = fnd_api.g_miss_num )
2811 THEN l_get_instance_rec.last_wip_job_id := l_curr_instance_rec.last_wip_job_id;
2812 ELSE l_get_instance_rec.last_wip_job_id := p_instance_rec.last_wip_job_id;
2813 END IF;
2814 --
2815 IF ( p_instance_rec.last_pa_project_id = fnd_api.g_miss_num )
2816 THEN l_get_instance_rec.last_pa_project_id := l_curr_instance_rec.last_pa_project_id;
2817 ELSE l_get_instance_rec.last_pa_project_id := p_instance_rec.last_pa_project_id;
2818 END IF;
2819 --
2820 IF ( p_instance_rec.last_pa_task_id = fnd_api.g_miss_num )
2821 THEN l_get_instance_rec.last_pa_task_id := l_curr_instance_rec.last_pa_task_id;
2822 ELSE l_get_instance_rec.last_pa_task_id := p_instance_rec.last_pa_task_id;
2823 END IF;
2824 --
2825 IF ( p_instance_rec.last_oe_agreement_id = fnd_api.g_miss_num )
2826 THEN l_get_instance_rec.last_oe_agreement_id := l_curr_instance_rec.last_oe_agreement_id;
2827 ELSE l_get_instance_rec.last_oe_agreement_id := p_instance_rec.last_oe_agreement_id;
2828 END IF;
2829 --
2830 IF ( p_instance_rec.install_date = fnd_api.g_miss_date )
2831 THEN l_get_instance_rec.install_date := l_curr_instance_rec.install_date;
2832 ELSE l_get_instance_rec.install_date := p_instance_rec.install_date;
2833 END IF;
2834 --
2835 IF ( p_instance_rec.manually_created_flag = fnd_api.g_miss_char )
2836 THEN l_get_instance_rec.manually_created_flag := l_curr_instance_rec.manually_created_flag;
2837 ELSE l_get_instance_rec.manually_created_flag := p_instance_rec.manually_created_flag;
2838 END IF;
2839 --
2840 IF ( p_instance_rec.return_by_date = fnd_api.g_miss_date )
2841 THEN l_get_instance_rec.return_by_date := l_curr_instance_rec.return_by_date;
2842 ELSE l_get_instance_rec.return_by_date := p_instance_rec.return_by_date;
2843 END IF;
2844 --
2845 IF ( p_instance_rec.actual_return_date = fnd_api.g_miss_date )
2846 THEN l_get_instance_rec.actual_return_date := l_curr_instance_rec.actual_return_date;
2847 ELSE l_get_instance_rec.actual_return_date := p_instance_rec.actual_return_date;
2848 END IF;
2849 --
2850 IF ( p_instance_rec.creation_complete_flag = fnd_api.g_miss_char )
2851 THEN l_get_instance_rec.creation_complete_flag := l_curr_instance_rec.creation_complete_flag;
2852 ELSE l_get_instance_rec.creation_complete_flag := p_instance_rec.creation_complete_flag;
2853 END IF;
2854 --
2855 IF ( p_instance_rec.completeness_flag = fnd_api.g_miss_char )
2856 THEN l_get_instance_rec.completeness_flag := l_curr_instance_rec.completeness_flag;
2857 ELSE l_get_instance_rec.completeness_flag := p_instance_rec.completeness_flag;
2858 END IF;
2859 --
2860 IF ( p_instance_rec.context = fnd_api.g_miss_char )
2861 THEN l_get_instance_rec.context := l_curr_instance_rec.context;
2862 ELSE l_get_instance_rec.context := p_instance_rec.context;
2863 END IF;
2864 --
2865 IF ( p_instance_rec.attribute1 = fnd_api.g_miss_char )
2866 THEN l_get_instance_rec.attribute1 := l_curr_instance_rec.attribute1;
2867 ELSE l_get_instance_rec.attribute1 := p_instance_rec.attribute1;
2868 END IF;
2869 --
2870 IF ( p_instance_rec.attribute2 = fnd_api.g_miss_char )
2871 THEN l_get_instance_rec.attribute2 := l_curr_instance_rec.attribute2;
2872 ELSE l_get_instance_rec.attribute2 := p_instance_rec.attribute2;
2873 END IF;
2874 --
2875 IF ( p_instance_rec.attribute3 = fnd_api.g_miss_char )
2876 THEN l_get_instance_rec.attribute3 := l_curr_instance_rec.attribute3;
2877 ELSE l_get_instance_rec.attribute3 := p_instance_rec.attribute3;
2878 END IF;
2879 --
2880 IF ( p_instance_rec.attribute4 = fnd_api.g_miss_char )
2881 THEN l_get_instance_rec.attribute4 := l_curr_instance_rec.attribute4;
2882 ELSE l_get_instance_rec.attribute4 := p_instance_rec.attribute4;
2883 END IF;
2884 --
2885 IF ( p_instance_rec.attribute5 = fnd_api.g_miss_char )
2886 THEN l_get_instance_rec.attribute5 := l_curr_instance_rec.attribute5;
2887 ELSE l_get_instance_rec.attribute5 := p_instance_rec.attribute5;
2888 END IF;
2889 --
2890 IF ( p_instance_rec.attribute6 = fnd_api.g_miss_char )
2891 THEN l_get_instance_rec.attribute6 := l_curr_instance_rec.attribute6;
2892 ELSE l_get_instance_rec.attribute6 := p_instance_rec.attribute6;
2893 END IF;
2894 --
2895 IF ( p_instance_rec.attribute7 = fnd_api.g_miss_char )
2896 THEN l_get_instance_rec.attribute7 := l_curr_instance_rec.attribute7;
2897 ELSE l_get_instance_rec.attribute7 := p_instance_rec.attribute7;
2898 END IF;
2899 --
2900 IF ( p_instance_rec.attribute8 = fnd_api.g_miss_char )
2901 THEN l_get_instance_rec.attribute8 := l_curr_instance_rec.attribute8;
2902 ELSE l_get_instance_rec.attribute8 := p_instance_rec.attribute8;
2903 END IF;
2904 --
2905 IF ( p_instance_rec.attribute9 = fnd_api.g_miss_char )
2906 THEN l_get_instance_rec.attribute9 := l_curr_instance_rec.attribute9;
2907 ELSE l_get_instance_rec.attribute9 := p_instance_rec.attribute9;
2908 END IF;
2909 --
2910 IF ( p_instance_rec.attribute10 = fnd_api.g_miss_char )
2911 THEN l_get_instance_rec.attribute10 := l_curr_instance_rec.attribute10;
2912 ELSE l_get_instance_rec.attribute10 := p_instance_rec.attribute10;
2913 END IF;
2914 --
2915 IF ( p_instance_rec.attribute11 = fnd_api.g_miss_char )
2916 THEN l_get_instance_rec.attribute11 := l_curr_instance_rec.attribute11;
2917 ELSE l_get_instance_rec.attribute11 := p_instance_rec.attribute11;
2918 END IF;
2919 --
2920 IF ( p_instance_rec.attribute12 = fnd_api.g_miss_char )
2921 THEN l_get_instance_rec.attribute12 := l_curr_instance_rec.attribute12;
2922 ELSE l_get_instance_rec.attribute12 := p_instance_rec.attribute12;
2923 END IF;
2924 --
2925 IF ( p_instance_rec.attribute13 = fnd_api.g_miss_char )
2926 THEN l_get_instance_rec.attribute13 := l_curr_instance_rec.attribute13;
2927 ELSE l_get_instance_rec.attribute13 := p_instance_rec.attribute13;
2928 END IF;
2929 --
2930 IF ( p_instance_rec.attribute14 = fnd_api.g_miss_char )
2931 THEN l_get_instance_rec.attribute14 := l_curr_instance_rec.attribute14;
2932 ELSE l_get_instance_rec.attribute14 := p_instance_rec.attribute14;
2933 END IF;
2934 --
2935 IF ( p_instance_rec.attribute15 = fnd_api.g_miss_char )
2936 THEN l_get_instance_rec.attribute15 := l_curr_instance_rec.attribute15;
2937 ELSE l_get_instance_rec.attribute15 := p_instance_rec.attribute15;
2938 END IF;
2939 --
2940 IF ( p_instance_rec.object_version_number = fnd_api.g_miss_num )
2941 THEN l_get_instance_rec.object_version_number := l_curr_instance_rec.object_version_number;
2942 ELSE l_get_instance_rec.object_version_number := p_instance_rec.object_version_number;
2943 END IF;
2944 --
2945 IF ( p_instance_rec.last_txn_line_detail_id = fnd_api.g_miss_num )
2946 THEN l_get_instance_rec.last_txn_line_detail_id := l_curr_instance_rec.last_txn_line_detail_id;
2947 ELSE l_get_instance_rec.last_txn_line_detail_id := p_instance_rec.last_txn_line_detail_id;
2948 END IF;
2949 --
2950 IF ( p_instance_rec.install_location_type_code = fnd_api.g_miss_char )
2951 THEN l_get_instance_rec.install_location_type_code := l_curr_instance_rec.install_location_type_code;
2952 ELSE l_get_instance_rec.install_location_type_code := p_instance_rec.install_location_type_code;
2953 END IF;
2954 --
2955 IF ( p_instance_rec.install_location_id = fnd_api.g_miss_num )
2956 THEN l_get_instance_rec.install_location_id := l_curr_instance_rec.install_location_id;
2957 ELSE l_get_instance_rec.install_location_id := p_instance_rec.install_location_id;
2958 END IF;
2959 --
2960 IF ( p_instance_rec.instance_usage_code = fnd_api.g_miss_char )
2961 THEN l_get_instance_rec.instance_usage_code := l_curr_instance_rec.instance_usage_code;
2962 ELSE l_get_instance_rec.instance_usage_code := p_instance_rec.instance_usage_code;
2963 END IF;
2964 --
2965
2966 /* IF ( p_instance_rec.vld_organization_id = fnd_api.g_miss_num )
2967 THEN l_get_instance_rec.vld_organization_id := l_curr_instance_rec.last_vld_organization_id;
2968 ELSE l_get_instance_rec.vld_organization_id := p_instance_rec.vld_organization_id;
2969 END IF;
2970 --
2971 */
2972
2973 IF ( (p_instance_rec.location_type_code <> FND_API.G_MISS_CHAR) OR
2974 (p_instance_rec.location_id <> FND_API.G_MISS_NUM) OR
2975 (p_instance_rec.inv_organization_id <> FND_API.G_MISS_NUM) OR
2976 (p_instance_rec.inv_subinventory_name <> FND_API.G_MISS_CHAR) OR
2977 (p_instance_rec.inv_locator_id <> FND_API.G_MISS_NUM) OR
2978 (p_instance_rec.pa_project_id <> FND_API.G_MISS_NUM) OR
2979 (p_instance_rec.pa_project_task_id <> FND_API.G_MISS_NUM) OR
2980 (p_instance_rec.in_transit_order_line_id <> FND_API.G_MISS_NUM) OR
2981 (p_instance_rec.wip_job_id <> FND_API.G_MISS_NUM) OR
2982 (p_instance_rec.po_order_line_id <> FND_API.G_MISS_NUM)
2983 ) THEN
2984
2985 IF l_get_instance_rec.location_type_code = 'INVENTORY' THEN
2986
2987 IF p_instance_rec.pa_project_id = FND_API.G_MISS_NUM THEN
2988 p_instance_rec.pa_project_id := NULL;
2989 l_get_instance_rec.pa_project_id := NULL;
2990 END IF;
2991 IF p_instance_rec.pa_project_task_id = FND_API.G_MISS_NUM THEN
2992 p_instance_rec.pa_project_task_id := NULL;
2993 l_get_instance_rec.pa_project_task_id := NULL;
2994 END IF;
2995 IF p_instance_rec.wip_job_id = FND_API.G_MISS_NUM THEN
2996 p_instance_rec.wip_job_id := NULL;
2997 l_get_instance_rec.wip_job_id := NULL;
2998 END IF;
2999 IF p_instance_rec.in_transit_order_line_id = FND_API.G_MISS_NUM THEN
3000 p_instance_rec.in_transit_order_line_id := NULL;
3001 l_get_instance_rec.in_transit_order_line_id := NULL;
3002 END IF;
3003 IF p_instance_rec.po_order_line_id = FND_API.G_MISS_NUM THEN
3004 p_instance_rec.po_order_line_id := NULL;
3005 l_get_instance_rec.po_order_line_id := NULL;
3006 END IF;
3007
3008 ELSIF
3009
3010 l_get_instance_rec.location_type_code = 'PROJECT' THEN
3011
3012 IF p_instance_rec.inv_organization_id = FND_API.G_MISS_NUM THEN
3013 p_instance_rec.inv_organization_id := NULL;
3014 l_get_instance_rec.inv_organization_id := NULL;
3015 END IF;
3016 IF p_instance_rec.inv_subinventory_name = FND_API.G_MISS_CHAR THEN
3017 p_instance_rec.inv_subinventory_name := NULL;
3018 l_get_instance_rec.inv_subinventory_name := NULL;
3019 END IF;
3020 IF p_instance_rec.inv_locator_id = FND_API.G_MISS_NUM THEN
3021 p_instance_rec.inv_locator_id := NULL;
3022 l_get_instance_rec.inv_locator_id := NULL;
3023 END IF;
3024 IF p_instance_rec.wip_job_id = FND_API.G_MISS_NUM THEN
3025 p_instance_rec.wip_job_id := NULL;
3026 l_get_instance_rec.wip_job_id := NULL;
3027 END IF;
3028 IF p_instance_rec.in_transit_order_line_id = FND_API.G_MISS_NUM THEN
3029 p_instance_rec.in_transit_order_line_id := NULL;
3030 l_get_instance_rec.in_transit_order_line_id := NULL;
3031 END IF;
3032 IF p_instance_rec.po_order_line_id = FND_API.G_MISS_NUM THEN
3033 p_instance_rec.po_order_line_id := NULL;
3034 l_get_instance_rec.po_order_line_id := NULL;
3035 END IF;
3036
3037 ELSIF
3038
3039 l_get_instance_rec.location_type_code = 'WIP' THEN
3040
3041 IF p_instance_rec.inv_organization_id = FND_API.G_MISS_NUM THEN
3042 p_instance_rec.inv_organization_id := NULL;
3043 l_get_instance_rec.inv_organization_id := NULL;
3044 END IF;
3045 IF p_instance_rec.inv_subinventory_name = FND_API.G_MISS_CHAR THEN
3046 p_instance_rec.inv_subinventory_name := NULL;
3047 l_get_instance_rec.inv_subinventory_name := NULL;
3048 END IF;
3049 IF p_instance_rec.inv_locator_id = FND_API.G_MISS_NUM THEN
3050 p_instance_rec.inv_locator_id := NULL;
3051 l_get_instance_rec.inv_locator_id := NULL;
3052 END IF;
3053 IF p_instance_rec.pa_project_id = FND_API.G_MISS_NUM THEN
3054 p_instance_rec.pa_project_id := NULL;
3055 l_get_instance_rec.pa_project_id := NULL;
3056 END IF;
3057 IF p_instance_rec.pa_project_task_id = FND_API.G_MISS_NUM THEN
3058 p_instance_rec.pa_project_task_id := NULL;
3059 l_get_instance_rec.pa_project_task_id := NULL;
3060 END IF;
3061 IF p_instance_rec.in_transit_order_line_id = FND_API.G_MISS_NUM THEN
3062 p_instance_rec.in_transit_order_line_id := NULL;
3063 l_get_instance_rec.in_transit_order_line_id := NULL;
3064 END IF;
3065 IF p_instance_rec.po_order_line_id = FND_API.G_MISS_NUM THEN
3066 p_instance_rec.po_order_line_id := NULL;
3067 l_get_instance_rec.po_order_line_id := NULL;
3068 END IF;
3069
3070 ELSIF
3071
3072 l_get_instance_rec.location_type_code = 'IN_TRANSIT' THEN
3073
3074 IF p_instance_rec.inv_organization_id = FND_API.G_MISS_NUM THEN
3075 p_instance_rec.inv_organization_id := NULL;
3076 l_get_instance_rec.inv_organization_id := NULL;
3077 END IF;
3078 IF p_instance_rec.inv_subinventory_name = FND_API.G_MISS_CHAR THEN
3079 p_instance_rec.inv_subinventory_name := NULL;
3080 l_get_instance_rec.inv_subinventory_name := NULL;
3081 END IF;
3082 IF p_instance_rec.inv_locator_id = FND_API.G_MISS_NUM THEN
3083 p_instance_rec.inv_locator_id := NULL;
3084 l_get_instance_rec.inv_locator_id := NULL;
3085 END IF;
3086 IF p_instance_rec.pa_project_id = FND_API.G_MISS_NUM THEN
3087 p_instance_rec.pa_project_id := NULL;
3088 l_get_instance_rec.pa_project_id := NULL;
3089 END IF;
3090 IF p_instance_rec.pa_project_task_id = FND_API.G_MISS_NUM THEN
3091 p_instance_rec.pa_project_task_id := NULL;
3092 l_get_instance_rec.pa_project_task_id := NULL;
3093 END IF;
3094 IF p_instance_rec.wip_job_id = FND_API.G_MISS_NUM THEN
3095 p_instance_rec.wip_job_id := NULL;
3096 l_get_instance_rec.wip_job_id := NULL;
3097 END IF;
3098 IF p_instance_rec.po_order_line_id = FND_API.G_MISS_NUM THEN
3099 p_instance_rec.po_order_line_id := NULL;
3100 l_get_instance_rec.po_order_line_id := NULL;
3101 END IF;
3102
3103 ELSIF
3104
3105 l_get_instance_rec.location_type_code = 'PO' THEN
3106
3107 IF p_instance_rec.inv_organization_id = FND_API.G_MISS_NUM THEN
3108 p_instance_rec.inv_organization_id := NULL;
3109 l_get_instance_rec.inv_organization_id := NULL;
3110 END IF;
3111 IF p_instance_rec.inv_subinventory_name = FND_API.G_MISS_CHAR THEN
3112 p_instance_rec.inv_subinventory_name := NULL;
3113 l_get_instance_rec.inv_subinventory_name := NULL;
3114 END IF;
3115 IF p_instance_rec.inv_locator_id = FND_API.G_MISS_NUM THEN
3116 p_instance_rec.inv_locator_id := NULL;
3117 l_get_instance_rec.inv_locator_id := NULL;
3118 END IF;
3119 IF p_instance_rec.pa_project_id = FND_API.G_MISS_NUM THEN
3120 p_instance_rec.pa_project_id := NULL;
3121 l_get_instance_rec.pa_project_id := NULL;
3122 END IF;
3123 IF p_instance_rec.pa_project_task_id = FND_API.G_MISS_NUM THEN
3124 p_instance_rec.pa_project_task_id := NULL;
3125 l_get_instance_rec.pa_project_task_id := NULL;
3126 END IF;
3127 IF p_instance_rec.wip_job_id = FND_API.G_MISS_NUM THEN
3128 p_instance_rec.wip_job_id := NULL;
3129 l_get_instance_rec.wip_job_id := NULL;
3130 END IF;
3131 IF p_instance_rec.in_transit_order_line_id = FND_API.G_MISS_NUM THEN
3132 p_instance_rec.in_transit_order_line_id := NULL;
3133 l_get_instance_rec.in_transit_order_line_id := NULL;
3134 END IF;
3135
3136 ELSIF
3137
3138 l_get_instance_rec.location_type_code = 'HZ_LOCATIONS' THEN
3139
3140 IF p_instance_rec.inv_organization_id = FND_API.G_MISS_NUM THEN
3141 p_instance_rec.inv_organization_id := NULL;
3142 l_get_instance_rec.inv_organization_id := NULL;
3143 END IF;
3144 IF p_instance_rec.inv_subinventory_name = FND_API.G_MISS_CHAR THEN
3145 p_instance_rec.inv_subinventory_name := NULL;
3146 l_get_instance_rec.inv_subinventory_name := NULL;
3147 END IF;
3148 IF p_instance_rec.inv_locator_id = FND_API.G_MISS_NUM THEN
3149 p_instance_rec.inv_locator_id := NULL;
3150 l_get_instance_rec.inv_locator_id := NULL;
3151 END IF;
3152 IF p_instance_rec.wip_job_id = FND_API.G_MISS_NUM THEN
3153 p_instance_rec.wip_job_id := NULL;
3154 l_get_instance_rec.wip_job_id := NULL;
3155 END IF;
3156 IF p_instance_rec.in_transit_order_line_id = FND_API.G_MISS_NUM THEN
3157 p_instance_rec.in_transit_order_line_id := NULL;
3158 l_get_instance_rec.in_transit_order_line_id := NULL;
3159 END IF;
3160 IF p_instance_rec.po_order_line_id = FND_API.G_MISS_NUM THEN
3161 p_instance_rec.po_order_line_id := NULL;
3162 l_get_instance_rec.po_order_line_id := NULL;
3163 END IF;
3164 /*
3165 IF p_instance_rec.pa_project_id = FND_API.G_MISS_NUM THEN
3166 p_instance_rec.pa_project_id := NULL;
3167 l_get_instance_rec.pa_project_id := NULL;
3168 END IF;
3169 IF p_instance_rec.pa_project_task_id = FND_API.G_MISS_NUM THEN
3170 p_instance_rec.pa_project_task_id := NULL;
3171 l_get_instance_rec.pa_project_task_id := NULL;
3172 END IF;
3173 */
3174 ELSIF
3175
3176 l_get_instance_rec.location_type_code = 'HZ_PARTY_SITES' THEN
3177
3178 IF p_instance_rec.inv_organization_id = FND_API.G_MISS_NUM THEN
3179 p_instance_rec.inv_organization_id := NULL;
3180 l_get_instance_rec.inv_organization_id := NULL;
3181 END IF;
3182 IF p_instance_rec.inv_subinventory_name = FND_API.G_MISS_CHAR THEN
3183 p_instance_rec.inv_subinventory_name := NULL;
3184 l_get_instance_rec.inv_subinventory_name := NULL;
3185 END IF;
3186 IF p_instance_rec.inv_locator_id = FND_API.G_MISS_NUM THEN
3187 p_instance_rec.inv_locator_id := NULL;
3188 l_get_instance_rec.inv_locator_id := NULL;
3189 END IF;
3190 IF p_instance_rec.wip_job_id = FND_API.G_MISS_NUM THEN
3191 p_instance_rec.wip_job_id := NULL;
3192 l_get_instance_rec.wip_job_id := NULL;
3193 END IF;
3194 IF p_instance_rec.in_transit_order_line_id = FND_API.G_MISS_NUM THEN
3195 p_instance_rec.in_transit_order_line_id := NULL;
3196 l_get_instance_rec.in_transit_order_line_id := NULL;
3197 END IF;
3198 IF p_instance_rec.po_order_line_id = FND_API.G_MISS_NUM THEN
3199 p_instance_rec.po_order_line_id := NULL;
3200 l_get_instance_rec.po_order_line_id := NULL;
3201 END IF;
3202 IF p_instance_rec.pa_project_id = FND_API.G_MISS_NUM THEN
3203 p_instance_rec.pa_project_id := NULL;
3204 l_get_instance_rec.pa_project_id := NULL;
3205 END IF;
3206 IF p_instance_rec.pa_project_task_id = FND_API.G_MISS_NUM THEN
3207 p_instance_rec.pa_project_task_id := NULL;
3208 l_get_instance_rec.pa_project_task_id := NULL;
3209 END IF;
3210
3211 ELSIF
3212
3213 l_get_instance_rec.location_type_code = 'VENDOR_SITE' THEN
3214
3215 IF p_instance_rec.inv_organization_id = FND_API.G_MISS_NUM THEN
3216 p_instance_rec.inv_organization_id := NULL;
3217 l_get_instance_rec.inv_organization_id := NULL;
3218 END IF;
3219 IF p_instance_rec.inv_subinventory_name = FND_API.G_MISS_CHAR THEN
3220 p_instance_rec.inv_subinventory_name := NULL;
3221 l_get_instance_rec.inv_subinventory_name := NULL;
3222 END IF;
3223 IF p_instance_rec.inv_locator_id = FND_API.G_MISS_NUM THEN
3224 p_instance_rec.inv_locator_id := NULL;
3225 l_get_instance_rec.inv_locator_id := NULL;
3226 END IF;
3227 IF p_instance_rec.wip_job_id = FND_API.G_MISS_NUM THEN
3228 p_instance_rec.wip_job_id := NULL;
3229 l_get_instance_rec.wip_job_id := NULL;
3230 END IF;
3231 IF p_instance_rec.in_transit_order_line_id = FND_API.G_MISS_NUM THEN
3232 p_instance_rec.in_transit_order_line_id := NULL;
3233 l_get_instance_rec.in_transit_order_line_id := NULL;
3234 END IF;
3235 IF p_instance_rec.po_order_line_id = FND_API.G_MISS_NUM THEN
3236 p_instance_rec.po_order_line_id := NULL;
3237 l_get_instance_rec.po_order_line_id := NULL;
3238 END IF;
3239 IF p_instance_rec.pa_project_id = FND_API.G_MISS_NUM THEN
3240 p_instance_rec.pa_project_id := NULL;
3241 l_get_instance_rec.pa_project_id := NULL;
3242 END IF;
3243 IF p_instance_rec.pa_project_task_id = FND_API.G_MISS_NUM THEN
3244 p_instance_rec.pa_project_task_id := NULL;
3245 l_get_instance_rec.pa_project_task_id := NULL;
3246 END IF;
3247
3248 ELSIF
3249
3250 l_get_instance_rec.location_type_code = 'INTERNAL_SITE' THEN
3251
3252 IF p_instance_rec.inv_organization_id = FND_API.G_MISS_NUM THEN
3253 p_instance_rec.inv_organization_id := NULL;
3254 l_get_instance_rec.inv_organization_id := NULL;
3255 END IF;
3256 IF p_instance_rec.inv_subinventory_name = FND_API.G_MISS_CHAR THEN
3257 p_instance_rec.inv_subinventory_name := NULL;
3258 l_get_instance_rec.inv_subinventory_name := NULL;
3259 END IF;
3260 IF p_instance_rec.inv_locator_id = FND_API.G_MISS_NUM THEN
3261 p_instance_rec.inv_locator_id := NULL;
3262 l_get_instance_rec.inv_locator_id := NULL;
3263 END IF;
3264 IF p_instance_rec.wip_job_id = FND_API.G_MISS_NUM THEN
3265 p_instance_rec.wip_job_id := NULL;
3266 l_get_instance_rec.wip_job_id := NULL;
3267 END IF;
3268 IF p_instance_rec.in_transit_order_line_id = FND_API.G_MISS_NUM THEN
3269 p_instance_rec.in_transit_order_line_id := NULL;
3270 l_get_instance_rec.in_transit_order_line_id := NULL;
3271 END IF;
3272 IF p_instance_rec.po_order_line_id = FND_API.G_MISS_NUM THEN
3273 p_instance_rec.po_order_line_id := NULL;
3274 l_get_instance_rec.po_order_line_id := NULL;
3275 END IF;
3276 IF p_instance_rec.pa_project_id = FND_API.G_MISS_NUM THEN
3277 p_instance_rec.pa_project_id := NULL;
3278 l_get_instance_rec.pa_project_id := NULL;
3279 END IF;
3280 IF p_instance_rec.pa_project_task_id = FND_API.G_MISS_NUM THEN
3281 p_instance_rec.pa_project_task_id := NULL;
3282 l_get_instance_rec.pa_project_task_id := NULL;
3283 END IF;
3284
3285 END IF;
3286 END IF; -- Any location attribute changing
3287
3288 END get_merge_rec;
3289
3290 /*----------------------------------------------------------*/
3291 /* Function Name : Get_instance_id */
3292 /* */
3293 /* Description : This function generates */
3294 /* instance_ids using a sequence */
3295 /*----------------------------------------------------------*/
3296 FUNCTION Get_instance_id
3297 ( p_stack_err_msg IN BOOLEAN
3298 )
3299 RETURN NUMBER
3300 IS
3301 l_instance_id NUMBER;
3302 BEGIN
3303 SELECT csi_item_instances_s.NEXTVAL
3304 INTO l_instance_id
3305 FROM sys.dual;
3306 RETURN l_instance_id;
3307 END Get_instance_id;
3308
3309 /*----------------------------------------------------------*/
3310 /* Function Name : get_cis_item_instance_h_id */
3311 /* */
3312 /* Description : This function generates */
3313 /* cis_item_instance_h_id using a sequence */
3314 /*----------------------------------------------------------*/
3315
3316 FUNCTION get_csi_item_instance_h_id
3317 ( p_stack_err_msg IN BOOLEAN
3318 )
3319 RETURN NUMBER
3320 IS
3321 l_csi_item_instance_h_id NUMBER;
3322
3323 BEGIN
3324 SELECT csi_item_instances_h_s.NEXTVAL
3325 INTO l_csi_item_instance_h_id
3326 FROM dual;
3327 RETURN l_csi_item_instance_h_id;
3328 EXCEPTION
3329 WHEN OTHERS THEN
3330 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_ITEM_INST_H_ID');
3331 FND_MESSAGE.SET_TOKEN('INSTANCE_HISTORY_ID',l_csi_item_instance_h_id);
3332 FND_MSG_PUB.Add;
3333
3334 END get_csi_item_instance_h_id;
3335
3336 /*-----------------------------------------------------------*/
3337 /* Procedure name: Is_Instance_creation_complete */
3338 /* Description : Check if the instance creation is */
3339 /* complete */
3340 /*-----------------------------------------------------------*/
3341
3342 FUNCTION Is_Inst_creation_complete
3343 ( p_instance_id IN NUMBER,
3344 p_stack_err_msg IN BOOLEAN
3345 ) RETURN BOOLEAN IS
3346
3347 l_dummy VARCHAR2(1);
3348 l_return_value BOOLEAN := TRUE;
3349 BEGIN
3350 SELECT 'x'
3351 INTO l_dummy
3352 FROM csi_item_instances
3353 WHERE instance_id = p_Instance_id
3354 AND creation_complete_flag = 'Y';
3355 RETURN l_return_value;
3356 EXCEPTION
3357 WHEN NO_DATA_FOUND THEN
3358 l_return_value := FALSE;
3359 RETURN l_return_value;
3360 END Is_Inst_creation_complete;
3361
3362 /*-----------------------------------------------------------*/
3363 /* Procedure name: Instance_has_Parent */
3364 /* Description : Check for the parent in csi relationships */
3365 /* */
3366 /*-----------------------------------------------------------*/
3367
3368 FUNCTION Instance_has_Parent
3369 ( p_instance_id IN NUMBER,
3370 p_stack_err_msg IN BOOLEAN
3371 ) RETURN BOOLEAN IS
3372
3373 l_dummy NUMBER;
3374 l_return_value BOOLEAN := TRUE;
3375
3376 BEGIN
3377
3378 BEGIN
3379 SELECT object_id
3380 INTO l_dummy
3381 FROM csi_ii_relationships
3382 WHERE subject_id = p_instance_id
3383 AND relationship_type_code = 'COMPONENT-OF'
3384 AND nvl(active_end_date,(sysdate+1)) > sysdate;
3385
3386 l_return_value := TRUE;
3387
3388 EXCEPTION
3389 WHEN NO_DATA_FOUND THEN
3390 l_return_value := FALSE;
3391 END;
3392 RETURN l_return_value;
3393
3394 END Instance_has_Parent;
3395
3396 /*------------------------------------------------------------*/
3397 /* This procedure verifies that the item serial number is */
3398 /* valid by looking into the mtl serial #s table */
3399 /*------------------------------------------------------------*/
3400
3401 PROCEDURE Validate_srl_num_for_Inst_Upd
3402 (
3403 p_inv_org_id IN NUMBER,
3404 p_inv_item_id IN NUMBER,
3405 p_serial_number IN VARCHAR2,
3406 p_mfg_serial_number_flag IN VARCHAR2,
3407 p_txn_rec IN csi_datastructures_pub.transaction_rec,
3408 p_location_type_code IN VARCHAR2, -- Added by sk on 09/13/01
3409 p_srl_control_code IN NUMBER,
3410 p_instance_usage_code IN VARCHAR2,
3411 p_instance_id IN NUMBER,
3412 l_return_value IN OUT NOCOPY BOOLEAN
3413 ) IS
3414 l_dummy varchar2(30);
3415 l_temp varchar2(30);
3416 p_stack_err_msg BOOLEAN DEFAULT TRUE;
3417 l_serial_tagged VARCHAR2(1) := 'N';
3418 l_inv_txn_typeid_from_cs NUMBER := -1;
3419
3420 -- If item is under serial control, then serial number MUST be a non-NULL
3421 -- value. If it is not under serial_control, then serial number MUST be NULL
3422 --
3423 CURSOR c1 is
3424 SELECT serial_number_control_code
3425 FROM mtl_system_items
3426 WHERE inventory_item_id = p_inv_item_id
3427 AND organization_id = p_inv_org_id
3428 AND enabled_flag = 'Y'
3429 AND nvl (start_date_active, sysdate) <= sysdate
3430 AND nvl (end_date_active, sysdate+1) > sysdate;
3431
3432 Serialized NUMBER;
3433 l_found VARCHAR2(1);
3434 BEGIN
3435 l_return_value := TRUE;
3436 --
3437 IF p_srl_control_code is not NULL AND
3438 p_srl_control_code <> FND_API.G_MISS_NUM THEN
3439 Serialized := p_srl_control_code;
3440 ELSE
3441 OPEN c1;
3442 FETCH c1 into serialized;
3443 CLOSE c1;
3444 END IF;
3445
3446 -- Get serial tagging control 9977630
3447 --
3448 -- Bug 12574008
3449 -- If the transaction is a Field Service Transaction
3450 -- Then assign p_txn_rec.ATTRIBUTE15
3451 IF NVL(p_txn_rec.ATTRIBUTE14, FND_API.G_MISS_CHAR) = 'FIELD_SERVICE_TXN' THEN
3452 l_inv_txn_typeid_from_cs := to_number(p_txn_rec.ATTRIBUTE15);
3453 END IF;
3454
3455 -- Get serial tagging control 9977630
3456 --
3457 csi_process_txn_pvt.get_serial_tagging_control (
3458 p_inventory_item_id => p_inv_item_id,
3459 p_organization_id => p_inv_org_id,
3460 p_mtl_transaction_id => p_txn_rec.inv_material_transaction_id,
3461 p_serial_tagged => l_serial_tagged,
3462 p_inv_txn_typeid_from_cs => l_inv_txn_typeid_from_cs);
3463
3464 csi_gen_utility_pvt.put_line('Serial Tagging Control - '||l_serial_tagged);
3465 -- End 9977630
3466
3467 --
3468 IF Serialized is not null THEN
3469 -- Item is under serial control but serial_number is NULL
3470 -- '1' stands for - No serial number control
3471 -- '2' stands for - Predefined serial numbers
3472 -- '5' stands for - Dynamic entry at inventory receipt
3473 -- '6' stands for - Dynamic entry at sales order issue
3474 --IF NVL(serialized,0) IN (2,5,6) THEN
3475 IF Is_treated_serialized( p_serial_control_code => serialized
3476 ,p_location_type_code => p_location_type_code
3477 ,p_transaction_type_id => p_txn_rec.transaction_type_id
3478 )
3479 AND NVL(l_serial_tagged,'N') = 'Y'
3480 THEN
3481 IF ((p_serial_number IS NULL) OR
3482 (p_serial_number = FND_API.G_MISS_CHAR)) THEN
3483 l_return_value := FALSE;
3484 IF (p_stack_err_msg = TRUE) THEN
3485 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_SERIAL_NUM');
3486 FND_MESSAGE.SET_TOKEN('SERIAL_NUMBER',p_serial_number);
3487 FND_MSG_PUB.Add;
3488 END IF;
3489 ELSE
3490 l_return_value := TRUE;
3491 END IF;
3492 ELSE
3493 -- Item is not under serial control but serial_number is not NULL
3494 --IF NVL(serialized,0) NOT IN (2,5,6) THEN
3495 IF NOT Is_treated_serialized( p_serial_control_code => serialized
3496 ,p_location_type_code => p_location_type_code
3497 ,p_transaction_type_id => p_txn_rec.transaction_type_id
3498 )
3499 AND NVL(l_serial_tagged,'N') <> 'Y'
3500 THEN
3501 IF ((p_serial_number IS NOT NULL) AND (p_serial_number <> FND_API.G_MISS_CHAR)) THEN
3502 l_found := NULL;
3503 IF serialized IS NOT NULL
3504 AND serialized=6
3505 AND p_instance_usage_code='RETURNED'
3506 AND p_location_type_code='INVENTORY'
3507 THEN
3508 BEGIN
3509 SELECT 'x'
3510 INTO l_found
3511 FROM mtl_serial_numbers
3512 WHERE inventory_item_id = p_inv_item_id
3513 AND serial_number = p_serial_number;
3514 l_return_value := TRUE;
3515 EXCEPTION
3516 WHEN OTHERS THEN
3517 NULL;
3518 END;
3519 -- Need to by-pass validation if the instance is in a configuration
3520 ELSIF serialized IS NOT NULL -- Fix for Bug # 3431641
3521 AND serialized=6
3522 AND p_instance_usage_code='IN_RELATIONSHIP'
3523 THEN
3524 l_found := 'x';
3525 l_return_value := TRUE;
3526 END IF;
3527 IF l_found IS NULL
3528 THEN
3529 l_return_value := FALSE;
3530 FND_MESSAGE.SET_NAME('CSI','CSI_API_NOT_SER_CONTROLLED');
3531 FND_MESSAGE.SET_TOKEN('SERIAL_NUMBER',p_serial_number);
3532 FND_MSG_PUB.Add;
3533 END IF;
3534 ELSE
3535 l_return_value := TRUE;
3536 END IF;
3537 END IF;
3538 END IF;
3539 ELSE
3540 l_return_value := FALSE;
3541 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_ITEM'); -- Item does not exist in the inventory organization provided
3542 FND_MESSAGE.SET_TOKEN('INVENTORY_ITEM_ID',p_inv_item_id);
3543 FND_MESSAGE.SET_TOKEN('INVENTORY_ORGANIZATION_ID',p_inv_org_id);
3544 FND_MSG_PUB.Add;
3545 END IF;
3546 --
3547 IF l_return_value = TRUE
3548 THEN
3549 Validate_ser_uniqueness
3550 ( p_inv_org_id => p_inv_org_id
3551 ,p_inv_item_id => p_inv_item_id
3552 ,p_serial_number => p_serial_number
3553 ,p_instance_id => p_instance_id
3554 ,l_return_value => l_return_value
3555 );
3556 --Commented out code for bug 7657438, no need to raise more than one error message
3557 /*IF l_return_value = FALSE THEN
3558 fnd_message.set_name('CSI','CSI_FAIL_UNIQUENESS');
3559 fnd_msg_pub.add;
3560 END IF;*/
3561 END IF;
3562 END Validate_srl_num_for_Inst_Upd;
3563
3564 /*------------------------------------------------------------*/
3565 /* This function validates the quantity and also check for */
3566 /* serialized items, quantity =1 */
3567 /*------------------------------------------------------------*/
3568 /*
3569 FUNCTION Update_Quantity
3570 (
3571 p_instance_id IN NUMBER ,
3572 p_inv_organization_id IN NUMBER ,
3573 p_quantity IN NUMBER ,
3574 --p_serial_number IN VARCHAR2,
3575 p_serial_control_code IN NUMBER ,
3576 p_location_type_code IN VARCHAR2,
3577 p_stack_err_msg IN BOOLEAN
3578 )
3579 RETURN BOOLEAN IS
3580
3581 l_quantity NUMBER;
3582 l_dummy NUMBER;
3583 l_return_value BOOLEAN := TRUE;
3584
3585 Cursor c1 is
3586 SELECT negative_inv_receipt_code
3587 FROM mtl_parameters
3588 WHERE organization_id = p_inv_organization_id;
3589 BEGIN
3590 -- IF ((p_serial_number IS NOT NULL) AND (p_serial_number <> FND_API.G_MISS_CHAR)) THEN
3591 IF (csi_Item_Instance_Vld_pvt.Is_treated_serialized
3592 ( p_serial_control_code => p_serial_control_code
3593 ,p_location_type_code => p_location_type_code
3594 )) --Added by sk on 09/14/01
3595 THEN
3596 IF p_quantity <> 1 THEN
3597 l_return_value := FALSE;
3598 IF (p_stack_err_msg = TRUE) THEN
3599 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_QUANTITY');
3600 FND_MESSAGE.SET_TOKEN('QUANTITY',p_quantity);
3601 FND_MSG_PUB.Add;
3602 END IF;
3603 END IF;
3604 ELSE
3605 IF p_quantity < 0 THEN
3606 OPEN C1;
3607 FETCH C1 INTO l_dummy;
3608 IF C1%found THEN
3609 IF nvl(l_dummy,0) = 1 THEN
3610 l_return_value := TRUE;
3611 ELSE
3612 l_return_value := FALSE;
3613 IF (p_stack_err_msg = TRUE) THEN
3614 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_NEGATIVE_QTY');
3615 FND_MESSAGE.SET_TOKEN('QUANTITY',p_quantity);
3616 FND_MSG_PUB.Add;
3617 END IF;
3618 END IF;
3619 END IF;
3620 CLOSE C1;
3621 ELSIF p_quantity > 1 THEN
3622 BEGIN
3623 SELECT subject_id
3624 INTO l_dummy
3625 FROM csi_ii_relationships
3626 WHERE object_id = p_instance_id;
3627 IF SQL%FOUND THEN
3628 l_return_value := FALSE;
3629 IF (p_stack_err_msg = TRUE) THEN
3630 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_REL_QTY');
3631 FND_MESSAGE.SET_TOKEN('QUANTITY',p_quantity);
3632 FND_MSG_PUB.Add;
3633 END IF;
3634 END IF;
3635 EXCEPTION
3636 WHEN NO_DATA_FOUND THEN
3637 l_return_value := TRUE;
3638 WHEN TOO_MANY_ROWS THEN
3639 l_return_value := FALSE;
3640 IF (p_stack_err_msg = TRUE) THEN
3641 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_QUANTITY');--check with faisal
3642 FND_MESSAGE.SET_TOKEN('QUANTITY',p_quantity);
3643 FND_MSG_PUB.Add;
3644 END IF;
3645 END;
3646 END IF;
3647 END IF;
3648 RETURN l_return_value;
3649 END Update_Quantity;
3650 */
3651 /*----------------------------------------------------*/
3652 /* This Procedure validates the accounting class code*/
3653 /* */
3654 /*----------------------------------------------------*/
3655
3656 PROCEDURE get_valid_acct_class
3657 ( p_instance_id IN NUMBER
3658 ,p_curr_acct_class_code IN VARCHAR2
3659 ,p_loc_type_code IN VARCHAR2
3660 ,x_acct_class_code OUT NOCOPY VARCHAR2
3661 )
3662 IS
3663 l_int_party_id NUMBER ;
3664 l_owner NUMBER := -1 ;
3665 l_count NUMBER := 0 ;
3666
3667 BEGIN
3668 IF csi_datastructures_pub.g_install_param_rec.fetch_flag IS NULL THEN
3669 csi_gen_utility_pvt.populate_install_param_rec;
3670 END IF;
3671 --
3672 l_int_party_id := csi_datastructures_pub.g_install_param_rec.internal_party_id;
3673 --
3674 BEGIN
3675 SELECT party_id
3676 INTO l_owner
3677 FROM csi_i_parties
3678 WHERE instance_id = p_instance_id
3679 AND relationship_type_code ='OWNER'
3680 AND (active_end_date >SYSDATE OR active_end_date IS NULL );
3681 EXCEPTION
3682 WHEN OTHERS THEN
3683 NULL;
3684 END;
3685
3686 BEGIN
3687 SELECT count(*)
3688 INTO l_count
3689 FROM csi_i_assets
3690 WHERE instance_id = p_instance_id
3691 AND (active_end_date >SYSDATE OR active_end_date IS NULL );
3692 EXCEPTION
3693 WHEN OTHERS THEN
3694 NULL;
3695 END;
3696
3697 IF l_owner = l_int_party_id THEN
3698
3699 IF l_count > 0 THEN
3700 x_acct_class_code := 'ASSET';
3701 ELSIF p_loc_type_code = 'WIP' THEN
3702 x_acct_class_code := 'WIP';
3703 ELSIF p_loc_type_code = 'PROJECT' THEN
3704 x_acct_class_code := 'PROJECT';
3705 ELSE
3706 x_acct_class_code := 'INV';
3707 END IF;
3708 ELSE
3709 IF ((p_curr_acct_class_code IS NULL) OR
3710 (p_curr_acct_class_code = FND_API.G_MISS_CHAR)) THEN
3711 x_acct_class_code := 'CUST_PROD';
3712 ELSE
3713 IF (p_curr_acct_class_code = 'WIP') OR
3714 (p_curr_acct_class_code = 'PROJECT') THEN
3715 x_acct_class_code := 'CUST_PROD';
3716 ELSE
3717 x_acct_class_code := p_curr_acct_class_code;
3718 END IF;
3719 END IF;
3720
3721 END IF;
3722 END;
3723
3724 /*-----------------------------------------------------------*/
3725 /* Procedure name: Is_InstanceID_Valid */
3726 /* Description : Check if the instance_id */
3727 /* exists in csi_item_instances */
3728 /*-----------------------------------------------------------*/
3729
3730 FUNCTION Is_InstanceID_Valid
3731 (
3732 p_instance_id IN NUMBER,
3733 p_stack_err_msg IN BOOLEAN
3734 ) RETURN BOOLEAN IS
3735
3736 l_instance_id NUMBER;
3737 l_return_value BOOLEAN := TRUE;
3738
3739 BEGIN
3740
3741 BEGIN
3742 SELECT instance_id
3743 INTO l_instance_id
3744 FROM csi_item_instances
3745 WHERE instance_id = p_instance_id;
3746 l_return_value := TRUE;
3747 EXCEPTION
3748 WHEN NO_DATA_FOUND THEN
3749 l_return_value := FALSE;
3750 IF ( p_stack_err_msg = TRUE ) THEN
3751 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_INSTANCE_ID');
3752 FND_MESSAGE.SET_TOKEN('INSTANCE_ID',p_instance_id);
3753 FND_MSG_PUB.Add;
3754 END IF;
3755 END;
3756 RETURN l_return_value;
3757 END Is_InstanceID_Valid;
3758
3759 /*-----------------------------------------------------------*/
3760 /* Function name: EndDate_Valid */
3761 /* Description : Check if item instance active end */
3762 /* date is valid */
3763 /*-----------------------------------------------------------*/
3764
3765 FUNCTION EndDate_Valid
3766 (
3767 p_start_date IN DATE,
3768 p_end_date IN DATE,
3769 p_instance_id IN NUMBER,
3770 p_transaction_id IN NUMBER, -- Bug 9081875
3771 p_stack_err_msg IN BOOLEAN
3772 ) RETURN BOOLEAN IS
3773
3774 l_instance_end_date DATE;
3775 l_instance_start_date DATE;
3776 l_return_value BOOLEAN := TRUE;
3777 l_temp VARCHAR2(1);
3778 l_txn_date DATE;
3779
3780 CURSOR c1 IS
3781 SELECT active_end_date,
3782 active_start_date
3783 FROM csi_item_instances
3784 WHERE instance_id = p_instance_id;
3785
3786 BEGIN
3787 IF ((p_end_date is NOT NULL) AND (p_end_date <> FND_API.G_MISS_DATE)) THEN
3788 OPEN c1;
3789 FETCH c1 INTO l_instance_end_date ,l_instance_start_date;
3790 IF trunc(p_end_date) < trunc(l_instance_start_date) THEN
3791 l_return_value := FALSE;
3792 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_END_DATE');
3793 FND_MESSAGE.SET_TOKEN('END_DATE_ACTIVE',to_char(p_end_date,'DD-MON-YYYY HH24:MI:SS'));
3794 FND_MSG_PUB.Add;
3795 RETURN l_return_value;
3796 csi_gen_utility_pvt.put_line('value of end date in ITEM_VLD_PVT before check for p_end_date < sysdate:'||to_char(p_end_date, 'DD-MON-YYYY HH24:MI:SS'));
3797 csi_gen_utility_pvt.put_line('value of sysdate:'||to_char(sysdate,'DD-MON-YYYY HH24:MI:SS'));
3798 ELSIF p_end_date < sysdate THEN -- srramakr
3799 BEGIN
3800 SELECT MAX(source_transaction_date)
3801 INTO l_txn_date
3802 FROM csi_inst_transactions_v
3803 WHERE instance_id=p_instance_id
3804 AND transaction_id <> p_transaction_id -- Bug 9081875
3805 AND source_transaction_date>p_end_date;
3806 csi_gen_utility_pvt.put_line('value of end date in ITEM_VLD_PVT after check for p_end_date < sysdate:'||to_char(p_end_date, 'DD-MON-YYYY HH24:MI:SS'));
3807 csi_gen_utility_pvt.put_line('value of l_instance_end_date :'||to_char(l_instance_end_date, 'DD-MON-YYYY HH24:MI:SS')); -- Bug 9081875
3808 csi_gen_utility_pvt.put_line('value of MAX(transaction_date) in ITEM_VLD_PVT:'||to_char(l_txn_date, 'DD-MON-YYYY HH24:MI:SS'));
3809 csi_gen_utility_pvt.put_line('value of instance_id in ITEM_VLD_PVT:'||p_instance_id);
3810 EXCEPTION
3811 WHEN NO_DATA_FOUND THEN
3812 l_return_value := TRUE;
3813 RETURN l_return_value;
3814 END;
3815
3816 IF l_txn_date IS NOT NULL
3817 THEN
3818 csi_gen_utility_pvt.put_line('value of end date in ITEM_VLD_PVT if there are any txns:'||to_char(p_end_date, 'DD-MON-YYYY HH24:MI:SS'));
3819 csi_gen_utility_pvt.put_line('value of MAX(source_transaction_date) in ITEM_VLD_PVT if there are any txns:'||to_char(l_txn_date, 'DD-MON-YYYY HH24:MI:SS'));
3820 csi_gen_utility_pvt.put_line('value of instance_id in ITEM_VLD_PVT, if there are any txns:'||p_instance_id);
3821 l_return_value := FALSE;
3822 FND_MESSAGE.Set_Name('CSI', 'CSI_PARENT_HAS_TXN');
3823 FND_MESSAGE.SET_TOKEN('INSTANCE_ID',p_instance_id );
3824 FND_MESSAGE.SET_TOKEN('TXN_DATE',to_char(l_txn_date, 'DD-MON-YYYY HH24:MI:SS'));
3825 FND_MSG_PUB.ADD;
3826 RETURN l_return_value;
3827 END IF;
3828 END IF;
3829 CLOSE c1;
3830 END IF;
3831 RETURN l_return_value;
3832 END EndDate_Valid;
3833
3834 /*-----------------------------------------------------*/
3835 /* Validates the item instance ID */
3836 /* Used exclusively by copy item instance */
3837 /*-----------------------------------------------------*/
3838
3839 FUNCTION Val_and_get_inst_rec
3840 ( p_item_instance_id IN NUMBER,
3841 p_instance_rec OUT NOCOPY csi_datastructures_pub.instance_rec,
3842 p_stack_err_msg IN BOOLEAN
3843 ) RETURN BOOLEAN IS
3844 BEGIN
3845 SELECT
3846 INSTANCE_ID ,
3847 INSTANCE_NUMBER ,
3848 EXTERNAL_REFERENCE ,
3849 LAST_VLD_ORGANIZATION_ID ,
3850 INVENTORY_ITEM_ID ,
3851 INVENTORY_REVISION ,
3852 INV_MASTER_ORGANIZATION_ID ,
3853 SERIAL_NUMBER ,
3854 MFG_SERIAL_NUMBER_FLAG ,
3855 LOT_NUMBER ,
3856 QUANTITY ,
3857 UNIT_OF_MEASURE ,
3858 ACCOUNTING_CLASS_CODE ,
3859 INSTANCE_CONDITION_ID ,
3860 INSTANCE_STATUS_ID ,
3861 CUSTOMER_VIEW_FLAG ,
3862 MERCHANT_VIEW_FLAG ,
3863 SELLABLE_FLAG ,
3864 SYSTEM_ID ,
3865 INSTANCE_TYPE_CODE ,
3866 ACTIVE_START_DATE ,
3867 ACTIVE_END_DATE ,
3868 LOCATION_TYPE_CODE ,
3869 LOCATION_ID ,
3870 INV_ORGANIZATION_ID ,
3871 INV_SUBINVENTORY_NAME ,
3872 INV_LOCATOR_ID ,
3873 PA_PROJECT_ID ,
3874 PA_PROJECT_TASK_ID ,
3875 IN_TRANSIT_ORDER_LINE_ID ,
3876 WIP_JOB_ID ,
3877 PO_ORDER_LINE_ID ,
3878 LAST_OE_ORDER_LINE_ID ,
3879 LAST_OE_RMA_LINE_ID ,
3880 LAST_PO_PO_LINE_ID ,
3881 LAST_OE_PO_NUMBER ,
3882 LAST_WIP_JOB_ID ,
3883 LAST_PA_PROJECT_ID ,
3884 LAST_PA_TASK_ID ,
3885 LAST_OE_AGREEMENT_ID ,
3886 INSTALL_DATE ,
3887 MANUALLY_CREATED_FLAG ,
3888 RETURN_BY_DATE ,
3889 ACTUAL_RETURN_DATE ,
3890 CREATION_COMPLETE_FLAG ,
3891 COMPLETENESS_FLAG ,
3892 CONTEXT ,
3893 ATTRIBUTE1 ,
3894 ATTRIBUTE2 ,
3895 ATTRIBUTE3 ,
3896 ATTRIBUTE4 ,
3897 ATTRIBUTE5 ,
3898 ATTRIBUTE6 ,
3899 ATTRIBUTE7 ,
3900 ATTRIBUTE8 ,
3901 ATTRIBUTE9 ,
3902 ATTRIBUTE10 ,
3903 ATTRIBUTE11 ,
3904 ATTRIBUTE12 ,
3905 ATTRIBUTE13 ,
3906 ATTRIBUTE14 ,
3907 ATTRIBUTE15 ,
3908 OBJECT_VERSION_NUMBER ,
3909 instance_usage_code , --Added for bug 2163942
3910 install_location_type_code ,
3911 install_location_id ,
3912 source_code -- Added for bug 7156553, base bug 6990065
3913 INTO
3914 p_instance_rec.INSTANCE_ID ,
3915 p_instance_rec.INSTANCE_NUMBER ,
3916 p_instance_rec.EXTERNAL_REFERENCE ,
3917 p_instance_rec.VLD_ORGANIZATION_ID ,
3918 p_instance_rec.INVENTORY_ITEM_ID ,
3919 p_instance_rec.INVENTORY_REVISION ,
3920 p_instance_rec.INV_MASTER_ORGANIZATION_ID ,
3921 p_instance_rec.SERIAL_NUMBER ,
3922 p_instance_rec.MFG_SERIAL_NUMBER_FLAG ,
3923 p_instance_rec.LOT_NUMBER ,
3924 p_instance_rec.QUANTITY ,
3925 p_instance_rec.UNIT_OF_MEASURE ,
3926 p_instance_rec.ACCOUNTING_CLASS_CODE ,
3927 p_instance_rec.INSTANCE_CONDITION_ID ,
3928 p_instance_rec.INSTANCE_STATUS_ID ,
3929 p_instance_rec.CUSTOMER_VIEW_FLAG ,
3930 p_instance_rec.MERCHANT_VIEW_FLAG ,
3931 p_instance_rec.SELLABLE_FLAG ,
3932 p_instance_rec.SYSTEM_ID ,
3933 p_instance_rec.INSTANCE_TYPE_CODE ,
3934 p_instance_rec.ACTIVE_START_DATE ,
3935 p_instance_rec.ACTIVE_END_DATE ,
3936 p_instance_rec.LOCATION_TYPE_CODE ,
3937 p_instance_rec.LOCATION_ID ,
3938 p_instance_rec.INV_ORGANIZATION_ID ,
3939 p_instance_rec.INV_SUBINVENTORY_NAME ,
3940 p_instance_rec.INV_LOCATOR_ID ,
3941 p_instance_rec.PA_PROJECT_ID ,
3942 p_instance_rec.PA_PROJECT_TASK_ID ,
3943 p_instance_rec.IN_TRANSIT_ORDER_LINE_ID ,
3944 p_instance_rec.WIP_JOB_ID ,
3945 p_instance_rec.PO_ORDER_LINE_ID ,
3946 p_instance_rec.LAST_OE_ORDER_LINE_ID ,
3947 p_instance_rec.LAST_OE_RMA_LINE_ID ,
3948 p_instance_rec.LAST_PO_PO_LINE_ID ,
3949 p_instance_rec.LAST_OE_PO_NUMBER ,
3950 p_instance_rec.LAST_WIP_JOB_ID ,
3951 p_instance_rec.LAST_PA_PROJECT_ID ,
3952 p_instance_rec.LAST_PA_TASK_ID ,
3953 p_instance_rec.LAST_OE_AGREEMENT_ID ,
3954 p_instance_rec.INSTALL_DATE ,
3955 p_instance_rec.MANUALLY_CREATED_FLAG ,
3956 p_instance_rec.RETURN_BY_DATE ,
3957 p_instance_rec.ACTUAL_RETURN_DATE ,
3958 p_instance_rec.CREATION_COMPLETE_FLAG ,
3959 p_instance_rec.COMPLETENESS_FLAG ,
3960 p_instance_rec.CONTEXT ,
3961 p_instance_rec.ATTRIBUTE1 ,
3962 p_instance_rec.ATTRIBUTE2 ,
3963 p_instance_rec.ATTRIBUTE3 ,
3964 p_instance_rec.ATTRIBUTE4 ,
3965 p_instance_rec.ATTRIBUTE5 ,
3966 p_instance_rec.ATTRIBUTE6 ,
3967 p_instance_rec.ATTRIBUTE7 ,
3968 p_instance_rec.ATTRIBUTE8 ,
3969 p_instance_rec.ATTRIBUTE9 ,
3970 p_instance_rec.ATTRIBUTE10 ,
3971 p_instance_rec.ATTRIBUTE11 ,
3972 p_instance_rec.ATTRIBUTE12 ,
3973 p_instance_rec.ATTRIBUTE13 ,
3974 p_instance_rec.ATTRIBUTE14 ,
3975 p_instance_rec.ATTRIBUTE15 ,
3976 p_instance_rec.OBJECT_VERSION_NUMBER ,
3977 p_instance_rec.instance_usage_code ,--Added for bug 2163942
3978 p_instance_rec.install_location_type_code ,
3979 p_instance_rec.install_location_id ,
3980 p_instance_rec.source_code --Added for bug 7156553, base bug 6990065
3981 FROM csi_item_instances
3982 WHERE instance_id = p_item_instance_id;
3983
3984 RETURN TRUE;
3985
3986
3987 EXCEPTION
3988 WHEN NO_DATA_FOUND THEN
3989 IF ( p_stack_err_msg = TRUE ) THEN
3990 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_INSTANCE');
3991 FND_MESSAGE.SET_TOKEN('INSTANCE_ID',p_item_instance_id);
3992 FND_MSG_PUB.Add;
3993 END IF;
3994 RETURN FALSE;
3995
3996 END Val_and_get_inst_rec;
3997
3998 /*-----------------------------------------------------*/
3999 /* Function : To get extended attrib level */
4000 /* Used exclusively by copy item instance */
4001 /*-----------------------------------------------------*/
4002
4003 FUNCTION get_ext_attrib_level
4004 ( p_ATTRIBUTE_ID IN NUMBER,
4005 p_ATTRIBUTE_LEVEL OUT NOCOPY VARCHAR2,
4006 p_stack_err_msg IN BOOLEAN
4007 ) RETURN BOOLEAN IS
4008
4009 BEGIN
4010
4011 SELECT attribute_level
4012 INTO p_ATTRIBUTE_LEVEL
4013 FROM csi_i_extended_attribs
4014 WHERE attribute_id = p_ATTRIBUTE_ID;
4015 RETURN TRUE;
4016 EXCEPTION
4017 WHEN NO_DATA_FOUND THEN
4018 IF ( p_stack_err_msg = TRUE ) THEN
4019 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_ATTRIBUTE_ID');
4020 FND_MESSAGE.SET_TOKEN('ATTRIBUTE_ID',p_ATTRIBUTE_ID);
4021 FND_MSG_PUB.Add;
4022 END IF;
4023 RETURN FALSE;
4024
4025
4026 END get_ext_attrib_level;
4027
4028 /*-----------------------------------------------------*/
4029 /* Function : val_item_org */
4030 /* To validate item and org */
4031 /*-----------------------------------------------------*/
4032
4033 FUNCTION val_item_org
4034 ( p_INVENTORY_ITEM_ID IN NUMBER,
4035 p_ORGANIZATION_ID IN VARCHAR2,
4036 p_stack_err_msg IN BOOLEAN
4037 ) RETURN BOOLEAN IS
4038
4039 l_dummy VARCHAR2(2);
4040
4041 BEGIN
4042 IF ((p_ORGANIZATION_ID = FND_API.G_MISS_NUM)
4043 OR (p_ORGANIZATION_ID IS NULL)
4044 OR (p_INVENTORY_ITEM_ID = FND_API.G_MISS_NUM)
4045 OR (p_INVENTORY_ITEM_ID IS NULL))
4046 THEN
4047 IF ( p_stack_err_msg = TRUE ) THEN
4048 FND_MESSAGE.SET_NAME('CSI','CSI_API_NULL_ITEM_ORG');
4049 FND_MESSAGE.SET_TOKEN('ITEM_ORG_ID',p_INVENTORY_ITEM_ID||' ' ||p_ORGANIZATION_ID);
4050 FND_MSG_PUB.Add;
4051 END IF;
4052 RETURN FALSE;
4053 END IF;
4054
4055
4056 SELECT '1'
4057 INTO l_dummy
4058 FROM mtl_system_items
4059 WHERE inventory_item_id = p_INVENTORY_ITEM_ID
4060 AND organization_id = p_ORGANIZATION_ID;
4061 RETURN TRUE;
4062 EXCEPTION
4063 WHEN NO_DATA_FOUND THEN
4064 IF ( p_stack_err_msg = TRUE ) THEN
4065 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_ITEM_ORG');
4066 FND_MESSAGE.SET_TOKEN('ITEM_ORG_ID',p_INVENTORY_ITEM_ID||' ' ||p_ORGANIZATION_ID);
4067 FND_MSG_PUB.Add;
4068 END IF;
4069 RETURN FALSE;
4070
4071 END val_item_org;
4072
4073 /*-----------------------------------------------------*/
4074 /* Function : val_bom_org */
4075 /* To validate bom and org */
4076 /*-----------------------------------------------------*/
4077
4078 FUNCTION val_bom_org
4079 ( p_INVENTORY_ITEM_ID IN NUMBER,
4080 p_ORGANIZATION_ID IN VARCHAR2,
4081 p_stack_err_msg IN BOOLEAN
4082 ) RETURN BOOLEAN IS
4083
4084 l_dummy VARCHAR2(2);
4085
4086 BEGIN
4087 IF ((p_ORGANIZATION_ID = FND_API.G_MISS_NUM)
4088 OR (p_ORGANIZATION_ID IS NULL)
4089 OR (p_INVENTORY_ITEM_ID = FND_API.G_MISS_NUM)
4090 OR (p_INVENTORY_ITEM_ID IS NULL))
4091 THEN
4092 IF ( p_stack_err_msg = TRUE ) THEN
4093 FND_MESSAGE.SET_NAME('CSI','CSI_API_NULL_ITEM_ORG');
4094 FND_MESSAGE.SET_TOKEN('ITEM_ORG_ID',p_INVENTORY_ITEM_ID||' ' ||p_ORGANIZATION_ID);
4095 FND_MSG_PUB.Add;
4096 END IF;
4097 RETURN FALSE;
4098 END IF;
4099
4100
4101 SELECT '1'
4102 INTO l_dummy
4103 FROM bom_bill_of_materials
4104 WHERE assembly_item_id = p_INVENTORY_ITEM_ID
4105 AND organization_id = p_ORGANIZATION_ID
4106 AND alternate_bom_designator IS NULL; -- srramakr
4107 RETURN TRUE;
4108 EXCEPTION
4109 WHEN NO_DATA_FOUND THEN
4110 IF ( p_stack_err_msg = TRUE ) THEN
4111 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_BOM_ORG');
4112 FND_MESSAGE.SET_TOKEN('BOM_ORG_ID',p_INVENTORY_ITEM_ID||' ' ||p_ORGANIZATION_ID);
4113 FND_MSG_PUB.Add;
4114 END IF;
4115 RETURN FALSE;
4116
4117 END val_bom_org;
4118
4119 /*-----------------------------------------------------*/
4120 /* Function : val_inst_ter_flag */
4121 /* To validate instances with statuses */
4122 /* having termination_flag set to 'Y' */
4123 /* has a end_date */
4124 /*-----------------------------------------------------*/
4125
4126 FUNCTION val_inst_ter_flag
4127 ( p_status_id IN NUMBER,
4128 p_stack_err_msg IN BOOLEAN
4129 ) RETURN BOOLEAN IS
4130
4131 l_dummy VARCHAR2(2);
4132
4133 BEGIN
4134
4135 SELECT '1'
4136 INTO l_dummy
4137 FROM csi_instance_statuses
4138 WHERE instance_status_id = p_status_id
4139 AND terminated_flag = 'Y';
4140 RETURN TRUE;
4141
4142 EXCEPTION
4143 WHEN NO_DATA_FOUND THEN
4144 RETURN FALSE;
4145
4146 END val_inst_ter_flag;
4147
4148 /*-----------------------------------------------------*/
4149 /* Function : Is_config_exploded */
4150 /* To check if the configuration for */
4151 /* the item has been exploded ever */
4152 /* before in Istalled Base */
4153 /*-----------------------------------------------------*/
4154
4155 FUNCTION Is_config_exploded
4156 ( p_instance_id IN NUMBER,
4157 p_stack_err_msg IN BOOLEAN
4158 ) RETURN BOOLEAN
4159 IS
4160
4161 l_dummy VARCHAR2(2);
4162
4163 BEGIN
4164
4165 SELECT '1'
4166 INTO l_dummy
4167 FROM csi_ii_relationships
4168 WHERE object_id = p_instance_id
4169 and ((active_end_date is null) or (active_end_date > sysdate))
4170 and relationship_type_code = 'COMPONENT-OF'
4171 and rownum < 2;
4172 IF ( p_stack_err_msg = TRUE ) THEN
4173 FND_MESSAGE.SET_NAME('CSI','CSI_CONFIG_EXPLODED');
4174 FND_MESSAGE.SET_TOKEN('INSTANCE_ID',p_instance_id);
4175 FND_MSG_PUB.Add;
4176 END IF;
4177 RETURN TRUE;
4178
4179 EXCEPTION
4180 WHEN NO_DATA_FOUND THEN
4181 RETURN FALSE;
4182
4183 END Is_config_exploded;
4184
4185 /*-----------------------------------------------------------*/
4186 /* Procedure name: Is_Ver_StartDate_Valid */
4187 /* Description : Check if Version Label's active start */
4188 /* date is valid */
4189 /*-----------------------------------------------------------*/
4190
4191 FUNCTION Is_Ver_StartDate_Valid
4192 ( p_start_date IN DATE,
4193 p_end_date IN DATE,
4194 p_instance_id IN NUMBER,
4195 p_stack_err_msg IN BOOLEAN DEFAULT TRUE
4196 ) RETURN BOOLEAN IS
4197
4198 l_instance_start_date DATE;
4199 l_instance_end_date DATE;
4200 l_return_value BOOLEAN := TRUE;
4201
4202 CURSOR c1 IS
4203 SELECT active_start_date,
4204 active_end_date
4205 FROM csi_item_instances
4206 WHERE instance_id = p_instance_id
4207 and ((active_end_date is null) OR (To_Date(active_end_date,'DD-MM-RRRR HH24:MI') >= To_Date(sysdate,'DD-MM-RRRR HH24:MI'))); -- Bug 8586745
4208
4209 BEGIN
4210 IF ((p_end_date is NOT NULL) AND (p_end_date <> FND_API.G_MISS_DATE))THEN
4211 IF To_Date(p_start_date,'DD-MM-RRRR HH24:MI') > To_Date(p_end_date,'DD-MM-RRRR HH24:MI') THEN -- Bug 8586745
4212 l_return_value := FALSE;
4213 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVAL_VER_START_DATE');
4214 FND_MESSAGE.SET_TOKEN('ACTIVE_START_DATE',p_start_date);
4215 FND_MSG_PUB.Add;
4216 RETURN l_return_value;
4217 END IF;
4218 END IF;
4219
4220 OPEN c1;
4221 FETCH c1 INTO l_instance_start_date,l_instance_end_date;
4222 IF c1%NOTFOUND THEN
4223 l_return_value := FALSE;
4224 IF ( p_stack_err_msg = TRUE ) THEN
4225 FND_MESSAGE.SET_NAME('CSI','CSI_API_INST_START_DATE');
4226 FND_MESSAGE.SET_NAME('ENTITY','VERSION LABEL');
4227 FND_MSG_PUB.Add;
4228 END IF;
4229 CLOSE c1;
4230 RETURN l_return_value;
4231 END IF;
4232
4233 IF ((p_start_date < l_instance_start_date)
4234 OR ((l_instance_end_date IS NOT NULL) AND (p_start_date > l_instance_end_date))
4235 OR (p_start_date > SYSDATE)) THEN
4236 l_return_value := FALSE;
4237 IF ( p_stack_err_msg = TRUE ) THEN
4238 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVAL_VER_START_DATE');
4239 FND_MESSAGE.SET_TOKEN('ACTIVE_START_DATE',p_start_date);
4240 FND_MSG_PUB.Add;
4241 END IF;
4242 END IF;
4243 RETURN l_return_value;
4244 END Is_Ver_StartDate_Valid;
4245
4246
4247 /*-----------------------------------------------------------*/
4248 /* Procedure name: Is_Ver_EndDate_Valid */
4249 /* Description : Check if version labels active end date */
4250 /* is valid */
4251 /*-----------------------------------------------------------*/
4252
4253 FUNCTION Is_Ver_EndDate_Valid
4254 (
4255 p_start_date IN DATE,
4256 p_end_date IN DATE,
4257 p_instance_id IN NUMBER,
4258 p_stack_err_msg IN BOOLEAN
4259 ) RETURN BOOLEAN IS
4260
4261 l_instance_end_date DATE;
4262 l_instance_start_date DATE;
4263 l_return_value BOOLEAN := TRUE;
4264
4265 CURSOR c1 IS
4266 SELECT active_end_date,
4267 active_start_date
4268 FROM csi_item_instances
4269 WHERE instance_id = p_instance_id
4270 and ((active_end_date is null) OR (To_Date(active_end_date,'DD-MM-RRRR HH24:MI') >= To_Date(sysdate,'DD-MM-RRRR HH24:MI'))); -- Bug 8586745
4271
4272 BEGIN
4273 IF p_end_date is NOT NULL THEN
4274 IF To_Date(p_end_date,'DD-MM-RRRR HH24:MI') < To_Date(sysdate,'DD-MM-RRRR HH24:MI') THEN -- Bug 8586745
4275 l_return_value := FALSE;
4276 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVAL_VER_END_DATE');
4277 FND_MESSAGE.SET_TOKEN('ACTIVE_END_DATE',p_end_date);
4278 FND_MSG_PUB.Add;
4279 RETURN l_return_value;
4280 END IF;
4281 END IF;
4282
4283 OPEN c1;
4284 FETCH c1 INTO l_instance_end_date ,l_instance_start_date;
4285
4286 IF l_instance_end_date is NOT NULL THEN
4287 IF ((p_end_date > l_instance_end_date) OR
4288 (p_end_date < l_instance_start_date))THEN
4289 l_return_value := FALSE;
4290 IF ( p_stack_err_msg = TRUE ) THEN
4291 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVAL_VER_END_DATE');
4292 FND_MESSAGE.SET_TOKEN('ACTIVE_END_DATE',p_end_date);
4293 FND_MSG_PUB.Add;
4294 END IF;
4295 END IF;
4296 END IF;
4297 CLOSE c1;
4298 RETURN l_return_value;
4299
4300 END Is_Ver_EndDate_Valid;
4301 --
4302 FUNCTION Is_Valid_Location_ID
4303 (
4304 p_location_source_table IN VARCHAR2,
4305 p_location_id IN NUMBER
4306 )
4307 RETURN BOOLEAN IS
4308 l_dummy NUMBER;
4309 l_return_value BOOLEAN;
4310 p_stack_err_msg BOOLEAN;
4311 l_location_lookup_type VARCHAR2(30) := 'CSI_INST_LOCATION_SOURCE_CODE';
4312 l_location_source_table VARCHAR2(30);
4313 BEGIN
4314 IF csi_datastructures_pub.g_install_param_rec.fetch_flag IS NULL THEN
4315 csi_gen_utility_pvt.populate_install_param_rec;
4316 END IF;
4317 --
4318 IF csi_datastructures_pub.g_install_param_rec.fetch_flag = 'N' THEN
4319 FND_MESSAGE.SET_NAME('CSI','CSI_API_UNINSTALLED_PARAMETER');
4320 FND_MSG_PUB.ADD;
4321 l_return_value := FALSE;
4322 RETURN l_return_value;
4323 END IF;
4324 --
4325 -- srramakr Removed the references to Location IDs in CSI_INSTALL_PARAMETERS as they are derived
4326 -- from HR_ALL_ORGANIZATION_UNITS upfront.
4327 --
4328 l_return_value := TRUE;
4329 --
4330 -- Validate the Location Type and check if exists in csi_lookups table with type
4331 -- CSI_INST_LOCATION_SOURCE_CODE. If not raise the CSI_API_INVALID_LOCATION_TYPE exception
4332 -- Added the following code for R12
4333 IF ((p_location_source_table IS NULL) OR (p_location_source_table = FND_API.G_MISS_CHAR) OR
4334 (p_location_id IS NULL) OR (p_location_id = FND_API.G_MISS_NUM) )
4335 THEN
4336 FND_MESSAGE.SET_NAME('CSI','CSI_API_LOCATION_NOT_VALID');
4337 FND_MSG_PUB.ADD;
4338 l_return_value := FALSE;
4339 RETURN l_return_value;
4340 END IF;
4341
4342 -- Validate location type code
4343 BEGIN
4344 SELECT lookup_code
4345 INTO l_location_source_table
4346 FROM csi_lookups
4347 WHERE lookup_code = upper(p_location_source_table)
4348 AND lookup_type = l_location_lookup_type;
4349 l_return_value := TRUE;
4350
4351 EXCEPTION
4352 WHEN NO_DATA_FOUND THEN
4353 l_return_value := FALSE;
4354 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_LOC_SOURCE');
4355 FND_MESSAGE.SET_TOKEN('LOCATION_SOURCE_TABLE',p_location_source_table);
4356 FND_MSG_PUB.Add;
4357 RETURN l_return_value;
4358 END;
4359 -- End addition of code for R12
4360
4361 IF (p_location_source_table = 'HZ_PARTY_SITES') THEN
4362 BEGIN
4363 SELECT party_site_id
4364 INTO l_dummy
4365 FROM HZ_PARTY_SITES
4366 WHERE party_site_id = p_location_id;
4367 l_return_value := TRUE;
4368 EXCEPTION
4369 WHEN NO_DATA_FOUND THEN
4370 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_PARTY_LOC_ID');
4371 FND_MESSAGE.SET_TOKEN('LOCATION_ID',p_location_id);
4372 FND_MSG_PUB.Add;
4373 l_return_value := FALSE;
4374 RETURN l_return_value;
4375 END;
4376 ELSIF (p_location_source_table = 'HZ_LOCATIONS') THEN
4377 BEGIN
4378 SELECT location_id
4379 INTO l_dummy
4380 FROM hz_locations
4381 WHERE location_id = p_location_id;
4382 l_return_value :=TRUE;
4383 EXCEPTION
4384 WHEN NO_DATA_FOUND THEN
4385 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_HZ_LOC_ID');
4386 FND_MESSAGE.SET_TOKEN('LOCATION_ID',p_location_id);
4387 FND_MSG_PUB.Add;
4388 l_return_value :=FALSE;
4389 RETURN l_return_value;
4390 END;
4391 ELSIF (p_location_source_table = 'VENDOR_SITE') THEN
4392 BEGIN
4393 SELECT vendor_site_id
4394 INTO l_dummy
4395 FROM po_vendor_sites_all
4396 WHERE vendor_site_id = p_location_id;
4397 l_return_value := TRUE;
4398 EXCEPTION
4399 WHEN NO_DATA_FOUND THEN
4400 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_VEND_LOC_ID');
4401 FND_MESSAGE.SET_TOKEN('LOCATION_ID',p_location_id);
4402 FND_MSG_PUB.Add;
4403 l_return_value := FALSE;
4404 RETURN l_return_value;
4405 END;
4406 ELSIF (p_location_source_table = 'INVENTORY') THEN
4407 BEGIN
4408 SELECT location_id
4409 INTO l_dummy
4410 FROM hr_locations_all
4411 WHERE location_id = p_location_id;
4412 l_return_value := TRUE;
4413 EXCEPTION
4414 WHEN NO_DATA_FOUND THEN
4415 l_return_value := FALSE;
4416 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_INV_LOCATION');
4417 FND_MESSAGE.SET_TOKEN('LOCATION_ID',p_location_id);
4418 FND_MSG_PUB.Add;
4419 RETURN l_return_value;
4420 END;
4421 ELSIF (p_location_source_table = 'PROJECT') THEN
4422 -- srramakr PROJECT location could from HR or HZ. Since they share the same sequence,
4423 -- we first check against HR, if not found then HZ.
4424 BEGIN
4425 SELECT location_id
4426 INTO l_dummy
4427 FROM hr_locations_all
4428 WHERE location_id = p_location_id;
4429 l_return_value := TRUE;
4430 EXCEPTION
4431 WHEN NO_DATA_FOUND THEN
4432 BEGIN
4433 SELECT location_id
4434 INTO l_dummy
4435 FROM hz_locations
4436 WHERE location_id = p_location_id;
4437 l_return_value :=TRUE;
4438 EXCEPTION
4439 WHEN NO_DATA_FOUND THEN
4440 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_INT_LOC_ID');
4441 FND_MESSAGE.SET_TOKEN('LOCATION_ID',p_location_id);
4442 FND_MSG_PUB.Add;
4443 l_return_value := FALSE;
4444 RETURN l_return_value;
4445 END;
4446 END;
4447 ELSIF (p_location_source_table IN ('INTERNAL_SITE','WIP','IN_TRANSIT','PO')) THEN
4448 BEGIN
4449 SELECT location_id
4450 INTO l_dummy
4451 FROM hr_locations_all
4452 WHERE location_id = p_location_id;
4453 l_return_value := TRUE;
4454 EXCEPTION
4455 WHEN NO_DATA_FOUND THEN
4456 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_INT_LOC_ID');
4457 FND_MESSAGE.SET_TOKEN('LOCATION_ID',p_location_id);
4458 FND_MSG_PUB.Add;
4459 l_return_value := FALSE;
4460 RETURN l_return_value;
4461 END;
4462 ELSIF p_location_source_table IN ( 'HR_LOCATIONS') THEN
4463 BEGIN
4464 SELECT location_id
4465 INTO l_dummy
4466 FROM hr_locations_all
4467 WHERE location_id = p_location_id;
4468 l_return_value := TRUE;
4469 EXCEPTION
4470 WHEN NO_DATA_FOUND THEN
4471 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_INT_LOC_ID');
4472 FND_MESSAGE.SET_TOKEN('LOCATION_ID',p_location_id);
4473 FND_MSG_PUB.Add;
4474 l_return_value := FALSE;
4475 RETURN l_return_value;
4476 END;
4477 ELSE
4478 l_return_value := FALSE;
4479 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_LOC_SOURCE');
4480 FND_MESSAGE.SET_TOKEN('LOCATION_SOURCE_TABLE',p_location_source_table);
4481 FND_MSG_PUB.Add;
4482 END IF;
4483 RETURN l_return_value;
4484 END Is_Valid_Location_ID;
4485 --
4486 FUNCTION Validate_Related_Loc_Params
4487 (
4488 p_location_source_table IN VARCHAR2,
4489 p_location_id IN NUMBER,
4490 p_organization_id IN NUMBER,
4491 p_subinventory IN VARCHAR2,
4492 p_locator_id IN NUMBER,
4493 p_project_id IN NUMBER,
4494 p_task_id IN NUMBER,
4495 p_sales_ord_line_id IN NUMBER,
4496 p_wip_job_id IN NUMBER,
4497 p_po_line_id IN NUMBER,
4498 p_inst_usage_code IN VARCHAR2
4499 )
4500 RETURN BOOLEAN IS
4501
4502 l_location_source_table VARCHAR2(30);
4503 l_temp_id NUMBER;
4504 l_return_value BOOLEAN;
4505 p_stack_err_msg BOOLEAN;
4506 BEGIN
4507
4508 -- Get the values of installation parameters
4509 IF (p_location_source_table = 'HZ_PARTY_SITES') THEN
4510 IF ((p_project_id IS NULL) OR (p_project_id = FND_API.G_MISS_NUM)) AND
4511 ((p_task_id IS NULL) OR (p_task_id = FND_API.G_MISS_NUM)) AND
4512 ((p_sales_ord_line_id IS NULL) OR (p_sales_ord_line_id = FND_API.G_MISS_NUM)) AND
4513 ((p_po_line_id IS NULL) OR (p_po_line_id = FND_API.G_MISS_NUM)) AND
4514 ((p_organization_id IS NULL) OR (p_organization_id = FND_API.G_MISS_NUM)) AND
4515 ((p_subinventory IS NULL) OR (p_subinventory = FND_API.G_MISS_CHAR)) AND
4516 ((p_locator_id IS NULL) OR (p_locator_id = FND_API.G_MISS_NUM)) AND
4517 ((p_wip_job_id IS NULL) OR (p_wip_job_id = FND_API.G_MISS_NUM)) THEN
4518 l_return_value:= TRUE;
4519 ELSE
4520 l_return_value:= FALSE;
4521 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_LOC_PARAMS');
4522 FND_MSG_PUB.Add;
4523 RETURN l_return_value;
4524 END IF;
4525 END IF;
4526 --
4527 IF (p_location_source_table = 'HZ_LOCATIONS') THEN
4528
4529 IF --((p_project_id IS NULL) OR (p_project_id = FND_API.G_MISS_NUM)) AND
4530 --((p_task_id IS NULL) OR (p_task_id = FND_API.G_MISS_NUM)) AND
4531 ((p_sales_ord_line_id IS NULL) OR (p_sales_ord_line_id = FND_API.G_MISS_NUM)) AND
4532 ((p_po_line_id IS NULL) OR (p_po_line_id = FND_API.G_MISS_NUM)) AND
4533 ((p_organization_id IS NULL) OR (p_organization_id = FND_API.G_MISS_NUM)) AND
4534 ((p_subinventory IS NULL) OR (p_subinventory = FND_API.G_MISS_CHAR)) AND
4535 ((p_locator_id IS NULL) OR (p_locator_id = FND_API.G_MISS_NUM)) AND
4536 ((p_wip_job_id IS NULL) OR (p_wip_job_id = FND_API.G_MISS_NUM)) THEN
4537 l_return_value:= TRUE;
4538 ELSE
4539 l_return_value:= FALSE;
4540 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_LOC_PARAMS');
4541 FND_MSG_PUB.Add;
4542 RETURN l_return_value;
4543 END IF;
4544 -----------
4545 IF ( (p_project_id IS NOT NULL AND p_project_id <> FND_API.G_MISS_NUM) OR
4546 (p_task_id IS NOT NULL AND p_task_id <> FND_API.G_MISS_NUM) ) THEN
4547 -- Modified for tracking FP bug 7276773 from base bug 6330298
4548 IF (p_inst_usage_code = 'INSTALLED' OR p_inst_usage_code = 'IN_PROCESS') THEN
4549 BEGIN
4550 SELECT '1'
4551 INTO l_temp_id
4552 FROM pa_tasks
4553 WHERE project_id = p_project_id
4554 AND task_id = p_task_id;
4555 EXCEPTION
4556 WHEN NO_DATA_FOUND THEN
4557 l_return_value:= FALSE;
4558 FND_MESSAGE.SET_NAME('CSI','CSI_API_INV_PROJ_LOC_ID');
4559 FND_MESSAGE.SET_TOKEN('PROJECT_ID',p_project_id||'-'||p_task_id);
4560 FND_MSG_PUB.Add;
4561 RETURN l_return_value;
4562 END;
4563 ELSE
4564 l_return_value:= FALSE;
4565 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_LOC_PARAMS');
4566 FND_MSG_PUB.Add;
4567 RETURN l_return_value;
4568 END IF; -- usage code = 'INSTALLED'
4569 END IF; -- Project id , task id provided
4570
4571 END IF; -- location type is HZ_LOCATIONS
4572 --
4573 IF (p_location_source_table = 'VENDOR_SITE') THEN
4574
4575 IF ((p_project_id IS NULL) OR (p_project_id = FND_API.G_MISS_NUM)) AND
4576 ((p_task_id IS NULL) OR (p_task_id = FND_API.G_MISS_NUM)) AND
4577 ((p_sales_ord_line_id IS NULL) OR (p_sales_ord_line_id = FND_API.G_MISS_NUM)) AND
4578 ((p_po_line_id IS NULL) OR (p_po_line_id = FND_API.G_MISS_NUM)) AND
4579 ((p_organization_id IS NULL) OR (p_organization_id = FND_API.G_MISS_NUM)) AND
4580 ((p_subinventory IS NULL) OR (p_subinventory = FND_API.G_MISS_CHAR)) AND
4581 ((p_locator_id IS NULL) OR (p_locator_id = FND_API.G_MISS_NUM)) AND
4582 ((p_wip_job_id IS NULL) OR (p_wip_job_id = FND_API.G_MISS_NUM)) THEN
4583 l_return_value:= TRUE;
4584 ELSE
4585 l_return_value:= FALSE;
4586 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_LOC_PARAMS');
4587 FND_MSG_PUB.Add;
4588 RETURN l_return_value;
4589 END IF;
4590 END IF;
4591 --
4592 IF (p_location_source_table = 'INVENTORY') THEN
4593
4594 IF (p_location_id IS NOT NULL) THEN
4595 IF p_inst_usage_code <> 'IN_TRANSIT' THEN
4596 IF ((p_organization_id IS NOT NULL) AND (p_organization_id <> FND_API.G_MISS_NUM)) AND
4597 ((p_subinventory IS NOT NULL) AND (p_subinventory <> FND_API.G_MISS_CHAR)) THEN
4598 -- l_return_value := TRUE;
4599 BEGIN
4600 SELECT '1'
4601 INTO l_temp_id
4602 FROM mtl_secondary_inventories
4603 WHERE secondary_inventory_name = p_subinventory AND
4604 organization_id = p_organization_id;
4605 l_return_value := TRUE;
4606
4607 EXCEPTION
4608 WHEN NO_DATA_FOUND THEN
4609 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_INV_LOC_ID');
4610 FND_MESSAGE.SET_TOKEN('SUBINVENTORY',p_subinventory);
4611 FND_MSG_PUB.Add;
4612 l_return_value := FALSE;
4613 RETURN l_return_value;
4614 END;
4615 -- Validate Locator_ID srramakr
4616 IF ((p_locator_id IS NOT NULL) AND (p_locator_id <> FND_API.G_MISS_NUM)) THEN
4617 BEGIN
4618 SELECT '1'
4619 INTO l_temp_id
4620 FROM MTL_ITEM_LOCATIONS
4621 WHERE inventory_location_id = p_locator_id
4622 AND organization_id = p_organization_id
4623 AND subinventory_code = p_subinventory;
4624 --
4625 l_return_value := TRUE;
4626 EXCEPTION
4627 WHEN NO_DATA_FOUND THEN
4628 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_INV_LOC_ID');
4629 FND_MESSAGE.SET_TOKEN('LOCATOR_ID',p_locator_id);
4630 FND_MSG_PUB.Add;
4631 l_return_value := FALSE;
4632 RETURN l_return_value;
4633 END;
4634 END IF;
4635 ELSE
4636 l_return_value := FALSE;
4637 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_INVENTORY_LOC');
4638 FND_MSG_PUB.Add;
4639 RETURN l_return_value;
4640 END IF;
4641 END IF;
4642 END IF;
4643
4644 IF ((p_project_id IS NULL) OR (p_project_id = FND_API.G_MISS_NUM)) AND
4645 ((p_task_id IS NULL) OR (p_task_id = FND_API.G_MISS_NUM)) AND
4646 ((p_sales_ord_line_id IS NULL) OR (p_sales_ord_line_id = FND_API.G_MISS_NUM)) AND
4647 ((p_po_line_id IS NULL) OR (p_po_line_id = FND_API.G_MISS_NUM)) AND
4648 ((p_wip_job_id IS NULL) OR (p_wip_job_id = FND_API.G_MISS_NUM)) THEN
4649 l_return_value:= TRUE;
4650 ELSE
4651 l_return_value:= FALSE;
4652 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_LOC_PARAMS');
4653 FND_MSG_PUB.Add;
4654 RETURN l_return_value;
4655 END IF;
4656 END IF; -- INVENTORY
4657 --
4658 IF (p_location_source_table = 'INTERNAL_SITE') THEN
4659 l_return_value := TRUE;
4660 IF ((p_project_id IS NULL) OR (p_project_id = FND_API.G_MISS_NUM)) AND
4661 ((p_task_id IS NULL) OR (p_task_id = FND_API.G_MISS_NUM)) AND
4662 ((p_sales_ord_line_id IS NULL) OR (p_sales_ord_line_id = FND_API.G_MISS_NUM)) AND
4663 ((p_po_line_id IS NULL) OR (p_po_line_id = FND_API.G_MISS_NUM)) AND
4664 ((p_organization_id IS NULL) OR (p_organization_id = FND_API.G_MISS_NUM)) AND
4665 ((p_subinventory IS NULL) OR (p_subinventory = FND_API.G_MISS_CHAR)) AND
4666 ((p_locator_id IS NULL) OR (p_locator_id = FND_API.G_MISS_NUM)) AND
4667 ((p_wip_job_id IS NULL) OR (p_wip_job_id = FND_API.G_MISS_NUM)) THEN
4668 l_return_value:= TRUE;
4669 ELSE
4670 l_return_value:= FALSE;
4671 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_LOC_PARAMS');
4672 FND_MSG_PUB.Add;
4673 RETURN l_return_value;
4674 END IF;
4675 END IF;
4676 --
4677 IF (p_location_source_table = 'WIP') THEN
4678 BEGIN
4679 SELECT '1'
4680 INTO l_temp_id
4681 FROM wip_entities
4682 WHERE wip_entity_id = p_wip_job_id;
4683
4684 IF ((p_project_id IS NULL) OR (p_project_id = FND_API.G_MISS_NUM)) AND
4685 ((p_task_id IS NULL) OR (p_task_id = FND_API.G_MISS_NUM)) AND
4686 ((p_sales_ord_line_id IS NULL) OR (p_sales_ord_line_id = FND_API.G_MISS_NUM)) AND
4687 ((p_po_line_id IS NULL) OR (p_po_line_id = FND_API.G_MISS_NUM)) AND
4688 ((p_organization_id IS NULL) OR (p_organization_id = FND_API.G_MISS_NUM)) AND
4689 ((p_subinventory IS NULL) OR (p_subinventory = FND_API.G_MISS_CHAR)) AND
4690 ((p_locator_id IS NULL) OR (p_locator_id = FND_API.G_MISS_NUM)) THEN
4691 l_return_value:= TRUE;
4692 ELSE
4693 l_return_value:= FALSE;
4694 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_LOC_PARAMS');
4695 FND_MSG_PUB.Add;
4696 RETURN l_return_value;
4697 END IF;
4698
4699 EXCEPTION
4700 WHEN NO_DATA_FOUND THEN
4701 l_return_value:= FALSE;
4702 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_WIP_JOB_ID');
4703 FND_MESSAGE.SET_TOKEN('WIP_JOB_ID',p_wip_job_id);
4704 FND_MSG_PUB.Add;
4705 RETURN l_return_value;
4706 END;
4707 --
4708 ELSIF (p_location_source_table = 'PROJECT') THEN
4709
4710 BEGIN
4711 SELECT '1'
4712 INTO l_temp_id
4713 FROM pa_tasks
4714 WHERE project_id = p_project_id
4715 AND task_id = p_task_id;
4716
4717 IF ((p_sales_ord_line_id IS NULL) OR (p_sales_ord_line_id = FND_API.G_MISS_NUM)) AND
4718 ((p_po_line_id IS NULL) OR (p_po_line_id = FND_API.G_MISS_NUM)) AND
4719 ((p_wip_job_id IS NULL) OR (p_wip_job_id = FND_API.G_MISS_NUM)) AND
4720 ((p_organization_id IS NULL) OR (p_organization_id = FND_API.G_MISS_NUM)) AND
4721 ((p_subinventory IS NULL) OR (p_subinventory = FND_API.G_MISS_CHAR)) AND
4722 ((p_locator_id IS NULL) OR (p_locator_id = FND_API.G_MISS_NUM)) THEN
4723 l_return_value:= TRUE;
4724 ELSE
4725 l_return_value:= FALSE;
4726 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_LOC_PARAMS');
4727 FND_MSG_PUB.Add;
4728 RETURN l_return_value;
4729 END IF;
4730
4731 EXCEPTION
4732 WHEN NO_DATA_FOUND THEN
4733 l_return_value:= FALSE;
4734 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_PROJ_LOC_ID');
4735 FND_MESSAGE.SET_TOKEN('PROJECT_ID',p_project_id||'-'||p_task_id);
4736 FND_MSG_PUB.Add;
4737 RETURN l_return_value;
4738 END;
4739
4740 ELSIF (p_location_source_table = 'IN_TRANSIT') THEN
4741 BEGIN
4742 SELECT '1'
4743 INTO l_temp_id
4744 FROM oe_order_lines_all
4745 WHERE line_id = p_sales_ord_line_id;
4746
4747 IF ((p_project_id IS NULL) OR (p_project_id = FND_API.G_MISS_NUM)) AND
4748 ((p_task_id IS NULL) OR (p_task_id = FND_API.G_MISS_NUM)) AND
4749 ((p_po_line_id IS NULL) OR (p_po_line_id = FND_API.G_MISS_NUM)) AND
4750 ((p_wip_job_id IS NULL) OR (p_wip_job_id = FND_API.G_MISS_NUM)) AND
4751 ((p_organization_id IS NULL) OR (p_organization_id = FND_API.G_MISS_NUM)) AND
4752 ((p_subinventory IS NULL) OR (p_subinventory = FND_API.G_MISS_CHAR)) AND
4753 ((p_locator_id IS NULL) OR (p_locator_id = FND_API.G_MISS_NUM)) THEN
4754 l_return_value:= TRUE;
4755 ELSE
4756 l_return_value:= FALSE;
4757 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_LOC_PARAMS');
4758 FND_MSG_PUB.Add;
4759 RETURN l_return_value;
4760 END IF;
4761
4762 EXCEPTION
4763 WHEN NO_DATA_FOUND THEN
4764 l_return_value:= FALSE;
4765 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_INT_ORDER_ID');
4766 FND_MESSAGE.SET_TOKEN('IN_TRANSIT_ID',p_sales_ord_line_id);
4767 FND_MSG_PUB.Add;
4768 RETURN l_return_value;
4769 END;
4770 --
4771 ELSIF (p_location_source_table = 'PO') THEN
4772 BEGIN
4773 SELECT '1'
4774 INTO l_temp_id
4775 FROM po_lines_all
4776 WHERE po_line_id = p_po_line_id;
4777
4778 IF ((p_sales_ord_line_id IS NULL) OR (p_sales_ord_line_id = FND_API.G_MISS_NUM)) AND
4779 ((p_project_id IS NULL) OR (p_project_id = FND_API.G_MISS_NUM)) AND
4780 ((p_task_id IS NULL) OR (p_task_id = FND_API.G_MISS_NUM)) AND
4781 ((p_wip_job_id IS NULL) OR (p_wip_job_id = FND_API.G_MISS_NUM)) AND
4782 ((p_organization_id IS NULL) OR (p_organization_id = FND_API.G_MISS_NUM)) AND
4783 ((p_subinventory IS NULL) OR (p_subinventory = FND_API.G_MISS_CHAR)) AND
4784 ((p_locator_id IS NULL) OR (p_locator_id = FND_API.G_MISS_NUM)) THEN
4785 l_return_value:= TRUE;
4786 ELSE
4787 l_return_value:= FALSE;
4788 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_LOC_PARAMS');
4789 FND_MSG_PUB.Add;
4790 FND_MSG_PUB.Add;
4791 RETURN l_return_value;
4792 END IF;
4793 EXCEPTION
4794 WHEN NO_DATA_FOUND THEN
4795 l_return_value:= FALSE;
4796 FND_MESSAGE.SET_NAME('CSI','CSI_API_INVALID_PO_LOC_ID');
4797 FND_MESSAGE.SET_TOKEN('PO_LINE_ID',p_po_line_id);
4798 FND_MSG_PUB.Add;
4799 RETURN l_return_value;
4800 END;
4801 END IF;
4802 RETURN l_return_value;
4803 END Validate_Related_Loc_Params;
4804
4805 -- Added by sguthiva for att enhancements
4806
4807 /*-----------------------------------------------------------*/
4808 /* Procedure name: get_link_locations */
4809 /* Description : Retreive the Location Parameters from */
4810 /* associated instances of an instance of */
4811 /* instance item class link */
4812 /*-----------------------------------------------------------*/
4813 PROCEDURE get_link_locations
4814 (p_instance_header_tbl IN OUT NOCOPY csi_datastructures_pub.instance_header_tbl,
4815 x_return_status OUT NOCOPY VARCHAR2
4816 ) IS
4817 l_object_id NUMBER;
4818 l_subject_id NUMBER;
4819 l_header_tbl csi_datastructures_pub.instance_header_tbl ;
4820 l_temp_header_tbl csi_datastructures_pub.instance_header_tbl ;
4821 l_link_type VARCHAR2(30);
4822 i NUMBER;
4823
4824 CURSOR link_csr(p_instance_id NUMBER) IS
4825 SELECT object_id,subject_id
4826 FROM csi_ii_relationships
4827 WHERE ( subject_id=p_instance_id
4828 OR object_id=p_instance_id)
4829 AND relationship_type_code ='CONNECTED-TO'
4830 AND SYSDATE BETWEEN NVL(active_start_date, SYSDATE) AND NVL(active_end_date, SYSDATE);
4831 BEGIN
4832 x_return_status := FND_API.G_RET_STS_SUCCESS;
4833 -- Need to get the schema name using FND API. Refer Bug # 3431768
4834 --
4835 FOR l_link IN p_instance_header_tbl.FIRST..p_instance_header_tbl.LAST
4836 LOOP
4837 SELECT nvl(ib_item_instance_class,'X')
4838 INTO l_link_type
4839 FROM mtl_system_items_b
4840 WHERE inventory_item_id=p_instance_header_tbl(l_link).inventory_item_id
4841 AND organization_id=p_instance_header_tbl(l_link).vld_organization_id;
4842
4843 IF l_link_type='LINK'
4844 THEN
4845 i:=1;
4846 l_header_tbl:=l_temp_header_tbl;
4847 FOR l_link_csr IN link_csr(p_instance_header_tbl(l_link).instance_id)
4848 LOOP
4849 IF l_link_csr.object_id= p_instance_header_tbl(l_link).instance_id
4850 THEN
4851 l_header_tbl(i).instance_id := l_link_csr.subject_id;
4852 END IF;
4853
4854 IF l_link_csr.subject_id= p_instance_header_tbl(l_link).instance_id
4855 THEN
4856 l_header_tbl(i).instance_id := l_link_csr.object_id;
4857 END IF;
4858 i:=i+1;
4859 END LOOP;
4860
4861 IF l_header_tbl.COUNT>0
4862 THEN
4863 IF l_header_tbl(1).instance_id IS NOT NULL AND
4864 l_header_tbl(1).instance_id <> FND_API.G_MISS_NUM
4865 THEN
4866 BEGIN
4867 SELECT location_id,
4868 location_type_code
4869 INTO l_header_tbl(1).location_id,
4870 l_header_tbl(1).location_type_code
4871 FROM csi_item_instances
4872 WHERE instance_id=l_header_tbl(1).instance_id;
4873 EXCEPTION
4874 WHEN OTHERS THEN
4875 NULL;
4876 END;
4877 --
4878 IF l_header_tbl.COUNT>1
4879 THEN
4880 IF l_header_tbl(2).instance_id IS NOT NULL AND
4881 l_header_tbl(2).instance_id <> FND_API.G_MISS_NUM
4882 THEN
4883
4884 BEGIN
4885 SELECT location_id,
4886 location_type_code
4887 INTO l_header_tbl(2).location_id,
4888 l_header_tbl(2).location_type_code
4889 FROM csi_item_instances
4890 WHERE instance_id=l_header_tbl(2).instance_id;
4891 EXCEPTION
4892 WHEN OTHERS THEN
4893 NULL;
4894 END;
4895 END IF;
4896 END IF;
4897
4898 csi_item_instance_pvt.resolve_id_columns
4899 (p_instance_header_tbl => l_header_tbl);
4900
4901 p_instance_header_tbl(l_link).start_loc_address1 := l_header_tbl(1).current_loc_address1;
4902 p_instance_header_tbl(l_link).start_loc_address2 := l_header_tbl(1).current_loc_address2;
4903 p_instance_header_tbl(l_link).start_loc_address3 := l_header_tbl(1).current_loc_address3;
4904 p_instance_header_tbl(l_link).start_loc_address4 := l_header_tbl(1).current_loc_address4;
4905 p_instance_header_tbl(l_link).start_loc_city := l_header_tbl(1).current_loc_city;
4906 p_instance_header_tbl(l_link).start_loc_state := l_header_tbl(1).current_loc_state;
4907 p_instance_header_tbl(l_link).start_loc_postal_code := l_header_tbl(1).current_loc_postal_code;
4908 p_instance_header_tbl(l_link).start_loc_country := l_header_tbl(1).current_loc_country;
4909 IF l_header_tbl.COUNT>1
4910 THEN
4911 p_instance_header_tbl(l_link).end_loc_address1 := l_header_tbl(2).current_loc_address1;
4912 p_instance_header_tbl(l_link).end_loc_address2 := l_header_tbl(2).current_loc_address2;
4913 p_instance_header_tbl(l_link).end_loc_address3 := l_header_tbl(2).current_loc_address3;
4914 p_instance_header_tbl(l_link).end_loc_address4 := l_header_tbl(2).current_loc_address4;
4915 p_instance_header_tbl(l_link).end_loc_city := l_header_tbl(2).current_loc_city;
4916 p_instance_header_tbl(l_link).end_loc_state := l_header_tbl(2).current_loc_state;
4917 p_instance_header_tbl(l_link).end_loc_postal_code := l_header_tbl(2).current_loc_postal_code;
4918 p_instance_header_tbl(l_link).end_loc_country := l_header_tbl(2).current_loc_country;
4919 END IF;
4920
4921 END IF;
4922 END IF;
4923 END IF;
4924 END LOOP;
4925 END get_link_locations;
4926
4927 PROCEDURE Call_batch_validate
4928 ( p_instance_rec IN csi_datastructures_pub.instance_rec
4929 ,p_config_hdr_id IN NUMBER
4930 ,p_config_rev_nbr IN NUMBER
4931 ,x_config_hdr_id OUT NOCOPY NUMBER
4932 ,x_config_rev_nbr OUT NOCOPY NUMBER
4933 ,x_return_status OUT NOCOPY VARCHAR2)
4934 IS
4935 l_xml_hdr VARCHAR2(2000);
4936 l_xml_message LONG := NULL;
4937
4938 BEGIN
4939 x_return_status:= FND_API.G_RET_STS_SUCCESS;
4940
4941 Create_hdr_xml
4942 ( p_config_hdr_id => p_config_hdr_id,
4943 p_config_rev_nbr => p_config_rev_nbr,
4944 p_config_inst_hdr_id => p_instance_rec.config_inst_hdr_id ,
4945 x_xml_hdr => l_xml_hdr,
4946 x_return_status => x_return_status);
4947
4948 csi_gen_utility_pvt.put_line('Status after calling Create_hdr_xml is '||x_return_status);
4949
4950 IF x_return_status = FND_API.G_RET_STS_ERROR THEN
4951 RAISE FND_API.G_EXC_ERROR;
4952 END IF;
4953
4954 Send_Input_xml
4955 ( p_xml_hdr => l_xml_hdr,
4956 x_out_xml_msg => l_xml_message,
4957 x_return_status => x_return_status);
4958
4959 csi_gen_utility_pvt.put_line('Status after calling Send_Input_xml is '||x_return_status);
4960
4961 IF x_return_status = FND_API.G_RET_STS_ERROR THEN
4962 RAISE FND_API.G_EXC_ERROR;
4963 END IF;
4964
4965 Parse_output_xml
4966 ( p_xml => l_xml_message,
4967 x_config_hdr_id => x_config_hdr_id,
4968 x_config_rev_nbr => x_config_rev_nbr,
4969 x_return_status => x_return_status );
4970
4971
4972 csi_gen_utility_pvt.put_line('Status after calling Parse_output_xml is '||x_return_status);
4973
4974 IF x_return_status = FND_API.G_RET_STS_ERROR THEN
4975 RAISE FND_API.G_EXC_ERROR;
4976 ELSIF x_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
4977 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4978 END IF;
4979
4980 EXCEPTION
4981 WHEN FND_API.G_EXC_ERROR THEN
4982 x_return_status := FND_API.G_RET_STS_ERROR;
4983 csi_gen_utility_pvt.put_line('An exp error raised');
4984
4985 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
4986 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4987 csi_gen_utility_pvt.put_line('An unexp error raised');
4988
4989 WHEN OTHERS THEN
4990 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4991 csi_gen_utility_pvt.put_line( 'Send_input_xml error: ' ||substr(sqlerrm,1,100));
4992
4993 END Call_batch_validate;
4994 --
4995 PROCEDURE decode_queue(p_pending_txn_tbl OUT NOCOPY csi_item_instance_pvt.T_NUM
4996 ,p_freeze_date IN DATE
4997 , p_source_transaction_date in date) is
4998 CURSOR msg_cur(l_min_creation_date DATE) is
4999 SELECT msg_id,
5000 msg_code,
5001 msg_status,
5002 body_text,
5003 creation_date,
5004 description
5005 FROM xnp_msgs
5006 WHERE (msg_code like 'CSI%' OR msg_code like 'CSE%')
5007 -- AND nvl(msg_status, 'READY') <> 'PROCESSED' -- COmmented for Bug 3987286
5008 AND msg_status in ('READY','FAILED')
5009 AND msg_creation_date > p_freeze_date
5010 AND creation_date < l_min_creation_date -- Bug 14712665
5011 AND recipient_name is null;
5012
5013 l_amount integer;
5014 l_msg_text varchar2(32767);
5015 l_source_id varchar2(200);
5016 l_ctr number;
5017 l_min_creation_date DATE; -- Bug 14712665
5018 l_loop_count NUMBER := 0;
5019
5020 BEGIN
5021 p_pending_txn_tbl.DELETE;
5022 l_ctr := 0;
5023 l_min_creation_date := trunc(nvl(p_source_transaction_date, sysdate)) + 1;-- Bug 14712665
5024 FOR msg_rec in msg_cur(l_min_creation_date)
5025 LOOP
5026 l_loop_count := l_loop_count +1;
5027 l_amount := null;
5028 l_amount := dbms_lob.getlength(msg_rec.body_text);
5029 l_msg_text := null;
5030
5031 dbms_lob.read(
5032 lob_loc => msg_rec.body_text,
5033 amount => l_amount,
5034 offset => 1,
5035 buffer => l_msg_text );
5036
5037 l_source_id := null;
5038
5039 IF msg_rec.msg_code in ('CSISOFUL', 'CSIRMAFL') THEN
5040 null;
5041 ELSE
5042 xnp_xml_utils.decode(l_msg_text, 'MTL_TRANSACTION_ID', l_source_id);
5043 END IF;
5044 --
5045 IF l_source_id IS NOT NULL THEN
5046 l_ctr := l_ctr + 1;
5047 p_pending_txn_tbl(l_ctr) := to_number(l_source_id);
5048 END IF;
5049 END LOOP;
5050 csi_gen_utility_pvt.put_line('end decode_queue');
5051 END decode_queue;
5052 --
5053 /*-----------------------------------------------------------*/
5054 /* Procedure name: Check_Prior_Txn */
5055 /* Description : Check if there is any transactions pending */
5056 /* this Item Instance prior to the current Txn */
5057 /* */
5058 /* If p_mode is CREATE then we need to get the pending txns */
5059 /* from the xnp_msgs by decoding the message. Each valid txn*/
5060 /* will be checked against this list for further processing */
5061 /*-----------------------------------------------------------*/
5062
5063 PROCEDURE Check_Prior_Txn
5064 ( p_instance_rec IN csi_datastructures_pub.instance_rec
5065 ,p_txn_rec IN csi_datastructures_pub.transaction_rec
5066 ,p_prior_txn_id OUT NOCOPY NUMBER
5067 ,p_mode IN VARCHAR2
5068 ,x_return_status OUT NOCOPY VARCHAR2
5069 ) AS
5070
5071 -- Added cursor for bug 6755879, FP of bug 6680634
5072 CURSOR err_txn_cur(
5073 p_transaction_id NUMBER,
5074 p_transfer_transaction_id NUMBER) IS
5075 SELECT inv_material_transaction_id
5076 FROM csi_txn_errors
5077 WHERE inv_material_transaction_id IS NOT NULL
5078 AND inv_material_transaction_id IN (p_transaction_id, p_transfer_transaction_id)
5079 AND processed_flag IN ('R','E');
5080
5081 --Added for Bug#14336404
5082 CURSOR mtl_txn_cur ( p_serial_number varchar2,
5083 p_inventory_item_id number) IS
5084 SELECT mut.transaction_id,
5085 msi.lot_control_code,
5086 msi.serial_number_control_code,
5087 msi.primary_uom_code,
5088 mmt.inventory_item_id,
5089 mmt.organization_id,
5090 mmt.transaction_date,
5091 mmt.creation_date,
5092 mmt.transfer_transaction_id,
5093 mmt.transaction_type_id,
5094 mmt.transaction_action_id,
5095 mmt.transaction_source_type_id,
5096 mmt.transaction_quantity,
5097 mmt.transaction_uom,
5098 mmt.primary_quantity,
5099 mmt.transaction_source_id,
5100 mmt.trx_source_line_id,
5101 NULL lot_number
5102 FROM mtl_unit_transactions mut,
5103 mtl_material_transactions mmt,
5104 mtl_system_items msi
5105 WHERE mut.serial_number = p_serial_number
5106 AND mut.inventory_item_id = p_inventory_item_id
5107 AND mmt.transaction_id = mut.transaction_id
5108 AND msi.inventory_item_id = mut.inventory_item_id
5109 AND msi.organization_id = mmt.organization_id
5110 AND msi.comms_nl_trackable_flag = 'Y'
5111 AND NOT EXISTS
5112 (SELECT 1 FROM csi_transactions
5113 WHERE inv_material_transaction_id = mmt.transaction_id)
5114 UNION ALL
5115 SELECT mut.transaction_id,
5116 msi.lot_control_code,
5117 msi.serial_number_control_code,
5118 msi.primary_uom_code,
5119 mmt.inventory_item_id,
5120 mmt.organization_id,
5121 mmt.transaction_date,
5122 mmt.creation_date,
5123 mmt.transfer_transaction_id,
5124 mmt.transaction_type_id,
5125 mmt.transaction_action_id,
5126 mmt.transaction_source_type_id,
5127 mmt.transaction_quantity,
5128 mmt.transaction_uom,
5129 mmt.primary_quantity,
5130 mmt.transaction_source_id,
5131 mmt.trx_source_line_id,
5132 mtln.lot_number
5133 FROM mtl_unit_transactions mut,
5134 mtl_transaction_lot_numbers mtln,
5135 mtl_material_transactions mmt,
5136 mtl_system_items msi
5137 WHERE mut.serial_number = p_serial_number
5138 AND mut.inventory_item_id = p_inventory_item_id
5139 AND mtln.organization_id = mut.organization_id
5140 AND mtln.transaction_date = mut.transaction_date
5141 AND mtln.serial_transaction_id = mut.transaction_id
5142 AND mmt.transaction_id = mtln.transaction_id
5143 AND msi.inventory_item_id = mut.inventory_item_id
5144 AND msi.comms_nl_trackable_flag = 'Y'
5145 AND NOT EXISTS
5146 (SELECT 1 FROM csi_transactions
5147 WHERE inv_material_transaction_id = mmt.transaction_id)
5148 ORDER BY 1 desc, 2 desc;
5149
5150 l_ind binary_integer := 0;
5151 -- Added for Bug#14336404
5152
5153 l_pending_txn_tbl csi_item_instance_pvt.T_NUM;
5154 --
5155 l_txn_seq_start_date DATE;
5156 l_max_csi_txn_id NUMBER;
5157 --
5158 l_src_txn_id NUMBER;
5159 l_src_txn_type_id NUMBER;
5160 l_min_txn_id NUMBER;
5161 l_xfer_mtl_txn_id NUMBER;
5162 l_src_txn_date DATE;
5163 l_cur_mtl_txn_id number;
5164 l_cur_mtl_txn_date DATE;
5165 l_mtl_txn_tbl csi_datastructures_pub.mtl_txn_tbl;
5166 l_txn_line_detail_id NUMBER;
5167 l_order_number NUMBER;
5168 l_line_number NUMBER;
5169 l_error_found varchar2(1);
5170 l_txn_found varchar2(1);
5171
5172 -- Added variables for bug 6755879, FP of bug 6680634
5173 l_err_mtl_txn_id NUMBER;
5174 l_err_mtl_txn_date DATE;
5175 l_temp_count number := 0; -- 14712665
5176
5177 -- Added for bug 9198245, FP of bug 7148814
5178 l_prev_mtl_txn_id NUMBER:=FND_API.G_MISS_NUM;
5179 l_min_inv_mtl_txn_id NUMBER:=FND_API.G_MISS_NUM;
5180 l_max_inv_mtl_txn_id NUMBER:=FND_API.G_MISS_NUM;
5181 BEGIN
5182 x_return_status := FND_API.G_RET_STS_SUCCESS;
5183 --
5184 csi_gen_utility_pvt.put_line('inside check_prior_txn');
5185
5186 IF p_instance_rec.inventory_item_id is NOT NULL AND p_instance_rec.inventory_item_id <> FND_API.G_MISS_NUM
5187 AND p_instance_rec.serial_number is NOT NULL AND p_instance_rec.serial_number <> FND_API.G_MISS_CHAR
5188 THEN
5189 IF csi_datastructures_pub.g_install_param_rec.fetch_flag IS NULL THEN
5190 csi_gen_utility_pvt.populate_install_param_rec;
5191 END IF;
5192
5193 l_txn_seq_start_date := nvl(csi_datastructures_pub.g_install_param_rec.txn_seq_start_date,
5194 csi_datastructures_pub.g_install_param_rec.freeze_date);
5195
5196 IF l_txn_seq_start_date IS NULL THEN
5197 FND_MESSAGE.SET_NAME('CSI','CSI_API_UNINSTALLED_PARAMETER');
5198 FND_MSG_PUB.ADD;
5199 raise fnd_api.g_exc_error;
5200 END IF;
5201
5202 IF p_instance_rec.last_txn_line_detail_id IS NULL OR
5203 p_instance_rec.last_txn_line_detail_id = FND_API.G_MISS_NUM THEN
5204 l_txn_line_detail_id := -9999;
5205 ELSE
5206 l_txn_line_detail_id := p_instance_rec.last_txn_line_detail_id;
5207 END IF;
5208 --
5209 l_cur_mtl_txn_id := NVL(p_txn_rec.inv_material_transaction_id,FND_API.G_MISS_NUM);
5210 IF l_cur_mtl_txn_id <> FND_API.G_MISS_NUM THEN
5211 Begin
5212 select creation_date
5213 into l_cur_mtl_txn_date
5214 from MTL_MATERIAL_TRANSACTIONS
5215 where transaction_id = l_cur_mtl_txn_id;
5216 Exception
5217 when no_data_found then
5218 l_cur_mtl_txn_date := sysdate;
5219 End;
5220 ELSE
5221 l_cur_mtl_txn_date := sysdate;
5222 END IF;
5223 -- Added debug lines for bug 6755879, FP of bug 6680634
5224 csi_gen_utility_pvt.put_line(' l_cur_mtl_txn_id : '||l_cur_mtl_txn_id);
5225 csi_gen_utility_pvt.put_line(' l_cur_mtl_txn_date : '||l_cur_mtl_txn_date);
5226
5227 IF p_mode <> 'CREATE' THEN -- Bug 14712665
5228 -- decode_queue(p_pending_txn_tbl => l_pending_txn_tbl
5229 -- ,p_freeze_date => csi_datastructures_pub.g_install_param_rec.freeze_date);
5230 -- For 'UPDATE' mode get the transactions starting from the src txn date used for instance creation.
5231 -- Bug # 4018629
5232 --ELSE -- Bug 14712665
5233 l_min_txn_id := NULL;
5234 l_src_txn_date := NULL;
5235 select min(transaction_id)
5236 into l_min_txn_id
5237 from csi_item_instances_h
5238 where instance_id = p_instance_rec.instance_id
5239 and creation_date = (select min(creation_date) from csi_item_instances_h
5240 where instance_id = p_instance_rec.instance_id
5241 );
5242 --
5243 IF l_min_txn_id IS NOT NULL THEN
5244 Begin
5245 select source_transaction_date
5246 into l_src_txn_date
5247 from csi_transactions
5248 where transaction_id = l_min_txn_id;
5249 Exception
5250 when no_data_found then
5251 null;
5252 End;
5253 END IF;
5254 --
5255 IF l_src_txn_date IS NOT NULL AND
5256 l_src_txn_date > l_txn_seq_start_date THEN
5257 l_txn_seq_start_date := l_src_txn_date;
5258 END IF;
5259
5260 -- Code added for bug 9198245, FP of bug 7294792 - Start
5261 BEGIN
5262 --Changed for Bug 13859378
5263 --Changed for Bug 15881410
5264 select /*+ leading(CSI_INST_TRANSACTIONS_V.cii,CSI_INST_TRANSACTIONS_V.v) index(csi_inst_transactions_v.t CSI_TRANSACTIONS_U01) */ min(inv_material_transaction_id) INTO l_min_inv_mtl_txn_id
5265 from CSI_INST_TRANSACTIONS_V
5266 where instance_id=p_instance_rec.instance_id
5267 AND inv_material_transaction_id is not NULL;
5268
5269 --Changed for Bug 13859378
5270 --Changed for Bug 15881410
5271 select /*+ leading(CSI_INST_TRANSACTIONS_V.cii,CSI_INST_TRANSACTIONS_V.v) index(csi_inst_transactions_v.t CSI_TRANSACTIONS_U01) */ max(inv_material_transaction_id) INTO l_max_inv_mtl_txn_id
5272 from CSI_INST_TRANSACTIONS_V
5273 where instance_id=p_instance_rec.instance_id
5274 AND inv_material_transaction_id is not NULL;
5275
5276
5277 EXCEPTION
5278 WHEN no_data_found THEN
5279 NULL;
5280 END;
5281
5282 -- Code added for bug 9198245, FP of bug 7294792 - End
5283 END IF;
5284 --
5285 --Added for bug#14336404
5286 FOR mtl_txn_rec IN mtl_txn_cur (p_serial_number => p_instance_rec.serial_number,
5287 p_inventory_item_id => p_instance_rec.inventory_item_id)
5288 LOOP
5289
5290 l_ind := l_ind + 1;
5291
5292 l_mtl_txn_tbl(l_ind).transaction_id := mtl_txn_rec.transaction_id;
5293 l_mtl_txn_tbl(l_ind).inventory_item_id := mtl_txn_rec.inventory_item_id;
5294 l_mtl_txn_tbl(l_ind).organization_id := mtl_txn_rec.organization_id;
5295 l_mtl_txn_tbl(l_ind).transaction_date := mtl_txn_rec.transaction_date;
5296 l_mtl_txn_tbl(l_ind).creation_date := mtl_txn_rec.creation_date;
5297 l_mtl_txn_tbl(l_ind).transfer_transaction_id := mtl_txn_rec.transfer_transaction_id;
5298 l_mtl_txn_tbl(l_ind).transaction_type_id := mtl_txn_rec.transaction_type_id;
5299 l_mtl_txn_tbl(l_ind).transaction_action_id := mtl_txn_rec.transaction_action_id;
5300 l_mtl_txn_tbl(l_ind).transaction_source_type_id := mtl_txn_rec.transaction_source_type_id;
5301 l_mtl_txn_tbl(l_ind).transaction_quantity := mtl_txn_rec.transaction_quantity;
5302 l_mtl_txn_tbl(l_ind).transaction_uom := mtl_txn_rec.transaction_uom;
5303 l_mtl_txn_tbl(l_ind).primary_quantity := mtl_txn_rec.primary_quantity;
5304 l_mtl_txn_tbl(l_ind).transaction_source_id := mtl_txn_rec.transaction_source_id;
5305 l_mtl_txn_tbl(l_ind).trx_source_line_id := mtl_txn_rec.trx_source_line_id;
5306 l_mtl_txn_tbl(l_ind).serial_control_code := mtl_txn_rec.serial_number_control_code;
5307 l_mtl_txn_tbl(l_ind).lot_control_code := mtl_txn_rec.lot_control_code;
5308 l_mtl_txn_tbl(l_ind).primary_uom := mtl_txn_rec.primary_uom_code;
5309 l_mtl_txn_tbl(l_ind).lot_number := mtl_txn_rec.lot_number;
5310
5311 END LOOP;
5312 --
5313 --Added for bug#14336404
5314 -- Commented for bug#14336404
5315 /* get_mtl_txn_for_srl(
5316 p_transaction_id => p_txn_rec.inv_material_transaction_id,--Added for bug#14835893
5317 p_inventory_item_id => p_instance_rec.inventory_item_id,
5318 p_serial_number => p_instance_rec.serial_number,
5319 x_mtl_txn_tbl => l_mtl_txn_tbl
5320 );*/
5321 -- Commented for bug#14336404
5322
5323 csi_gen_utility_pvt.put_line('l_mtl_txn_tbl.count : '||l_mtl_txn_tbl.count);
5324
5325 IF l_mtl_txn_tbl.count > 0 THEN
5326 IF p_mode = 'CREATE' THEN -- Bug 14712665
5327 FOR l_ind_c IN l_mtl_txn_tbl.FIRST .. l_mtl_txn_tbl.LAST
5328 LOOP
5329 IF l_mtl_txn_tbl(l_ind_c).creation_date > l_txn_seq_start_date
5330 AND l_mtl_txn_tbl(l_ind_c).creation_date < l_cur_mtl_txn_date
5331 AND l_mtl_txn_tbl(l_ind_c).transaction_id <> l_cur_mtl_txn_id
5332 THEN
5333 decode_queue(p_pending_txn_tbl => l_pending_txn_tbl
5334 ,p_freeze_date => csi_datastructures_pub.g_install_param_rec.freeze_date
5335 ,p_source_transaction_date => p_txn_rec.source_transaction_date);
5336 EXIT;
5337 END IF;
5338 l_temp_count := l_temp_count +1;
5339 END LOOP;
5340 end if; -- Bug 14712665
5341
5342 FOR l_ind IN l_mtl_txn_tbl.FIRST .. l_mtl_txn_tbl.LAST
5343 LOOP
5344 -- Added debug lines for bug 6755879, FP of bug 6680634
5345 csi_gen_utility_pvt.put_line('l_mtl_txn_tbl('||l_ind||').transaction_id : '
5346 ||l_mtl_txn_tbl(l_ind).transaction_id);
5347 csi_gen_utility_pvt.put_line('l_mtl_txn_tbl('||l_ind||').transfer_transaction_id : '
5348 ||l_mtl_txn_tbl(l_ind).transfer_transaction_id);
5349 IF l_mtl_txn_tbl(l_ind).creation_date > l_txn_seq_start_date
5350 AND l_mtl_txn_tbl(l_ind).creation_date < l_cur_mtl_txn_date
5351 AND l_mtl_txn_tbl(l_ind).transaction_id <> l_cur_mtl_txn_id
5352 THEN
5353 IF p_mode = 'CREATE' THEN
5354 IF l_pending_txn_tbl.count > 0 THEN
5355 IF l_pending_txn_tbl.exists(l_mtl_txn_tbl(l_ind).transaction_id) THEN
5356 fnd_message.set_name('CSI','CSI_PENDING_PRIOR_TXN');
5357 fnd_message.set_token('MAT_TXN_ID',l_mtl_txn_tbl(l_ind).transaction_id);
5358 fnd_msg_pub.add;
5359 p_prior_txn_id := l_mtl_txn_tbl(l_ind).transaction_id;
5360 raise fnd_api.g_exc_error;
5361 END IF;
5362 IF l_mtl_txn_tbl(l_ind).transfer_transaction_id is not null THEN
5363 IF l_pending_txn_tbl.exists(l_mtl_txn_tbl(l_ind).transfer_transaction_id) THEN
5364 fnd_message.set_name('CSI','CSI_PENDING_PRIOR_TXN');
5365 fnd_message.set_token('MAT_TXN_ID',l_mtl_txn_tbl(l_ind).transfer_transaction_id);
5366 fnd_msg_pub.add;
5367 p_prior_txn_id := l_mtl_txn_tbl(l_ind).transfer_transaction_id;
5368 RAISE fnd_api.g_exc_error;
5369 END IF;
5370 END IF;
5371 END IF;
5372 END IF;
5373 IF l_mtl_txn_tbl(l_ind).transfer_transaction_id is not null THEN
5374 l_xfer_mtl_txn_id := l_mtl_txn_tbl(l_ind).transfer_transaction_id;
5375 ELSE
5376 l_xfer_mtl_txn_id := -999999;
5377 END IF;
5378
5379 -- check against csi_txn_errors
5380 -- Begin modification for bug 6755879, FP of bug 6680634
5381 FOR err_txn_rec IN err_txn_cur(
5382 p_transaction_id => l_mtl_txn_tbl(l_ind).transaction_id,
5383 p_transfer_transaction_id => l_xfer_mtl_txn_id)
5384 LOOP
5385 l_err_mtl_txn_id := err_txn_rec.inv_material_transaction_id;
5386
5387 IF l_err_mtl_txn_id <> FND_API.G_MISS_NUM
5388 AND l_err_mtl_txn_id <> l_cur_mtl_txn_id THEN -- The errorred transaction is not the transaction currently being reprocessed
5389 BEGIN
5390 SELECT creation_date
5391 INTO l_err_mtl_txn_date
5392 FROM mtl_material_transactions
5393 WHERE transaction_id = l_err_mtl_txn_id;
5394 EXCEPTION
5395 WHEN NO_DATA_FOUND THEN
5396 NULL;
5397 END;
5398
5399 csi_gen_utility_pvt.put_line(' l_err_mtl_txn_id : '||l_err_mtl_txn_id);
5400 csi_gen_utility_pvt.put_line(' l_err_mtl_txn_date : '||l_err_mtl_txn_date);
5401
5402 IF (l_err_mtl_txn_date <> FND_API.G_MISS_DATE
5403 AND l_err_mtl_txn_date <= l_cur_mtl_txn_date)
5404 OR (l_err_mtl_txn_date = FND_API.G_MISS_DATE) THEN
5405 fnd_message.set_name('CSI','CSI_ERROR_PRIOR_TXN');
5406 fnd_message.set_token('MAT_TXN_ID',l_mtl_txn_tbl(l_ind).transaction_id);
5407 fnd_msg_pub.add;
5408 p_prior_txn_id := l_mtl_txn_tbl(l_ind).transaction_id;
5409 RAISE fnd_api.g_exc_error;
5410 END IF;
5411 END IF;
5412 END LOOP;
5413
5414 -- Add condition for bug 6755879, FP of bug 6680634
5415 IF p_mode <> 'CREATE' THEN
5416 BEGIN
5417
5418 -- Added condition for bug9198245, FP of bug 7294792
5419
5420 l_prev_mtl_txn_id:=l_mtl_txn_tbl(l_ind).transaction_id;
5421
5422 IF l_min_inv_mtl_txn_id <> FND_API.G_MISS_NUM AND l_max_inv_mtl_txn_id <> FND_API.G_MISS_NUM
5423 AND l_min_inv_mtl_txn_id<l_prev_mtl_txn_id AND l_prev_mtl_txn_id<l_max_inv_mtl_txn_id
5424 THEN
5425 SELECT 'Y'
5426 INTO l_txn_found
5427 FROM csi_transactions
5428 WHERE inv_material_transaction_id in (l_mtl_txn_tbl(l_ind).transaction_id, l_xfer_mtl_txn_id)
5429 AND rownum = 1;
5430
5431 end if;
5432 EXCEPTION
5433 WHEN no_data_found THEN
5434 fnd_message.set_name('CSI','CSI_PENDING_PRIOR_TXN');
5435 fnd_message.set_token('MAT_TXN_ID',l_mtl_txn_tbl(l_ind).transaction_id);
5436 fnd_msg_pub.add;
5437 p_prior_txn_id := l_mtl_txn_tbl(l_ind).transaction_id;
5438 RAISE fnd_api.g_exc_error;
5439 END;
5440 END IF;
5441 END IF;
5442 END LOOP;
5443 -- End modification for bug 6755879, FP of bug 6680634
5444 END IF;
5445 -- Check whether the instance_id resides in CSI_T_TXN_LINE_DETAILS in 'ERROR' status.
5446 l_src_txn_id := NULL;
5447 l_src_txn_type_id := NULL;
5448 Begin
5449 select line.source_transaction_id,line.source_transaction_type_id
5450 into l_src_txn_id,l_src_txn_type_id
5451 from CSI_T_TXN_LINE_DETAILS det,
5452 CSI_T_TRANSACTION_LINES line
5453 where ( (det.instance_id = p_instance_rec.instance_id) OR
5454 (det.inventory_item_id = p_instance_rec.inventory_item_id AND
5455 det.serial_number = p_instance_rec.serial_number) )
5456 and nvl(det.processing_status,'SUBMIT') = 'ERROR'
5457 and det.creation_date < p_txn_rec.source_transaction_date
5458 and det.txn_line_detail_id <> l_txn_line_detail_id
5459 and line.transaction_line_id = det.transaction_line_id
5460 and rownum = 1;
5461 Exception
5462 when no_data_found then
5463 null;
5464 End;
5465 --
5466 IF l_src_txn_id IS NOT NULL AND
5467 l_src_txn_type_id in (51,53,54) THEN
5468 Begin
5469 select hdr.order_number,line.line_number
5470 into l_order_number,l_line_number
5471 from oe_order_headers_all hdr
5472 ,oe_order_lines_all line
5473 where line.line_id = l_src_txn_id
5474 and hdr.header_id = line.header_id;
5475 Exception
5476 when no_data_found then
5477 null;
5478 End;
5479 FND_MESSAGE.SET_NAME('CSI','CSI_ERROR_INST_DETAILS');
5480 FND_MESSAGE.SET_TOKEN('ORDER_NUMBER',l_order_number);
5481 FND_MESSAGE.SET_TOKEN('LINE_NUMBER',l_line_number);
5482 FND_MSG_PUB.Add;
5483 RAISE fnd_api.g_exc_error;
5484 END IF;
5485 END IF; -- Item-srl# not null check
5486 EXCEPTION
5487 WHEN fnd_api.g_exc_error THEN
5488 x_return_status := FND_API.G_RET_STS_ERROR;
5489 END Check_Prior_Txn;
5490 --
5491 FUNCTION Is_Forward_Synch
5492 ( p_instance_id IN NUMBER,
5493 p_stop_all_txn IN VARCHAR2,
5494 p_mtl_txn_id IN NUMBER)
5495 RETURN BOOLEAN IS
5496 --
5497 l_return_value BOOLEAN;
5498 l_recount NUMBER;
5499 l_process_flag VARCHAR2(1) := 'P';
5500 l_mtl_txn_id NUMBER := NVL(p_mtl_txn_id,fnd_api.g_miss_num);
5501 l_def_cr_date DATE := sysdate;
5502 l_mtl_txn_cr_date DATE;
5503 BEGIN
5504 l_return_value := TRUE;
5505 --
5506 IF p_instance_id IS NOT NULL AND
5507 p_instance_id <> FND_API.G_MISS_NUM THEN
5508 l_recount := 0;
5509 IF nvl(p_stop_all_txn,FND_API.G_TRUE) = FND_API.G_TRUE THEN
5510 csi_gen_utility_pvt.put_line('Stop All Txns..');
5511 BEGIN
5512 select count(*)
5513 into l_recount
5514 from CSI_II_FORWARD_SYNC_TEMP
5515 where instance_id = p_instance_id
5516 and nvl(process_flag,'N') <> l_process_flag
5517 and ROWNUM = 1;
5518 EXCEPTION
5519 WHEN OTHERS THEN
5520 l_recount := 0;
5521 END;
5522 --
5523 ELSE
5524 csi_gen_utility_pvt.put_line('Stop Later Txns..');
5525 IF l_mtl_txn_id <> fnd_api.g_miss_num THEN
5526 Begin
5527 select creation_date
5528 into l_mtl_txn_cr_date
5529 from MTL_MATERIAL_TRANSACTIONS
5530 where transaction_id = l_mtl_txn_id;
5531 Exception
5532 when no_data_found then
5533 l_mtl_txn_cr_date := sysdate;
5534 End;
5535 ELSE
5536 l_mtl_txn_cr_date := sysdate;
5537 END IF;
5538 --
5539 BEGIN
5540 select count(*)
5541 into l_recount
5542 from CSI_II_FORWARD_SYNC_TEMP
5543 where instance_id = p_instance_id
5544 and nvl(process_flag,'N') <> l_process_flag
5545 and nvl(mtl_txn_creation_date,l_def_cr_date) < l_mtl_txn_cr_date
5546 and ROWNUM = 1;
5547 EXCEPTION
5548 WHEN OTHERS THEN
5549 l_recount := 0;
5550 END;
5551 END IF;
5552 --
5553 IF nvl(l_recount,0) > 0 THEN -- Forward Synch not performed
5554 l_return_value := FALSE;
5555 ELSE
5556 l_return_value := TRUE;
5557 END IF;
5558 --
5559 RETURN l_return_value;
5560 END IF;
5561 RETURN l_return_value;
5562 END Is_Forward_Synch;
5563 --
5564 FUNCTION Is_Valid_Master_Org
5565 ( p_master_org_id IN NUMBER )
5566 RETURN BOOLEAN IS
5567 --
5568 l_return_value BOOLEAN;
5569 l_exists VARCHAR2(1);
5570 BEGIN
5571 l_return_value := TRUE;
5572 IF p_master_org_id IS NULL OR
5573 p_master_org_id = FND_API.G_MISS_NUM THEN
5574 l_return_value := FALSE;
5575 RETURN l_return_value;
5576 END IF;
5577 --
5578 Begin
5579 select 'x'
5580 into l_exists
5581 from MTL_PARAMETERS
5582 where organization_id = p_master_org_id
5583 and master_organization_id = p_master_org_id;
5584 l_return_value := TRUE;
5585 Exception
5586 when no_data_found then
5587 l_return_value := FALSE;
5588 End;
5589 --
5590 RETURN l_return_value;
5591 END Is_Valid_Master_Org;
5592 --
5593 /*-------------------------------------------------------------------------
5594 Procedure Name : Create_hdr_xml
5595 Description : creates a batch validation header message.
5596 --------------------------------------------------------------------------*/
5597
5598 PROCEDURE Create_hdr_xml
5599 ( p_config_hdr_id IN NUMBER
5600 , p_config_rev_nbr IN NUMBER
5601 , p_config_inst_hdr_id IN NUMBER
5602 , x_xml_hdr OUT NOCOPY VARCHAR2 -- this needs to be passed to Send_input_xml
5603 , x_return_status OUT NOCOPY VARCHAR2 )
5604 IS
5605 /*TYPE param_name_type IS TABLE OF VARCHAR2(30)
5606 INDEX BY BINARY_INTEGER;
5607 TYPE param_value_type IS TABLE OF VARCHAR2(200)
5608 INDEX BY BINARY_INTEGER;*/
5609 param_name csi_datastructures_pub.parameter_name;
5610 param_value csi_datastructures_pub.parameter_value;
5611 l_rec_index BINARY_INTEGER;
5612 -- SPC specific params
5613 l_database_id VARCHAR2(100);
5614 l_save_config_behavior VARCHAR2(30):= 'new_config';
5615 l_ui_type VARCHAR2(30):= NULL;
5616 l_msg_behavior VARCHAR2(30):= 'brief';
5617 l_config_header_id VARCHAR2(80);
5618 l_config_rev_nbr VARCHAR2(80);
5619 l_count NUMBER;
5620 -- message related
5621 l_xml_hdr VARCHAR2(2000):= '<initialize>';
5622 l_dummy VARCHAR2(500) := NULL;
5623 l_debug_level NUMBER;
5624 l_icx_session_ticket VARCHAR2(200);
5625 BEGIN
5626 x_return_status:= FND_API.G_RET_STS_SUCCESS;
5627
5628
5629
5630 -- Now set the values from model_rec and org_id
5631 l_config_header_id := to_char(p_config_hdr_id);
5632 l_config_rev_nbr := to_char(p_config_rev_nbr);
5633
5634
5635 csi_gen_utility_pvt.put_line('Queried from oe_lines: ' ||
5636 ' config-hdr: ' || l_config_header_id ||
5637 ' config-rev: ' || l_config_rev_nbr );
5638
5639 -- profiles and env. variables.
5640 l_database_id := fnd_web_config.database_id;
5641 l_icx_session_ticket := cz_cf_api.icx_session_ticket;
5642
5643 csi_gen_utility_pvt.put_line('database_id: '||l_database_id);--,2);
5644
5645 -- Set param_names
5646 -- Always required
5647 param_name(1) := 'ui_type'; -- we are passing null
5648 -- DB connection parameters
5649 param_name(2) := 'database_id'; -- passing fnd_web_config.database_id
5650 -- Dates related parameters
5651 -- param_name(3) := 'config_creation_date'; -- passing oe_order_lines.creation_date
5652 -- Applicability parameters i.e model identification parameters
5653 -- 1 set is required
5654 -- Set 2 is not required . according to spec this set is used when the
5655 -- previously saved configuration is restored. I think this can be used in
5656 -- update_item_instance instead of create_item_instance.
5657 param_name(3) := 'config_header_id'; -- value is l_config_header_id
5658 param_name(4) := 'config_rev_nbr'; -- value is l_config_rev_nbr
5659
5660 -- Other applicability parameters
5661 param_name(5) := 'calling_application_id'; -- Required parameter
5662 param_name(6) := 'sbm_flag'; -- TRUE is passed
5663 param_name(7) := 'responsibility_id';
5664 param_name(8) := 'save_config_behavior';
5665 param_name(9) := 'terminate_msg_behavior';
5666 param_name(10) := 'validation_context';
5667 param_name(11) := 'suppress_baseline_errors';
5668 param_name(12) := 'icx_session_ticket';
5669
5670 -- In spec the following 2 parameters were newly added.
5671
5672
5673
5674
5675 l_count := 12;
5676
5677 param_value(1) := l_ui_type;
5678 param_value(2) := l_database_id;
5679 -- param_value(3) := to_char(l_line_rec.creation_date,'MM-DD-YYYY-HH24-MI-SS');
5680 param_value(3) := l_config_header_id;
5681 param_value(4) := l_config_rev_nbr;
5682 param_value(5) := fnd_profile.value('RESP_APPL_ID');
5683 param_value(6) := 'TRUE';
5684 param_value(7) := fnd_profile.value('RESP_ID');
5685 param_value(8) := l_save_config_behavior;
5686 param_value(9) := l_msg_behavior;
5687 param_value(10) := 'INSTALLED';
5688 param_value(11) := 'TRUE';
5689 param_value(12) := l_icx_session_ticket;
5690
5691
5692 csi_gen_utility_pvt.put_line('Inside Create_hdr_xml, parameters are set');
5693 l_rec_index := 1;
5694 LOOP
5695 IF (param_value(l_rec_index) IS NOT NULL) THEN
5696 l_dummy := '<param name=' ||
5697 '"' || param_name(l_rec_index) || '"'
5698 ||'>'|| param_value(l_rec_index) ||
5699 '</param>';
5700 l_xml_hdr := l_xml_hdr || l_dummy;
5701 END IF;
5702 l_dummy := NULL;
5703 l_rec_index := l_rec_index + 1;
5704 EXIT WHEN l_rec_index > l_count;
5705 END LOOP;
5706
5707 l_debug_level:=fnd_profile.value('CSI_DEBUG_LEVEL');
5708
5709 IF (l_debug_level > 0) THEN
5710 csi_gen_utility_pvt.put_line( 'Call to batch validation ');
5711 END IF;
5712
5713 IF (l_debug_level > 1) THEN
5714 csi_gen_utility_pvt.dump_call_batch_val
5715 ( p_api_version => 1.0
5716 ,p_init_msg_list => fnd_api.g_false
5717 ,p_parameter_name => param_name
5718 ,p_parameter_value => param_value
5719 );
5720 END IF;
5721
5722
5723
5724
5725 l_xml_hdr := l_xml_hdr ||'<instance header_id='||'"'||p_config_inst_hdr_id||'"'||'/>';
5726 -- add termination tags
5727 l_xml_hdr := l_xml_hdr || '</initialize>';
5728 l_xml_hdr := REPLACE(l_xml_hdr, ' ' , '+');
5729
5730 csi_gen_utility_pvt.put_line(' ');
5731 csi_gen_utility_pvt.put_line
5732 ('1st Part of Create_hdr_xml is : '||SUBSTR(l_xml_hdr, 1, 200) );
5733 csi_gen_utility_pvt.put_line(' ');
5734 csi_gen_utility_pvt.put_line
5735 ('2nd Part of Create_hdr_xml is : '||SUBSTR(l_xml_hdr, 201, 200) );
5736 csi_gen_utility_pvt.put_line(' ');
5737 csi_gen_utility_pvt.put_line
5738 ('3rd Part of Create_hdr_xml is : '||SUBSTR(l_xml_hdr, 401, 200) );
5739 csi_gen_utility_pvt.put_line(' ');
5740 csi_gen_utility_pvt.put_line
5741 ('4th Part of Create_hdr_xml is : '||SUBSTR(l_xml_hdr, 601, 200) );
5742
5743 x_xml_hdr := l_xml_hdr;
5744 csi_gen_utility_pvt.put_line(' ');
5745 csi_gen_utility_pvt.put_line('length of ini msg:' || length(l_xml_hdr));
5746 csi_gen_utility_pvt.put_line('Leaving Create_hdr_xml');
5747 csi_gen_utility_pvt.put_line('------------------------------------- ');
5748 EXCEPTION
5749 WHEN OTHERS THEN
5750 csi_gen_utility_pvt.put_line('exception in create_hdr_xml '|| sqlerrm);
5751 x_return_status := FND_API.G_RET_STS_ERROR;
5752 END Create_hdr_xml;
5753
5754
5755
5756 -- create xml message, send it to ui manager
5757 -- get back pieces of xml message
5758 -- process them and generate a long output xml message
5759 -- hardcoded :url,user, passwd, gwyuid,fndnam,two_task
5760
5761 /*-------------------------------------------------------------------
5762 Procedure Name : Send_input_xml
5763 Description : sends the xml batch validation message
5764 ---------------------------------------------------------------------*/
5765
5766 PROCEDURE Send_input_xml
5767 ( p_xml_hdr IN VARCHAR2,-- Value passed from Create_hdr_xml
5768 x_out_xml_msg OUT NOCOPY LONG,
5769 x_return_status OUT NOCOPY VARCHAR2 )
5770 IS
5771 l_html_pieces CZ_CF_API.CFG_OUTPUT_PIECES;
5772 l_option CZ_CF_API.INPUT_SELECTION;
5773 l_batch_val_tbl CZ_CF_API.CFG_INPUT_LIST;
5774
5775 --variable to fetch from cursor Get_Options
5776 l_component_code VARCHAR2(1000);
5777 l_configuration_id NUMBER;
5778 -- message related
5779 l_validation_status NUMBER;
5780 l_sequence NUMBER := 0;
5781 l_url VARCHAR2(500):= FND_PROFILE.Value('CZ_UIMGR_URL');
5782 l_rec_index BINARY_INTEGER;
5783 l_xml_hdr VARCHAR2(2000);
5784 l_long_xml LONG := NULL;
5785 l_return_status VARCHAR2(1);
5786
5787 BEGIN
5788 l_return_status := FND_API.G_RET_STS_SUCCESS;
5789
5790 csi_gen_utility_pvt.put_line('Entering Send_input_xml');
5791 csi_gen_utility_pvt.put_line('UImanager url: ' || l_url );
5792
5793 l_xml_hdr := p_xml_hdr;
5794 csi_gen_utility_pvt.put_line('length of ini msg: ' || length(l_xml_hdr));
5795
5796
5797 -- delete previous data.
5798 IF (l_html_pieces.COUNT <> 0) THEN
5799 l_html_pieces.DELETE;
5800 END IF;
5801
5802 cz_network_api_pub.Validate( config_input_list => l_batch_val_tbl ,
5803 init_message => l_xml_hdr ,
5804 config_messages => l_html_pieces ,
5805 validation_status => l_validation_status ,
5806 URL => l_url ,
5807 p_validation_type => cz_api_pub.validate_fulfillment
5808 );
5809
5810 csi_gen_utility_pvt.put_line('After call to batch validation the status is : '||l_validation_status );
5811
5812
5813 IF l_validation_status <> 0 THEN
5814 l_return_status := FND_API.G_RET_STS_ERROR;
5815 FND_MESSAGE.Set_Name('CSI', 'CSI_BATCH_VALIDATE');
5816 FND_MESSAGE.Set_token('ERR_TEXT' , 'Error returned from cz_network_api_pub.Validate, validation_status is: '||l_validation_status);
5817 FND_MSG_PUB.ADD;
5818 END IF;
5819
5820 IF (l_html_pieces.COUNT <= 0) THEN
5821 l_return_status := FND_API.G_RET_STS_ERROR;
5822 FND_MESSAGE.Set_Name('CSI', 'CSI_BATCH_VALIDATE');
5823 FND_MESSAGE.Set_token('ERR_TEXT' , 'Error returned from cz_network_api_pub.Validate, html_pieces count is <= 0' );
5824 FND_MSG_PUB.ADD;
5825 END IF;
5826
5827
5828 IF l_html_pieces.COUNT >0
5829 THEN
5830 l_rec_index := l_html_pieces.FIRST;
5831 LOOP
5832 csi_gen_utility_pvt.put_line(l_rec_index ||': Part of output_message: ' ||
5833 SUBSTR(l_html_pieces(l_rec_index), 1, 100) );
5834
5835 l_long_xml := l_long_xml || l_html_pieces(l_rec_index);
5836
5837 EXIT WHEN l_rec_index = l_html_pieces.LAST;
5838 l_rec_index := l_html_pieces.NEXT(l_rec_index);
5839
5840 END LOOP;
5841 END IF;
5842
5843 -- if everything ok, set out values
5844 x_out_xml_msg := l_long_xml;
5845 x_return_status := l_return_status;
5846 csi_gen_utility_pvt.put_line('Exiting csi_config_util.Send_input_xml');
5847 EXCEPTION
5848 WHEN OTHERS THEN
5849 x_return_status := FND_API.G_RET_STS_ERROR;
5850 csi_gen_utility_pvt.put_line( 'Inside Send_input_xml when others exception: ' ||substr(sqlerrm,1,100));
5851 END Send_input_xml;
5852
5853 PROCEDURE Parse_output_xml
5854 ( p_xml IN LONG,
5855 x_config_hdr_id OUT NOCOPY NUMBER,
5856 x_config_rev_nbr OUT NOCOPY NUMBER,
5857 x_return_status OUT NOCOPY VARCHAR2 )
5858 IS
5859
5860 CURSOR messages(p_config_hdr_id NUMBER, p_config_rev_nbr NUMBER) is
5861 SELECT constraint_type , message
5862 FROM cz_config_messages
5863 WHERE config_hdr_id = p_config_hdr_id
5864 AND config_rev_nbr = p_config_rev_nbr;
5865
5866
5867 l_exit_start_tag VARCHAR2(20) := '<exit>';
5868 l_exit_end_tag VARCHAR2(20) := '</exit>';
5869 l_exit_start_pos NUMBER;
5870 l_exit_end_pos NUMBER;
5871
5872 l_valid_config_start_tag VARCHAR2(30) := '<valid_configuration>';
5873 l_valid_config_end_tag VARCHAR2(30) := '</valid_configuration>';
5874 l_valid_config_start_pos NUMBER;
5875 l_valid_config_end_pos NUMBER;
5876
5877 l_complete_config_start_tag VARCHAR2(30) := '<complete_configuration>';
5878 l_complete_config_end_tag VARCHAR2(30) := '</complete_configuration>';
5879 l_complete_config_start_pos NUMBER;
5880 l_complete_config_end_pos NUMBER;
5881
5882 l_config_header_id_start_tag VARCHAR2(20) := '<config_header_id>';
5883 l_config_header_id_end_tag VARCHAR2(20) := '</config_header_id>';
5884 l_config_header_id_start_pos NUMBER;
5885 l_config_header_id_end_pos NUMBER;
5886
5887 l_config_rev_nbr_start_tag VARCHAR2(20) := '<config_rev_nbr>';
5888 l_config_rev_nbr_end_tag VARCHAR2(20) := '</config_rev_nbr>';
5889 l_config_rev_nbr_start_pos NUMBER;
5890 l_config_rev_nbr_end_pos NUMBER;
5891
5892 l_message_text_start_tag VARCHAR2(20) := '<message_text>';
5893 l_message_text_end_tag VARCHAR2(20) := '</message_text>';
5894 l_message_text_start_pos NUMBER;
5895 l_message_text_end_pos NUMBER;
5896
5897 l_message_type_start_tag VARCHAR2(20) := '<message_type>';
5898 l_message_type_end_tag VARCHAR2(20) := '</message_type>';
5899 l_message_type_start_pos NUMBER;
5900 l_message_type_end_pos NUMBER;
5901
5902 l_exit VARCHAR(20);
5903 l_config_header_id NUMBER;
5904 l_config_rev_nbr NUMBER;
5905 l_message_text VARCHAR2(2000);
5906 l_message_type VARCHAR2(200);
5907 l_list_price NUMBER;
5908 l_selection_line_id NUMBER;
5909 l_valid_config VARCHAR2(10);
5910 l_complete_config VARCHAR2(10);
5911 l_header_id NUMBER;
5912 l_return_status VARCHAR2(1) :=FND_API.G_RET_STS_SUCCESS;
5913 l_return_status_del VARCHAR2(1);
5914 l_msg VARCHAR2(2000);
5915 l_constraint VARCHAR2(16);
5916 l_flag VARCHAR2(1) := 'N';
5917
5918 BEGIN
5919
5920 csi_gen_utility_pvt.put_line('Entering Parse_output_xml');
5921
5922 l_exit_start_pos :=
5923 INSTR(p_xml, l_exit_start_tag,1, 1) +
5924 length(l_exit_start_tag);
5925
5926 l_exit_end_pos :=
5927 INSTR(p_xml, l_exit_end_tag,1, 1) - 1;
5928
5929 l_exit := SUBSTR (p_xml, l_exit_start_pos,
5930 l_exit_end_pos - l_exit_start_pos + 1);
5931
5932 csi_gen_utility_pvt.put_line('l_exit: '||l_exit);
5933
5934 -- if error go to msg etc.
5935 IF nvl(l_exit,'error') <> 'error' THEN
5936
5937 l_valid_config_start_pos :=
5938 INSTR(p_xml, l_valid_config_start_tag,1, 1) +length(l_valid_config_start_tag);
5939
5940 l_valid_config_end_pos :=
5941 INSTR(p_xml, l_valid_config_end_tag,1, 1) - 1;
5942
5943 l_valid_config := SUBSTR( p_xml, l_valid_config_start_pos,
5944 l_valid_config_end_pos -
5945 l_valid_config_start_pos + 1);
5946
5947 csi_gen_utility_pvt.put_line('l_valid_config: '|| l_valid_config);
5948
5949 l_complete_config_start_pos :=
5950 INSTR(p_xml, l_complete_config_start_tag,1, 1)+length(l_complete_config_start_tag);
5951 l_complete_config_end_pos :=
5952 INSTR(p_xml, l_complete_config_end_tag,1, 1) - 1;
5953
5954 l_complete_config := SUBSTR( p_xml, l_complete_config_start_pos,
5955 l_complete_config_end_pos -
5956 l_complete_config_start_pos + 1);
5957
5958 csi_gen_utility_pvt.put_line('l_complete_config '|| l_complete_config);
5959
5960
5961 IF (nvl(l_valid_config, 'N') <> 'true') THEN
5962 csi_gen_utility_pvt.put_line(' Returned valid_flag as null/false');
5963 l_flag := 'Y';
5964 END IF ;
5965
5966
5967 IF (nvl(l_complete_config, 'N') <> 'true' ) THEN
5968 csi_gen_utility_pvt.put_line('Returned complete_flag as null/false');
5969 l_flag := 'Y';
5970 END IF;
5971
5972
5973 END IF; /* if not error */
5974
5975
5976
5977 l_message_text_start_pos :=
5978 INSTR(p_xml, l_message_text_start_tag,1, 1)+length(l_message_text_start_tag);
5979 l_message_text_end_pos :=
5980 INSTR(p_xml, l_message_text_end_tag,1, 1) - 1;
5981
5982 l_message_text := SUBSTR( p_xml, l_message_text_start_pos,
5983 l_message_text_end_pos -
5984 l_message_text_start_pos + 1);
5985
5986 csi_gen_utility_pvt.put_line('l_message_text is: '||l_message_text);
5987
5988 l_message_type_start_pos :=
5989 INSTR(p_xml, l_message_type_start_tag,1, 1)+length(l_message_type_start_tag);
5990 l_message_type_end_pos :=
5991 INSTR(p_xml, l_message_type_end_tag,1, 1) - 1;
5992
5993 l_message_type := SUBSTR( p_xml, l_message_type_start_pos,
5994 l_message_type_end_pos -
5995 l_message_type_start_pos + 1);
5996
5997
5998 -- get the latest config_header_id, and rev_nbr to get
5999 -- messages if any.
6000
6001
6002 csi_gen_utility_pvt.put_line('l_message_type is : '|| l_message_type);
6003
6004
6005 l_config_header_id_start_pos :=
6006 INSTR(p_xml, l_config_header_id_start_tag, 1, 1)+length(l_config_header_id_start_tag);
6007
6008 l_config_header_id_end_pos :=
6009 INSTR(p_xml, l_config_header_id_end_tag, 1, 1) - 1;
6010
6011 l_config_header_id :=
6012 to_number(SUBSTR( p_xml,l_config_header_id_start_pos,
6013 l_config_header_id_end_pos -
6014 l_config_header_id_start_pos + 1));
6015
6016
6017 l_config_rev_nbr_start_pos :=
6018 INSTR(p_xml, l_config_rev_nbr_start_tag, 1, 1)+length(l_config_rev_nbr_start_tag);
6019
6020 l_config_rev_nbr_end_pos :=
6021 INSTR(p_xml, l_config_rev_nbr_end_tag, 1, 1) - 1;
6022
6023 l_config_rev_nbr :=
6024 to_number(SUBSTR( p_xml,l_config_rev_nbr_start_pos,
6025 l_config_rev_nbr_end_pos -
6026 l_config_rev_nbr_start_pos + 1));
6027
6028 csi_gen_utility_pvt.put_line('Returned config_header_id as:' ||to_char(l_config_header_id));
6029 csi_gen_utility_pvt.put_line('Returned config_rev_nbr as:' ||to_char(l_config_rev_nbr));
6030
6031
6032
6033
6034 IF (l_flag = 'Y' ) OR
6035 l_exit is NULL OR
6036 l_exit = 'error' THEN
6037
6038 csi_gen_utility_pvt.put_line('Getting messages from cz_config_messages');
6039
6040 OPEN messages(l_config_header_id, l_config_rev_nbr);
6041
6042 LOOP
6043 FETCH messages INTO l_constraint,l_msg;
6044 EXIT WHEN messages%notfound;
6045
6046 csi_gen_utility_pvt.put_line('msg : '|| substr(l_msg, 1, 250));
6047 END LOOP;
6048 /*
6049 IF nvl(l_valid_config, 'false') = 'false'
6050 OR l_exit = 'error'
6051 THEN
6052 l_return_status:=FND_API.G_RET_STS_ERROR;
6053 FND_MESSAGE.Set_Name('CSI', 'CSI_BATCH_VALIDATE');
6054 FND_MESSAGE.Set_token('ERR_TEXT' , 'Error returned from cz_network_api_pub.Validate, from Parse_output_xml ' );
6055 FND_MSG_PUB.ADD;
6056 csi_gen_utility_pvt.put_line('Configuration is invalid/incomplete');
6057 END IF;
6058 */
6059
6060
6061
6062
6063 END IF;
6064 x_config_hdr_id := l_config_header_id;
6065 x_config_rev_nbr := l_config_rev_nbr;
6066
6067 -- if everything ok, set return values
6068 x_return_status := l_return_status;
6069
6070
6071 csi_gen_utility_pvt.put_line('Exiting parse_output_xml');
6072
6073 EXCEPTION
6074 WHEN OTHERS THEN
6075 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6076 csi_gen_utility_pvt.put_line( 'Parse_Output_xml error: ' || substr(sqlerrm,1,100));
6077
6078 END Parse_output_xml;
6079
6080 -- End addition by sguthiva for att enhancements
6081
6082 FUNCTION Check_for_eam_item
6083 (p_inventory_item_id IN NUMBER,
6084 p_organization_id IN NUMBER,
6085 p_eam_item_type IN NUMBER)
6086 RETURN BOOLEAN
6087 IS
6088 l_eam NUMBER;
6089 BEGIN
6090 IF nvl(p_eam_item_type,-99) <> FND_API.G_MISS_NUM
6091 THEN
6092 IF p_eam_item_type in (1,3) THEN
6093 RETURN TRUE;
6094 ELSE
6095 RETURN FALSE;
6096 END IF;
6097 ELSE
6098 SELECT eam_item_type
6099 INTO l_eam
6100 FROM mtl_system_items_b
6101 WHERE inventory_item_id = p_inventory_item_id
6102 AND organization_id = p_organization_id;
6103
6104 IF l_eam IN (1,3)
6105 THEN
6106 RETURN TRUE;
6107 ELSE
6108 RETURN FALSE;
6109 END IF;
6110 END IF;
6111 EXCEPTION
6112 WHEN NO_DATA_FOUND THEN
6113 RETURN FALSE;
6114 END Check_for_eam_item;
6115
6116 FUNCTION pending_in_oi_or_tld(
6117 p_inventory_item_id IN number,
6118 p_serial_number IN varchar2)
6119 RETURN boolean IS
6120
6121 CURSOR tld_cur IS
6122 SELECT ctl.source_transaction_table,
6123 ctl.source_transaction_id
6124 FROM csi_t_txn_line_details ctld,
6125 csi_t_transaction_lines ctl
6126 WHERE ctld.inventory_item_id = p_inventory_item_id
6127 AND ctld.serial_number = p_serial_number
6128 AND nvl(ctld.processing_status, 'SUBMIT') <> 'PROCESSED'
6129 AND ctl.transaction_line_id = ctld.transaction_line_id;
6130
6131 CURSOR oi_cur IS
6132 SELECT '1'
6133 FROM csi_instance_interface
6134 WHERE inventory_item_id = p_inventory_item_id
6135 AND serial_number = p_serial_number
6136 AND process_status <> 'P';
6137 l_oe_line_status VARCHAR2(30);
6138
6139 BEGIN
6140
6141 FOR tld_rec IN tld_cur
6142 LOOP
6143 -- Start of Bug#12599234
6144 IF tld_rec.source_transaction_table = 'OE_ORDER_LINES_ALL'
6145 AND tld_rec.source_transaction_id IS NOT NULL THEN
6146 BEGIN
6147 select flow_status_code
6148 into l_oe_line_status
6149 from OE_ORDER_LINES_ALL
6150 where line_id = tld_rec.source_transaction_id;
6151
6152 IF l_oe_line_status = 'CANCELLED' THEN
6153 -- OE line cancelled, so proceed with checking next OE line
6154 NULL;
6155 ELSE
6156 fnd_message.set_name('CSI','CSI_SRL_PENDING_IN_TLD');
6157 fnd_message.set_token('SRC_TBL', tld_rec.source_transaction_table);
6158 fnd_message.set_token('SRC_ID', tld_rec.source_transaction_id);
6159 fnd_msg_pub.add;
6160 RAISE fnd_api.g_exc_error;
6161 END IF;
6162 EXCEPTION
6163 WHEN OTHERS THEN
6164 fnd_message.set_name('CSI','CSI_SRL_PENDING_IN_TLD');
6165 fnd_message.set_token('SRC_TBL', tld_rec.source_transaction_table);
6166 fnd_message.set_token('SRC_ID', tld_rec.source_transaction_id);
6167 fnd_msg_pub.add;
6168 RAISE fnd_api.g_exc_error;
6169 END;
6170 -- End of Bug#12599234
6171 ELSE
6172 fnd_message.set_name('CSI','CSI_SRL_PENDING_IN_TLD');
6173 fnd_message.set_token('SRC_TBL', tld_rec.source_transaction_table);
6174 fnd_message.set_token('SRC_ID', tld_rec.source_transaction_id);
6175 fnd_msg_pub.add;
6176 RAISE fnd_api.g_exc_error;
6177 END IF;
6178 END LOOP;
6179
6180 FOR oi_rec IN oi_cur
6181 LOOP
6182 fnd_message.set_name('CSI','CSI_SRL_PENDING_IN_OI');
6183 fnd_msg_pub.add;
6184 RAISE fnd_api.g_exc_error;
6185 END LOOP;
6186
6187 RETURN FALSE;
6188
6189 EXCEPTION
6190 WHEN fnd_api.g_exc_error THEN
6191 RETURN TRUE;
6192 END pending_in_oi_or_tld;
6193
6194 PROCEDURE validate_serial_for_upd(
6195 p_instance_rec IN csi_datastructures_pub.instance_rec,
6196 p_txn_rec IN csi_datastructures_pub.transaction_rec,
6197 p_old_serial_number IN varchar2,
6198 x_return_status OUT nocopy varchar2)
6199 IS
6200
6201 l_gen_object_id number;
6202 l_return_status varchar2(1) := fnd_api.g_ret_sts_success;
6203 l_current_txn_id NUMBER; --uncommented code for 6965008
6204 l_rec_count NUMBER;
6205
6206 l_current_status NUMBER; -- added for 6176621
6207
6208 CURSOR mog_cur(p_gen_object_id IN number) IS
6209 SELECT 'Y'
6210 FROM mtl_object_genealogy mog
6211 WHERE mog.parent_object_type = 2
6212 AND (mog.object_id = p_gen_object_id OR mog.parent_object_id = p_gen_object_id)
6213 AND mog.object_type = 2
6214 AND sysdate BETWEEN nvl(mog.start_date_active, sysdate-1)
6215 AND nvl(mog.end_date_active, sysdate+1)
6216 AND ROWNUM = 1;
6217 --
6218 CURSOR ALL_TXN_CUR(p_item_id IN NUMBER,p_srl_num IN VARCHAR2,p_curr_txn_id IN NUMBER) IS
6219 select '1'
6220 FROM mtl_unit_transactions mut,
6221 mtl_material_transactions mmt
6222 WHERE mut.inventory_item_id = p_item_id
6223 AND mut.serial_number = p_srl_num
6224 AND mmt.transaction_id = mut.transaction_id
6225 AND mmt.transaction_id <> p_curr_txn_id
6226 AND ROWNUM = 1
6227 UNION --uncommented code for 6965008
6228 select '1'
6229 FROM mtl_unit_transactions mut,
6230 mtl_transaction_lot_numbers mtln,
6231 mtl_material_transactions mmt
6232 WHERE mut.inventory_item_id = p_item_id
6233 AND mut.serial_number = p_srl_num
6234 AND mtln.organization_id = mut.organization_id
6235 AND mtln.serial_transaction_id = mut.transaction_id
6236 AND mmt.transaction_id = mtln.transaction_id
6237 AND mmt.transaction_id <> p_curr_txn_id
6238 AND ROWNUM = 1;
6239 --
6240 BEGIN
6241
6242 x_return_status := fnd_api.g_ret_sts_success;
6243 csi_gen_utility_pvt.put_line('p_txn_rec.transaction_type_id : ' ||p_txn_rec.transaction_type_id);
6244 IF p_txn_rec.transaction_type_id not in (205,127,10082) THEN --Added condition and uncommented the code for bug 6965008
6245 IF p_txn_rec.inv_material_transaction_id IS NULL OR
6246 p_txn_rec.inv_material_transaction_id = FND_API.G_MISS_NUM THEN
6247 l_current_txn_id := -99999;
6248 ELSE
6249 l_current_txn_id := p_txn_rec.inv_material_transaction_id;
6250 END IF;
6251 --
6252 IF p_instance_rec.location_type_code IN
6253 ('INVENTORY', 'IN_TRANSIT', 'PROJECT', 'PO') --Removed INTERNAL_SITE for bug 5168249
6254 THEN
6255 fnd_message.set_name('CSI', 'CSI_SRL_IN_INT_CANNOT_UPD');
6256 fnd_message.set_token('INST_NUM', p_instance_rec.instance_number);
6257 fnd_message.set_token('LOC_TYPE_CODE', p_instance_rec.location_type_code);
6258 fnd_msg_pub.add;
6259 RAISE fnd_api.g_exc_error;
6260 END IF;
6261 END IF;
6262
6263 -- Added the following IF to handle NULL to NOT NULL serial update
6264 IF p_old_serial_number IS NOT NULL AND
6265 p_old_serial_number <> fnd_api.g_miss_char THEN
6266
6267 IF p_txn_rec.transaction_type_id not in (205,127,10082) THEN --Added condition and uncommented the code for bug 6965008
6268 -- check for existence in mut and error
6269 FOR all_txn_rec IN all_txn_cur(p_instance_rec.inventory_item_id,p_old_serial_number,-9999)
6270 LOOP
6271 fnd_message.set_name('CSI', 'CSI_OLD_SRL_HAS_TXN_CANNOT_UPD');
6272 fnd_message.set_token('SERIAL_NUM', p_old_serial_number);
6273 fnd_msg_pub.add;
6274 RAISE fnd_api.g_exc_error;
6275 END LOOP;
6276
6277 --uncommented the code and brought the code up for bug 6965008
6278
6279 -- Check whether EAM Work Order Exists for this Serial Number.
6280 -- From R12 release, EAM work Order will always have the item instance reference.
6281 -- Indirectly, the validation is done for the old serial number.
6282 -- This need not have to be performed for the new serial number because if an item instance
6283 -- exists for the new one, updating the current instance with that serial number would
6284 -- lead to serial uniqueness violation. Since our uniqueness validation catches that, we are
6285 -- performing this only for the old serial number.
6286 --
6287 l_rec_count := 0;
6288 --
6289 select count(*)
6290 into l_rec_count
6291 from EAM_WORK_ORDER_DETAILS ewod,
6292 WIP_DISCRETE_JOBS wdj
6293 where wdj.wip_entity_id = ewod.wip_entity_id
6294 and wdj.organization_id = ewod.organization_id
6295 and wdj.maintenance_object_type = 3
6296 and wdj.maintenance_object_id = p_instance_rec.instance_id
6297 and wdj.maintenance_object_source = 1
6298 and ROWNUM = 1;
6299 --
6300 IF l_rec_count > 0 THEN
6301 fnd_message.set_name('CSI', 'CSI_OLD_SRL_HAS_EAM_CANNOT_UPD');
6302 fnd_message.set_token('SERIAL_NUM', p_old_serial_number);
6303 fnd_msg_pub.add;
6304 RAISE fnd_api.g_exc_error;
6305 END IF;
6306 END IF;
6307
6308 BEGIN
6309 SELECT gen_object_id,current_status --changed for 6176621
6310 INTO l_gen_object_id,
6311 l_current_status
6312 FROM mtl_serial_numbers
6313 WHERE inventory_item_id = p_instance_rec.inventory_item_id
6314 AND serial_number = p_old_serial_number;
6315
6316 --start of code fix for 6176621
6317 IF l_current_status <> 4 THEN
6318 fnd_message.set_name('CSI', 'CSI_SRL_IN_USE_CANNOT_UPD');
6319 fnd_message.set_token('SERIAL_NUM',p_old_serial_number);
6320 fnd_msg_pub.add;
6321 RAISE fnd_api.g_exc_error;
6322 END IF;
6323 --code fix end for 6176621
6324 --
6325 FOR mog_rec IN mog_cur(l_gen_object_id)
6326 LOOP
6327 fnd_message.set_name('CSI', 'CSI_SRL_IN_MOG_CANNOT_UPD');
6328 fnd_message.set_token('SERIAL_NUM',p_old_serial_number);
6329 fnd_msg_pub.add;
6330 RAISE fnd_api.g_exc_error;
6331 END LOOP;
6332
6333 -- check pending transaction in open interface and installation detail references
6334 IF pending_in_oi_or_tld(p_instance_rec.inventory_item_id, p_old_serial_number) THEN
6335 RAISE fnd_api.g_exc_error;
6336 END IF;
6337 --
6338 EXCEPTION
6339 WHEN no_data_found THEN
6340 null;
6341 END;
6342 --
6343 END IF;-- Check Old serial Number not null
6344 --
6345 -- New Serial specific validations
6346 --
6347 -- srramakr When Serialized at SO Issue items are shipped, the staging instance is splitted and then
6348 -- the new instance is updated with the shipped serial# and external location.
6349 -- Under such scenario, when the serial update validation happens for the new serial number,
6350 -- we should ignore the current material transaction as the current txn is one that is updating it.
6351 -- Whenever we filter the serial records based on transaction_id, we cannot use MUT always.
6352 -- If the item is lot-serial controlled then it needs to be joined with MTLN.
6353 --
6354 IF nvl(p_old_serial_number, fnd_api.g_miss_char) <> fnd_api.g_miss_char
6355 AND p_txn_rec.transaction_type_id not in (205,127,10082) --Added condition and uncommented the code for bug 6965008
6356 THEN
6357 FOR all_txn_rec IN all_txn_cur(p_instance_rec.inventory_item_id,
6358 p_instance_rec.serial_number,
6359 l_current_txn_id)
6360 LOOP
6361 fnd_message.set_name('CSI', 'CSI_SRL_HAS_TXN_CANNOT_UPD');
6362 fnd_message.set_token('SERIAL_NUM', p_instance_rec.serial_number);
6363 fnd_msg_pub.add;
6364 RAISE fnd_api.g_exc_error;
6365 END LOOP;
6366 END IF;
6367 ----uncommented code for 6965008
6368 fnd_message.set_name('CSI', 'CSI_SERIAL_UPD_WARNING');
6369 fnd_message.set_token('CURRENT_SERIAL', p_old_serial_number);
6370 fnd_message.set_token('NEW_SERIAL', p_instance_rec.serial_number);
6371 fnd_msg_pub.add;
6372 --
6373 -- Warning Status should be handled by Public API based ont Serial Number Update Event
6374 -- x_return_status := 'W';
6375 EXCEPTION
6376 WHEN fnd_api.g_exc_error THEN
6377 x_return_status := fnd_api.g_ret_sts_error;
6378 END validate_serial_for_upd;
6379 --
6380 /*-----------------------------------------------------------*/
6381 /* This function gets the version label of an item instance */
6382 /* based on the time stamp passed. */
6383 /*---------------------------------------------------------*/
6384 FUNCTION Get_Version_Label
6385 (
6386 p_instance_id IN NUMBER,
6387 p_time_stamp IN DATE
6388 ) RETURN VARCHAR2 IS
6389 --
6390 l_time_stamp DATE;
6391 l_ver_label VARCHAR2(30);
6392 --
6393 CURSOR VER_LABEL_CUR IS
6394 select version_label
6395 from CSI_I_VERSION_LABELS
6396 where instance_id = p_instance_id
6397 and date_time_stamp <= l_time_stamp
6398 order by date_time_stamp desc;
6399 BEGIN
6400 IF p_time_stamp IS NULL OR
6401 p_time_stamp = FND_API.G_MISS_DATE THEN
6402 l_time_stamp := sysdate + 1;
6403 ELSE
6404 l_time_stamp := p_time_stamp;
6405 END IF;
6406 --
6407 l_ver_label := NULL;
6408 --
6409 OPEN VER_LABEL_CUR;
6410 FETCH VER_LABEL_CUR INTO l_ver_label;
6411 CLOSE VER_LABEL_CUR;
6412 --
6413 RETURN l_ver_label;
6414 END Get_Version_Label;
6415 --
6416
6417
6418 PROCEDURE get_mtl_txn_for_srl(
6419 p_transaction_id IN number, -- Added for bug#14835893
6420 p_inventory_item_id IN number,
6421 p_serial_number IN varchar2,
6422 x_mtl_txn_tbl OUT nocopy csi_datastructures_pub.mtl_txn_tbl)
6423 IS
6424
6425 l_mtl_txn_id number;
6426 --l_lot_number varchar2(30);
6427 l_lot_number varchar2(80); --bug 10279935
6428 l_mtl_txn_tbl csi_datastructures_pub.mtl_txn_tbl;
6429 l_ind binary_integer := 0;
6430 x_ind binary_integer := 0;
6431 l_txn_seq_start_date date;
6432
6433 CURSOR unit_txn_cur IS
6434 SELECT mut.transaction_id,
6435 mut.creation_date,
6436 --msi.lot_control_code,
6437 nvl(csi_utl_pkg.get_lot_ctrl_code(p_transaction_id),msi.lot_control_code) lot_control_code, -- Added for bug#14835893
6438 msi.serial_number_control_code,
6439 msi.primary_uom_code
6440 FROM mtl_unit_transactions mut,
6441 mtl_system_items msi
6442 WHERE mut.serial_number = p_serial_number
6443 AND mut.inventory_item_id = p_inventory_item_id
6444 AND msi.organization_id = mut.organization_id
6445 AND msi.inventory_item_id = mut.inventory_item_id
6446 -- need to add this because in a diff ou it this item may not be ib tracked
6447 AND msi.comms_nl_trackable_flag = 'Y'
6448 ORDER BY mut.creation_date desc, mut.transaction_id desc;
6449
6450 BEGIN
6451
6452 IF csi_datastructures_pub.g_install_param_rec.fetch_flag IS NULL THEN
6453 csi_gen_utility_pvt.populate_install_param_rec;
6454 END IF;
6455
6456 l_txn_seq_start_date := csi_datastructures_pub.g_install_param_rec.txn_seq_start_date;
6457 IF l_txn_seq_start_date is null THEN
6458 l_txn_seq_start_date := csi_datastructures_pub.g_install_param_rec.freeze_date;
6459 END IF;
6460
6461 IF l_txn_seq_start_date is null THEN
6462 fnd_message.set_name('CSI','CSI_API_UNINSTALLED_PARAMETER');
6463 fnd_msg_pub.add;
6464 raise fnd_api.g_exc_error;
6465 END IF;
6466
6467 FOR unit_txn_rec IN unit_txn_cur
6468 LOOP
6469 l_mtl_txn_id := unit_txn_rec.transaction_id;
6470
6471 IF unit_txn_rec.lot_control_code = 2 THEN -- serial is lot controlled in the transacting org
6472 BEGIN
6473 SELECT transaction_id,
6474 lot_number
6475 INTO l_mtl_txn_id,
6476 l_lot_number
6477 FROM mtl_transaction_lot_numbers
6478 WHERE serial_transaction_id = unit_txn_rec.transaction_id;
6479 EXCEPTION
6480 WHEN no_data_found THEN
6481 l_mtl_txn_id := unit_txn_rec.transaction_id;
6482 l_lot_number := null;
6483 END;
6484 END IF;
6485
6486 l_ind := l_ind + 1;
6487
6488 l_mtl_txn_tbl(l_ind).transaction_id := l_mtl_txn_id;
6489
6490 BEGIN -- Added for bug 8549651 (FP of 8507649)
6491 SELECT inventory_item_id,
6492 organization_id,
6493 transaction_date,
6494 creation_date,
6495 transfer_transaction_id,
6496 transaction_type_id,
6497 transaction_action_id,
6498 transaction_source_type_id,
6499 transaction_quantity,
6500 transaction_uom,
6501 primary_quantity,
6502 transaction_source_id,
6503 trx_source_line_id
6504 INTO l_mtl_txn_tbl(l_ind).inventory_item_id,
6505 l_mtl_txn_tbl(l_ind).organization_id,
6506 l_mtl_txn_tbl(l_ind).transaction_date,
6507 l_mtl_txn_tbl(l_ind).creation_date,
6508 l_mtl_txn_tbl(l_ind).transfer_transaction_id,
6509 l_mtl_txn_tbl(l_ind).transaction_type_id,
6510 l_mtl_txn_tbl(l_ind).transaction_action_id,
6511 l_mtl_txn_tbl(l_ind).transaction_source_type_id,
6512 l_mtl_txn_tbl(l_ind).transaction_quantity,
6513 l_mtl_txn_tbl(l_ind).transaction_uom,
6514 l_mtl_txn_tbl(l_ind).primary_quantity,
6515 l_mtl_txn_tbl(l_ind).transaction_source_id,
6516 l_mtl_txn_tbl(l_ind).trx_source_line_id
6517 FROM mtl_material_transactions
6518 WHERE transaction_id = l_mtl_txn_id;
6519 -- Added for bug 8549651 (FP of 8507649)
6520 EXCEPTION
6521 WHEN NO_DATA_FOUND THEN
6522 fnd_message.set_name('CSI','CSI_API_NOT_LOT_CONTROLLED');
6523 fnd_msg_pub.add;
6524 END;
6525 -- End bug 8549651 (FP of 8507649)
6526
6527 l_mtl_txn_tbl(l_ind).serial_control_code := unit_txn_rec.serial_number_control_code;
6528 l_mtl_txn_tbl(l_ind).lot_control_code := unit_txn_rec.lot_control_code;
6529 l_mtl_txn_tbl(l_ind).primary_uom := unit_txn_rec.primary_uom_code;
6530 l_mtl_txn_tbl(l_ind).lot_number := l_lot_number;
6531
6532 END LOOP;
6533
6534 IF l_mtl_txn_tbl.count <> 0 -- 6164506
6535 THEN
6536 FOR l_ind IN l_mtl_txn_tbl.FIRST .. l_mtl_txn_tbl.LAST
6537 LOOP
6538 IF l_mtl_txn_tbl(l_ind).creation_date > l_txn_seq_start_date
6539 AND
6540 csi_inv_trxs_pkg.valid_ib_txn(l_mtl_txn_tbl(l_ind).transaction_id)
6541 THEN
6542 x_ind := x_ind + 1;
6543 x_mtl_txn_tbl(x_ind) := l_mtl_txn_tbl(l_ind);
6544 END IF;
6545 END LOOP;
6546 END IF;
6547 END get_mtl_txn_for_srl;
6548 END csi_Item_Instance_Vld_Pvt;