DBA Data[Home] [Help]

PACKAGE BODY: APPS.CSI_ITEM_INSTANCE_VLD_PVT

Source


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