DBA Data[Home] [Help]

PACKAGE BODY: APPS.INV_VALIDATE_TROLIN

Source


1 PACKAGE BODY INV_Validate_Trolin AS
2 /* $Header: INVLTRLB.pls 120.12.12020000.2 2012/11/27 06:52:00 ppulloor ship $ */
3 --  Global constant holding the package name
4 
5 G_PKG_NAME                    CONSTANT VARCHAR2(30) := 'INV_Validate_Trolin';
6 
7 g_organization_id      NUMBER;
8 g_wms_org_flag         BOOLEAN;
9 
10 -- Line level Validations
11 -- ---------------------------------------------------------------------
12 
13 FUNCTION Line ( p_line_id IN NUMBER ) RETURN NUMBER
14 IS
15 l_dummy                       VARCHAR2(10);
16   l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
17 BEGIN
18     IF p_line_id IS NULL OR p_line_id = FND_API.G_MISS_NUM THEN
19         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
20             FND_MESSAGE.SET_NAME('INV','INV_ATTRIBUTE_REQUIRED');
21             FND_MESSAGE.SET_TOKEN('ATTRIBUTE',FND_MESSAGE.GET_STRING('INV','INV_LINE_ID'),FALSE); -- ND
22             FND_MSG_PUB.Add;
23         END IF;
24         RETURN F;
25     END IF;
26     RETURN T;
27 END Line;
28 
29 -- ---------------------------------------------------------------------
30 FUNCTION Line_Number ( p_line_number IN NUMBER,
31 		       p_header_id IN NUMBER,
32 		       p_org IN inv_validate_trohdr.ORG ) RETURN NUMBER
33 IS
34 l_dummy                       VARCHAR2(10);
35 l_return_value		      BOOLEAN;
36 l_request_number              VARCHAR2(30);
37 l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
38 BEGIN
39   IF p_line_number IS NULL OR p_line_number = FND_API.G_MISS_NUM THEN
40     IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
41       FND_MESSAGE.SET_NAME('INV','INV_ATTRIBUTE_REQUIRED');
42       FND_MESSAGE.SET_TOKEN('ATTRIBUTE',FND_MESSAGE.GET_STRING('INV','INV_LINE_NUMBER'),FALSE); -- ND
43       FND_MSG_PUB.Add;
44     END IF;
45     RETURN F;
46   END IF;
47   l_return_value :=INV_Transfer_Order_PVT.Unique_Line(
48                 p_org.organization_id
49               , p_header_id
50               , p_line_number);
51   IF l_return_value then
52     RETURN T;
53   ELSE
54     --Bug #4347016
55     --If the line number is not unique display an error message
56     FND_MESSAGE.SET_NAME('INV','INV_ALREADY_EXISTS');
57     FND_MESSAGE.SET_TOKEN('ENTITY',FND_MESSAGE.GET_STRING('INV','INV_LINE_NUMBER'),FALSE);
58     FND_MSG_PUB.Add;
59 	  RETURN F;
60   END IF;
61 
62 EXCEPTION
63     WHEN NO_DATA_FOUND THEN
64 	--inv_debug.message('in when no_data_found');
65         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
66             FND_MESSAGE.SET_NAME('INV','INV_INVALID_ATTRIBUTE');
67             FND_MESSAGE.SET_TOKEN('ATTRIBUTE',FND_MESSAGE.GET_STRING('INV','LINE_NUMBER'),FALSE);
68             FND_MSG_PUB.Add;
69         END IF;
70         RETURN F;
71     WHEN OTHERS THEN
72         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
73             FND_MSG_PUB.Add_Exc_Msg
74             (   G_PKG_NAME
75             ,   'Line_Number'
76             );
77         END IF;
78 
79         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
80 END Line_Number;
81 
82 -- ---------------------------------------------------------------------
83 FUNCTION Line_Status ( p_line_status IN NUMBER ) RETURN NUMBER
84 IS
85 l_dummy                       VARCHAR2(10);
86 l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
87 BEGIN
88 
89     IF p_line_status IS NULL OR p_line_status = FND_API.G_MISS_NUM THEN
90         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
91             FND_MESSAGE.SET_NAME('INV','INV_ATTRIBUTE_REQUIRED');
92             FND_MESSAGE.SET_TOKEN('ATTRIBUTE',FND_MESSAGE.GET_STRING('INV','INV_LINE_STATUS'),FALSE); -- ND
93             FND_MSG_PUB.Add;
94         END IF;
95         RETURN F;
96     END IF;
97 
98     SELECT  'VALID'
99     INTO    l_dummy
100     FROM    MFG_LOOKUPS
101     WHERE   LOOKUP_TYPE = 'MTL_TXN_REQUEST_STATUS'
102       AND   p_line_status IN (1,7)
103       AND   LOOKUP_CODE = p_line_status;
104 
105     RETURN T;
106 
107 EXCEPTION
108 
109     WHEN NO_DATA_FOUND THEN
110         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
111             FND_MESSAGE.SET_NAME('INV','INV_INVALID_ATTRIBUTE');
112             FND_MESSAGE.SET_TOKEN('ATTRIBUTE',FND_MESSAGE.GET_STRING('INV','INV_LINE_STATUS'),FALSE);
113             FND_MSG_PUB.Add;
114         END IF;
115         RETURN F;
116 
117     WHEN OTHERS THEN
118         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
119             FND_MSG_PUB.Add_Exc_Msg
120             (   G_PKG_NAME
121             ,   'Line_Status'
122             );
123         END IF;
124         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
125 
126 END Line_Status;
127 
128 -- ---------------------------------------------------------------------
129 FUNCTION Quantity_Delivered ( p_quantity_delivered IN NUMBER ) RETURN NUMBER
130 IS
131 l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
132 BEGIN
133      RETURN T;
134 END Quantity_Delivered;
135 
136 -- ---------------------------------------------------------------------
137 FUNCTION Quantity_Detailed ( p_quantity_detailed IN NUMBER ) RETURN NUMBER
138 IS
139 l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
140 BEGIN
141      RETURN T;
142 END Quantity_Detailed;
143 
144 -- ---------------------------------------------------------------------
145 --INVCONV
146 -- ---------------------------------------------------------------------
147 FUNCTION Secondary_Quantity_Delivered ( p_secondary_quantity_delivered IN NUMBER ) RETURN NUMBER
148 IS
149 l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
150 BEGIN
151      RETURN T;
152 END Secondary_Quantity_Delivered;
153 
154 -- ---------------------------------------------------------------------
155 FUNCTION Secondary_Quantity_Detailed ( p_secondary_quantity_detailed IN NUMBER ) RETURN NUMBER
156 IS
157 l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
158 BEGIN
159      RETURN T;
160 END Secondary_Quantity_Detailed;
161 
162 -- ---------------------------------------------------------------------
163 --INVCONV
164 --  Procedure Entity
165 PROCEDURE Entity
166 (   x_return_status                 OUT NOCOPY VARCHAR2
167 ,   p_trolin_rec                    IN  INV_Move_Order_PUB.Trolin_Rec_Type
168 ,   p_old_trolin_rec                IN  INV_Move_Order_PUB.Trolin_Rec_Type :=
169                                         INV_Move_Order_PUB.G_MISS_TROLIN_REC
170 ,   p_move_order_type	    	    IN  NUMBER DEFAULT INV_GLOBALS.G_MOVE_ORDER_REQUISITION
171 )
172 IS
173 
174     CURSOR c_get_jobsch_name
175     ( p_wip_entity_id    IN  NUMBER
176     , p_organization_id  IN  NUMBER
177     ) IS
178       SELECT wip_entity_name
179         FROM wip_entities
180        WHERE wip_entity_id   = p_wip_entity_id
181          AND organization_id = p_organization_id;
182 
183     CURSOR c_get_item_num
184     ( p_item_id  IN  NUMBER
185     , p_organization_id  IN  NUMBER
186     ) IS
187       SELECT concatenated_segments
188         FROM mtl_system_items_kfv
189        WHERE inventory_item_id = p_item_id
190          AND organization_id   = p_organization_id;
191 
192 l_return_status               VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
193 l_start_prefix                VARCHAR2(30);
194 l_start_number                NUMBER;
195 l_end_prefix                  VARCHAR2(30);
196 l_end_number                  NUMBER;
197 l_unit_effectivity	      NUMBER;
198 l_cross_unit_number	      NUMBER;
199 l_unit_effective_item	      NUMBER;
200 l_dummy 		      NUMBER;
201 l_debug                       NUMBER := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
202 l_errorcode                   NUMBER;
203 l_temp_bool                   BOOLEAN;
204 l_quantity                    NUMBER;
205 l_return_value                BOOLEAN;
206 --Bug #4777248
207 l_sub_loc_control             NUMBER;
208 l_item_loc_control            NUMBER;
209 l_org_loc_control             NUMBER;
210 --Bug #4438410
211 l_sub_lpn_controlled          NUMBER := 0;
212 l_sub_reservable              NUMBER;
213 l_wip_entity_name             VARCHAR2(240);
214 l_item_number                 VARCHAR2(40);
215 
216 BEGIN
217 
218     --  Check required attributes.
219     IF  p_trolin_rec.line_id IS NULL THEN
220         l_return_status := FND_API.G_RET_STS_ERROR;
221         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
222             FND_MESSAGE.SET_NAME('INV','INV_ATTRIBUTE_REQUIRED');
223             FND_MESSAGE.SET_TOKEN('ATTRIBUTE','line_id');
224             FND_MSG_PUB.Add;
225         END IF;
226     END IF;
227 
228     IF  p_trolin_rec.header_id IS NULL THEN
229         l_return_status := FND_API.G_RET_STS_ERROR;
230         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
231             FND_MESSAGE.SET_NAME('INV','INV_ATTRIBUTE_REQUIRED');
232             FND_MESSAGE.SET_TOKEN('ATTRIBUTE','Header_Id');
233             FND_MSG_PUB.Add;
234         END IF;
235     END IF;
236     --
237     --  Check rest of required attributes here.
238     --  Return Error if a required attribute is missing.
239 
240     IF  p_trolin_rec.inventory_item_id IS NULL THEN
241 	if( p_move_order_type <> INV_GLOBALS.G_MOVE_ORDER_PUT_AWAY ) then
242             l_return_status := FND_API.G_RET_STS_ERROR;
243 
244             IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
245                 FND_MESSAGE.SET_NAME('INV','INV_ENTER_ITEM');
246                 FND_MSG_PUB.Add;
247             END IF;
248 	elsif( p_move_order_type = INV_GLOBALS.G_MOVE_ORDER_PUT_AWAY AND p_trolin_rec.lpn_id is NULL) then
249 	    l_return_status := FND_API.G_RET_STS_ERROR;
250 	    if( FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_ERROR)) then
251 		FND_MESSAGE.SET_NAME('INV', 'INV_ENTER_ITEM_LPN');
252 		FND_MSG_PUB.Add;
253 	    end if;
254 	end if;
255     END IF;
256 
257     IF  p_trolin_rec.date_required IS NULL THEN
258         l_return_status := FND_API.G_RET_STS_ERROR;
259 
260         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
261             FND_MESSAGE.SET_NAME('INV','INV_ATTRIBUTE_REQUIRED');
262             FND_MESSAGE.SET_TOKEN('ATTRIBUTE',FND_MESSAGE.GET_STRING('INV','INV_DATE_REQUIRED'),FALSE);
263             FND_MSG_PUB.Add;
264         END IF;
265     END IF;
266 
267     IF  p_trolin_rec.quantity IS NULL THEN
268 	if( p_move_order_type <> INV_GLOBALS.G_MOVE_ORDER_PUT_AWAY ) then
269             l_return_status := FND_API.G_RET_STS_ERROR;
270 
271             IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
272                 FND_MESSAGE.SET_NAME('INV','INV_INT_QTYCODE');
273                 FND_MSG_PUB.Add;
274             END IF;
275 	end if;
276     END IF;
277 
278     IF  p_trolin_rec.uom_code IS NULL THEN
279 	if( p_trolin_rec.inventory_item_id is not null and p_move_order_type <> INV_GLOBALS.G_MOVE_ORDER_PUT_AWAY ) then
280             l_return_status := FND_API.G_RET_STS_ERROR;
281             IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
282                 FND_MESSAGE.SET_NAME('INV','INV_ATTRIBUTE_REQUIRED');
283                 FND_MESSAGE.SET_TOKEN('ATTRIBUTE',FND_MESSAGE.GET_STRING('INV','UOM'),FALSE);
284                 FND_MSG_PUB.Add;
285             END IF;
286 	end if;
287     END IF;
288 
289     IF p_trolin_rec.lpn_id IS NULL THEN
290 	if p_move_order_type = INV_GLOBALS.G_MOVE_ORDER_PUT_AWAY and p_trolin_rec.inventory_item_id is null then
291 	    if( fnd_msg_pub.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)) then
292 		FND_MESSAGE.SET_NAME('INV', 'INV_ENTER_ITEM_LPN');
293 		FND_MSG_PUB.Add;
294 	    end if;
295 	end if;
296     END IF;
297 
298     IF  g_transaction_l.transaction_action_id = 1 THEN
299         IF  p_trolin_rec.to_account_id IS NULL AND
300             p_trolin_rec.transaction_type_id <> INV_GLOBALS.G_TYPE_XFER_ORDER_WIP_ISSUE
301 	    AND g_item.inventory_asset_flag = 'Y'  THEN
302         	-- Added the last condition for bug 2519579
303             l_return_status := FND_API.G_RET_STS_ERROR;
304 
305             IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
306                FND_MESSAGE.SET_NAME('INV','INV_ATTRIBUTE_REQUIRED');
307                FND_MESSAGE.SET_TOKEN('ATTRIBUTE','Account');
308                FND_MSG_PUB.Add;
309             END IF;
310         END IF;
311 
312      ELSIF g_transaction_l.transaction_action_id in (2,28) THEN
313 
314         IF p_trolin_rec.organization_id <> nvl(g_organization_id, -1) THEN
315            g_organization_id := p_trolin_rec.organization_id;
316            l_return_value := INV_CACHE.set_wms_installed(g_organization_id);
317            If NOT l_return_value Then
318               RAISE fnd_api.g_exc_unexpected_error;
319            End If;
320            g_wms_org_flag := INV_CACHE.wms_installed;
321         END IF;
322 
323         IF  p_trolin_rec.to_subinventory_code IS NULL THEN
324           --Bug #4347016
325           --For the Move Order types Putaway and Subinventory, destination subinventory
326           --is not required. Hence Bypass the validation
327 	        IF (p_move_order_type NOT IN
328                (INV_GLOBALS.G_MOVE_ORDER_PUT_AWAY, INV_GLOBALS.G_MOVE_ORDER_SYSTEM)) THEN
329             l_return_status := FND_API.G_RET_STS_ERROR;
330 
331             IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
332               FND_MESSAGE.SET_NAME('INV','INV_ATTRIBUTE_REQUIRED');
333               FND_MESSAGE.SET_TOKEN('ATTRIBUTE','To Subinventory');
334               FND_MSG_PUB.Add;
335             END IF; --END IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_ERROR)
336           END IF; --END IF MO type not in Putaway, System)
337         END IF;   --END IF sub code is NULL
338     END IF;
339 
340      --Bug #4777248
341     --Validating source and destination subinventories
342     --Bug #6271307, skipping validations for Kanban replenishment move orders.
343 
344     if ((p_trolin_rec.transaction_type_id = 64) and
345         (p_trolin_rec.from_subinventory_code IS NOT NULL) and
346 	(p_trolin_rec.to_subinventory_code IS NOT NULL) and
347   (NVL(p_trolin_rec.reference_type_code,0) <> 1) and
348 	(p_trolin_rec.from_subinventory_code = p_trolin_rec.to_subinventory_code)) THEN
349 
350        SELECT nvl(stock_locator_control_code, 1)
351          into l_org_loc_control
352          from mtl_parameters
353         where organization_id = p_trolin_rec.organization_id;
354 
355 	if (l_org_loc_control = 1) then
356 	   l_return_status := FND_API.G_RET_STS_ERROR;
357 
358 	  IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
359                 FND_MESSAGE.SET_NAME('INV','INV_SUB_RESTRICT');
360                 FND_MSG_PUB.Add;
361           END IF;
362 	else
363 	     if (l_org_loc_control = 4) then
364                 select nvl(locator_type,3)
365 	          into l_sub_loc_control
366 	          from mtl_secondary_inventories
367 	         where organization_id = p_trolin_rec.organization_id
368                    and secondary_inventory_name = p_trolin_rec.to_subinventory_code;
369 
370                 if (l_sub_loc_control = 1) THEN
371 
372                   l_return_status := FND_API.G_RET_STS_ERROR;
373 
374 	          IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
375                     FND_MESSAGE.SET_NAME('INV','INV_SUB_RESTRICT');
376                     FND_MSG_PUB.Add;
377                   END IF;
378                 elsif (l_sub_loc_control = 5) THEN
379 	          select nvl(location_control_code,1)
380 	            into l_item_loc_control
381 	            from mtl_system_items_b
382 	           where organization_id = p_trolin_rec.organization_id
383 	             and inventory_item_id = p_trolin_rec.inventory_item_id;
384 
385 	           if (l_item_loc_control = 1) THEN
386 	             l_return_status := FND_API.G_RET_STS_ERROR;
387 
388 	             IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
389                        FND_MESSAGE.SET_NAME('INV','INV_SUB_RESTRICT');
390                        FND_MSG_PUB.Add;
391                      END IF;
392 	           end if;
393                  end if;
394 	       end if;
395         end if;
396      end if;
397     --End Bug #4777248
398 
399     --Bug #4438410, adding validations for WIP component pick release.
400     IF inv_wip_picking_pvt.g_wip_patch_level >= 1159
401     THEN
402        IF p_trolin_rec.transaction_source_type_id
403           = inv_globals.g_sourcetype_inventory
404           AND p_move_order_type = inv_globals.g_move_order_mfg_pick
405           AND p_trolin_rec.to_subinventory_code is not null
406        THEN
407             SELECT NVL(lpn_controlled_flag, 0), reservable_type
408               INTO l_sub_lpn_controlled, l_sub_reservable
409               FROM mtl_secondary_inventories
410              WHERE organization_id = p_trolin_rec.organization_id
411                AND secondary_inventory_name = p_trolin_rec.to_subinventory_code;
412 
413             IF l_sub_reservable = inv_globals.g_subinventory_reservable
414             THEN
415               -- Get the job or schedule number
416               OPEN c_get_jobsch_name( p_trolin_rec.txn_source_id
417                                     , p_trolin_rec.organization_id);
418               FETCH c_get_jobsch_name INTO l_wip_entity_name;
419               CLOSE c_get_jobsch_name;
420 
421               -- Get the item number
422               OPEN c_get_item_num( p_trolin_rec.inventory_item_id
423                                  , p_trolin_rec.organization_id);
424               FETCH c_get_item_num INTO l_item_number;
425               CLOSE c_get_item_num;
426 
427               fnd_message.set_name('INV', 'INV_SUB_RESERVABLE');
428               fnd_message.set_token('JOB', l_wip_entity_name);
429               fnd_message.set_token('SUB', p_trolin_rec.to_subinventory_code);
430               fnd_message.set_token('ITEM', l_item_number);
431               fnd_msg_pub.ADD;
432               l_return_status := FND_API.G_RET_STS_ERROR;
433             END IF;
434 
435             IF g_wms_org_flag
436                AND l_sub_lpn_controlled = inv_globals.g_subinventory_lpn_controlled
437             THEN
438                -- Get the job or schedule number
439                OPEN c_get_jobsch_name( p_trolin_rec.txn_source_id
440                                      , p_trolin_rec.organization_id);
441                FETCH c_get_jobsch_name INTO l_wip_entity_name;
442                CLOSE c_get_jobsch_name;
443 
444                -- Get the item number
445                OPEN c_get_item_num( p_trolin_rec.inventory_item_id
446                                   , p_trolin_rec.organization_id);
447                FETCH c_get_item_num INTO l_item_number;
448                CLOSE c_get_item_num;
449 
450                fnd_message.set_name('WMS', 'WMS_SUB_LPN_CONTROLLED');
451                fnd_message.set_token('JOB', l_wip_entity_name);
452                fnd_message.set_token('SUB', p_trolin_rec.to_subinventory_code);
453                fnd_message.set_token('ITEM', l_item_number);
454 
455                fnd_msg_pub.ADD;
456                l_return_status := FND_API.G_RET_STS_ERROR;
457             END IF;
458        END IF; -- end if source type is g_sourcetype_inventory
459     END IF;
460     --End Bug #4438410
461 
462     IF l_return_status = FND_API.G_RET_STS_ERROR THEN
463         RAISE FND_API.G_EXC_ERROR;
464     END IF;
465 
466     --
467     --  Check conditionally required attributes here.
468     --
469     --  Validate attribute dependencies here.
470     --
471     -- inv_debug.message('TRO: dependency conditions');
472     -- validate unit number is the unit number is not null
473     IF (p_trolin_Rec.unit_number is NOT NULL) then
474         if( nvl(PJM_UNIT_EFF.ENABLED, 'N') = 'Y' ) then
475 	   if( PJM_UNIT_EFF.UNIT_EFFECTIVE_ITEM(p_trolin_rec.inventory_item_id,
476 						p_trolin_rec.organization_id) = 'Y') then
477 	       begin
478 		  select 1
479 		  into l_dummy
480 		  from pjm_unit_numbers_lov_v
481 		  where unit_number = p_trolin_rec.unit_number;
482 	       exception
483 		  when no_data_found then
484 	 	    FND_MESSAGE.SET_NAME('INV', 'INV_INT_UNITNUMBER');
485 		    FND_MSG_PUB.ADD;
486 		    raise FND_API.G_EXC_ERROR;
487 	       end;
488 	    end if;
489 	end if;
490     end if;
491 
492     IF (p_trolin_rec.serial_number_start IS NOT NULL
493          AND p_trolin_rec.serial_number_end IS NULL)
494      OR (p_trolin_rec.serial_number_start IS NULL
495          AND p_trolin_rec.serial_number_end IS NOT NULL)
496     THEN
497        x_return_status := FND_API.G_RET_STS_ERROR;
498        return;
499     ELSIF p_trolin_rec.serial_number_start IS NOT NULL
500     THEN
501       --Bug #2659444
502       --Call the procedure mtl_serial_check.inv_serial_info for validating
503       --serial prefixes, quantity between serials. (Replaced the existing validations
504       --with this call since it was not complete)
505       l_temp_bool := mtl_serial_check.inv_serial_info(
506               p_from_serial_number  =>  p_trolin_rec.serial_number_start,
507 	            p_to_serial_number    =>  p_trolin_rec.serial_number_end,
508 	            x_prefix              =>  l_start_prefix,
509 	            x_quantity            =>  l_quantity,
510 	            x_from_number         =>  l_start_number,
511 	            x_to_number           =>  l_end_number,
512 	            x_errorcode           =>  l_errorcode);
513       IF l_temp_bool = FALSE THEN
514         x_return_status := FND_API.G_RET_STS_ERROR;
515        return;
516       END IF;
517     END IF;
518 
519     --  Done validating entity
520     x_return_status := l_return_status;
521 
522 EXCEPTION
523     WHEN FND_API.G_EXC_ERROR THEN
524         x_return_status := FND_API.G_RET_STS_ERROR;
525 
526     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
527         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
528 
529     WHEN OTHERS THEN
530         -- inv_debug.message('TRO U: ' || SQLERRM);
531         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
532         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
533             FND_MSG_PUB.Add_Exc_Msg
534             (   G_PKG_NAME
535             ,   'Entity'
536             );
537         END IF;
538 
539 END Entity;
540 
541 --  Procedure Attributes
542 
543 PROCEDURE Attributes
544 (   x_return_status                 OUT NOCOPY VARCHAR2
545 ,   p_trolin_rec                    IN OUT NOCOPY INV_Move_Order_PUB.Trolin_Rec_Type
546 ,   p_trolin_val_rec                IN  INV_Move_Order_PUB.Trolin_Val_Rec_Type
547 ,   p_old_trolin_rec                IN  INV_Move_Order_PUB.Trolin_Rec_Type :=
548                                         INV_Move_Order_PUB.G_MISS_TROLIN_REC
549 )
550 IS
551 v_locator_control                   NUMBER;
552 l_return_status                     VARCHAR2(10);
553 l_temp                              VARCHAR2(10);
554 l_msg_count                         NUMBER;
555 l_msg_data                          VARCHAR2(240);
556 l_keystat_val                       BOOLEAN;
557 l_combination_id                    NUMBER;
558 l_project_id                        VARCHAR2(15);
559 l_task_id                           VARCHAR2(15);
560 l_chart_of_accounts_id              NUMBER;
561 l_acct_txn                          NUMBER;
562 l_found				    VARCHAR2(1);
563 l_project_id_mil                    VARCHAR2(15);
564 l_mov_order_type                    NUMBER;
565 l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
566 l_pjm                               NUMBER;--Bug#5036174
567 BEGIN
568 
569 
570     x_return_status := FND_API.G_RET_STS_SUCCESS;
571 
572 
573      --inv_debug.message('ssia', 'TRO: validating attributes');
574     --  Validate trolin attributes
575 
576 
577      --inv_debug.message('ssia', 'TRO: organization: ' || x_return_status);
578      --inv_debug.message('ssia', 'TRO: inventoryItem: '|| p_trolin_val_rec.inventory_item || x_return_status);
579 
580     IF  p_trolin_rec.inventory_item_id IS NULL
581         AND p_trolin_val_rec.inventory_item IS NOT NULL
582     THEN
583         p_trolin_rec.inventory_item_id :=  INV_Value_To_Id.Inventory_Item(p_trolin_rec.organization_id,
584                                               p_trolin_val_rec.inventory_item);
585     END IF;
586 
587     IF  p_trolin_rec.transaction_type_id IS NOT NULL and
588         ( p_trolin_rec.transaction_type_id <> p_old_trolin_rec.transaction_type_id OR
589           p_old_trolin_rec.transaction_type_id IS NULL )
590     THEN
591         g_transaction_l.transaction_type_id := p_trolin_rec.transaction_type_id;
592         IF INV_Validate.Transaction_Type(g_transaction_l) = inv_validate.F THEN
593            x_return_status := FND_API.G_RET_STS_ERROR;
594         END IF;
595     END IF;
596 
597 
598     /* bug9267446 moved the code after validation of transaction type id */
599     IF  p_trolin_rec.inventory_item_id IS NOT NULL AND
600         (   p_trolin_rec.inventory_item_id <>
601             p_old_trolin_rec.inventory_item_id OR
602             p_old_trolin_rec.inventory_item_id IS NULL )
603     THEN
604        g_item.inventory_item_id := p_trolin_rec.inventory_item_id;
605        inv_validate_trohdr.g_org.organization_id := p_trolin_rec.organization_id;
606        /* bug9267446 */
607       IF  g_transaction_l.transaction_type_id IS NOT NULL THEN
608 	 IF INV_Validate.Inventory_Item(g_item,inv_validate_trohdr.g_org,g_transaction_l.transaction_type_id) =
609 	  INV_Validate.F
610 	 THEN
611 	  x_return_status := FND_API.G_RET_STS_ERROR;
612 	  return;
613        END IF;
614      ELSE
615        /* bug9267446 */
616        IF INV_Validate.Inventory_Item(g_item,inv_validate_trohdr.g_org) =
617        --IF INV_Validate.Inventory_Item(g_item,inv_validate_trohdr.g_org) =
618 	 INV_Validate.F
619 	 THEN
620 	  x_return_status := FND_API.G_RET_STS_ERROR;
621 	  return;
622        END IF;
623       END IF;
624     END IF;
625      --inv_debug.message('ssia', 'TRO: item: ' || x_return_status);
626      -- Bug 15841667 Org validation added after item validation
627      IF p_trolin_rec.organization_id <> INV_Validate_Trohdr.g_org.organization_id
628       THEN
629        x_return_status := FND_API.G_RET_STS_ERROR;
630        return;
631     END IF;
632 -- Bug 15841667
633      --inv_debug.message('ssia', 'TRO: created_by: ' || to_char(p_trolin_rec.created_by));
634     IF  p_trolin_rec.created_by IS NOT NULL AND
635         (   p_trolin_rec.created_by <>
636             p_old_trolin_rec.created_by OR
637             p_old_trolin_rec.created_by IS NULL )
638     THEN
639        IF INV_Validate.Created_By(p_trolin_rec.created_by) = inv_validate.F
640 	 THEN
641             x_return_status := FND_API.G_RET_STS_ERROR;
642             return;
643         END IF;
644     END IF;
645     --inv_debug.message('ssia', 'TRO: created_by: ' || x_return_status);
646 
647     IF  p_trolin_rec.creation_date IS NULL THEN
648        p_trolin_rec.creation_date := SYSDATE;
649     END IF;
650     IF  p_trolin_rec.creation_date IS NOT NULL AND
651         (   p_trolin_rec.creation_date <>
652             p_old_trolin_rec.creation_date OR
653             p_old_trolin_rec.creation_date IS NULL )
654     THEN
655        IF INV_Validate.Creation_Date(p_trolin_rec.creation_date) =
656 	 INV_Validate.F
657 	 THEN
658 	  x_return_status := FND_API.G_RET_STS_ERROR;
659 	  return;
660        END IF;
661     END IF;
662 
663      --inv_debug.message('ssia', 'TRO: creation_date: ' || x_return_status);
664     IF  p_trolin_rec.date_required IS NOT NULL AND
665         (   p_trolin_rec.date_required <>
666             p_old_trolin_rec.date_required OR
667             p_old_trolin_rec.date_required IS NULL )
668     THEN
669        IF INV_Validate_Trohdr.Date_Required(p_trolin_rec.date_required) =
670 	 INV_Validate.F
671 	 THEN
672 	  x_return_status := FND_API.G_RET_STS_ERROR;
673 	  return;
674        END IF;
675     END IF;
676 
677      --inv_debug.message('ssia', 'TRO: date_required: ' || x_return_status);
678 
679     IF  p_trolin_rec.from_subinventory_code IS NOT NULL AND
680         (   p_trolin_rec.from_subinventory_code <>
681             p_old_trolin_rec.from_subinventory_code OR
682             p_old_trolin_rec.from_subinventory_code IS NULL )
683     THEN
684        g_from_sub.secondary_inventory_name :=
685 	 p_trolin_rec.from_subinventory_code;
686        IF inv_validate_trolin.g_transaction_l.transaction_action_id = 2 THEN
687 	  l_acct_txn := 0;
688        ELSE
689           l_acct_txn := 1;
690        END IF;
691        IF INV_Validate.From_Subinventory(g_from_sub,
692 					 inv_validate_trohdr.g_org,
693 					 g_item,l_acct_txn ) = INV_Validate.F
694 	 THEN
695 	   --inv_Debug.message('ssia', 'error from inv_validate.from_subinventory');
696 	  x_return_status := FND_API.G_RET_STS_ERROR;
697 	  return;
698        END IF;
699 
700        if( g_item.restrict_subinventories_code = 1 ) then
701 	 --inv_debug.message('ssia', 'g_item.restrict_subinventories_code is 1');
702          BEGIN
703            SELECT 'Y' INTO l_found
704              FROM mtl_item_sub_trk_all_v
705              WHERE inventory_item_id = p_trolin_Rec.inventory_item_id
706              AND organization_id = p_trolin_rec.organization_id
707              AND secondary_inventory_name = p_trolin_rec.from_subinventory_code;
708          --
709          EXCEPTION
710            WHEN NO_DATA_FOUND THEN
711 	      --inv_debug.message('ssia', 'invalid from sub');
712               fnd_message.set_name('INV','INVALID_SUB');
713               fnd_msg_pub.add;
714               RAISE fnd_api.g_exc_error;
715          END ;
716        ELSIF g_item.restrict_subinventories_code = 2 THEN
717            -- item is not restricted to specific subs
718 	 --inv_debug.message('ssia', 'g_item.restrict_subinventories_code is 2');
719          BEGIN
720            SELECT 'Y' INTO l_found
721              FROM mtl_subinventories_trk_val_v
722              WHERE organization_id = p_trolin_rec.organization_id
723              AND secondary_inventory_name = p_trolin_rec.from_subinventory_code ;
724            --
725          EXCEPTION
726            WHEN NO_DATA_FOUND THEN
727 	      --inv_debug.message('ssia', 'invalid from sub');
728               fnd_message.SET_NAME('INV','INVALID_SUB');
729               fnd_msg_pub.add;
730               RAISE fnd_api.g_exc_error;
731          END ;
732        END IF;
733      --inv_debug.message('ssia', 'TRO: from_subinventory_code: ' || x_return_status);
734     end if;
735 
736     IF  p_trolin_rec.project_id IS NOT NULL AND
737         (   p_trolin_rec.project_id <>
738             p_old_trolin_rec.project_id OR
739             p_old_trolin_rec.project_id IS NULL )
740     THEN
741        IF INV_Validate.Project(p_trolin_rec.project_id) = inv_validate.F THEN
742             x_return_status := FND_API.G_RET_STS_ERROR;
743             return;
744         END IF;
745     END IF;
746 
747     -- inv_debug.message('TRO: project_id: ' || x_return_status);
748 
749     IF  p_trolin_rec.task_id IS NOT NULL AND
750         (   p_trolin_rec.task_id <>
751             p_old_trolin_rec.task_id OR
752             p_old_trolin_rec.task_id IS NULL )
753     THEN
754        IF INV_Validate.Task(p_trolin_rec.task_id, p_trolin_rec.project_id)
755 	 = INV_Validate.F THEN
756 	  x_return_status := FND_API.G_RET_STS_ERROR;
757 	  return;
758        END IF;
759     END IF;
760 
761     -- inv_debug.message('TRO: task_id: ' || x_return_status);
762 
763     IF  p_trolin_rec.from_locator_id IS NULL
764        AND p_trolin_val_rec.from_locator IS NOT NULL
765     THEN
766         p_trolin_rec.from_locator_id := INV_Value_To_Id.from_locator(p_trolin_rec.organization_id,
767                                                          p_trolin_val_rec.from_locator);
768     END IF;
769 
770     IF  p_trolin_rec.from_locator_id IS NOT NULL AND
771         (   p_trolin_rec.from_locator_id <>
772             p_old_trolin_rec.from_locator_id OR
773             p_old_trolin_rec.from_locator_id IS NULL )
774     THEN
775        g_from_locator.inventory_location_id := p_trolin_rec.from_locator_id;
776 /*Bug#5036174. If the org is non-PJM enbled, then the 'from locator' should not   be specific to any project. So the values of both project_id and task_id
777   passed to 'INV_VALIDATE.FROM_LOCATOR' should be null when the org is non-PJM
778   enabled.*/
779 
780        IF (inv_cache.set_org_rec(p_trolin_rec.organization_id)) THEN
781          l_pjm := inv_cache.org_rec.project_reference_enabled;
782        END IF;
783        IF (l_pjm = 2) THEN
784          IF INV_Validate.From_Locator(
785                       g_from_locator
786 	             ,inv_validate_trohdr.g_org
787 	             ,g_item
788                      ,g_from_sub
789 	             ,NULL
790 	             ,NULL
791 	             ,inv_validate_trolin.g_transaction_l.transaction_action_id)                     = INV_Validate.F
792 	         THEN
793 	           x_return_status := FND_API.G_RET_STS_ERROR;
794 	           return;
795            END IF;
796          ELSE
797            IF INV_Validate.From_Locator(g_from_locator,
798 				    inv_validate_trohdr.g_org,
799 				    g_item, g_from_sub,
800 				    p_trolin_rec.project_id,
801 				    p_trolin_rec.task_id,
802 				    inv_validate_trolin.g_transaction_l.transaction_action_id) =
803 	 INV_Validate.F
804 	 THEN
805 	    x_return_status := FND_API.G_RET_STS_ERROR;
806 	    return;
807          END IF;
808       END IF;
809     END IF;
810 
811 
812     -- inv_debug.message('TRO: from_locator_id: ' || x_return_status);
813 
814     IF  p_trolin_rec.header_id IS NOT NULL AND
815         (   p_trolin_rec.header_id <>
816             p_old_trolin_rec.header_id OR
817             p_old_trolin_rec.header_id IS NULL )
818     THEN
819        IF INV_Validate_Trohdr.Header(p_trolin_rec.header_id) =
820 	 INV_Validate.F THEN
821             x_return_status := FND_API.G_RET_STS_ERROR;
822             return;
823         END IF;
824     END IF;
825 
826     -- inv_debug.message('TRO: header id: ' || x_return_status);
827 
828     IF  p_trolin_rec.last_updated_by IS NOT NULL AND
829         (   p_trolin_rec.last_updated_by <>
830             p_old_trolin_rec.last_updated_by OR
831             p_old_trolin_rec.last_updated_by IS NULL )
832     THEN
833        IF INV_Validate.Last_Updated_By(p_trolin_rec.last_updated_by) =
834 	 INV_Validate.F
835        	 THEN
836 	  x_return_status := FND_API.G_RET_STS_ERROR;
837 	  return;
838        END IF;
839     END IF;
840 
841     -- inv_debug.message('TRO: last_updated_by: ' || x_return_status);
842 
843     IF  p_trolin_rec.last_update_date IS NULL THEN
844        p_trolin_rec.last_update_date := SYSDATE;
845     END IF;
846     IF  p_trolin_rec.last_update_date IS NOT NULL AND
847         (   p_trolin_rec.last_update_date <>
848             p_old_trolin_rec.last_update_date OR
849             p_old_trolin_rec.last_update_date IS NULL )
850     THEN
851        IF INV_Validate.Last_Update_Date(p_trolin_rec.last_update_date) =
852 	 inv_validate.f
853 	 THEN
854 	  x_return_status := FND_API.G_RET_STS_ERROR;
855 	  return;
856        END IF;
857     END IF;
858 
859     -- inv_debug.message('TRO: last_update_date: ' || x_return_status);
860 
861     IF  p_trolin_rec.last_update_login IS NOT NULL AND
862         (   p_trolin_rec.last_update_login <>
863             p_old_trolin_rec.last_update_login OR
864             p_old_trolin_rec.last_update_login IS NULL )
865 	      THEN
866        IF INV_Validate.Last_Update_Login(p_trolin_rec.last_update_login) =
867 	 INV_Validate.f
868 	 THEN
869 	  x_return_status := FND_API.G_RET_STS_ERROR;
870 	  return;
871        END IF;
872     END IF;
873 
874     -- inv_debug.message('TRO: last_update_login: ' || x_return_status);
875 
876     IF  p_trolin_rec.line_id IS NOT NULL AND
877         (   p_trolin_rec.line_id <>
878             p_old_trolin_rec.line_id OR
879             p_old_trolin_rec.line_id IS NULL )
880 	      THEN
881         IF Line(p_trolin_rec.line_id) = F THEN
882 	   x_return_status := FND_API.G_RET_STS_ERROR;
883 	   return;
884         END IF;
885     END IF;
886 
887     -- inv_debug.message('TRO: line_id: ' || x_return_status);
888 
889 
890     IF  p_trolin_rec.line_number IS NOT NULL AND
891       (   p_trolin_rec.line_number <>
892 	  p_old_trolin_rec.line_number OR
893 	  p_old_trolin_rec.line_number IS NULL )
894     THEN
895        IF Line_Number(p_trolin_rec.line_number,p_trolin_rec.header_id,
896 		      inv_validate_trohdr.g_org) = F
897 	 THEN
898 	  x_return_status := FND_API.G_RET_STS_ERROR;
899 	  RETURN;
900        END IF;
901     END IF;
902 
903     -- inv_debug.message('TRO: line_number: ' || x_return_status);
904 
905 
906     IF  p_trolin_rec.line_status IS NOT NULL AND
907         (
908 	    --p_trolin_rec.line_status <>
909             --p_old_trolin_rec.line_status OR
910             p_old_trolin_rec.line_status IS NULL )
911     THEN
912        IF Line_Status(p_trolin_rec.line_status) = F THEN
913 	  x_return_status := FND_API.G_RET_STS_ERROR;
914 	  return;
915        END IF;
916     END IF;
917 
918     -- inv_debug.message('TRO: line_status: ' || x_return_status);
919 
920     IF  p_trolin_rec.program_application_id IS NOT NULL AND
921         (   p_trolin_rec.program_application_id <>
922             p_old_trolin_rec.program_application_id OR
923             p_old_trolin_rec.program_application_id IS NULL )
924     THEN
925        IF
926 	 INV_Validate.Program_Application(p_trolin_rec.program_application_id)
927 	 = INV_Validate.F
928 	 THEN
929 	  x_return_status := FND_API.G_RET_STS_ERROR;
930 	  return;
931        END IF;
932     END IF;
933 
934     -- inv_debug.message('TRO: program_application_id: ' || x_return_status);
935 
936     IF  p_trolin_rec.program_id IS NOT NULL AND
937         (   p_trolin_rec.program_id <>
938             p_old_trolin_rec.program_id OR
939             p_old_trolin_rec.program_id IS NULL )
940     THEN
941        IF INV_Validate.Program(p_trolin_rec.program_id) = inv_validate.F THEN
942 	  x_return_status := FND_API.G_RET_STS_ERROR;
943 	  return;
944        END IF;
945     END IF;
946 
947     -- inv_debug.message('TRO: program_id: ' || x_return_status);
948 
949     IF  p_trolin_rec.program_update_date IS NOT NULL AND
950         (   p_trolin_rec.program_update_date <>
951             p_old_trolin_rec.program_update_date OR
952             p_old_trolin_rec.program_update_date IS NULL )
953     THEN
954        IF
955 	 INV_Validate.Program_Update_Date(p_trolin_rec.program_update_date)
956 	 = inv_validate.F THEN
957 	  x_return_status := FND_API.G_RET_STS_ERROR;
958 	  return;
959        END IF;
960     END IF;
961 
962     -- inv_debug.message('TRO: program_update_date: ' || x_return_status);
963 
964     IF  p_trolin_rec.quantity IS NOT NULL AND
965         (   p_trolin_rec.quantity <>
966             p_old_trolin_rec.quantity OR
967             p_old_trolin_rec.quantity IS NULL )
968     THEN
969        IF INV_Validate.Quantity(p_trolin_rec.quantity) = inv_validate.F THEN
970 	  x_return_status := FND_API.G_RET_STS_ERROR;
971 	  return;
972        END IF;
973     END IF;
974 
975     -- inv_debug.message('TRO: quantity: ' || x_return_status);
976 
977     IF  p_trolin_rec.quantity_delivered IS NOT NULL AND
978         (   p_trolin_rec.quantity_delivered <>
979             p_old_trolin_rec.quantity_delivered OR
980             p_old_trolin_rec.quantity_delivered IS NULL )
981     THEN
982        IF Quantity_Delivered(p_trolin_rec.quantity_delivered) = F THEN
983 	  x_return_status := FND_API.G_RET_STS_ERROR;
984 	  return;
985        END IF;
986     END IF;
987 
988     -- inv_debug.message('TRO: quantity_delivered: ' || x_return_status);
989 
990     IF  p_trolin_rec.quantity_detailed IS NOT NULL AND
991         (   p_trolin_rec.quantity_detailed <>
992             p_old_trolin_rec.quantity_detailed OR
993             p_old_trolin_rec.quantity_detailed IS NULL )
994     THEN
995        IF Quantity_Detailed(p_trolin_rec.quantity_detailed) = F THEN
996 	  x_return_status := FND_API.G_RET_STS_ERROR;
997 	  return;
998        END IF;
999     END IF;
1000 
1001     -- inv_debug.message('TRO: quantity_detailed: ' || x_return_status);
1002 
1003 --INVCONV
1004 
1005     IF  p_trolin_rec.secondary_quantity IS NOT NULL AND
1006         (   p_trolin_rec.secondary_quantity <>
1007             p_old_trolin_rec.secondary_quantity OR
1008             p_old_trolin_rec.secondary_quantity IS NULL )
1009     THEN
1010        IF INV_Validate.Secondary_Quantity(p_trolin_rec.secondary_quantity) = inv_validate.F THEN
1011 	  x_return_status := FND_API.G_RET_STS_ERROR;
1012 	  return;
1013        END IF;
1014     END IF;
1015 
1016     -- inv_debug.message('TRO: secondary_quantity: ' || x_return_status);
1017 
1018     IF  p_trolin_rec.secondary_quantity_delivered IS NOT NULL AND
1019         (   p_trolin_rec.secondary_quantity_delivered <>
1020             p_old_trolin_rec.secondary_quantity_delivered OR
1021             p_old_trolin_rec.secondary_quantity_delivered IS NULL )
1022     THEN
1023        IF Secondary_Quantity_Delivered(p_trolin_rec.secondary_quantity_delivered) = F THEN
1024 	  x_return_status := FND_API.G_RET_STS_ERROR;
1025 	  return;
1026        END IF;
1027     END IF;
1028 
1029     -- inv_debug.message('TRO: secondary_quantity_delivered: ' || x_return_status);
1030 
1031     IF  p_trolin_rec.secondary_quantity_detailed IS NOT NULL AND
1032         (   p_trolin_rec.secondary_quantity_detailed <>
1033             p_old_trolin_rec.secondary_quantity_detailed OR
1034             p_old_trolin_rec.secondary_quantity_detailed IS NULL )
1035     THEN
1036        IF Secondary_Quantity_Detailed(p_trolin_rec.secondary_quantity_detailed) = F THEN
1037 	  x_return_status := FND_API.G_RET_STS_ERROR;
1038 	  return;
1039        END IF;
1040     END IF;
1041 
1042     -- inv_debug.message('TRO: secondary_quantity_detailed: ' || x_return_status);
1043 --INVCONV
1044     IF  p_trolin_rec.reason_id IS NOT NULL AND
1045         (   p_trolin_rec.reason_id <>
1046             p_old_trolin_rec.reason_id OR
1047             p_old_trolin_rec.reason_id IS NULL )
1048     THEN
1049        IF INV_Validate.Reason(p_trolin_rec.reason_id) = inv_validate.F THEN
1050 	  x_return_status := FND_API.G_RET_STS_ERROR;
1051 	  return;
1052        END IF;
1053     END IF;
1054     -- inv_debug.message('TRO: reason_id: ' || x_return_status);
1055 
1056     IF  p_trolin_rec.reference IS NOT NULL AND
1057         (   p_trolin_rec.reference <>
1058             p_old_trolin_rec.reference OR
1059             p_old_trolin_rec.reference IS NULL )
1060     THEN
1061        IF INV_Validate.Reference(p_trolin_rec.reference) = inv_validate.F THEN
1062             x_return_status := FND_API.G_RET_STS_ERROR;
1063             return;
1064         END IF;
1065     END IF;
1066     -- inv_debug.message('TRO: reference: ' || x_return_status);
1067 
1068     IF  p_trolin_rec.reference_type_code IS NOT NULL AND
1069         (   p_trolin_rec.reference_type_code <>
1070             p_old_trolin_rec.reference_type_code OR
1071             p_old_trolin_rec.reference_type_code IS NULL )
1072     THEN
1073        IF INV_Validate.Reference_Type(p_trolin_rec.reference_type_code) =
1074 	 inv_validate.F THEN
1075 	  x_return_status := FND_API.G_RET_STS_ERROR;
1076 	  return;
1077        END IF;
1078     END IF;
1079     -- inv_debug.message('TRO: reference_type_code: ' || x_return_status);
1080 
1081     IF  p_trolin_rec.reference_id IS NOT NULL AND
1082         p_trolin_rec.reference_type_code IS NOT NULL AND
1083         (   p_trolin_rec.reference_id <>
1084             p_old_trolin_rec.reference_id OR
1085             p_old_trolin_rec.reference_id IS NULL )
1086     THEN
1087        IF INV_Validate.Reference(p_trolin_rec.reference_id,
1088 				 p_trolin_rec.reference_type_code) =
1089 	 inv_validate.F  THEN
1090 	  x_return_status := FND_API.G_RET_STS_ERROR;
1091 	  return;
1092        END IF;
1093     END IF;
1094     -- inv_debug.message('TRO: reference_id: ' || x_return_status);
1095 
1096     IF  p_trolin_rec.request_id IS NOT NULL AND
1097         (   p_trolin_rec.request_id <>
1098             p_old_trolin_rec.request_id OR
1099             p_old_trolin_rec.request_id IS NULL )
1100     THEN
1101        IF INV_Validate_Trohdr.Request(p_trolin_rec.request_id) =
1102 	 inv_validate.F THEN
1103 	  x_return_status := FND_API.G_RET_STS_ERROR;
1104 	  return;
1105        END IF;
1106     END IF;
1107     -- inv_debug.message('TRO: request_id: ' || x_return_status);
1108 
1109     IF  p_trolin_rec.revision IS NOT NULL AND
1110         (   p_trolin_rec.revision <>
1111             p_old_trolin_rec.revision OR
1112             p_old_trolin_rec.revision IS NULL )
1113     THEN
1114        IF INV_Validate.Revision(p_trolin_rec.revision,
1115 				inv_validate_trohdr.g_org,
1116 				g_item) = inv_validate.F THEN
1117             x_return_status := FND_API.G_RET_STS_ERROR;
1118             return;
1119         END IF;
1120     END IF;
1121     -- inv_debug.message('TRO: revision: ' || x_return_status);
1122 
1123  /* Bug# 3347313. Moved the code to initialise the g_lot.lot_number variable
1124     outside the condition.*/
1125     g_lot.lot_number := p_trolin_rec.lot_number;
1126 
1127     IF  p_trolin_rec.lot_number IS NOT NULL AND
1128         (   p_trolin_rec.lot_number <>
1129             p_old_trolin_rec.lot_number OR
1130             p_old_trolin_rec.lot_number IS NULL )
1131     THEN
1132        --g_lot.lot_number := p_trolin_rec.lot_number;
1133        --Added to call new lot number function if putaway move order
1134        -- this is because on hand might not have this lot already
1135        -- in the case of a putaway move order
1136 
1137        SELECT move_order_type INTO l_mov_order_type
1138 	 FROM   mtl_txn_request_headers
1139 	 WHERE header_id=p_trolin_rec.header_id;
1140 
1141 
1142        IF l_mov_order_type=INV_GLOBALS.g_move_order_put_away
1143 	 THEN
1144 
1145 	  IF INV_Validate.Lot_Number(g_lot, inv_validate_trohdr.g_org, g_item) = inv_validate.F THEN
1146 	     x_return_status := FND_API.G_RET_STS_ERROR;
1147 	     return;
1148 	  END IF;
1149 
1150 	ELSE
1151 
1152 	  IF INV_Validate.Lot_Number(g_lot, inv_validate_trohdr.g_org, g_item,
1153 				     g_from_sub, g_from_locator,
1154 				     p_trolin_rec.revision) = inv_validate.F THEN
1155 	     x_return_status := FND_API.G_RET_STS_ERROR;
1156 	     return;
1157 	  END IF;
1158 
1159        END IF;
1160 
1161 
1162        /*
1163        IF INV_Validate.Lot_Number(g_lot, inv_validate_trohdr.g_org, g_item,
1164 				  g_from_sub, g_from_locator,
1165 				  p_trolin_rec.revision) = inv_validate.F THEN
1166             x_return_status := FND_API.G_RET_STS_ERROR;
1167             return;
1168 	 END IF;
1169 	 */
1170     END IF;
1171     -- inv_debug.message('TRO: lot_number: ' || x_return_status);
1172 
1173     IF  p_trolin_rec.serial_number_start IS NOT NULL AND
1174         (   p_trolin_rec.serial_number_start <>
1175             p_old_trolin_rec.serial_number_start OR
1176             p_old_trolin_rec.serial_number_start IS NULL )
1177     THEN
1178        g_serial.serial_number := p_trolin_rec.serial_number_start;
1179        IF INV_Validate.Serial_Number_Start(g_serial,
1180 					   inv_validate_trohdr.g_org,
1181 					   g_item, g_from_sub, g_lot,
1182 					   g_from_locator,
1183 					   p_trolin_rec.revision) =
1184 	 inv_validate.F THEN
1185 	  x_return_status := FND_API.G_RET_STS_ERROR;
1186 	  return;
1187        END IF;
1188     END IF;
1189     -- inv_debug.message('TRO: serial_number_start: ' || x_return_status);
1190 
1191     IF  p_trolin_rec.serial_number_end IS NOT NULL AND
1192         (   p_trolin_rec.serial_number_end <>
1193             p_old_trolin_rec.serial_number_end OR
1194             p_old_trolin_rec.serial_number_end IS NULL )
1195     THEN
1196        g_serial.serial_number := p_trolin_rec.serial_number_end;
1197        IF INV_Validate.Serial_Number_End(g_serial,
1198 					 inv_validate_trohdr.g_org,
1199 					 g_item, g_from_sub, g_lot,
1200 					 g_from_locator,
1201 					 p_trolin_rec.revision) =
1202 	 inv_validate.F THEN
1203 	  x_return_status := FND_API.G_RET_STS_ERROR;
1204 	  return;
1205        END IF;
1206     END IF;
1207     -- inv_debug.message('TRO: serial_number: ' || x_return_status);
1208 
1209 
1210     IF  p_trolin_rec.status_date IS NOT NULL AND
1211         (   p_trolin_rec.status_date <>
1212             p_old_trolin_rec.status_date OR
1213             p_old_trolin_rec.status_date IS NULL )
1214     THEN
1215        IF INV_Validate_Trohdr.Status_Date(p_trolin_rec.status_date) =
1216 	 inv_validate.F THEN
1217 	  x_return_status := FND_API.G_RET_STS_ERROR;
1218 	  return;
1219        END IF;
1220     END IF;
1221     -- inv_debug.message('TRO: status_date: ' || x_return_status);
1222 
1223 
1224     IF g_transaction_l.transaction_action_id = 1 THEN
1225        IF  p_trolin_rec.to_account_id IS NULL
1226           AND p_trolin_val_rec.to_account IS NOT NULL
1227       THEN
1228 
1229 	 SELECT ORG.CHART_OF_ACCOUNTS_ID
1230 	   INTO l_chart_of_accounts_id
1231 	   FROM ORG_ORGANIZATION_DEFINITIONS ORG
1232 	   WHERE ORG.ORGANIZATION_ID = inv_validate_trohdr.g_org.organization_id;
1233 
1234 	 l_keystat_val := FND_FLEX_KEYVAL.Validate_Segs(
1235                             OPERATION        => 'CREATE_COMBINATION',
1236                             APPL_SHORT_NAME  => 'SQLGL',
1237 			    key_flex_code    => 'GL#',
1238                             STRUCTURE_NUMBER => l_chart_of_accounts_id,
1239                             CONCAT_SEGMENTS  => p_trolin_val_rec.to_account,
1240                             VALUES_OR_IDS    => 'V');
1241                             -- DATA_SET         => INV_Validate.g_TRO_VAttributes.organization_id);
1242           if l_keystat_val then
1243             l_combination_id := FND_FLEX_KEYVAL.combination_id;
1244             p_trolin_rec.to_account_id := l_combination_id;
1245           else
1246             x_return_status := FND_API.G_RET_STS_ERROR;
1247           end if;
1248       END IF;
1249 
1250 
1251       IF  p_trolin_rec.to_account_id IS NOT NULL AND
1252           (   p_trolin_rec.to_account_id <>
1253               p_old_trolin_rec.to_account_id OR
1254               p_old_trolin_rec.to_account_id IS NULL )
1255       THEN
1256 	 IF INV_Validate.To_Account(p_trolin_rec.to_account_id) =
1257 	   inv_validate.f THEN
1258               x_return_status := FND_API.G_RET_STS_ERROR;
1259           END IF;
1260       END IF;
1261       -- inv_debug.message('TRO: to_account_id: ' || x_return_status);
1262     END IF;
1263 
1264     IF  g_transaction_l.transaction_action_id in (2,28) THEN
1265        IF  p_trolin_rec.to_subinventory_code IS NOT NULL AND
1266           (   p_trolin_rec.to_subinventory_code <>
1267               p_old_trolin_rec.to_subinventory_code OR
1268               p_old_trolin_rec.to_subinventory_code IS NULL )
1269       THEN
1270          --inv_debug.message('ssia', 'check to_subinventory_code');
1271 	 g_to_sub.secondary_inventory_name := p_trolin_rec.to_subinventory_code;
1272 	 IF INV_Validate.To_Subinventory(g_to_sub, inv_validate_trohdr.g_org,
1273 					 g_item, g_from_sub, 0) =
1274 	   inv_validate.F THEN
1275 	    --inv_debug.message('ssia', 'error to_subinventory_code');
1276             x_return_status := FND_API.G_RET_STS_ERROR;
1277             return;
1278 	 END IF;
1279          if( g_item.restrict_subinventories_code = 1 ) then
1280 	    --inv_Debug.message('ssia', 'g_item_restrict subinventory code is 1');
1281             BEGIN
1282               SELECT 'Y' INTO l_found
1283                 FROM mtl_secondary_inventories sec, mtl_item_sub_inventories item
1284                 WHERE item.inventory_item_id = p_trolin_rec.inventory_item_id
1285                 AND sec.organization_id = p_trolin_Rec.organization_id
1286                 AND sec.secondary_inventory_name = p_trolin_rec.to_subinventory_code
1287 		AND sec.organization_id = item.organization_id
1288 		AND sec.secondary_inventory_name = item.secondary_inventory;
1289             --
1290             EXCEPTION
1291               WHEN NO_DATA_FOUND THEN
1292 		 --inv_debug.message('ssia', 'invalid to sub');
1293                  fnd_message.set_name('INV','INVALID_SUB');
1294                  fnd_msg_pub.add;
1295                  RAISE fnd_api.g_exc_error;
1296             END ;
1297           ELSIF g_item.restrict_subinventories_code = 2 THEN
1298               -- item is not restricted to specific subs
1299 	    --inv_Debug.message('ssia', 'g_item_restrict subinventory code is 2');
1300             BEGIN
1301               SELECT 'Y' INTO l_found
1302                 FROM mtl_secondary_inventories
1303                 WHERE organization_id = p_trolin_rec.organization_id
1304 		AND secondary_inventory_name = p_trolin_rec.to_subinventory_code
1305 		AND nvl(disable_date, SYSDATE+1) > SYSDATE;
1306             --
1307             EXCEPTION
1308                 WHEN NO_DATA_FOUND THEN
1309 		 --inv_debug.message('ssia', 'invalid to sub');
1310                   fnd_message.SET_NAME('INV','INVALID_SUB');
1311                   fnd_msg_pub.add;
1312                   RAISE fnd_api.g_exc_error;
1313             END ;
1314 	 END IF;
1315       END IF;
1316        --inv_debug.message('ssia', 'TRO: to_subinventory: ' || x_return_status);
1317 
1318 
1319     -- **********************************************************
1320     -- Validation
1321     -- **********************************************************
1322       IF  p_trolin_rec.to_locator_id IS NULL
1323           AND p_trolin_val_rec.to_locator IS NOT NULL
1324       THEN
1325           v_locator_control :=
1326              INV_Globals.Locator_control(
1327                            l_return_status,
1328                            l_msg_count,
1329                            l_msg_data,
1330                            inv_validate_trohdr.g_org.stock_locator_control_code,
1331                            nvl(g_to_sub.locator_type,1),
1332                            g_item.location_control_code,
1333                            g_item.restrict_locators_code,
1334                            inv_validate_trohdr.g_org.negative_inv_receipt_code,
1335 			   inv_validate_trolin.g_transaction_l.transaction_action_id);
1336           if (NVL(v_locator_control,1) = 3) then
1337             l_keystat_val := FND_FLEX_KEYVAL.Validate_Segs(
1338                             OPERATION        => 'CREATE_COMB_NO_AT',
1339                             APPL_SHORT_NAME  => 'INV',
1340                             KEY_FLEX_CODE    => 'MTLL',
1341                             STRUCTURE_NUMBER => 101,
1342                             CONCAT_SEGMENTS  => p_trolin_val_rec.to_locator,
1343                             VALUES_OR_IDS    => 'V',
1344                             DATA_SET         => inv_validate_trohdr.g_org.organization_id);
1345 
1346             if l_keystat_val then
1347               l_combination_id := FND_FLEX_KEYVAL.combination_id;
1348               BEGIN
1349                 SELECT 'EXISTS'
1350                   INTO l_temp
1351                   FROM MTL_ITEM_LOCATIONS
1352                  WHERE INVENTORY_LOCATION_ID = l_combination_id
1353                    AND ORGANIZATION_ID = inv_validate_trohdr.g_org.organization_id
1354 		AND SUBINVENTORY_CODE = g_to_sub.secondary_inventory_name;
1355 
1356               EXCEPTION
1357                WHEN NO_DATA_FOUND THEN
1358 		  UPDATE mtl_item_locations
1359                    SET SUBINVENTORY_CODE = g_to_sub.secondary_inventory_name
1360                  WHERE INVENTORY_LOCATION_ID = l_combination_id
1361                    AND ORGANIZATION_ID = inv_validate_trohdr.g_org.organization_id
1362                    AND SUBINVENTORY_CODE = NULL;
1363 
1364                 if SQL%NOTFOUND then
1365                    x_return_status := FND_API.G_RET_STS_ERROR;
1366                    return;
1367                 else
1368                   SELECT PROJECT_ID,TASK_ID
1369                     INTO l_project_id, l_task_id
1370                     FROM MTL_ITEM_LOCATIONS
1371                    WHERE INVENTORY_LOCATION_ID = l_combination_id
1372                      AND ORGANIZATION_ID =inv_validate_trohdr.g_org.organization_id;
1373 
1374                    if NOT INV_ProjectLocator_PUB.Check_Project_References(
1375                               inv_validate_trohdr.g_org.organization_id,
1376                               p_trolin_rec.to_locator_id,
1377                               'ANY',
1378                               'N',
1379                               l_project_id,
1380                               l_task_id) then
1381                       x_return_status := FND_API.G_RET_STS_ERROR;
1382                    end if;
1383                  end if;
1384               END;
1385             end if;
1386           else
1387             x_return_status := FND_API.G_RET_STS_ERROR;
1388             return;
1389           end if;
1390           p_trolin_rec.to_locator_id := INV_Value_To_Id.To_Locator(p_trolin_rec.organization_id,
1391                                                        p_trolin_val_rec.to_locator);
1392       END IF;
1393 
1394       IF  p_trolin_rec.to_locator_id IS NOT NULL AND
1395           (   p_trolin_rec.to_locator_id <>
1396               p_old_trolin_rec.to_locator_id OR
1397               p_old_trolin_rec.to_locator_id IS NULL )
1398       THEN
1399 	 g_to_locator.inventory_location_id := p_trolin_rec.to_locator_id;
1400 
1401 /*	BUG 2347421 - When locator is specified on order line this validation fails
1402 		      if the logical locator with the project and task does not exist.
1403 		      This project locator is created later on in the flow.
1404 		      Changing this validation to not consider the project and task.
1405 
1406         BUG 3036732 - The fix in 2347421 fails when the locator is already entered with project and task
1407                       If the project info is already entered on the locator then validate the locator , else
1408                       do not consider the project and task
1409 */
1410                     SELECT PROJECT_ID
1411                     INTO l_project_id_mil
1412                     FROM MTL_ITEM_LOCATIONS
1413                     WHERE INVENTORY_LOCATION_ID =  g_to_locator.inventory_location_id
1414                     AND ORGANIZATION_ID = p_trolin_rec.organization_id;
1415 
1416 
1417            IF l_project_id_mil is NOT NULL THEN
1418 
1419 
1420         	 IF INV_Validate.To_Locator(g_to_locator,
1421 				    inv_validate_trohdr.g_org, g_item,
1422 				    g_to_sub, p_trolin_rec.project_id,
1423 				    p_trolin_rec.task_id,
1424 			    inv_validate_trolin.g_transaction_l.transaction_action_id) = inv_validate.F THEN
1425                              x_return_status := FND_API.G_RET_STS_ERROR;
1426                              return;
1427                   END IF;
1428 
1429            ELSE
1430 
1431 	           IF INV_Validate.To_Locator(g_to_locator,
1432 				    inv_validate_trohdr.g_org, g_item,
1433 				    g_to_sub, null, null,
1434 				    inv_validate_trolin.g_transaction_l.transaction_action_id) = inv_validate.F THEN
1435                                     x_return_status := FND_API.G_RET_STS_ERROR;
1436                                     return;
1437                    END IF;
1438             END IF;
1439       END IF;
1440       -- inv_debug.message('TRO: to_locator_id: ' || x_return_status);
1441     END IF;
1442 
1443 
1444     IF  p_trolin_rec.transaction_header_id IS NOT NULL AND
1445         (   p_trolin_rec.transaction_header_id <>
1446             p_old_trolin_rec.transaction_header_id OR
1447             p_old_trolin_rec.transaction_header_id IS NULL )
1448     THEN
1449        IF
1450 	 INV_Validate.Transaction_Header(p_trolin_rec.transaction_header_id) =
1451 	 inv_validate.f THEN
1452 	  x_return_status := FND_API.G_RET_STS_ERROR;
1453        END IF;
1454     END IF;
1455     -- inv_debug.message('TRO: transaction_header_id: ' || x_return_status);
1456 
1457     IF p_trolin_rec.ship_to_location_id IS NOT NULL AND
1458        ( p_trolin_rec.ship_to_location_id <>
1459            p_old_trolin_rec.transaction_header_id OR
1460            p_old_trolin_rec.transaction_header_id IS NULL)
1461     THEN
1462       IF INV_Validate.HR_Location(p_trolin_rec.ship_to_location_id) =
1463            INV_Validate.F
1464       THEN
1465         x_return_status := FND_API.G_RET_STS_ERROR;
1466       END IF;
1467     END IF;
1468 
1469     IF  p_trolin_rec.uom_code IS NOT NULL AND
1470         (   p_trolin_rec.uom_code <>
1471             p_old_trolin_rec.uom_code OR
1472             p_old_trolin_rec.uom_code IS NULL )
1473     THEN
1474        IF INV_Validate.Uom(p_trolin_rec.uom_code,
1475 			   inv_validate_trohdr.g_org, g_item) = inv_validate.F THEN
1476             x_return_status := FND_API.G_RET_STS_ERROR;
1477         END IF;
1478     END IF;
1479 
1480     IF p_trolin_rec.from_cost_group_id IS NOT NULL AND
1481        (p_trolin_rec.from_cost_group_id <> p_old_trolin_rec.from_cost_group_id OR
1482 	p_old_trolin_rec.from_cost_group_id IS NULL) then
1483         if INV_Validate.Cost_Group(p_trolin_rec.from_cost_group_id,
1484 				   p_trolin_rec.organization_id) = inv_validate.F then
1485 		x_return_status := FND_API.G_RET_STS_ERROR;
1486 	END IF;
1487     END IF;
1488 
1489     IF p_trolin_rec.to_cost_group_id IS NOT NULL AND
1490        (p_trolin_rec.to_cost_group_id <> p_old_trolin_rec.to_cost_group_id OR
1491         p_old_trolin_rec.to_cost_group_id IS NULL) then
1492         if INV_Validate.Cost_Group(p_trolin_rec.to_cost_group_id,
1493                                    p_trolin_rec.organization_id) = inv_validate.F then
1494                 x_return_status := FND_API.G_RET_STS_ERROR;
1495         END IF;
1496     END IF;
1497 
1498     IF p_trolin_rec.lpn_id IS NOT NULL AND
1499        (p_trolin_rec.lpn_id <> p_old_trolin_rec.lpn_id OR
1500         p_old_trolin_rec.lpn_id IS NULL) then
1501         if INV_Validate.LPN(p_trolin_rec.lpn_id) = inv_validate.F then
1502                 x_return_status := FND_API.G_RET_STS_ERROR;
1503         END IF;
1504     END IF;
1505 
1506     IF p_trolin_rec.to_lpn_id IS NOT NULL AND
1507        (p_trolin_rec.to_lpn_id <> p_old_trolin_rec.to_lpn_id OR
1508         p_old_trolin_rec.to_lpn_id IS NULL) then
1509         if INV_Validate.LPN(p_trolin_rec.to_lpn_id) = inv_validate.F then
1510                 x_return_status := FND_API.G_RET_STS_ERROR;
1511         END IF;
1512     END IF;
1513 
1514     -- inv_debug.message('TRO: uom: ' || x_return_status);
1515 
1516     IF  (p_trolin_rec.attribute1 IS NOT NULL AND
1517         (   p_trolin_rec.attribute1 <>
1518             p_old_trolin_rec.attribute1 OR
1519             p_old_trolin_rec.attribute1 IS NULL ))
1520     OR  (p_trolin_rec.attribute10 IS NOT NULL AND
1521         (   p_trolin_rec.attribute10 <>
1522             p_old_trolin_rec.attribute10 OR
1523             p_old_trolin_rec.attribute10 IS NULL ))
1524     OR  (p_trolin_rec.attribute11 IS NOT NULL AND
1525         (   p_trolin_rec.attribute11 <>
1526             p_old_trolin_rec.attribute11 OR
1527             p_old_trolin_rec.attribute11 IS NULL ))
1528     OR  (p_trolin_rec.attribute12 IS NOT NULL AND
1529         (   p_trolin_rec.attribute12 <>
1530             p_old_trolin_rec.attribute12 OR
1531             p_old_trolin_rec.attribute12 IS NULL ))
1532     OR  (p_trolin_rec.attribute13 IS NOT NULL AND
1533         (   p_trolin_rec.attribute13 <>
1534             p_old_trolin_rec.attribute13 OR
1535             p_old_trolin_rec.attribute13 IS NULL ))
1536     OR  (p_trolin_rec.attribute14 IS NOT NULL AND
1537         (   p_trolin_rec.attribute14 <>
1538             p_old_trolin_rec.attribute14 OR
1539             p_old_trolin_rec.attribute14 IS NULL ))
1540     OR  (p_trolin_rec.attribute15 IS NOT NULL AND
1541         (   p_trolin_rec.attribute15 <>
1542             p_old_trolin_rec.attribute15 OR
1543             p_old_trolin_rec.attribute15 IS NULL ))
1544     OR  (p_trolin_rec.attribute2 IS NOT NULL AND
1545         (   p_trolin_rec.attribute2 <>
1546             p_old_trolin_rec.attribute2 OR
1547             p_old_trolin_rec.attribute2 IS NULL ))
1548     OR  (p_trolin_rec.attribute3 IS NOT NULL AND
1549         (   p_trolin_rec.attribute3 <>
1550             p_old_trolin_rec.attribute3 OR
1551             p_old_trolin_rec.attribute3 IS NULL ))
1552     OR  (p_trolin_rec.attribute4 IS NOT NULL AND
1553         (   p_trolin_rec.attribute4 <>
1554             p_old_trolin_rec.attribute4 OR
1555             p_old_trolin_rec.attribute4 IS NULL ))
1556     OR  (p_trolin_rec.attribute5 IS NOT NULL AND
1557         (   p_trolin_rec.attribute5 <>
1558             p_old_trolin_rec.attribute5 OR
1559             p_old_trolin_rec.attribute5 IS NULL ))
1560     OR  (p_trolin_rec.attribute6 IS NOT NULL AND
1561         (   p_trolin_rec.attribute6 <>
1562             p_old_trolin_rec.attribute6 OR
1563             p_old_trolin_rec.attribute6 IS NULL ))
1564     OR  (p_trolin_rec.attribute7 IS NOT NULL AND
1565         (   p_trolin_rec.attribute7 <>
1566             p_old_trolin_rec.attribute7 OR
1567             p_old_trolin_rec.attribute7 IS NULL ))
1568     OR  (p_trolin_rec.attribute8 IS NOT NULL AND
1569         (   p_trolin_rec.attribute8 <>
1570             p_old_trolin_rec.attribute8 OR
1571             p_old_trolin_rec.attribute8 IS NULL ))
1572     OR  (p_trolin_rec.attribute9 IS NOT NULL AND
1573         (   p_trolin_rec.attribute9 <>
1574             p_old_trolin_rec.attribute9 OR
1575             p_old_trolin_rec.attribute9 IS NULL ))
1576     OR  (p_trolin_rec.attribute_category IS NOT NULL AND
1577         (   p_trolin_rec.attribute_category <>
1578             p_old_trolin_rec.attribute_category OR
1579             p_old_trolin_rec.attribute_category IS NULL ))
1580     THEN
1581 
1582     --  These calls are temporarily commented out
1583 
1584 
1585         --  Validate descriptive flexfield.
1586 
1587        IF INV_Validate.Desc_Flex( 'TROLIN' ) = inv_validate.F THEN
1588             x_return_status := FND_API.G_RET_STS_ERROR;
1589        END IF;
1590 
1591     END IF;
1592 
1593     --  Done validating attributes
1594 EXCEPTION
1595     WHEN FND_API.G_EXC_ERROR THEN
1596       x_return_status := FND_API.G_RET_STS_ERROR;
1597 
1598     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1599         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1600 
1601     WHEN OTHERS THEN
1602         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1603 
1604         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
1605             FND_MSG_PUB.Add_Exc_Msg ( G_PKG_NAME, 'Attributes');
1606         END IF;
1607 END Attributes;
1608 
1609 --  Procedure Entity_Delete
1610 
1611 PROCEDURE Entity_Delete
1612 (   x_return_status                 OUT NOCOPY VARCHAR2
1613 ,   p_trolin_rec                    IN  INV_Move_Order_PUB.Trolin_Rec_Type
1614 )
1615 IS
1616 l_return_status               VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
1617 l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
1618 BEGIN
1619 
1620     --  Validate entity delete.
1621     NULL;
1622 
1623     --  Done.
1624     x_return_status := l_return_status;
1625 
1626 EXCEPTION
1627 
1628     WHEN FND_API.G_EXC_ERROR THEN
1629         x_return_status := FND_API.G_RET_STS_ERROR;
1630 
1631     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1632         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1633 
1634     WHEN OTHERS THEN
1635         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1636 
1637         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
1638         THEN
1639             FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, 'Entity_Delete');
1640         END IF;
1641 
1642 END Entity_Delete;
1643 
1644 -- Bug # 1911054
1645 -- Procedure Init : used to initialized the global variable created in this package
1646 PROCEDURE Init
1647 IS
1648  l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
1649 BEGIN
1650      /*Fixed for bug#8358229
1651        Initialization should be done for complete record.
1652        Modified following initialization to initialize complete
1653        record
1654      */
1655 
1656    g_transaction_l             := Null;
1657    g_item                      := Null;
1658    g_from_sub                  := Null;
1659    g_to_sub                    := Null;
1660    g_from_locator              := Null;
1661    g_to_locator                := Null;
1662 END;
1663 
1664 END INV_Validate_Trolin;