DBA Data[Home] [Help]

PACKAGE BODY: APPS.INV_VALIDATE_TROLIN

Source


1 PACKAGE BODY INV_Validate_Trolin AS
2 /* $Header: INVLTRLB.pls 120.9 2007/07/24 13:45:32 hjogleka 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     IF p_trolin_rec.organization_id <> INV_Validate_Trohdr.g_org.organization_id
577       THEN
578        x_return_status := FND_API.G_RET_STS_ERROR;
579        return;
580     END IF;
581      --inv_debug.message('ssia', 'TRO: organization: ' || x_return_status);
582      --inv_debug.message('ssia', 'TRO: inventoryItem: '|| p_trolin_val_rec.inventory_item || x_return_status);
583 
584     IF  p_trolin_rec.inventory_item_id IS NULL
585         AND p_trolin_val_rec.inventory_item IS NOT NULL
586     THEN
587         p_trolin_rec.inventory_item_id :=  INV_Value_To_Id.Inventory_Item(p_trolin_rec.organization_id,
588                                               p_trolin_val_rec.inventory_item);
589     END IF;
590 
591     IF  p_trolin_rec.inventory_item_id IS NOT NULL AND
592         (   p_trolin_rec.inventory_item_id <>
593             p_old_trolin_rec.inventory_item_id OR
594             p_old_trolin_rec.inventory_item_id IS NULL )
595     THEN
596 
597        g_item.inventory_item_id := p_trolin_rec.inventory_item_id;
598        inv_validate_trohdr.g_org.organization_id := p_trolin_rec.organization_id;
599 
600        IF INV_Validate.Inventory_Item(g_item,inv_validate_trohdr.g_org) =
601 	 INV_Validate.F
602 	 THEN
603 	  x_return_status := FND_API.G_RET_STS_ERROR;
604 	  return;
605        END IF;
606     END IF;
607      --inv_debug.message('ssia', 'TRO: item: ' || x_return_status);
608 
609     IF  p_trolin_rec.transaction_type_id IS NOT NULL and
610         ( p_trolin_rec.transaction_type_id <> p_old_trolin_rec.transaction_type_id OR
611           p_old_trolin_rec.transaction_type_id IS NULL )
612     THEN
613         g_transaction_l.transaction_type_id := p_trolin_rec.transaction_type_id;
614         IF INV_Validate.Transaction_Type(g_transaction_l) = inv_validate.F THEN
615            x_return_status := FND_API.G_RET_STS_ERROR;
616         END IF;
617     END IF;
618 
619      --inv_debug.message('ssia', 'TRO: created_by: ' || to_char(p_trolin_rec.created_by));
620     IF  p_trolin_rec.created_by IS NOT NULL AND
621         (   p_trolin_rec.created_by <>
622             p_old_trolin_rec.created_by OR
623             p_old_trolin_rec.created_by IS NULL )
624     THEN
625        IF INV_Validate.Created_By(p_trolin_rec.created_by) = inv_validate.F
626 	 THEN
627             x_return_status := FND_API.G_RET_STS_ERROR;
628             return;
629         END IF;
630     END IF;
631     --inv_debug.message('ssia', 'TRO: created_by: ' || x_return_status);
632 
633     IF  p_trolin_rec.creation_date IS NULL THEN
634        p_trolin_rec.creation_date := SYSDATE;
635     END IF;
636     IF  p_trolin_rec.creation_date IS NOT NULL AND
637         (   p_trolin_rec.creation_date <>
638             p_old_trolin_rec.creation_date OR
639             p_old_trolin_rec.creation_date IS NULL )
640     THEN
641        IF INV_Validate.Creation_Date(p_trolin_rec.creation_date) =
642 	 INV_Validate.F
643 	 THEN
644 	  x_return_status := FND_API.G_RET_STS_ERROR;
645 	  return;
646        END IF;
647     END IF;
648 
649      --inv_debug.message('ssia', 'TRO: creation_date: ' || x_return_status);
650     IF  p_trolin_rec.date_required IS NOT NULL AND
651         (   p_trolin_rec.date_required <>
652             p_old_trolin_rec.date_required OR
653             p_old_trolin_rec.date_required IS NULL )
654     THEN
655        IF INV_Validate_Trohdr.Date_Required(p_trolin_rec.date_required) =
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: date_required: ' || x_return_status);
664 
665     IF  p_trolin_rec.from_subinventory_code IS NOT NULL AND
666         (   p_trolin_rec.from_subinventory_code <>
667             p_old_trolin_rec.from_subinventory_code OR
668             p_old_trolin_rec.from_subinventory_code IS NULL )
669     THEN
670        g_from_sub.secondary_inventory_name :=
671 	 p_trolin_rec.from_subinventory_code;
672        IF inv_validate_trolin.g_transaction_l.transaction_action_id = 2 THEN
673 	  l_acct_txn := 0;
674        ELSE
675           l_acct_txn := 1;
676        END IF;
677        IF INV_Validate.From_Subinventory(g_from_sub,
678 					 inv_validate_trohdr.g_org,
679 					 g_item,l_acct_txn ) = INV_Validate.F
680 	 THEN
681 	   --inv_Debug.message('ssia', 'error from inv_validate.from_subinventory');
682 	  x_return_status := FND_API.G_RET_STS_ERROR;
683 	  return;
684        END IF;
685 
686        if( g_item.restrict_subinventories_code = 1 ) then
687 	 --inv_debug.message('ssia', 'g_item.restrict_subinventories_code is 1');
688          BEGIN
689            SELECT 'Y' INTO l_found
690              FROM mtl_item_sub_trk_all_v
691              WHERE inventory_item_id = p_trolin_Rec.inventory_item_id
692              AND organization_id = p_trolin_rec.organization_id
693              AND secondary_inventory_name = p_trolin_rec.from_subinventory_code;
694          --
695          EXCEPTION
696            WHEN NO_DATA_FOUND THEN
697 	      --inv_debug.message('ssia', 'invalid from sub');
698               fnd_message.set_name('INV','INVALID_SUB');
699               fnd_msg_pub.add;
700               RAISE fnd_api.g_exc_error;
701          END ;
702        ELSIF g_item.restrict_subinventories_code = 2 THEN
703            -- item is not restricted to specific subs
704 	 --inv_debug.message('ssia', 'g_item.restrict_subinventories_code is 2');
705          BEGIN
706            SELECT 'Y' INTO l_found
707              FROM mtl_subinventories_trk_val_v
708              WHERE organization_id = p_trolin_rec.organization_id
709              AND secondary_inventory_name = p_trolin_rec.from_subinventory_code ;
710            --
711          EXCEPTION
712            WHEN NO_DATA_FOUND THEN
713 	      --inv_debug.message('ssia', 'invalid from sub');
714               fnd_message.SET_NAME('INV','INVALID_SUB');
715               fnd_msg_pub.add;
716               RAISE fnd_api.g_exc_error;
717          END ;
718        END IF;
719      --inv_debug.message('ssia', 'TRO: from_subinventory_code: ' || x_return_status);
720     end if;
721 
722     IF  p_trolin_rec.project_id IS NOT NULL AND
723         (   p_trolin_rec.project_id <>
724             p_old_trolin_rec.project_id OR
725             p_old_trolin_rec.project_id IS NULL )
726     THEN
727        IF INV_Validate.Project(p_trolin_rec.project_id) = inv_validate.F THEN
728             x_return_status := FND_API.G_RET_STS_ERROR;
729             return;
730         END IF;
731     END IF;
732 
733     -- inv_debug.message('TRO: project_id: ' || x_return_status);
734 
735     IF  p_trolin_rec.task_id IS NOT NULL AND
736         (   p_trolin_rec.task_id <>
737             p_old_trolin_rec.task_id OR
738             p_old_trolin_rec.task_id IS NULL )
739     THEN
740        IF INV_Validate.Task(p_trolin_rec.task_id, p_trolin_rec.project_id)
741 	 = 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: task_id: ' || x_return_status);
748 
749     IF  p_trolin_rec.from_locator_id IS NULL
750        AND p_trolin_val_rec.from_locator IS NOT NULL
751     THEN
752         p_trolin_rec.from_locator_id := INV_Value_To_Id.from_locator(p_trolin_rec.organization_id,
753                                                          p_trolin_val_rec.from_locator);
754     END IF;
755 
756     IF  p_trolin_rec.from_locator_id IS NOT NULL AND
757         (   p_trolin_rec.from_locator_id <>
758             p_old_trolin_rec.from_locator_id OR
759             p_old_trolin_rec.from_locator_id IS NULL )
760     THEN
761        g_from_locator.inventory_location_id := p_trolin_rec.from_locator_id;
762 /*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
763   passed to 'INV_VALIDATE.FROM_LOCATOR' should be null when the org is non-PJM
764   enabled.*/
765 
766        IF (inv_cache.set_org_rec(p_trolin_rec.organization_id)) THEN
767          l_pjm := inv_cache.org_rec.project_reference_enabled;
768        END IF;
769        IF (l_pjm = 2) THEN
770          IF INV_Validate.From_Locator(
771                       g_from_locator
772 	             ,inv_validate_trohdr.g_org
773 	             ,g_item
774                      ,g_from_sub
775 	             ,NULL
776 	             ,NULL
777 	             ,inv_validate_trolin.g_transaction_l.transaction_action_id)                     = INV_Validate.F
778 	         THEN
779 	           x_return_status := FND_API.G_RET_STS_ERROR;
780 	           return;
781            END IF;
782          ELSE
783            IF INV_Validate.From_Locator(g_from_locator,
784 				    inv_validate_trohdr.g_org,
785 				    g_item, g_from_sub,
786 				    p_trolin_rec.project_id,
787 				    p_trolin_rec.task_id,
788 				    inv_validate_trolin.g_transaction_l.transaction_action_id) =
789 	 INV_Validate.F
790 	 THEN
791 	    x_return_status := FND_API.G_RET_STS_ERROR;
792 	    return;
793          END IF;
794       END IF;
795     END IF;
796 
797 
798     -- inv_debug.message('TRO: from_locator_id: ' || x_return_status);
799 
800     IF  p_trolin_rec.header_id IS NOT NULL AND
801         (   p_trolin_rec.header_id <>
802             p_old_trolin_rec.header_id OR
803             p_old_trolin_rec.header_id IS NULL )
804     THEN
805        IF INV_Validate_Trohdr.Header(p_trolin_rec.header_id) =
806 	 INV_Validate.F THEN
807             x_return_status := FND_API.G_RET_STS_ERROR;
808             return;
809         END IF;
810     END IF;
811 
812     -- inv_debug.message('TRO: header id: ' || x_return_status);
813 
814     IF  p_trolin_rec.last_updated_by IS NOT NULL AND
815         (   p_trolin_rec.last_updated_by <>
816             p_old_trolin_rec.last_updated_by OR
817             p_old_trolin_rec.last_updated_by IS NULL )
818     THEN
819        IF INV_Validate.Last_Updated_By(p_trolin_rec.last_updated_by) =
820 	 INV_Validate.F
821        	 THEN
822 	  x_return_status := FND_API.G_RET_STS_ERROR;
823 	  return;
824        END IF;
825     END IF;
826 
827     -- inv_debug.message('TRO: last_updated_by: ' || x_return_status);
828 
829     IF  p_trolin_rec.last_update_date IS NULL THEN
830        p_trolin_rec.last_update_date := SYSDATE;
831     END IF;
832     IF  p_trolin_rec.last_update_date IS NOT NULL AND
833         (   p_trolin_rec.last_update_date <>
834             p_old_trolin_rec.last_update_date OR
835             p_old_trolin_rec.last_update_date IS NULL )
836     THEN
837        IF INV_Validate.Last_Update_Date(p_trolin_rec.last_update_date) =
838 	 inv_validate.f
839 	 THEN
840 	  x_return_status := FND_API.G_RET_STS_ERROR;
841 	  return;
842        END IF;
843     END IF;
844 
845     -- inv_debug.message('TRO: last_update_date: ' || x_return_status);
846 
847     IF  p_trolin_rec.last_update_login IS NOT NULL AND
848         (   p_trolin_rec.last_update_login <>
849             p_old_trolin_rec.last_update_login OR
850             p_old_trolin_rec.last_update_login IS NULL )
851 	      THEN
852        IF INV_Validate.Last_Update_Login(p_trolin_rec.last_update_login) =
853 	 INV_Validate.f
854 	 THEN
855 	  x_return_status := FND_API.G_RET_STS_ERROR;
856 	  return;
857        END IF;
858     END IF;
859 
860     -- inv_debug.message('TRO: last_update_login: ' || x_return_status);
861 
862     IF  p_trolin_rec.line_id IS NOT NULL AND
863         (   p_trolin_rec.line_id <>
864             p_old_trolin_rec.line_id OR
865             p_old_trolin_rec.line_id IS NULL )
866 	      THEN
867         IF Line(p_trolin_rec.line_id) = F THEN
868 	   x_return_status := FND_API.G_RET_STS_ERROR;
869 	   return;
870         END IF;
871     END IF;
872 
873     -- inv_debug.message('TRO: line_id: ' || x_return_status);
874 
875 
876     IF  p_trolin_rec.line_number IS NOT NULL AND
877       (   p_trolin_rec.line_number <>
878 	  p_old_trolin_rec.line_number OR
879 	  p_old_trolin_rec.line_number IS NULL )
880     THEN
881        IF Line_Number(p_trolin_rec.line_number,p_trolin_rec.header_id,
882 		      inv_validate_trohdr.g_org) = F
883 	 THEN
884 	  x_return_status := FND_API.G_RET_STS_ERROR;
885 	  RETURN;
886        END IF;
887     END IF;
888 
889     -- inv_debug.message('TRO: line_number: ' || x_return_status);
890 
891 
892     IF  p_trolin_rec.line_status IS NOT NULL AND
893         (
894 	    --p_trolin_rec.line_status <>
895             --p_old_trolin_rec.line_status OR
896             p_old_trolin_rec.line_status IS NULL )
897     THEN
898        IF Line_Status(p_trolin_rec.line_status) = F THEN
899 	  x_return_status := FND_API.G_RET_STS_ERROR;
900 	  return;
901        END IF;
902     END IF;
903 
904     -- inv_debug.message('TRO: line_status: ' || x_return_status);
905 
906     IF  p_trolin_rec.program_application_id IS NOT NULL AND
907         (   p_trolin_rec.program_application_id <>
908             p_old_trolin_rec.program_application_id OR
909             p_old_trolin_rec.program_application_id IS NULL )
910     THEN
911        IF
912 	 INV_Validate.Program_Application(p_trolin_rec.program_application_id)
913 	 = INV_Validate.F
914 	 THEN
915 	  x_return_status := FND_API.G_RET_STS_ERROR;
916 	  return;
917        END IF;
918     END IF;
919 
920     -- inv_debug.message('TRO: program_application_id: ' || x_return_status);
921 
922     IF  p_trolin_rec.program_id IS NOT NULL AND
923         (   p_trolin_rec.program_id <>
924             p_old_trolin_rec.program_id OR
925             p_old_trolin_rec.program_id IS NULL )
926     THEN
927        IF INV_Validate.Program(p_trolin_rec.program_id) = inv_validate.F THEN
928 	  x_return_status := FND_API.G_RET_STS_ERROR;
929 	  return;
930        END IF;
931     END IF;
932 
933     -- inv_debug.message('TRO: program_id: ' || x_return_status);
934 
935     IF  p_trolin_rec.program_update_date IS NOT NULL AND
936         (   p_trolin_rec.program_update_date <>
937             p_old_trolin_rec.program_update_date OR
938             p_old_trolin_rec.program_update_date IS NULL )
939     THEN
940        IF
941 	 INV_Validate.Program_Update_Date(p_trolin_rec.program_update_date)
942 	 = inv_validate.F THEN
943 	  x_return_status := FND_API.G_RET_STS_ERROR;
944 	  return;
945        END IF;
946     END IF;
947 
948     -- inv_debug.message('TRO: program_update_date: ' || x_return_status);
949 
950     IF  p_trolin_rec.quantity IS NOT NULL AND
951         (   p_trolin_rec.quantity <>
952             p_old_trolin_rec.quantity OR
953             p_old_trolin_rec.quantity IS NULL )
954     THEN
955        IF INV_Validate.Quantity(p_trolin_rec.quantity) = inv_validate.F THEN
956 	  x_return_status := FND_API.G_RET_STS_ERROR;
957 	  return;
958        END IF;
959     END IF;
960 
961     -- inv_debug.message('TRO: quantity: ' || x_return_status);
962 
963     IF  p_trolin_rec.quantity_delivered IS NOT NULL AND
964         (   p_trolin_rec.quantity_delivered <>
965             p_old_trolin_rec.quantity_delivered OR
966             p_old_trolin_rec.quantity_delivered IS NULL )
967     THEN
968        IF Quantity_Delivered(p_trolin_rec.quantity_delivered) = F THEN
969 	  x_return_status := FND_API.G_RET_STS_ERROR;
970 	  return;
971        END IF;
972     END IF;
973 
974     -- inv_debug.message('TRO: quantity_delivered: ' || x_return_status);
975 
976     IF  p_trolin_rec.quantity_detailed IS NOT NULL AND
977         (   p_trolin_rec.quantity_detailed <>
978             p_old_trolin_rec.quantity_detailed OR
979             p_old_trolin_rec.quantity_detailed IS NULL )
980     THEN
981        IF Quantity_Detailed(p_trolin_rec.quantity_detailed) = F THEN
982 	  x_return_status := FND_API.G_RET_STS_ERROR;
983 	  return;
984        END IF;
985     END IF;
986 
987     -- inv_debug.message('TRO: quantity_detailed: ' || x_return_status);
988 
989 --INVCONV
990 
991     IF  p_trolin_rec.secondary_quantity IS NOT NULL AND
992         (   p_trolin_rec.secondary_quantity <>
993             p_old_trolin_rec.secondary_quantity OR
994             p_old_trolin_rec.secondary_quantity IS NULL )
995     THEN
996        IF INV_Validate.Secondary_Quantity(p_trolin_rec.secondary_quantity) = inv_validate.F THEN
997 	  x_return_status := FND_API.G_RET_STS_ERROR;
998 	  return;
999        END IF;
1000     END IF;
1001 
1002     -- inv_debug.message('TRO: secondary_quantity: ' || x_return_status);
1003 
1004     IF  p_trolin_rec.secondary_quantity_delivered IS NOT NULL AND
1005         (   p_trolin_rec.secondary_quantity_delivered <>
1006             p_old_trolin_rec.secondary_quantity_delivered OR
1007             p_old_trolin_rec.secondary_quantity_delivered IS NULL )
1008     THEN
1009        IF Secondary_Quantity_Delivered(p_trolin_rec.secondary_quantity_delivered) = F THEN
1010 	  x_return_status := FND_API.G_RET_STS_ERROR;
1011 	  return;
1012        END IF;
1013     END IF;
1014 
1015     -- inv_debug.message('TRO: secondary_quantity_delivered: ' || x_return_status);
1016 
1017     IF  p_trolin_rec.secondary_quantity_detailed IS NOT NULL AND
1018         (   p_trolin_rec.secondary_quantity_detailed <>
1019             p_old_trolin_rec.secondary_quantity_detailed OR
1020             p_old_trolin_rec.secondary_quantity_detailed IS NULL )
1021     THEN
1022        IF Secondary_Quantity_Detailed(p_trolin_rec.secondary_quantity_detailed) = F THEN
1023 	  x_return_status := FND_API.G_RET_STS_ERROR;
1024 	  return;
1025        END IF;
1026     END IF;
1027 
1028     -- inv_debug.message('TRO: secondary_quantity_detailed: ' || x_return_status);
1029 --INVCONV
1030     IF  p_trolin_rec.reason_id IS NOT NULL AND
1031         (   p_trolin_rec.reason_id <>
1032             p_old_trolin_rec.reason_id OR
1033             p_old_trolin_rec.reason_id IS NULL )
1034     THEN
1035        IF INV_Validate.Reason(p_trolin_rec.reason_id) = inv_validate.F THEN
1036 	  x_return_status := FND_API.G_RET_STS_ERROR;
1037 	  return;
1038        END IF;
1039     END IF;
1040     -- inv_debug.message('TRO: reason_id: ' || x_return_status);
1041 
1042     IF  p_trolin_rec.reference IS NOT NULL AND
1043         (   p_trolin_rec.reference <>
1044             p_old_trolin_rec.reference OR
1045             p_old_trolin_rec.reference IS NULL )
1046     THEN
1047        IF INV_Validate.Reference(p_trolin_rec.reference) = inv_validate.F THEN
1048             x_return_status := FND_API.G_RET_STS_ERROR;
1049             return;
1050         END IF;
1051     END IF;
1052     -- inv_debug.message('TRO: reference: ' || x_return_status);
1053 
1054     IF  p_trolin_rec.reference_type_code IS NOT NULL AND
1055         (   p_trolin_rec.reference_type_code <>
1056             p_old_trolin_rec.reference_type_code OR
1057             p_old_trolin_rec.reference_type_code IS NULL )
1058     THEN
1059        IF INV_Validate.Reference_Type(p_trolin_rec.reference_type_code) =
1060 	 inv_validate.F THEN
1061 	  x_return_status := FND_API.G_RET_STS_ERROR;
1062 	  return;
1063        END IF;
1064     END IF;
1065     -- inv_debug.message('TRO: reference_type_code: ' || x_return_status);
1066 
1067     IF  p_trolin_rec.reference_id IS NOT NULL AND
1068         p_trolin_rec.reference_type_code IS NOT NULL AND
1069         (   p_trolin_rec.reference_id <>
1070             p_old_trolin_rec.reference_id OR
1071             p_old_trolin_rec.reference_id IS NULL )
1072     THEN
1073        IF INV_Validate.Reference(p_trolin_rec.reference_id,
1074 				 p_trolin_rec.reference_type_code) =
1075 	 inv_validate.F  THEN
1076 	  x_return_status := FND_API.G_RET_STS_ERROR;
1077 	  return;
1078        END IF;
1079     END IF;
1080     -- inv_debug.message('TRO: reference_id: ' || x_return_status);
1081 
1082     IF  p_trolin_rec.request_id IS NOT NULL AND
1083         (   p_trolin_rec.request_id <>
1084             p_old_trolin_rec.request_id OR
1085             p_old_trolin_rec.request_id IS NULL )
1086     THEN
1087        IF INV_Validate_Trohdr.Request(p_trolin_rec.request_id) =
1088 	 inv_validate.F THEN
1089 	  x_return_status := FND_API.G_RET_STS_ERROR;
1090 	  return;
1091        END IF;
1092     END IF;
1093     -- inv_debug.message('TRO: request_id: ' || x_return_status);
1094 
1095     IF  p_trolin_rec.revision IS NOT NULL AND
1096         (   p_trolin_rec.revision <>
1097             p_old_trolin_rec.revision OR
1098             p_old_trolin_rec.revision IS NULL )
1099     THEN
1100        IF INV_Validate.Revision(p_trolin_rec.revision,
1101 				inv_validate_trohdr.g_org,
1102 				g_item) = 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: revision: ' || x_return_status);
1108 
1109  /* Bug# 3347313. Moved the code to initialise the g_lot.lot_number variable
1110     outside the condition.*/
1111     g_lot.lot_number := p_trolin_rec.lot_number;
1112 
1113     IF  p_trolin_rec.lot_number IS NOT NULL AND
1114         (   p_trolin_rec.lot_number <>
1115             p_old_trolin_rec.lot_number OR
1116             p_old_trolin_rec.lot_number IS NULL )
1117     THEN
1118        --g_lot.lot_number := p_trolin_rec.lot_number;
1119        --Added to call new lot number function if putaway move order
1120        -- this is because on hand might not have this lot already
1121        -- in the case of a putaway move order
1122 
1123        SELECT move_order_type INTO l_mov_order_type
1124 	 FROM   mtl_txn_request_headers
1125 	 WHERE header_id=p_trolin_rec.header_id;
1126 
1127 
1128        IF l_mov_order_type=INV_GLOBALS.g_move_order_put_away
1129 	 THEN
1130 
1131 	  IF INV_Validate.Lot_Number(g_lot, inv_validate_trohdr.g_org, g_item) = inv_validate.F THEN
1132 	     x_return_status := FND_API.G_RET_STS_ERROR;
1133 	     return;
1134 	  END IF;
1135 
1136 	ELSE
1137 
1138 	  IF INV_Validate.Lot_Number(g_lot, inv_validate_trohdr.g_org, g_item,
1139 				     g_from_sub, g_from_locator,
1140 				     p_trolin_rec.revision) = inv_validate.F THEN
1141 	     x_return_status := FND_API.G_RET_STS_ERROR;
1142 	     return;
1143 	  END IF;
1144 
1145        END IF;
1146 
1147 
1148        /*
1149        IF INV_Validate.Lot_Number(g_lot, inv_validate_trohdr.g_org, g_item,
1150 				  g_from_sub, g_from_locator,
1151 				  p_trolin_rec.revision) = inv_validate.F THEN
1152             x_return_status := FND_API.G_RET_STS_ERROR;
1153             return;
1154 	 END IF;
1155 	 */
1156     END IF;
1157     -- inv_debug.message('TRO: lot_number: ' || x_return_status);
1158 
1159     IF  p_trolin_rec.serial_number_start IS NOT NULL AND
1160         (   p_trolin_rec.serial_number_start <>
1161             p_old_trolin_rec.serial_number_start OR
1162             p_old_trolin_rec.serial_number_start IS NULL )
1163     THEN
1164        g_serial.serial_number := p_trolin_rec.serial_number_start;
1165        IF INV_Validate.Serial_Number_Start(g_serial,
1166 					   inv_validate_trohdr.g_org,
1167 					   g_item, g_from_sub, g_lot,
1168 					   g_from_locator,
1169 					   p_trolin_rec.revision) =
1170 	 inv_validate.F THEN
1171 	  x_return_status := FND_API.G_RET_STS_ERROR;
1172 	  return;
1173        END IF;
1174     END IF;
1175     -- inv_debug.message('TRO: serial_number_start: ' || x_return_status);
1176 
1177     IF  p_trolin_rec.serial_number_end IS NOT NULL AND
1178         (   p_trolin_rec.serial_number_end <>
1179             p_old_trolin_rec.serial_number_end OR
1180             p_old_trolin_rec.serial_number_end IS NULL )
1181     THEN
1182        g_serial.serial_number := p_trolin_rec.serial_number_end;
1183        IF INV_Validate.Serial_Number_End(g_serial,
1184 					 inv_validate_trohdr.g_org,
1185 					 g_item, g_from_sub, g_lot,
1186 					 g_from_locator,
1187 					 p_trolin_rec.revision) =
1188 	 inv_validate.F THEN
1189 	  x_return_status := FND_API.G_RET_STS_ERROR;
1190 	  return;
1191        END IF;
1192     END IF;
1193     -- inv_debug.message('TRO: serial_number: ' || x_return_status);
1194 
1195 
1196     IF  p_trolin_rec.status_date IS NOT NULL AND
1197         (   p_trolin_rec.status_date <>
1198             p_old_trolin_rec.status_date OR
1199             p_old_trolin_rec.status_date IS NULL )
1200     THEN
1201        IF INV_Validate_Trohdr.Status_Date(p_trolin_rec.status_date) =
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: status_date: ' || x_return_status);
1208 
1209 
1210     IF g_transaction_l.transaction_action_id = 1 THEN
1211        IF  p_trolin_rec.to_account_id IS NULL
1212           AND p_trolin_val_rec.to_account IS NOT NULL
1213       THEN
1214 
1215 	 SELECT ORG.CHART_OF_ACCOUNTS_ID
1216 	   INTO l_chart_of_accounts_id
1217 	   FROM ORG_ORGANIZATION_DEFINITIONS ORG
1218 	   WHERE ORG.ORGANIZATION_ID = inv_validate_trohdr.g_org.organization_id;
1219 
1220 	 l_keystat_val := FND_FLEX_KEYVAL.Validate_Segs(
1221                             OPERATION        => 'CREATE_COMBINATION',
1222                             APPL_SHORT_NAME  => 'SQLGL',
1223 			    key_flex_code    => 'GL#',
1224                             STRUCTURE_NUMBER => l_chart_of_accounts_id,
1225                             CONCAT_SEGMENTS  => p_trolin_val_rec.to_account,
1226                             VALUES_OR_IDS    => 'V');
1227                             -- DATA_SET         => INV_Validate.g_TRO_VAttributes.organization_id);
1228           if l_keystat_val then
1229             l_combination_id := FND_FLEX_KEYVAL.combination_id;
1230             p_trolin_rec.to_account_id := l_combination_id;
1231           else
1232             x_return_status := FND_API.G_RET_STS_ERROR;
1233           end if;
1234       END IF;
1235 
1236 
1237       IF  p_trolin_rec.to_account_id IS NOT NULL AND
1238           (   p_trolin_rec.to_account_id <>
1239               p_old_trolin_rec.to_account_id OR
1240               p_old_trolin_rec.to_account_id IS NULL )
1241       THEN
1242 	 IF INV_Validate.To_Account(p_trolin_rec.to_account_id) =
1243 	   inv_validate.f THEN
1244               x_return_status := FND_API.G_RET_STS_ERROR;
1245           END IF;
1246       END IF;
1247       -- inv_debug.message('TRO: to_account_id: ' || x_return_status);
1248     END IF;
1249 
1250     IF  g_transaction_l.transaction_action_id in (2,28) THEN
1251        IF  p_trolin_rec.to_subinventory_code IS NOT NULL AND
1252           (   p_trolin_rec.to_subinventory_code <>
1253               p_old_trolin_rec.to_subinventory_code OR
1254               p_old_trolin_rec.to_subinventory_code IS NULL )
1255       THEN
1256          --inv_debug.message('ssia', 'check to_subinventory_code');
1257 	 g_to_sub.secondary_inventory_name := p_trolin_rec.to_subinventory_code;
1258 	 IF INV_Validate.To_Subinventory(g_to_sub, inv_validate_trohdr.g_org,
1259 					 g_item, g_from_sub, 0) =
1260 	   inv_validate.F THEN
1261 	    --inv_debug.message('ssia', 'error to_subinventory_code');
1262             x_return_status := FND_API.G_RET_STS_ERROR;
1263             return;
1264 	 END IF;
1265          if( g_item.restrict_subinventories_code = 1 ) then
1266 	    --inv_Debug.message('ssia', 'g_item_restrict subinventory code is 1');
1267             BEGIN
1268               SELECT 'Y' INTO l_found
1269                 FROM mtl_secondary_inventories sec, mtl_item_sub_inventories item
1270                 WHERE item.inventory_item_id = p_trolin_rec.inventory_item_id
1271                 AND sec.organization_id = p_trolin_Rec.organization_id
1272                 AND sec.secondary_inventory_name = p_trolin_rec.to_subinventory_code
1273 		AND sec.organization_id = item.organization_id
1274 		AND sec.secondary_inventory_name = item.secondary_inventory;
1275             --
1276             EXCEPTION
1277               WHEN NO_DATA_FOUND THEN
1278 		 --inv_debug.message('ssia', 'invalid to sub');
1279                  fnd_message.set_name('INV','INVALID_SUB');
1280                  fnd_msg_pub.add;
1281                  RAISE fnd_api.g_exc_error;
1282             END ;
1283           ELSIF g_item.restrict_subinventories_code = 2 THEN
1284               -- item is not restricted to specific subs
1285 	    --inv_Debug.message('ssia', 'g_item_restrict subinventory code is 2');
1286             BEGIN
1287               SELECT 'Y' INTO l_found
1288                 FROM mtl_secondary_inventories
1289                 WHERE organization_id = p_trolin_rec.organization_id
1290 		AND secondary_inventory_name = p_trolin_rec.to_subinventory_code
1291 		AND nvl(disable_date, SYSDATE+1) > SYSDATE;
1292             --
1293             EXCEPTION
1294                 WHEN NO_DATA_FOUND THEN
1295 		 --inv_debug.message('ssia', 'invalid to sub');
1296                   fnd_message.SET_NAME('INV','INVALID_SUB');
1297                   fnd_msg_pub.add;
1298                   RAISE fnd_api.g_exc_error;
1299             END ;
1300 	 END IF;
1301       END IF;
1302        --inv_debug.message('ssia', 'TRO: to_subinventory: ' || x_return_status);
1303 
1304 
1305     -- **********************************************************
1306     -- Validation
1307     -- **********************************************************
1308       IF  p_trolin_rec.to_locator_id IS NULL
1309           AND p_trolin_val_rec.to_locator IS NOT NULL
1310       THEN
1311           v_locator_control :=
1312              INV_Globals.Locator_control(
1313                            l_return_status,
1314                            l_msg_count,
1315                            l_msg_data,
1316                            inv_validate_trohdr.g_org.stock_locator_control_code,
1317                            nvl(g_to_sub.locator_type,1),
1318                            g_item.location_control_code,
1319                            g_item.restrict_locators_code,
1320                            inv_validate_trohdr.g_org.negative_inv_receipt_code,
1321 			   inv_validate_trolin.g_transaction_l.transaction_action_id);
1322           if (NVL(v_locator_control,1) = 3) then
1323             l_keystat_val := FND_FLEX_KEYVAL.Validate_Segs(
1324                             OPERATION        => 'CREATE_COMB_NO_AT',
1325                             APPL_SHORT_NAME  => 'INV',
1326                             KEY_FLEX_CODE    => 'MTLL',
1327                             STRUCTURE_NUMBER => 101,
1328                             CONCAT_SEGMENTS  => p_trolin_val_rec.to_locator,
1329                             VALUES_OR_IDS    => 'V',
1330                             DATA_SET         => inv_validate_trohdr.g_org.organization_id);
1331 
1332             if l_keystat_val then
1333               l_combination_id := FND_FLEX_KEYVAL.combination_id;
1334               BEGIN
1335                 SELECT 'EXISTS'
1336                   INTO l_temp
1337                   FROM MTL_ITEM_LOCATIONS
1338                  WHERE INVENTORY_LOCATION_ID = l_combination_id
1339                    AND ORGANIZATION_ID = inv_validate_trohdr.g_org.organization_id
1340 		AND SUBINVENTORY_CODE = g_to_sub.secondary_inventory_name;
1341 
1342               EXCEPTION
1343                WHEN NO_DATA_FOUND THEN
1344 		  UPDATE mtl_item_locations
1345                    SET SUBINVENTORY_CODE = g_to_sub.secondary_inventory_name
1346                  WHERE INVENTORY_LOCATION_ID = l_combination_id
1347                    AND ORGANIZATION_ID = inv_validate_trohdr.g_org.organization_id
1348                    AND SUBINVENTORY_CODE = NULL;
1349 
1350                 if SQL%NOTFOUND then
1351                    x_return_status := FND_API.G_RET_STS_ERROR;
1352                    return;
1353                 else
1354                   SELECT PROJECT_ID,TASK_ID
1355                     INTO l_project_id, l_task_id
1356                     FROM MTL_ITEM_LOCATIONS
1357                    WHERE INVENTORY_LOCATION_ID = l_combination_id
1358                      AND ORGANIZATION_ID =inv_validate_trohdr.g_org.organization_id;
1359 
1360                    if NOT INV_ProjectLocator_PUB.Check_Project_References(
1361                               inv_validate_trohdr.g_org.organization_id,
1362                               p_trolin_rec.to_locator_id,
1363                               'ANY',
1364                               'N',
1365                               l_project_id,
1366                               l_task_id) then
1367                       x_return_status := FND_API.G_RET_STS_ERROR;
1368                    end if;
1369                  end if;
1370               END;
1371             end if;
1372           else
1373             x_return_status := FND_API.G_RET_STS_ERROR;
1374             return;
1375           end if;
1376           p_trolin_rec.to_locator_id := INV_Value_To_Id.To_Locator(p_trolin_rec.organization_id,
1377                                                        p_trolin_val_rec.to_locator);
1378       END IF;
1379 
1380       IF  p_trolin_rec.to_locator_id IS NOT NULL AND
1381           (   p_trolin_rec.to_locator_id <>
1382               p_old_trolin_rec.to_locator_id OR
1383               p_old_trolin_rec.to_locator_id IS NULL )
1384       THEN
1385 	 g_to_locator.inventory_location_id := p_trolin_rec.to_locator_id;
1386 
1387 /*	BUG 2347421 - When locator is specified on order line this validation fails
1388 		      if the logical locator with the project and task does not exist.
1389 		      This project locator is created later on in the flow.
1390 		      Changing this validation to not consider the project and task.
1391 
1392         BUG 3036732 - The fix in 2347421 fails when the locator is already entered with project and task
1393                       If the project info is already entered on the locator then validate the locator , else
1394                       do not consider the project and task
1395 */
1396                     SELECT PROJECT_ID
1397                     INTO l_project_id_mil
1398                     FROM MTL_ITEM_LOCATIONS
1399                     WHERE INVENTORY_LOCATION_ID =  g_to_locator.inventory_location_id
1400                     AND ORGANIZATION_ID = p_trolin_rec.organization_id;
1401 
1402 
1403            IF l_project_id_mil is NOT NULL THEN
1404 
1405 
1406         	 IF INV_Validate.To_Locator(g_to_locator,
1407 				    inv_validate_trohdr.g_org, g_item,
1408 				    g_to_sub, p_trolin_rec.project_id,
1409 				    p_trolin_rec.task_id,
1410 			    inv_validate_trolin.g_transaction_l.transaction_action_id) = inv_validate.F THEN
1411                              x_return_status := FND_API.G_RET_STS_ERROR;
1412                              return;
1413                   END IF;
1414 
1415            ELSE
1416 
1417 	           IF INV_Validate.To_Locator(g_to_locator,
1418 				    inv_validate_trohdr.g_org, g_item,
1419 				    g_to_sub, null, null,
1420 				    inv_validate_trolin.g_transaction_l.transaction_action_id) = inv_validate.F THEN
1421                                     x_return_status := FND_API.G_RET_STS_ERROR;
1422                                     return;
1423                    END IF;
1424             END IF;
1425       END IF;
1426       -- inv_debug.message('TRO: to_locator_id: ' || x_return_status);
1427     END IF;
1428 
1429 
1430     IF  p_trolin_rec.transaction_header_id IS NOT NULL AND
1431         (   p_trolin_rec.transaction_header_id <>
1432             p_old_trolin_rec.transaction_header_id OR
1433             p_old_trolin_rec.transaction_header_id IS NULL )
1434     THEN
1435        IF
1436 	 INV_Validate.Transaction_Header(p_trolin_rec.transaction_header_id) =
1437 	 inv_validate.f THEN
1438 	  x_return_status := FND_API.G_RET_STS_ERROR;
1439        END IF;
1440     END IF;
1441     -- inv_debug.message('TRO: transaction_header_id: ' || x_return_status);
1442 
1443     IF p_trolin_rec.ship_to_location_id IS NOT NULL AND
1444        ( p_trolin_rec.ship_to_location_id <>
1445            p_old_trolin_rec.transaction_header_id OR
1446            p_old_trolin_rec.transaction_header_id IS NULL)
1447     THEN
1448       IF INV_Validate.HR_Location(p_trolin_rec.ship_to_location_id) =
1449            INV_Validate.F
1450       THEN
1451         x_return_status := FND_API.G_RET_STS_ERROR;
1452       END IF;
1453     END IF;
1454 
1455     IF  p_trolin_rec.uom_code IS NOT NULL AND
1456         (   p_trolin_rec.uom_code <>
1457             p_old_trolin_rec.uom_code OR
1458             p_old_trolin_rec.uom_code IS NULL )
1459     THEN
1460        IF INV_Validate.Uom(p_trolin_rec.uom_code,
1461 			   inv_validate_trohdr.g_org, g_item) = inv_validate.F THEN
1462             x_return_status := FND_API.G_RET_STS_ERROR;
1463         END IF;
1464     END IF;
1465 
1466     IF p_trolin_rec.from_cost_group_id IS NOT NULL AND
1467        (p_trolin_rec.from_cost_group_id <> p_old_trolin_rec.from_cost_group_id OR
1468 	p_old_trolin_rec.from_cost_group_id IS NULL) then
1469         if INV_Validate.Cost_Group(p_trolin_rec.from_cost_group_id,
1470 				   p_trolin_rec.organization_id) = inv_validate.F then
1471 		x_return_status := FND_API.G_RET_STS_ERROR;
1472 	END IF;
1473     END IF;
1474 
1475     IF p_trolin_rec.to_cost_group_id IS NOT NULL AND
1476        (p_trolin_rec.to_cost_group_id <> p_old_trolin_rec.to_cost_group_id OR
1477         p_old_trolin_rec.to_cost_group_id IS NULL) then
1478         if INV_Validate.Cost_Group(p_trolin_rec.to_cost_group_id,
1479                                    p_trolin_rec.organization_id) = inv_validate.F then
1480                 x_return_status := FND_API.G_RET_STS_ERROR;
1481         END IF;
1482     END IF;
1483 
1484     IF p_trolin_rec.lpn_id IS NOT NULL AND
1485        (p_trolin_rec.lpn_id <> p_old_trolin_rec.lpn_id OR
1486         p_old_trolin_rec.lpn_id IS NULL) then
1487         if INV_Validate.LPN(p_trolin_rec.lpn_id) = inv_validate.F then
1488                 x_return_status := FND_API.G_RET_STS_ERROR;
1489         END IF;
1490     END IF;
1491 
1492     IF p_trolin_rec.to_lpn_id IS NOT NULL AND
1493        (p_trolin_rec.to_lpn_id <> p_old_trolin_rec.to_lpn_id OR
1494         p_old_trolin_rec.to_lpn_id IS NULL) then
1495         if INV_Validate.LPN(p_trolin_rec.to_lpn_id) = inv_validate.F then
1496                 x_return_status := FND_API.G_RET_STS_ERROR;
1497         END IF;
1498     END IF;
1499 
1500     -- inv_debug.message('TRO: uom: ' || x_return_status);
1501 
1502     IF  (p_trolin_rec.attribute1 IS NOT NULL AND
1503         (   p_trolin_rec.attribute1 <>
1504             p_old_trolin_rec.attribute1 OR
1505             p_old_trolin_rec.attribute1 IS NULL ))
1506     OR  (p_trolin_rec.attribute10 IS NOT NULL AND
1507         (   p_trolin_rec.attribute10 <>
1508             p_old_trolin_rec.attribute10 OR
1509             p_old_trolin_rec.attribute10 IS NULL ))
1510     OR  (p_trolin_rec.attribute11 IS NOT NULL AND
1511         (   p_trolin_rec.attribute11 <>
1512             p_old_trolin_rec.attribute11 OR
1513             p_old_trolin_rec.attribute11 IS NULL ))
1514     OR  (p_trolin_rec.attribute12 IS NOT NULL AND
1515         (   p_trolin_rec.attribute12 <>
1516             p_old_trolin_rec.attribute12 OR
1517             p_old_trolin_rec.attribute12 IS NULL ))
1518     OR  (p_trolin_rec.attribute13 IS NOT NULL AND
1519         (   p_trolin_rec.attribute13 <>
1520             p_old_trolin_rec.attribute13 OR
1521             p_old_trolin_rec.attribute13 IS NULL ))
1522     OR  (p_trolin_rec.attribute14 IS NOT NULL AND
1523         (   p_trolin_rec.attribute14 <>
1524             p_old_trolin_rec.attribute14 OR
1525             p_old_trolin_rec.attribute14 IS NULL ))
1526     OR  (p_trolin_rec.attribute15 IS NOT NULL AND
1527         (   p_trolin_rec.attribute15 <>
1528             p_old_trolin_rec.attribute15 OR
1529             p_old_trolin_rec.attribute15 IS NULL ))
1530     OR  (p_trolin_rec.attribute2 IS NOT NULL AND
1531         (   p_trolin_rec.attribute2 <>
1532             p_old_trolin_rec.attribute2 OR
1533             p_old_trolin_rec.attribute2 IS NULL ))
1534     OR  (p_trolin_rec.attribute3 IS NOT NULL AND
1535         (   p_trolin_rec.attribute3 <>
1536             p_old_trolin_rec.attribute3 OR
1537             p_old_trolin_rec.attribute3 IS NULL ))
1538     OR  (p_trolin_rec.attribute4 IS NOT NULL AND
1539         (   p_trolin_rec.attribute4 <>
1540             p_old_trolin_rec.attribute4 OR
1541             p_old_trolin_rec.attribute4 IS NULL ))
1542     OR  (p_trolin_rec.attribute5 IS NOT NULL AND
1543         (   p_trolin_rec.attribute5 <>
1544             p_old_trolin_rec.attribute5 OR
1545             p_old_trolin_rec.attribute5 IS NULL ))
1546     OR  (p_trolin_rec.attribute6 IS NOT NULL AND
1547         (   p_trolin_rec.attribute6 <>
1548             p_old_trolin_rec.attribute6 OR
1549             p_old_trolin_rec.attribute6 IS NULL ))
1550     OR  (p_trolin_rec.attribute7 IS NOT NULL AND
1551         (   p_trolin_rec.attribute7 <>
1552             p_old_trolin_rec.attribute7 OR
1553             p_old_trolin_rec.attribute7 IS NULL ))
1554     OR  (p_trolin_rec.attribute8 IS NOT NULL AND
1555         (   p_trolin_rec.attribute8 <>
1556             p_old_trolin_rec.attribute8 OR
1557             p_old_trolin_rec.attribute8 IS NULL ))
1558     OR  (p_trolin_rec.attribute9 IS NOT NULL AND
1559         (   p_trolin_rec.attribute9 <>
1560             p_old_trolin_rec.attribute9 OR
1561             p_old_trolin_rec.attribute9 IS NULL ))
1562     OR  (p_trolin_rec.attribute_category IS NOT NULL AND
1563         (   p_trolin_rec.attribute_category <>
1564             p_old_trolin_rec.attribute_category OR
1565             p_old_trolin_rec.attribute_category IS NULL ))
1566     THEN
1567 
1568     --  These calls are temporarily commented out
1569 
1570 
1571         --  Validate descriptive flexfield.
1572 
1573        IF INV_Validate.Desc_Flex( 'TROLIN' ) = inv_validate.F THEN
1574             x_return_status := FND_API.G_RET_STS_ERROR;
1575        END IF;
1576 
1577     END IF;
1578 
1579     --  Done validating attributes
1580 EXCEPTION
1581     WHEN FND_API.G_EXC_ERROR THEN
1582       x_return_status := FND_API.G_RET_STS_ERROR;
1583 
1584     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1585         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1586 
1587     WHEN OTHERS THEN
1588         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1589 
1590         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
1591             FND_MSG_PUB.Add_Exc_Msg ( G_PKG_NAME, 'Attributes');
1592         END IF;
1593 END Attributes;
1594 
1595 --  Procedure Entity_Delete
1596 
1597 PROCEDURE Entity_Delete
1598 (   x_return_status                 OUT NOCOPY VARCHAR2
1599 ,   p_trolin_rec                    IN  INV_Move_Order_PUB.Trolin_Rec_Type
1600 )
1601 IS
1602 l_return_status               VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
1603 l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
1604 BEGIN
1605 
1606     --  Validate entity delete.
1607     NULL;
1608 
1609     --  Done.
1610     x_return_status := l_return_status;
1611 
1612 EXCEPTION
1613 
1614     WHEN FND_API.G_EXC_ERROR THEN
1615         x_return_status := FND_API.G_RET_STS_ERROR;
1616 
1617     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1618         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1619 
1620     WHEN OTHERS THEN
1621         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1622 
1623         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
1624         THEN
1625             FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, 'Entity_Delete');
1626         END IF;
1627 
1628 END Entity_Delete;
1629 
1630 -- Bug # 1911054
1631 -- Procedure Init : used to initialized the global variable created in this package
1632 PROCEDURE Init
1633 IS
1634  l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
1635 BEGIN
1636    g_transaction_l.transaction_type_id   := Null;
1637    g_transaction_l.transaction_action_id := Null;
1638    g_item.inventory_item_id		 := Null;
1639    g_from_sub.secondary_inventory_name   := Null;
1640    g_to_sub.secondary_inventory_name     := Null;
1641    g_from_locator.inventory_location_id  := Null;
1642    g_to_locator.inventory_location_id    := Null;
1643 END;
1644 
1645 END INV_Validate_Trolin;