DBA Data[Home] [Help]

PACKAGE BODY: APPS.MTL_OG_UTIL_PKG

Source


1 PACKAGE BODY mtl_og_util_pkg AS
2   /* $Header: INVOGUTB.pls 115.16 2004/08/13 02:01:16 ssia ship $ */
3   --
4   /*
5    * Get the Object_ID and Object_Type of an object given its object_number
6    * and Inventory_Item_Id
7    */
8   PROCEDURE get_objid(
9     p_object_number     IN     VARCHAR2
10   , p_inventory_item_id IN     NUMBER
11   , p_organization_id   IN     NUMBER
12   , x_object_id         OUT    NOCOPY NUMBER
13   , x_object_type       OUT    NOCOPY NUMBER
14   , x_return_status     OUT    NOCOPY VARCHAR2
15   , x_msg_data          OUT    NOCOPY VARCHAR2
16   , x_msg_count         OUT    NOCOPY NUMBER
17   ) IS
18     l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
19   BEGIN
20     x_return_status := FND_API.G_RET_STS_SUCCESS;
21     /* Bug 2456261: Added Object_Type = 2 in the Query */
22     SELECT object_id, object_type
23       INTO x_object_id, x_object_type
24       FROM mtl_object_numbers_v
25      WHERE object_number = p_object_number
26        AND inventory_item_id = p_inventory_item_id
27        AND object_type = 2
28        AND organization_id = NVL(p_organization_id, organization_id);
29 
30   EXCEPTION
31      WHEN NO_DATA_FOUND THEN
32         x_return_status := FND_API.G_RET_STS_ERROR;
33         fnd_message.set_name('INV','INV_NO_OBJECT_ID');
34         fnd_message.set_token('OBJECT_NAME',p_object_number,FALSE);
35         fnd_msg_pub.ADD;
36         fnd_msg_pub.count_and_get(p_encoded => FND_API.G_FALSE, p_data => x_msg_data, p_count => x_msg_count);
37      WHEN OTHERS THEN
38         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
39         fnd_msg_pub.count_and_get(p_encoded => FND_API.G_FALSE, p_data => x_msg_data, p_count => x_msg_count);
40   END get_objid;
41 
42   /*
43    * Insert a new Genealogy record connecting a child and it's parent
44    * Due to AK Navigator considerations, to show 'Child Genealogy', all objects
45    * should have a record connecting them with a parent. Similary, to show
46    * 'Parent-Genealogy' all objects should have a record connecting them
47    * to a child.
48    */
49   PROCEDURE gen_insert(
50     p_rowid             IN OUT NOCOPY VARCHAR2
51   , p_item_id           IN     NUMBER
52   , p_object_num        IN     VARCHAR2
53   , p_parent_item_id    IN     NUMBER
54   , p_parent_object_num IN     VARCHAR2
55   , p_origin_txn_id     IN     NUMBER
56   , p_org_id            IN     NUMBER := NULL
57   ) IS
58     l_trx_date           DATE;
59     l_obj_id             NUMBER;
60     l_obj_type           NUMBER;
61     l_parent_obj_id      NUMBER;
62     l_parent_obj_type    NUMBER;
63     l_genealogy_origin   NUMBER;
64     l_genealogy_type     NUMBER;
65     l_user_id            NUMBER := fnd_global.user_id;
66     l_return_status      VARCHAR2(30);
67     l_msg_data           VARCHAR2(200);
68     l_msg_count          NUMBER;
69 
70     CURSOR c IS
71       SELECT ROWID
72         FROM mtl_object_genealogy
73        WHERE object_id = l_obj_id
74          AND parent_object_id = l_parent_obj_id;
75     l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
76   BEGIN
77     /*
78      * First get Obj. ID and Type of Object and its parent
79      */
80     get_objid(p_object_num, p_item_id, p_org_id, l_obj_id,l_obj_type,l_return_status,l_msg_data,l_msg_count);
81     IF l_return_status = FND_API.G_RET_STS_ERROR THEN
82        RAISE NO_DATA_FOUND;
83     END IF;
84     get_objid(p_parent_object_num, p_parent_item_id, p_org_id, l_parent_obj_id,l_parent_obj_type,l_return_status,l_msg_data,l_msg_count);
85     IF l_return_status = FND_API.G_RET_STS_ERROR THEN
86        RAISE NO_DATA_FOUND;
87     END IF;
88     l_genealogy_type    := 1;
89     l_genealogy_origin  := 1;
90     l_trx_date          := SYSDATE;
91 
92     INSERT INTO mtl_object_genealogy
93                 (
94                 object_id
95               , object_type
96               , parent_object_type
97               , parent_object_id
98               , last_update_date
99               , last_updated_by
100               , creation_date
101               , created_by
102               , start_date_active
103               , genealogy_origin
104               , origin_txn_id
105               , genealogy_type
106                 )
107          VALUES (
108                 l_obj_id
109               , l_obj_type
110               , l_parent_obj_type
111               , l_parent_obj_id
112               , SYSDATE
113               , l_user_id
114               , SYSDATE
115               , l_user_id
116               , l_trx_date
117               , l_genealogy_origin
118               , p_origin_txn_id
119               , l_genealogy_type
120                 );
121 
122     OPEN c;
123     FETCH c INTO p_rowid;
124 
125     IF (c%NOTFOUND) THEN
126       CLOSE c;
127       RAISE NO_DATA_FOUND;
128     END IF;
129 
130     CLOSE c;
131   END gen_insert;
132 
133 
134   PROCEDURE gen_insert(
135     x_return_status     OUT    NOCOPY VARCHAR2
136   , x_msg_data          OUT    NOCOPY VARCHAR2
137   , x_msg_count         OUT    NOCOPY NUMBER
138   , p_item_id           IN     NUMBER
139   , p_object_num        IN     VARCHAR2
140   , p_parent_item_id    IN     NUMBER
141   , p_parent_object_num IN     VARCHAR2
142   , p_origin_txn_id     IN     NUMBER
143   , p_org_id            IN     NUMBER
144   ) IS
145      l_trx_date           DATE;
146      l_obj_id             NUMBER;
147      l_obj_type           NUMBER;
148      l_parent_obj_id      NUMBER;
149      l_parent_obj_type    NUMBER;
150      l_genealogy_origin   NUMBER;
151      l_genealogy_type     NUMBER;
152      l_user_id            NUMBER := fnd_global.user_id;
153      l_rowid              VARCHAR2(30);
154      l_parent_ser_ctrl    NUMBER;
155 
156      CURSOR c IS
157        SELECT ROWID
158          FROM mtl_object_genealogy
159         WHERE object_id = l_obj_id
160           AND parent_object_id = l_parent_obj_id;
161     l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
162   BEGIN
163      x_return_status := FND_API.G_RET_STS_SUCCESS;
164 
165      /* Checking whether Parent Item is Serial Controlled */
166      BEGIN
167         SELECT serial_number_control_code INTO l_parent_ser_ctrl
168            FROM mtl_system_items
169            WHERE inventory_item_id = p_parent_item_id
170              AND organization_id = p_org_id;
171 
172         IF l_parent_ser_ctrl IN (1,6) THEN
173            IF (l_debug = 1) THEN
174               inv_log_util.trace('Parent not Serial Controlled','INV_OG_UTIL_PKG.GET_INSERT',3);
175            END IF;
176            RETURN;
177         END IF;
178      EXCEPTION
179         WHEN NO_DATA_FOUND THEN
180            fnd_message.set_name(application=> 'INV',NAME   => 'INV_INVALID_ITEM_ORG');
181            fnd_msg_pub.ADD;
182            RAISE FND_API.G_EXC_ERROR;
183      END;
184 
185      /* Getting Object ID of the Child Object */
186      get_objid(p_object_num, p_item_id, p_org_id, l_obj_id, l_obj_type, x_return_status, x_msg_data, x_msg_count);
187      IF x_return_status = FND_API.G_RET_STS_ERROR THEN
188         RAISE FND_API.G_EXC_ERROR;
189      ELSIF x_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
190         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
191      END IF;
192 
193      /* Getting Object ID of the Parent Object */
194      get_objid(p_parent_object_num, p_parent_item_id, p_org_id, l_parent_obj_id, l_parent_obj_type, x_return_status, x_msg_data, x_msg_count);
195      IF x_return_status = FND_API.G_RET_STS_ERROR THEN
196         RAISE FND_API.G_EXC_ERROR;
197      ELSIF x_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
198         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
199      END IF;
200 
201      l_genealogy_type    := 1;
202      l_genealogy_origin  := 1;
203      l_trx_date          := SYSDATE;
204 
205      INSERT INTO mtl_object_genealogy
206                  (
207                  object_id
208                , object_type
209                , parent_object_type
210                , parent_object_id
211                , last_update_date
212                , last_updated_by
213                , creation_date
214                , created_by
215                , start_date_active
216                , genealogy_origin
217                , origin_txn_id
218                , genealogy_type
219                  )
220           VALUES (
221                  l_obj_id
222                , l_obj_type
223                , l_parent_obj_type
224                , l_parent_obj_id
225                , SYSDATE
226                , l_user_id
227                , SYSDATE
228                , l_user_id
229                , l_trx_date
230                , l_genealogy_origin
231                , p_origin_txn_id
232                , l_genealogy_type
233                  );
234 
235      OPEN c;
236      FETCH c INTO l_rowid;
237 
238      IF (c%NOTFOUND) THEN
239        CLOSE c;
240        fnd_message.set_name(application=> 'INV',NAME   => 'INV_INSERT_ERROR');
241        fnd_message.set_token(token  => 'ENTITY1',VALUE  => 'Genealogy',TRANSLATE=> FALSE);
242        fnd_msg_pub.ADD;
243        RAISE FND_API.G_EXC_ERROR;
244      END IF;
245 
246      CLOSE c;
247    EXCEPTION
248       WHEN FND_API.G_EXC_ERROR THEN
249         x_return_status := FND_API.G_RET_STS_ERROR;
250         fnd_msg_pub.count_and_get(p_encoded => FND_API.G_FALSE, p_data => x_msg_data, p_count => x_msg_count);
251       WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
252         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
253         fnd_msg_pub.count_and_get(p_encoded => FND_API.G_FALSE, p_data => x_msg_data, p_count => x_msg_count);
254       WHEN OTHERS THEN
255         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
256         fnd_msg_pub.count_and_get(p_encoded => FND_API.G_FALSE, p_data => x_msg_data, p_count => x_msg_count);
257   END gen_insert;
258 
259  /** added the procedure gen_update for the 'Serial Tracking in WIP Project.
260       This updates the mtl_object_genealogy and mtl_serial_numbers tables
261       when a serialized component is returned to stores from a WIP job.
262       The genealogy between the parent and the child serials should be disabled
263       whenever a component return transaction is performed. */
264   PROCEDURE gen_update(
265       x_return_status  OUT NOCOPY VARCHAR2
266   , x_msg_data       OUT NOCOPY VARCHAR2
267   , x_msg_count      OUT NOCOPY NUMBER
268   , p_item_id        IN  NUMBER
269   , p_sernum         IN  VARCHAR2
270   , p_parent_sernum  IN  VARCHAR2
271   , p_org_id         IN  NUMBER
272   ) IS
273      l_object_id NUMBER;
274     l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
275   BEGIN
276     x_return_status := FND_API.G_RET_STS_SUCCESS;
277 
278     BEGIN
279     if( p_parent_sernum is not null ) then
280         SELECT gen_object_id INTO l_object_id
281         FROM mtl_serial_numbers
282         WHERE serial_number = p_sernum
283         AND parent_serial_number = p_parent_sernum
284         AND current_organization_id = p_org_id
285 	AND inventory_item_id = p_item_id;	--Bug # 2682600
286      else
287         SELECT gen_object_id into l_object_id
288         FROM mtl_serial_numbers
289 	WHERE serial_number = p_sernum
290 	AND current_organization_id = p_org_id
291 	AND inventory_item_id = p_item_id;	--Bug # 2682600
292     end if;
293 
294   EXCEPTION
295     WHEN NO_DATA_FOUND THEN
296        IF (l_debug = 1) THEN
297           inv_trx_util_pub.trace(' no data found in gen_update','MTL_OG_UTIL_PKG');
298        END IF;
299        x_return_status := FND_API.G_RET_STS_ERROR;
300     WHEN OTHERS THEN
301        IF (l_debug = 1) THEN
302           inv_trx_util_pub.trace(' exception in gen_update','MTL_OG_UTIL_PKG');
303        END IF;
304        x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
305     END;
306     BEGIN
307      UPDATE mtl_object_genealogy
308         SET end_date_active = SYSDATE
309        ,LAST_UPDATE_DATE = SYSDATE
310        ,LAST_UPDATED_BY = -1
311        ,LAST_UPDATE_LOGIN = -1
312         WHERE object_id = l_object_id
313         AND END_date_active IS NULL
314 	AND genealogy_type <> 5 ;
315 
316      UPDATE mtl_serial_numbers
317         SET parent_serial_number = NULL
318        ,LAST_UPDATE_DATE = SYSDATE
319        ,LAST_UPDATED_BY = -1
320        ,LAST_UPDATE_LOGIN = -1
321         WHERE gen_object_id = l_object_id;
322     EXCEPTION
323        WHEN no_data_found THEN
324          IF (l_debug = 1) THEN
325             inv_trx_util_pub.trace(' no data found while trying to update in gen_update','MTL_OG_UTIL_PKG');
326          END IF;
327          x_return_status := FND_API.G_RET_STS_ERROR;
328        WHEN OTHERS THEN
329        IF (l_debug = 1) THEN
330           inv_trx_util_pub.trace(' exception in gen_update when trying to update','MTL_OG_UTIL_PKG');
331        END IF;
332        x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
333     END;
334   END gen_update;
335 
336   /** Insert a record corresponding to an event into the MTL_OBJECT_EVENTS table
340   , p_item_id       IN     NUMBER
337    */
338   PROCEDURE event_insert(
339     p_rowid         IN OUT NOCOPY VARCHAR2
341   , p_object_number IN     VARCHAR2
342   , p_trx_id        IN     NUMBER
343   , p_trx_date      IN     DATE
344   , p_trx_src_id    IN     NUMBER
345   , p_trx_actin_id  IN     NUMBER
346   , p_org_id        IN     NUMBER := NULL
347   ) IS
348     l_gen_event_type NUMBER;
349     l_object_type    NUMBER;
350     l_object_id      NUMBER := 0;
351     l_user_id        NUMBER := fnd_global.user_id;
352     l_return_status      VARCHAR2(30);
353     l_msg_data           VARCHAR2(200);
354     l_msg_count          NUMBER;
355   /*   mrana : 10/02/01:
356        Removed the cursot C, to select rowid of the row just inserted into mtl_object_event
357        since it is un-necessary.
358        Also , now populating p_rowid (IN OUT parameter) with '0' to avoid any problems with NULL
359        calue in inltis.
360        p_rowid is not used anywhere */
361     l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
362   BEGIN
363     p_rowid      := '0';
364     /*
365      * Determine the type of transaction from the transaction source and action
366      */
367     get_objid(p_object_number, p_item_id, p_org_id, l_object_id, l_object_type, l_return_status, l_msg_data, l_msg_count);
368     IF l_return_status = FND_API.G_RET_STS_ERROR THEN
369        RAISE NO_DATA_FOUND;
370     END IF;
371 
372     /*
373      * Determine the Genealogy Event Type
374      * If src_id = 5 AND trx_actin_id = 1 this is a WIP issue. So event
375      * type is 'Built'. If src_id = 13 and trx_actin_id = 27, then this
376      * is a Misc. receipt transaction. So event is 'Issued'
377      */
378     IF  (p_trx_src_id = 5)
379         AND (p_trx_actin_id = 1) THEN
380       l_gen_event_type  := 1;
381     ELSIF  (p_trx_src_id = 13)
382            AND (p_trx_actin_id = 27) THEN
383       l_gen_event_type  := 4;
384     END IF;
385 
386     INSERT INTO mtl_object_events
387                 (
388                 object_id
389               , genealogy_event_type
390               , genealogy_event_date
391               , transaction_id
392               , creation_date
393               , created_by
394               , last_update_date
395               , last_updated_by
396                 )
397          VALUES (
398                 l_object_id
399               , l_gen_event_type
400               , p_trx_date
401               , p_trx_id
402               , SYSDATE
403               , l_user_id
404               , SYSDATE
405               , l_user_id
406                 );
407   END event_insert;
408 END;