DBA Data[Home] [Help]

PACKAGE BODY: APPS.INV_SERIAL_NUMBER_PUB

Source


1 PACKAGE BODY inv_serial_number_pub AS
2   /* $Header: INVPSNB.pls 120.21.12020000.4 2013/01/02 11:36:52 raitha ship $*/
3 
4   --  Global constant holding the package name
5   g_pkg_name CONSTANT VARCHAR2(30) := 'INV_SERIAL_NUMBER_PUB';
6 /* -- Added for DMV Project */
7 -- Bug# 6825191, Commenting the variables to be obsoleted
8 --G_first_row_of_trx boolean := true;
9 --G_first_row_trx_tmp_id number := 0;
10 l_status_after_p1 NUMBER := 0;
11 l_status_before_p1 NUMBER := 0;
12 MSN_UPDATE_FIRST_PASS BOOLEAN := TRUE;
13 
14 PROCEDURE set_firstscan(p_firstscan IN BOOLEAN) IS
15    l_debug NUMBER := NVL(fnd_profile.VALUE('INV_DEBUG_TRACE'), 0);
16 BEGIN
17    g_firstscan  := p_firstscan;
18 END;
19 
20 -- Procedure used to trace message for debugging
21 PROCEDURE invtrace(p_msg VARCHAR2 := NULL) IS
22    --Bug: 3772309: Performance bug fix.The fnd call happens everytime
23    -- debug_print is called.
24    -- l_debug NUMBER := NVL(fnd_profile.VALUE('INV_DEBUG_TRACE'), 0);
25 BEGIN
26    -- IF (l_debug = 1) THEN
27    inv_log_util.TRACE(p_msg, 'INVSER', 9);
28    --  END IF;
29 END;
30 
31 PROCEDURE populateattributescolumn IS
32    l_debug NUMBER := NVL(fnd_profile.VALUE('INV_DEBUG_TRACE'), 0);
33 BEGIN
34    g_serial_attributes_tbl(1).column_name   := 'SERIAL_ATTRIBUTE_CATEGORY';
35    g_serial_attributes_tbl(1).column_type   := 'VARCHAR2';
36    g_serial_attributes_tbl(2).column_name   := 'ORIGINATION_DATE';
37    g_serial_attributes_tbl(2).column_type   := 'DATE';
38    g_serial_attributes_tbl(3).column_name   := 'C_ATTRIBUTE1';
39    g_serial_attributes_tbl(3).column_type   := 'VARCHAR2';
40    g_serial_attributes_tbl(4).column_name   := 'C_ATTRIBUTE2';
41    g_serial_attributes_tbl(4).column_type   := 'VARCHAR2';
42    g_serial_attributes_tbl(5).column_name   := 'C_ATTRIBUTE3';
43    g_serial_attributes_tbl(5).column_type   := 'VARCHAR2';
44    g_serial_attributes_tbl(6).column_name   := 'C_ATTRIBUTE4';
45    g_serial_attributes_tbl(6).column_type   := 'VARCHAR2';
46    g_serial_attributes_tbl(7).column_name   := 'C_ATTRIBUTE5';
47    g_serial_attributes_tbl(7).column_type   := 'VARCHAR2';
48    g_serial_attributes_tbl(8).column_name   := 'C_ATTRIBUTE6';
49    g_serial_attributes_tbl(8).column_type   := 'VARCHAR2';
50    g_serial_attributes_tbl(9).column_name   := 'C_ATTRIBUTE7';
51    g_serial_attributes_tbl(9).column_type   := 'VARCHAR2';
52    g_serial_attributes_tbl(10).column_name  := 'C_ATTRIBUTE8';
53    g_serial_attributes_tbl(10).column_type  := 'VARCHAR2';
54    g_serial_attributes_tbl(11).column_name  := 'C_ATTRIBUTE9';
55    g_serial_attributes_tbl(11).column_type  := 'VARCHAR2';
56    g_serial_attributes_tbl(12).column_name  := 'C_ATTRIBUTE10';
57    g_serial_attributes_tbl(12).column_type  := 'VARCHAR2';
58    g_serial_attributes_tbl(13).column_name  := 'C_ATTRIBUTE11';
59    g_serial_attributes_tbl(13).column_type  := 'VARCHAR2';
60    g_serial_attributes_tbl(14).column_name  := 'C_ATTRIBUTE12';
61    g_serial_attributes_tbl(14).column_type  := 'VARCHAR2';
62    g_serial_attributes_tbl(15).column_name  := 'C_ATTRIBUTE13';
63    g_serial_attributes_tbl(15).column_type  := 'VARCHAR2';
64    g_serial_attributes_tbl(16).column_name  := 'C_ATTRIBUTE14';
65    g_serial_attributes_tbl(16).column_type  := 'VARCHAR2';
66    g_serial_attributes_tbl(17).column_name  := 'C_ATTRIBUTE15';
67    g_serial_attributes_tbl(17).column_type  := 'VARCHAR2';
68    g_serial_attributes_tbl(18).column_name  := 'C_ATTRIBUTE16';
69    g_serial_attributes_tbl(18).column_type  := 'VARCHAR2';
70    g_serial_attributes_tbl(19).column_name  := 'C_ATTRIBUTE17';
71    g_serial_attributes_tbl(19).column_type  := 'VARCHAR2';
72    g_serial_attributes_tbl(20).column_name  := 'C_ATTRIBUTE18';
73    g_serial_attributes_tbl(20).column_type  := 'VARCHAR2';
74    g_serial_attributes_tbl(21).column_name  := 'C_ATTRIBUTE19';
75    g_serial_attributes_tbl(21).column_type  := 'VARCHAR2';
76    g_serial_attributes_tbl(22).column_name  := 'C_ATTRIBUTE20';
77    g_serial_attributes_tbl(22).column_type  := 'VARCHAR2';
78    g_serial_attributes_tbl(23).column_name  := 'D_ATTRIBUTE1';
79    g_serial_attributes_tbl(23).column_type  := 'DATE';
80    g_serial_attributes_tbl(24).column_name  := 'D_ATTRIBUTE2';
81    g_serial_attributes_tbl(24).column_type  := 'DATE';
82    g_serial_attributes_tbl(25).column_name  := 'D_ATTRIBUTE3';
83    g_serial_attributes_tbl(25).column_type  := 'DATE';
84    g_serial_attributes_tbl(26).column_name  := 'D_ATTRIBUTE4';
85    g_serial_attributes_tbl(26).column_type  := 'DATE';
86    g_serial_attributes_tbl(27).column_name  := 'D_ATTRIBUTE5';
87    g_serial_attributes_tbl(27).column_type  := 'DATE';
88    g_serial_attributes_tbl(28).column_name  := 'D_ATTRIBUTE6';
89    g_serial_attributes_tbl(28).column_type  := 'DATE';
90    g_serial_attributes_tbl(29).column_name  := 'D_ATTRIBUTE7';
91    g_serial_attributes_tbl(29).column_type  := 'DATE';
92    g_serial_attributes_tbl(30).column_name  := 'D_ATTRIBUTE8';
93    g_serial_attributes_tbl(30).column_type  := 'DATE';
94    g_serial_attributes_tbl(31).column_name  := 'D_ATTRIBUTE9';
95    g_serial_attributes_tbl(31).column_type  := 'DATE';
96    g_serial_attributes_tbl(32).column_name  := 'D_ATTRIBUTE10';
97    g_serial_attributes_tbl(32).column_type  := 'DATE';
98    g_serial_attributes_tbl(33).column_name  := 'N_ATTRIBUTE1';
99    g_serial_attributes_tbl(33).column_type  := 'NUMBER';
100    g_serial_attributes_tbl(34).column_name  := 'N_ATTRIBUTE2';
101    g_serial_attributes_tbl(34).column_type  := 'NUMBER';
102    g_serial_attributes_tbl(35).column_name  := 'N_ATTRIBUTE3';
103    g_serial_attributes_tbl(35).column_type  := 'NUMBER';
104    g_serial_attributes_tbl(36).column_name  := 'N_ATTRIBUTE4';
105    g_serial_attributes_tbl(36).column_type  := 'NUMBER';
106    g_serial_attributes_tbl(37).column_name  := 'N_ATTRIBUTE5';
107    g_serial_attributes_tbl(37).column_type  := 'NUMBER';
108    g_serial_attributes_tbl(38).column_name  := 'N_ATTRIBUTE6';
109    g_serial_attributes_tbl(38).column_type  := 'NUMBER';
110    g_serial_attributes_tbl(39).column_name  := 'N_ATTRIBUTE7';
111    g_serial_attributes_tbl(39).column_type  := 'NUMBER';
112    g_serial_attributes_tbl(40).column_name  := 'N_ATTRIBUTE8';
113    g_serial_attributes_tbl(40).column_type  := 'NUMBER';
114    g_serial_attributes_tbl(41).column_name  := 'N_ATTRIBUTE9';
115    g_serial_attributes_tbl(41).column_type  := 'NUMBER';
116    g_serial_attributes_tbl(42).column_name  := 'N_ATTRIBUTE10';
117    g_serial_attributes_tbl(42).column_type  := 'NUMBER';
118    g_serial_attributes_tbl(43).column_name  := 'STATUS_ID';
119    g_serial_attributes_tbl(43).column_type  := 'NUMBER';
120    g_serial_attributes_tbl(44).column_name  := 'TERRITORY_CODE';
121    g_serial_attributes_tbl(44).column_type  := 'VARCHAR2';
122 	g_serial_attributes_tbl(45).column_name   := 'ATTRIBUTE_CATEGORY';
123 	g_serial_attributes_tbl(45).column_type  := 'VARCHAR2';
124 	g_serial_attributes_tbl(46).column_name   := 'ATTRIBUTE1';
125 	g_serial_attributes_tbl(46).column_type  := 'VARCHAR2';
126 	g_serial_attributes_tbl(47).column_name   := 'ATTRIBUTE2';
127 	g_serial_attributes_tbl(47).column_type  := 'VARCHAR2';
128 	g_serial_attributes_tbl(48).column_name   := 'ATTRIBUTE3';
129 	g_serial_attributes_tbl(48).column_type  := 'VARCHAR2';
130 	g_serial_attributes_tbl(49).column_name   := 'ATTRIBUTE4';
131 	g_serial_attributes_tbl(49).column_type   := 'VARCHAR2';
132 	g_serial_attributes_tbl(50).column_name   := 'ATTRIBUTE5';
133 	g_serial_attributes_tbl(50).column_type   := 'VARCHAR2';
134 	g_serial_attributes_tbl(51).column_name   := 'ATTRIBUTE6';
135 	g_serial_attributes_tbl(51).column_type   := 'VARCHAR2';
136 	g_serial_attributes_tbl(52).column_name   := 'ATTRIBUTE7';
137 	g_serial_attributes_tbl(52).column_type   := 'VARCHAR2';
138 	g_serial_attributes_tbl(53).column_name  := 'ATTRIBUTE8';
139 	g_serial_attributes_tbl(53).column_type  := 'VARCHAR2';
140 	g_serial_attributes_tbl(54).column_name  := 'ATTRIBUTE9';
141 	g_serial_attributes_tbl(54).column_type  := 'VARCHAR2';
142 	g_serial_attributes_tbl(55).column_name  := 'ATTRIBUTE10';
143 	g_serial_attributes_tbl(55).column_type  := 'VARCHAR2';
144 	g_serial_attributes_tbl(56).column_name  := 'ATTRIBUTE11';
145 	g_serial_attributes_tbl(56).column_type  := 'VARCHAR2';
146 	g_serial_attributes_tbl(57).column_name  := 'ATTRIBUTE12';
147 	g_serial_attributes_tbl(57).column_type  := 'VARCHAR2';
148 	g_serial_attributes_tbl(58).column_name  := 'ATTRIBUTE13';
149 	g_serial_attributes_tbl(58).column_type  := 'VARCHAR2';
150 	g_serial_attributes_tbl(59).column_name  := 'ATTRIBUTE14';
151 	g_serial_attributes_tbl(59).column_type  := 'VARCHAR2';
152 	g_serial_attributes_tbl(60).column_name  := 'ATTRIBUTE15';
153 	g_serial_attributes_tbl(60).column_type  := 'VARCHAR2';
154 END;
155 
156 -- OverLoaded Procedure insertSerial for eAM
157 PROCEDURE insertserial
158   (
159    p_api_version         IN            NUMBER
160    , p_init_msg_list       IN            VARCHAR2 := fnd_api.g_false
161    , p_commit              IN            VARCHAR2 := fnd_api.g_false
162    , p_validation_level    IN            NUMBER := fnd_api.g_valid_level_full
163    , p_inventory_item_id   IN            NUMBER
164    , p_organization_id     IN            NUMBER
165    , p_serial_number       IN            VARCHAR2
166    , p_current_status      IN            NUMBER
167    , p_group_mark_id       IN            NUMBER
168    , p_lot_number          IN            VARCHAR2
169    , p_initialization_date IN            DATE DEFAULT SYSDATE
170    , x_return_status       OUT NOCOPY    VARCHAR2
171    , x_msg_count           OUT NOCOPY    NUMBER
172    , x_msg_data            OUT NOCOPY    VARCHAR2
173    , p_organization_type   IN            NUMBER DEFAULT NULL
174    , p_owning_org_id       IN            NUMBER DEFAULT NULL
175    , p_owning_tp_type      IN            NUMBER DEFAULT NULL
176    , p_planning_org_id     IN            NUMBER DEFAULT NULL
177   , p_planning_tp_type    IN            NUMBER DEFAULT NULL
178   ) IS
179      l_api_version CONSTANT NUMBER         := 1.0;
180      l_api_name    CONSTANT VARCHAR2(30)   := 'insertSerial';
181      l_userid               NUMBER;
182      l_loginid              NUMBER;
183      l_serial_control_code  NUMBER;
184      l_return_status        VARCHAR2(1);
185      l_msg_data             VARCHAR2(2000);
186      l_msg_count            NUMBER;
187      isunique               NUMBER;
188      item_count             NUMBER;
189      eam_item               NUMBER;
190      l_current_status       NUMBER;
191      x_object_id            NUMBER;
192      l_debug                NUMBER         := NVL(fnd_profile.VALUE('INV_DEBUG_TRACE'), 0);
193 BEGIN
194    -- Standard Start of API savepoint
195    SAVEPOINT apiinsertserial_apipub;
196 
197    -- Standard call to check for call compatibility.
198    IF NOT fnd_api.compatible_api_call(l_api_version, p_api_version, l_api_name, g_pkg_name) THEN
199       RAISE fnd_api.g_exc_unexpected_error;
200    END IF;
201 
202    -- Initialize message list if p_init_msg_list is set to TRUE.
203    IF fnd_api.to_boolean(p_init_msg_list) THEN
204       fnd_msg_pub.initialize;
205    END IF;
206 
207    --  Initialize API return status to success
208    -- API body
209 
210    --Block for Organization Validation
211     BEGIN
212        SELECT 1
213          INTO item_count
214          FROM mtl_parameters
215          WHERE organization_id = p_organization_id;
216     EXCEPTION
217        WHEN NO_DATA_FOUND THEN
218           item_count  := 0;
219        WHEN OTHERS THEN
220           --Bug 3153585:Raising exception to populate error message correctly.
221           IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_unexp_error) THEN
222              fnd_msg_pub.add_exc_msg('INV_SERIAL_NUMBER_PUB', 'insertSerial');
223           END IF;
224 
225           RAISE fnd_api.g_exc_unexpected_error;
226     END;
227 
228     IF (item_count = 0) THEN
229        fnd_message.set_name('INV', 'INV_INVALID_ORGANIZATION');
230        fnd_msg_pub.ADD;
231        --Bug 3153585:Raising exception to populate error message correctly.
232        RAISE fnd_api.g_exc_error;
233     END IF;
234 
235     -- Block to check the Serial Control Code
236     BEGIN
237        SELECT serial_number_control_code
238          , eam_item_type
239          INTO l_serial_control_code
240          , eam_item
241          FROM mtl_system_items
242          WHERE inventory_item_id = p_inventory_item_id
243          AND organization_id = p_organization_id;
244 
245        IF (l_serial_control_code = 1
246            AND is_serial_tagged(p_inventory_item_id,p_organization_id,NULL) = 1) THEN
247           fnd_message.set_name('INV', 'INV_ITEM_NOT_SERIAL_CONTROLLED');
248           fnd_msg_pub.ADD;
249           --Bug 3153585:Raising exception to populate error message correctly.
250           RAISE fnd_api.g_exc_error;
251        END IF;
252 
253        IF eam_item IS NULL THEN
254           l_current_status  := 1;
255         ELSE
256           l_current_status  := p_current_status;
257        END IF;
258     EXCEPTION
259        WHEN fnd_api.g_exc_error THEN
260           RAISE fnd_api.g_exc_error;
261           --Bug 3153585:Raising exception to populate error message correctly.
262        WHEN NO_DATA_FOUND THEN
263           fnd_message.set_name('INV', 'INV_INVALID_ITEM');
264           fnd_msg_pub.ADD;
265           --Bug 3153585:Raising exception to populate error message correctly.
266           RAISE fnd_api.g_exc_error;
267        WHEN OTHERS THEN
268           --Bug 3152585:Raising Exception to populate error message correctly.
269           IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_unexp_error) THEN
270              fnd_msg_pub.add_exc_msg('INV_SERIAL_NUMBER_PUB', 'insertSerial');
271           END IF;
272 
273           RAISE fnd_api.g_exc_unexpected_error;
274     END;
275 
276     SELECT mtl_gen_object_id_s.NEXTVAL
277       INTO x_object_id
278       FROM DUAL;
279 
280     l_userid         := fnd_global.user_id;
281     l_loginid        := fnd_global.login_id;
282     isunique         := is_serial_unique(p_organization_id, p_inventory_item_id, p_serial_number, x_msg_data);
283 
284     IF (isunique = 0) THEN
285        INSERT INTO mtl_serial_numbers
286          (
287           inventory_item_id
288           , serial_number
289           , last_update_date
290           , last_updated_by
291           , creation_date
292           , created_by
293           , last_update_login
294           , current_status
295           , current_organization_id
296           , group_mark_id
297           , gen_object_id
298           , lot_number
299           , initialization_date
300           , organization_type
301           , owning_organization_id
302           , owning_tp_type
303           , planning_organization_id
304           , planning_tp_type
305           )
306          VALUES (
307                  p_inventory_item_id
308                  , p_serial_number
309                  , SYSDATE
310                  , l_userid
311                  , SYSDATE
312                  , l_userid
313                  , l_loginid
314                  , l_current_status
315                  , p_organization_id
316                  , p_group_mark_id
317                  , x_object_id
318                  , p_lot_number
319                  , p_initialization_date
320                  , NVL(p_organization_type, 2)
321                  , NVL(p_owning_org_id, p_organization_id)
322                  , NVL(p_owning_tp_type, 2)
323                  , NVL(p_planning_org_id, p_organization_id)
324                  , NVL(p_planning_tp_type, 2)
325                   );
326     END IF;
327 
328     x_return_status  := fnd_api.g_ret_sts_success;
329 
330     -- End of API body.
331     -- Standard check of p_commit.
332     IF fnd_api.to_boolean(p_commit) THEN
333       COMMIT WORK;
334     END IF;
335 
336     -- Standard call to get message count and if count is 1, get message info.
337     fnd_msg_pub.count_and_get(p_encoded => fnd_api.g_false, p_count => x_msg_count, p_data => x_msg_data);
338   EXCEPTION
339     WHEN fnd_api.g_exc_error THEN
340       ROLLBACK TO apiinsertserial_apipub;
341       --Bug 3153585:Populating the message from the message stack
342       fnd_msg_pub.count_and_get(p_encoded => fnd_api.g_false, p_count => x_msg_count, p_data => x_msg_data);
343       x_return_status  := fnd_api.g_ret_sts_error;
344     WHEN fnd_api.g_exc_unexpected_error THEN
345       --Bug 3153585:Populating the message from the message stack
346       ROLLBACK TO apiinsertserial_apipub;
347       fnd_msg_pub.count_and_get(p_encoded => fnd_api.g_false, p_count => x_msg_count, p_data => x_msg_data);
348       x_return_status  := fnd_api.g_ret_sts_unexp_error;
349     WHEN OTHERS THEN
350       ROLLBACK TO apiinsertserial_apipub;
351 
352       IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_unexp_error) THEN
353         fnd_msg_pub.add_exc_msg('INV_SERIAL_NUMBER_PUB', 'insertSerial');
354       END IF;
355 
356       x_return_status  := fnd_api.g_ret_sts_unexp_error;
357       fnd_msg_pub.count_and_get(p_encoded => fnd_api.g_false, p_count => x_msg_count, p_data => x_msg_data);
358   END insertserial;
359 
360   -- 'Serial Tracking in WIP project. insert wip_entity_id, operation_seq_num and intraoperation_step_type
361   -- into MSN.
362   PROCEDURE insertserial(
363     p_api_version              IN            NUMBER
364   , p_init_msg_list            IN            VARCHAR2 := fnd_api.g_false
365   , p_commit                   IN            VARCHAR2 := fnd_api.g_false
366   , p_validation_level         IN            NUMBER := fnd_api.g_valid_level_full
367   , p_inventory_item_id        IN            NUMBER
368   , p_organization_id          IN            NUMBER
369   , p_serial_number            IN            VARCHAR2
370   , p_initialization_date      IN            DATE
371   , p_completion_date          IN            DATE
372   , p_ship_date                IN            DATE
373   , p_revision                 IN            VARCHAR2
374   , p_lot_number               IN            VARCHAR2
375   , p_current_locator_id       IN            NUMBER
376   , p_subinventory_code        IN            VARCHAR2
377   , p_trx_src_id               IN            NUMBER
378   , p_unit_vendor_id           IN            NUMBER
379   , p_vendor_lot_number        IN            VARCHAR2
380   , p_vendor_serial_number     IN            VARCHAR2
381   , p_receipt_issue_type       IN            NUMBER
382   , p_txn_src_id               IN            NUMBER
383   , p_txn_src_name             IN            VARCHAR2
384   , p_txn_src_type_id          IN            NUMBER
385   , p_transaction_id           IN            NUMBER
386   , p_current_status           IN            NUMBER
387   , p_parent_item_id           IN            NUMBER
388   , p_parent_serial_number     IN            VARCHAR2
389   , p_cost_group_id            IN            NUMBER
390   , p_transaction_action_id    IN            NUMBER
391   , p_transaction_temp_id      IN            NUMBER
392   , p_status_id                IN            NUMBER
393   , x_object_id                OUT NOCOPY    NUMBER
394   , x_return_status            OUT NOCOPY    VARCHAR2
395   , x_msg_count                OUT NOCOPY    NUMBER
396   , x_msg_data                 OUT NOCOPY    VARCHAR2
397   , p_organization_type        IN            NUMBER DEFAULT NULL
398   , p_owning_org_id            IN            NUMBER DEFAULT NULL
399   , p_owning_tp_type           IN            NUMBER DEFAULT NULL
400   , p_planning_org_id          IN            NUMBER DEFAULT NULL
401   , p_planning_tp_type         IN            NUMBER DEFAULT NULL
402   --Serial Tracking in WIP project
403   , p_wip_entity_id            IN            NUMBER DEFAULT NULL
404   , p_operation_seq_num        IN            NUMBER DEFAULT NULL
405   , p_intraoperation_step_type IN            NUMBER DEFAULT NULL
406   ) IS
407     l_api_version     CONSTANT NUMBER                                             := 1.0;
408     l_api_name        CONSTANT VARCHAR2(30)                                       := 'insertSerial';
409     l_userid                   NUMBER;
410     l_loginid                  NUMBER;
411     l_serial_control_code      NUMBER;
412     l_attributes_default       inv_lot_sel_attr.lot_sel_attributes_tbl_type;
413     l_attributes_default_count NUMBER;
414     l_attributes_in            inv_lot_sel_attr.lot_sel_attributes_tbl_type;
415     l_column_idx               BINARY_INTEGER                                     := 44;
416     l_return_status            VARCHAR2(1);
417     l_msg_data                 VARCHAR2(2000);
418     l_msg_count                NUMBER;
419     l_status_rec               inv_material_status_pub.mtl_status_update_rec_type;
420     l_status_id                NUMBER                                             := NULL;
421     l_lot_status_enabled       VARCHAR2(1);
422     l_default_lot_status_id    NUMBER                                             := NULL;
423     l_serial_status_enabled    VARCHAR2(1);
424     l_default_serial_status_id NUMBER;
425     l_wms_installed            BOOLEAN;
426 
427     CURSOR serial_temp_csr(p_transaction_temp_id NUMBER) IS
428       SELECT serial_attribute_category
429            , fnd_date.date_to_canonical(origination_date)
430            , c_attribute1
431            , c_attribute2
432            , c_attribute3
433            , c_attribute4
434            , c_attribute5
435            , c_attribute6
436            , c_attribute7
437            , c_attribute8
438            , c_attribute9
439            , c_attribute10
440            , c_attribute11
441            , c_attribute12
442            , c_attribute13
443            , c_attribute14
444            , c_attribute15
445            , c_attribute16
446            , c_attribute17
447            , c_attribute18
448            , c_attribute19
449            , c_attribute20
450            , fnd_date.date_to_canonical(d_attribute1)
451            , fnd_date.date_to_canonical(d_attribute2)
452            , fnd_date.date_to_canonical(d_attribute3)
453            , fnd_date.date_to_canonical(d_attribute4)
454            , fnd_date.date_to_canonical(d_attribute5)
455            , fnd_date.date_to_canonical(d_attribute6)
456            , fnd_date.date_to_canonical(d_attribute7)
457            , fnd_date.date_to_canonical(d_attribute8)
458            , fnd_date.date_to_canonical(d_attribute9)
459            , fnd_date.date_to_canonical(d_attribute10)
460            , TO_CHAR(n_attribute1)
461            , TO_CHAR(n_attribute2)
462            , TO_CHAR(n_attribute3)
463            , TO_CHAR(n_attribute4)
464            , TO_CHAR(n_attribute5)
465            , TO_CHAR(n_attribute6)
466            , TO_CHAR(n_attribute7)
467            , TO_CHAR(n_attribute8)
468            , TO_CHAR(n_attribute9)
469            , TO_CHAR(n_attribute10)
470            , status_id
471            , territory_code
472         FROM mtl_serial_numbers_temp
473        WHERE transaction_temp_id = p_transaction_temp_id
474          AND p_serial_number BETWEEN fm_serial_number AND NVL(to_serial_number, fm_serial_number);
475 
476     l_input_idx                BINARY_INTEGER;
477     l_debug                    NUMBER                                             := NVL(fnd_profile.VALUE('INV_DEBUG_TRACE'), 0);
478   BEGIN
479     -- Standard Start of API savepoint
480     SAVEPOINT apiinsertserial_apipub;
481 
482     IF (l_debug = 1) THEN
483       inv_trx_util_pub.TRACE('In insertserial() procedure. ', 'INV_SERIAL_NUMBER_PUB', 9);
484     END IF;
485 
486     -- Standard call to check for call compatibility.
487     IF NOT fnd_api.compatible_api_call(l_api_version, p_api_version, l_api_name, g_pkg_name) THEN
488       RAISE fnd_api.g_exc_unexpected_error;
489     END IF;
490 
491     -- Initialize message list if p_init_msg_list is set to TRUE.
492     IF fnd_api.to_boolean(p_init_msg_list) THEN
493       fnd_msg_pub.initialize;
494     END IF;
495 
496     /** ssia we don't need this if condition **/
497     /*IF (p_transaction_action_id = 3 AND g_firstscan = FALSE) THEN*/
498     /*** ssia note end ****/
499     x_return_status  := fnd_api.g_ret_sts_success;
500 
501     /**ELSE**/
502     BEGIN
503       SELECT serial_number_control_code
504         INTO l_serial_control_code
505         FROM mtl_system_items
506        WHERE inventory_item_id = p_inventory_item_id
507          AND organization_id = p_organization_id;
508 
509       -- invtrace('serial_number_control_code is ' || l_serial_control_code);
510       IF (l_serial_control_code = 1
511            AND is_serial_tagged(p_inventory_item_id,p_organization_id,NULL) = 1) THEN
512         -- invtrace('serial_control_code is 1.there is no serial control.');
513         fnd_message.set_name('INV', 'INV_ITEM_NOT_SERIAL_CONTROLLED');
514         fnd_msg_pub.ADD;
515         --Bug 3153585:Populating the message from the message stack
516         RAISE fnd_api.g_exc_error;
517       END IF;
518     EXCEPTION
519       WHEN NO_DATA_FOUND THEN
520         fnd_message.set_name('INV', 'INV_INVALID_ITEM');
521         fnd_msg_pub.ADD;
522         RAISE fnd_api.g_exc_error;
523     END;
524 
525     SELECT mtl_gen_object_id_s.NEXTVAL
526       INTO x_object_id
527       FROM DUAL;
528 
529     -- invtrace('next genealogy object id from the sequence mtl_gen_object_id_s is ' || x_object_id);
530     l_wms_installed  :=
531       wms_install.check_install(
532         x_return_status              => l_return_status
533       , x_msg_count                  => l_msg_count
534       , x_msg_data                   => l_msg_data
535       , p_organization_id            => NULL   --p_organization_id
536       );
537     -- bug 2771342/2768690
538     -- Moved this line before the if statement so that this code is
539     -- called for the else part of the if statement too.
540     populateattributescolumn();
541 
542     -- invtrace('wms is installed?' || l_wms_installed);
543     IF (p_transaction_temp_id IS NOT NULL) THEN
544       -- invtrace('transaction_temp_id is not null. It is  ' || p_transaction_temp_id);
545       OPEN serial_temp_csr(p_transaction_temp_id);
546 
547       --populateattributescolumn();
548       FETCH serial_temp_csr
549        INTO g_serial_attributes_tbl(1).column_value
550           , g_serial_attributes_tbl(2).column_value
551           , g_serial_attributes_tbl(3).column_value
552           , g_serial_attributes_tbl(4).column_value
553           , g_serial_attributes_tbl(5).column_value
554           , g_serial_attributes_tbl(6).column_value
555           , g_serial_attributes_tbl(7).column_value
556           , g_serial_attributes_tbl(8).column_value
557           , g_serial_attributes_tbl(9).column_value
558           , g_serial_attributes_tbl(10).column_value
559           , g_serial_attributes_tbl(11).column_value
560           , g_serial_attributes_tbl(12).column_value
561           , g_serial_attributes_tbl(13).column_value
562           , g_serial_attributes_tbl(14).column_value
563           , g_serial_attributes_tbl(15).column_value
564           , g_serial_attributes_tbl(16).column_value
565           , g_serial_attributes_tbl(17).column_value
566           , g_serial_attributes_tbl(18).column_value
567           , g_serial_attributes_tbl(19).column_value
568           , g_serial_attributes_tbl(20).column_value
569           , g_serial_attributes_tbl(21).column_value
570           , g_serial_attributes_tbl(22).column_value
571           , g_serial_attributes_tbl(23).column_value
572           , g_serial_attributes_tbl(24).column_value
573           , g_serial_attributes_tbl(25).column_value
574           , g_serial_attributes_tbl(26).column_value
575           , g_serial_attributes_tbl(27).column_value
576           , g_serial_attributes_tbl(28).column_value
577           , g_serial_attributes_tbl(29).column_value
578           , g_serial_attributes_tbl(30).column_value
579           , g_serial_attributes_tbl(31).column_value
580           , g_serial_attributes_tbl(32).column_value
581           , g_serial_attributes_tbl(33).column_value
582           , g_serial_attributes_tbl(34).column_value
583           , g_serial_attributes_tbl(35).column_value
584           , g_serial_attributes_tbl(36).column_value
585           , g_serial_attributes_tbl(37).column_value
586           , g_serial_attributes_tbl(38).column_value
587           , g_serial_attributes_tbl(39).column_value
588           , g_serial_attributes_tbl(40).column_value
589           , g_serial_attributes_tbl(41).column_value
590           , g_serial_attributes_tbl(42).column_value
591           , g_serial_attributes_tbl(43).column_value
592           , g_serial_attributes_tbl(44).column_value;
593 
594       CLOSE serial_temp_csr;
595 
596       IF l_wms_installed THEN
597         -- invtrace('wms is installed ');
598         l_input_idx  := 0;
599 
600         FOR x IN 1 .. 44 LOOP
601           IF (g_serial_attributes_tbl(x).column_value IS NOT NULL) THEN
602             l_input_idx                                := l_input_idx + 1;
603             -- invtrace('in serial attributes loop. input_idx is ' || l_input_idx);
604             l_attributes_in(l_input_idx).column_name   := g_serial_attributes_tbl(x).column_name;
605             -- invtrace('l_attributes_in(l_input_idx).column_name is ' || l_attributes_in(l_input_idx).column_name);
606             l_attributes_in(l_input_idx).column_type   := g_serial_attributes_tbl(x).column_type;
607             -- invtrace('l_attributes_in(l_input_idx).column_type is ' || l_attributes_in(l_input_idx).column_type);
608             l_attributes_in(l_input_idx).column_value  := g_serial_attributes_tbl(x).column_value;
609           -- invtrace('l_attributes_in(l_input_idx).column_value is ' || l_attributes_in(l_input_idx).column_value);
610           END IF;
611         END LOOP;
612       END IF;   -- if wms installed is true
613     END IF;   -- if transaction_Temp_id is not null
614 
615         ----------------------------------------------------------
616         -- call inv_lot_sel_attr.get_default to get the default value
617         -- of the lot attributes
618         ---------------------------------------------------------
619     -- invtrace('calling inv_lot_sel_attr.get_default to get the default value of lot attributes');
620     IF l_wms_installed THEN
621       inv_lot_sel_attr.get_default(
622         x_attributes_default         => l_attributes_default
623       , x_attributes_default_count   => l_attributes_default_count
624       , x_return_status              => l_return_status
625       , x_msg_count                  => l_msg_count
626       , x_msg_data                   => l_msg_data
627       , p_table_name                 => 'MTL_SERIAL_NUMBERS'
628       , p_attributes_name            => 'Serial Attributes'
629       , p_inventory_item_id          => p_inventory_item_id
630       , p_organization_id            => p_organization_id
631       , p_lot_serial_number          => p_serial_number
632       , p_attributes                 => l_attributes_in
633       );
634 
635       IF (l_return_status <> fnd_api.g_ret_sts_success) THEN
636         x_return_status  := l_return_status;
637         RAISE fnd_api.g_exc_unexpected_error;
638       END IF;
639 
640       IF (l_attributes_default_count > 0) THEN
641         FOR i IN 1 .. l_attributes_default_count LOOP
642           FOR j IN 1 .. g_serial_attributes_tbl.COUNT LOOP
643             IF (l_attributes_default(i).column_name = g_serial_attributes_tbl(j).column_name) THEN
644               g_serial_attributes_tbl(j).column_value  := l_attributes_default(i).column_value;
645             END IF;
646           END LOOP;
647         END LOOP;
648       END IF;
649     END IF;   -- end if of wms install is true
650 
651     --END IF; -- delete this since we don't need the if condition to set the l_return_status
652     l_userid         := fnd_global.user_id;
653     l_loginid        := fnd_global.login_id;
654 
655     -- invtrace('transaction_action_id is ' || p_transaction_action_id);
656     IF (p_transaction_action_id = 3
657         AND g_firstscan = FALSE) THEN
658       -- invtrace(' inserting into MSN values ');
659        ---------#-#-#-#get the values later
660       INSERT INTO mtl_serial_numbers
661                   (
662                    inventory_item_id
663                  , serial_number
664                  , last_update_date
665                  , last_updated_by
666                  , creation_date
667                  , created_by
668                  , last_update_login
669                  , request_id
670                  , program_application_id
671                  , program_id
672                  , program_update_date
673                  , initialization_date
674                  , completion_date
675                  , ship_date
676                  , current_status
677                  , revision
678                  , lot_number
679                  , fixed_asset_tag
680                  , reserved_order_id
681                  , parent_item_id
682                  , parent_serial_number
683                  , original_wip_entity_id
684                  , original_unit_vendor_id
685                  , vendor_serial_number
686                  , vendor_lot_number
687                  , last_txn_source_type_id
688                  , last_transaction_id
689                  , last_receipt_issue_type
690                  , last_txn_source_name
691                  , last_txn_source_id
692                  , descriptive_text
693                  , current_subinventory_code
694                  , current_locator_id
695                  , current_organization_id
696                  , attribute_category
697                  , attribute1
698                  , attribute2
699                  , attribute3
700                  , attribute4
701                  , attribute5
702                  , attribute6
703                  , attribute7
704                  , attribute8
705                  , attribute9
706                  , attribute10
707                  , attribute11
708                  , attribute12
709                  , attribute13
710                  , attribute14
711                  , attribute15
712                  , group_mark_id
713                  , line_mark_id
714                  , lot_line_mark_id
715                  , end_item_unit_number
716                  , gen_object_id
717                  , serial_attribute_category
718                  , origination_date
719                  , c_attribute1
720                  , c_attribute2
721                  , c_attribute3
722                  , c_attribute4
723                  , c_attribute5
724                  , c_attribute6
725                  , c_attribute7
726                  , c_attribute8
727                  , c_attribute9
728                  , c_attribute10
729                  , c_attribute11
730                  , c_attribute12
731                  , c_attribute13
732                  , c_attribute14
733                  , c_attribute15
734                  , c_attribute16
735                  , c_attribute17
736                  , c_attribute18
737                  , c_attribute19
738                  , c_attribute20
739                  , d_attribute1
740                  , d_attribute2
741                  , d_attribute3
742                  , d_attribute4
743                  , d_attribute5
744                  , d_attribute6
745                  , d_attribute7
746                  , d_attribute8
747                  , d_attribute9
748                  , d_attribute10
749                  , n_attribute1
750                  , n_attribute2
751                  , n_attribute3
752                  , n_attribute4
753                  , n_attribute5
754                  , n_attribute6
755                  , n_attribute7
756                  , n_attribute8
757                  , n_attribute9
758                  , n_attribute10
759                  , status_id
760                  , territory_code
761                  , cost_group_id
762                  , organization_type
763                  , owning_organization_id
764                  , owning_tp_type
765                  , planning_organization_id
766                  , planning_tp_type
767                  , wip_entity_id
768                  , operation_seq_num
769                  , intraoperation_step_type
770                   )
771         SELECT inventory_item_id
772              , serial_number
773              , SYSDATE
774              , l_userid
775              , SYSDATE
776              , l_userid
777              , l_loginid
778              , request_id
779              , program_application_id
780              , program_id
781              , program_update_date
782              , initialization_date
783              , completion_date
784              , ship_date
785              , current_status
786              , revision
787              , lot_number
788              , fixed_asset_tag
789              , reserved_order_id
790              , parent_item_id
791              , parent_serial_number
792              , original_wip_entity_id
793              , original_unit_vendor_id
794              , vendor_serial_number
795              , vendor_lot_number
796              , last_txn_source_type_id
797              , p_transaction_id
798              , last_receipt_issue_type
799              , p_txn_src_name
800              , p_txn_src_id
801              , descriptive_text
802              , p_subinventory_code
803              , p_current_locator_id
804              , p_organization_id
805              , attribute_category
806              , attribute1
807              , attribute2
808              , attribute3
809              , attribute4
810              , attribute5
811              , attribute6
812              , attribute7
813              , attribute8
814              , attribute9
815              , attribute10
816              , attribute11
817              , attribute12
818              , attribute13
819              , attribute14
820              , attribute15
821              , group_mark_id
822              , line_mark_id
823              , lot_line_mark_id
824              , end_item_unit_number
825              , x_object_id
826              , serial_attribute_category
827              , origination_date
828              , c_attribute1
829              , c_attribute2
830              , c_attribute3
831              , c_attribute4
832              , c_attribute5
833              , c_attribute6
834              , c_attribute7
835              , c_attribute8
836              , c_attribute9
837              , c_attribute10
838              , c_attribute11
839              , c_attribute12
840              , c_attribute13
841              , c_attribute14
842              , c_attribute15
843              , c_attribute16
844              , c_attribute17
845              , c_attribute18
846              , c_attribute19
847              , c_attribute20
848              , d_attribute1
849              , d_attribute2
850              , d_attribute3
851              , d_attribute4
852              , d_attribute5
853              , d_attribute6
854              , d_attribute7
855              , d_attribute8
856              , d_attribute9
857              , d_attribute10
858              , n_attribute1
859              , n_attribute2
860              , n_attribute3
861             , n_attribute4
862              , n_attribute5
863              , n_attribute6
864              , n_attribute7
865              , n_attribute8
866              , n_attribute9
867              , n_attribute10
868              , status_id
869              , territory_code
870              , inv_cost_group_pub.g_cost_group_id
871              , NVL(p_organization_type, 2)
872              , NVL(p_owning_org_id, p_organization_id)
873              , NVL(p_owning_tp_type, 2)
874              , NVL(p_planning_org_id, p_organization_id)
875              , NVL(p_planning_tp_type, 2)
876              , wip_entity_id
877              , operation_seq_num
878              , intraoperation_step_type
879           FROM mtl_serial_numbers
880          WHERE serial_number = p_serial_number
881            AND current_organization_id = g_transfer_org_id
882            AND inventory_item_id = p_inventory_item_id
883            AND NOT EXISTS(
884                 SELECT NULL
885                   FROM mtl_serial_numbers sn
886                  WHERE sn.serial_number = p_serial_number
887                    AND sn.current_organization_id = p_organization_id
888                    AND sn.inventory_item_id = p_inventory_item_id);
889 
890       -- prepare to insert the initial status to the status history table
891       -- bug 1870120
892       SELECT status_id
893         INTO l_status_id
894         FROM mtl_serial_numbers
895        WHERE serial_number = p_serial_number
896          AND current_organization_id = p_organization_id
897          AND inventory_item_id = p_inventory_item_id;
898     -- invtrace('l_status_id from MSN when serial_number = ' || p_serial_number || ' current_organization_id = ' || p_organization_id || 'inventory_item_id = ' || p_inventory_item_id);
899     ELSE
900       /** Populate Serial Attribute Category info. **/
901       IF (l_wms_installed) THEN
902         -- invtrace('wms is installed. Calling inv_lot_sel_attr.get_context_code');
903         inv_lot_sel_attr.get_context_code(g_serial_attributes_tbl(1).column_value, p_organization_id, p_inventory_item_id
904         , 'Serial Attributes');
905       ELSE
906         -- invtrace('wms is not installed. populating all the column values in the g_serial_attributes_tbl with null value');
907         g_serial_attributes_tbl(1).column_value  := NULL;
908       END IF;
909 
910       -- if the p_status_id is null, then default the status if it is
911       -- specified in the mtl_system_items
912       -- invtrace('p_status_id is ' || p_status_id);
913       IF p_status_id IS NULL THEN
914         -- invtrace('p_status_id is null. calling inv_material_status_grp.get_lot_serial_status_control');
915         inv_material_status_grp.get_lot_serial_status_control(
916           p_organization_id            => p_organization_id
917         , p_inventory_item_id          => p_inventory_item_id
918         , x_return_status              => l_return_status
919         , x_msg_count                  => l_msg_count
920         , x_msg_data                   => l_msg_data
921         , x_lot_status_enabled         => l_lot_status_enabled
922         , x_default_lot_status_id      => l_default_lot_status_id
923         , x_serial_status_enabled      => l_serial_status_enabled
924         , x_default_serial_status_id   => l_default_serial_status_id
925         );
926 
927         IF (l_return_status <> fnd_api.g_ret_sts_success) THEN
928           x_return_status  := l_return_status;
929           RAISE fnd_api.g_exc_unexpected_error;
930         END IF;
931 
932         IF (NVL(l_serial_status_enabled, 'Y') = 'Y') THEN
933           l_status_id  := l_default_serial_status_id;
934         END IF;
935       ELSE
936         l_status_id  := p_status_id;
937       END IF;
938 
939       -- invtrace('inserting into MSN values');
940       INSERT INTO mtl_serial_numbers
941                   (
942                    inventory_item_id
943                  , serial_number
944                  , last_update_date
945                  , last_updated_by
946                  , creation_date
947                  , created_by
948                  , last_update_login
949                  , request_id
950                  , program_application_id
951                  , program_id
952                  , program_update_date
953                  , initialization_date
954                  , completion_date
955                  , ship_date
956                  , current_status
957                  , revision
958                  , lot_number
959                  , fixed_asset_tag
960                  , reserved_order_id
961                  , parent_item_id
962                  , parent_serial_number
963                  , original_wip_entity_id
964                  , original_unit_vendor_id
965                  , vendor_serial_number
966                  , vendor_lot_number
967                  , last_txn_source_type_id
968                  , last_transaction_id
969                  , last_receipt_issue_type
970                  , last_txn_source_name
971                  , last_txn_source_id
972                  , descriptive_text
973                  , current_subinventory_code
974                  , current_locator_id
975                  , current_organization_id
976                  , attribute_category
977                  , attribute1
978                  , attribute2
979                  , attribute3
980                  , attribute4
981                  , attribute5
982                  , attribute6
983                  , attribute7
984                  , attribute8
985                  , attribute9
986                  , attribute10
987                  , attribute11
988                  , attribute12
989                  , attribute13
990                  , attribute14
991                  , attribute15
992                  , group_mark_id
993                  , line_mark_id
994                  , lot_line_mark_id
995                  , end_item_unit_number
996                  , gen_object_id
997                  , serial_attribute_category
998                  , origination_date
999                  , c_attribute1
1000                  , c_attribute2
1001                  , c_attribute3
1002                  , c_attribute4
1003                  , c_attribute5
1004                  , c_attribute6
1005                  , c_attribute7
1006                  , c_attribute8
1007                  , c_attribute9
1008                  , c_attribute10
1009                  , c_attribute11
1010                  , c_attribute12
1011                  , c_attribute13
1012                  , c_attribute14
1013                  , c_attribute15
1014                  , c_attribute16
1015                  , c_attribute17
1016                  , c_attribute18
1017                  , c_attribute19
1018                  , c_attribute20
1019                  , d_attribute1
1020                  , d_attribute2
1021                  , d_attribute3
1022                  , d_attribute4
1023                  , d_attribute5
1024                  , d_attribute6
1025                  , d_attribute7
1026                  , d_attribute8
1027                  , d_attribute9
1028                  , d_attribute10
1029                  , n_attribute1
1030                  , n_attribute2
1031                  , n_attribute3
1032                  , n_attribute4
1033                  , n_attribute5
1034                  , n_attribute6
1035                  , n_attribute7
1036                  , n_attribute8
1037                  , n_attribute9
1038                  , n_attribute10
1039                  , status_id
1040                  , territory_code
1041                  , cost_group_id
1042                  , organization_type
1043                  , owning_organization_id
1044                  , owning_tp_type
1045                  , planning_organization_id
1046                  , planning_tp_type
1047                  , wip_entity_id
1048                  , operation_seq_num
1049                  , intraoperation_step_type
1050                   )
1051            VALUES (
1052                    p_inventory_item_id
1053                  , p_serial_number
1054                  , SYSDATE
1055                  , l_userid
1056                  , SYSDATE
1057                  , l_userid
1058                  , l_loginid
1059                  , NULL
1060                  , NULL
1061                  , NULL
1062                  , NULL
1063                  , p_initialization_date
1064                  , p_completion_date
1065                  , p_ship_date
1066                  , p_current_status
1067                  , p_revision
1068                  , p_lot_number
1069                  , NULL
1070                  , NULL
1071                  , p_parent_item_id
1072                  , p_parent_serial_number
1073                  , p_trx_src_id
1074                  , p_unit_vendor_id
1075                  , p_vendor_serial_number
1076                  , p_vendor_lot_number
1077                  , p_txn_src_type_id
1078                  , p_transaction_id
1079                  , p_receipt_issue_type
1080                  , p_txn_src_name
1081                  , p_txn_src_id
1082                  , g_serial_attributes_tbl(31).column_value
1083                  , p_subinventory_code
1084                  , p_current_locator_id
1085                  , p_organization_id
1086                  , NULL
1087                  , NULL
1088                  , NULL
1089                  , NULL
1090                  , NULL
1091                  , NULL
1092                  , NULL
1093                  , NULL
1094                  , NULL
1095                  , NULL
1096                  , NULL
1097                  , NULL
1098                  , NULL
1099                  , NULL
1100                  , NULL
1101                  , NULL
1102                  , NULL
1103                  , NULL
1104                  , NULL
1105                  , NULL
1106                  , x_object_id
1107                  , g_serial_attributes_tbl(1).column_value
1108                  , fnd_date.canonical_to_date(g_serial_attributes_tbl(2).column_value)
1109                  , g_serial_attributes_tbl(3).column_value
1110                  , g_serial_attributes_tbl(4).column_value
1111                  , g_serial_attributes_tbl(5).column_value
1112                  , g_serial_attributes_tbl(6).column_value
1113                  , g_serial_attributes_tbl(7).column_value
1114                  , g_serial_attributes_tbl(8).column_value
1115                  , g_serial_attributes_tbl(9).column_value
1116                  , g_serial_attributes_tbl(10).column_value
1117                  , g_serial_attributes_tbl(11).column_value
1118                  , g_serial_attributes_tbl(12).column_value
1119                  , g_serial_attributes_tbl(13).column_value
1120                  , g_serial_attributes_tbl(14).column_value
1121                  , g_serial_attributes_tbl(15).column_value
1122                  , g_serial_attributes_tbl(16).column_value
1123                  , g_serial_attributes_tbl(17).column_value
1124                  , g_serial_attributes_tbl(18).column_value
1125                  , g_serial_attributes_tbl(19).column_value
1126                  , g_serial_attributes_tbl(20).column_value
1127                  , g_serial_attributes_tbl(21).column_value
1128                  , g_serial_attributes_tbl(22).column_value
1129                  , fnd_date.canonical_to_date(g_serial_attributes_tbl(23).column_value)
1130                  , fnd_date.canonical_to_date(g_serial_attributes_tbl(24).column_value)
1131                  , fnd_date.canonical_to_date(g_serial_attributes_tbl(25).column_value)
1132                  , fnd_date.canonical_to_date(g_serial_attributes_tbl(26).column_value)
1133                  , fnd_date.canonical_to_date(g_serial_attributes_tbl(27).column_value)
1134                  , fnd_date.canonical_to_date(g_serial_attributes_tbl(28).column_value)
1135                  , fnd_date.canonical_to_date(g_serial_attributes_tbl(29).column_value)
1136                  , fnd_date.canonical_to_date(g_serial_attributes_tbl(30).column_value)
1137                  , fnd_date.canonical_to_date(g_serial_attributes_tbl(31).column_value)
1138                  , fnd_date.canonical_to_date(g_serial_attributes_tbl(32).column_value)
1139                  , TO_NUMBER(g_serial_attributes_tbl(33).column_value)
1140                  , TO_NUMBER(g_serial_attributes_tbl(34).column_value)
1141                  , TO_NUMBER(g_serial_attributes_tbl(35).column_value)
1142                  , TO_NUMBER(g_serial_attributes_tbl(36).column_value)
1143                  , TO_NUMBER(g_serial_attributes_tbl(37).column_value)
1144                  , TO_NUMBER(g_serial_attributes_tbl(38).column_value)
1145                  , TO_NUMBER(g_serial_attributes_tbl(39).column_value)
1146                  , TO_NUMBER(g_serial_attributes_tbl(40).column_value)
1147                  , TO_NUMBER(g_serial_attributes_tbl(41).column_value)
1148                  , TO_NUMBER(g_serial_attributes_tbl(42).column_value)
1149                  , l_status_id
1150                  , g_serial_attributes_tbl(44).column_value
1151                  , inv_cost_group_pub.g_cost_group_id
1152                  , NVL(p_organization_type, 2)
1153                  , NVL(p_owning_org_id, p_organization_id)
1154                  , NVL(p_owning_tp_type, 2)
1155                  , NVL(p_planning_org_id, p_organization_id)
1156                  , NVL(p_planning_tp_type, 2)
1157                  , p_wip_entity_id
1158                  , p_operation_seq_num
1159                  , p_intraoperation_step_type
1160                   );
1161     -- invtrace(' p_inventory_item_id  ' || p_inventory_item_id);
1162     -- invtrace(', p_serial_number ' || p_serial_number);
1163     -- invtrace(' last_update_date ' || SYSDATE);
1164     -- invtrace('last updated by' || l_userid);
1165     -- invtrace('creation_date ' || SYSDATE);
1166     -- invtrace(' created_by ' ||l_userid);
1167     -- invtrace('last_update_login ' || l_loginid);
1168     -- invtrace('request_id ' || NULL);
1169     -- invtrace('program application id is NULL ');
1170              -- invtrace('program id is NULL');
1171              -- invtrace('program update date is  NULL');
1172              -- invtrace('initialization_date is ' || p_initialization_date);
1173              -- invtrace('completion_date is ' || p_completion_date);
1174              -- invtrace('ship date is ' || p_ship_date);
1175              -- invtrace('current status is ' || p_current_status);
1176              -- invtrace('revision is ' || p_revision);
1177              -- invtrace('lot number is ' || p_lot_number);
1178              -- invtrace('fixed asset tag is NULL');
1179              -- invtrace('reserved order id is NULL');
1180              -- invtrace('parent item id is '|| p_parent_item_id);
1181              -- invtrace('parent_serial_number is ' || p_parent_serial_number);
1182              -- invtrace('trx_src_id is ' ||p_trx_src_id);
1183              -- invtrace('p_unit_vendor_id is ' ||p_unit_vendor_id);
1184              -- invtrace('p_vendor_serial_number is ' || p_vendor_serial_number);
1185              -- invtrace('p_vendor_lot_number is ' || p_vendor_lot_number);
1186              -- invtrace('p_txn_src_type_id  is ' || p_txn_src_type_id);
1187              -- invtrace('p_transaction_id is ' || p_transaction_id);
1188              -- invtrace('p_receipt_issue_type ' || p_receipt_issue_type);
1189              -- invtrace('p_txn_src_name is ' || p_txn_src_name);
1190              -- invtrace('p_txn_src_id is ' || p_txn_src_id);
1191              -- invtrace('g_serial_attributes_tbl(31).column_value is ' || g_serial_attributes_tbl(31).column_value);
1192              -- invtrace('p_subinventory_code is ' || p_subinventory_code);
1193              -- invtrace('p_current_locator_id is ' || p_current_locator_id);
1194              -- invtrace('current organization_id is '|| p_organization_id);
1195              -- invtrace('attribute category is NULL');
1196              -- invtrace(' attributes 1 to 15 are NULL');
1197              -- invtrace('group mark id is NULL');
1198              -- invtrace('line mark_id is NULL');
1199              -- invtrace('lot_linemark_id is  NULL');
1200              -- invtrace('end item unit number is NULL');
1201              -- invtrace('gen_object_id is ' ||x_object_id);
1202              -- invtrace('serial attribute category is ' || g_serial_attributes_tbl(1).column_value);
1203              -- invtrace('origination date is ' || fnd_date.canonical_to_date(g_serial_attributes_tbl(2).column_value));
1204              -- invtrace('c_attribute1 '|| g_serial_attributes_tbl(3).column_value);
1205              -- invtrace('cattribute2 ' || g_serial_attributes_tbl(4).column_value);
1206              -- invtrace('cattribute3 ' ||g_serial_attributes_tbl(5).column_value);
1207              -- invtrace('cattribute4 ' ||g_serial_attributes_tbl(6).column_value);
1208              -- invtrace('cattribute5 ' ||g_serial_attributes_tbl(7).column_value);
1209              -- invtrace('cattribute6 ' ||g_serial_attributes_tbl(8).column_value);
1210              -- invtrace('cattribute7 ' ||g_serial_attributes_tbl(9).column_value);
1211              -- invtrace('cattribute8 ' ||g_serial_attributes_tbl(10).column_value);
1212              -- invtrace('cattribute9 ' ||g_serial_attributes_tbl(11).column_value);
1213              -- invtrace('cattribute10 ' ||g_serial_attributes_tbl(12).column_value);
1214              -- invtrace('cattribute11 ' ||g_serial_attributes_tbl(13).column_value);
1215              -- invtrace('cattribute12 ' ||g_serial_attributes_tbl(14).column_value);
1216              -- invtrace('cattribute13 ' ||g_serial_attributes_tbl(15).column_value);
1217              -- invtrace('cattribute14 ' ||g_serial_attributes_tbl(16).column_value);
1218              -- invtrace('cattribute15 ' ||g_serial_attributes_tbl(17).column_value);
1219              -- invtrace('cattribute16 ' ||g_serial_attributes_tbl(18).column_value);
1220              -- invtrace('cattribute17 ' ||g_serial_attributes_tbl(19).column_value);
1221              -- invtrace('cattribute18 ' ||g_serial_attributes_tbl(20).column_value);
1222              -- invtrace('cattribute19 ' ||g_serial_attributes_tbl(21).column_value);
1223              -- invtrace('cattribute20 ' ||g_serial_attributes_tbl(22).column_value);
1224              -- invtrace('dattribute1 ' ||fnd_date.canonical_to_date(g_serial_attributes_tbl(23).column_value));
1225              -- invtrace('dattribute2 ' ||fnd_date.canonical_to_date(g_serial_attributes_tbl(24).column_value));
1226              -- invtrace('dattribute3 ' ||fnd_date.canonical_to_date(g_serial_attributes_tbl(25).column_value));
1227              -- invtrace('dattribute4 ' ||fnd_date.canonical_to_date(g_serial_attributes_tbl(26).column_value));
1228              -- invtrace('dattribute5 ' ||fnd_date.canonical_to_date(g_serial_attributes_tbl(27).column_value));
1229              -- invtrace('dattribute6 ' ||fnd_date.canonical_to_date(g_serial_attributes_tbl(28).column_value));
1230              -- invtrace('dattribute7 ' ||fnd_date.canonical_to_date(g_serial_attributes_tbl(29).column_value));
1231              -- invtrace('dattribute8 ' ||fnd_date.canonical_to_date(g_serial_attributes_tbl(30).column_value));
1232              -- invtrace('dattribute9 ' ||fnd_date.canonical_to_date(g_serial_attributes_tbl(31).column_value));
1233              -- invtrace('dattribute10 ' ||fnd_date.canonical_to_date(g_serial_attributes_tbl(32).column_value));
1234              -- invtrace('nattribute1 ' ||TO_NUMBER(g_serial_attributes_tbl(33).column_value));
1235              -- invtrace('nattribute2 ' ||TO_NUMBER(g_serial_attributes_tbl(34).column_value));
1236              -- invtrace('nattribute3 ' ||TO_NUMBER(g_serial_attributes_tbl(35).column_value));
1237              -- invtrace('nattribute4 ' ||TO_NUMBER(g_serial_attributes_tbl(36).column_value));
1238              -- invtrace('nattribute5 ' ||TO_NUMBER(g_serial_attributes_tbl(37).column_value));
1239              -- invtrace('nattribute6 ' ||TO_NUMBER(g_serial_attributes_tbl(38).column_value));
1240              -- invtrace('nattribute7 ' ||TO_NUMBER(g_serial_attributes_tbl(39).column_value));
1241              -- invtrace('nattribute8 ' ||TO_NUMBER(g_serial_attributes_tbl(40).column_value));
1242              -- invtrace('nattribute9 ' ||TO_NUMBER(g_serial_attributes_tbl(41).column_value));
1243              -- invtrace('nattribute10 ' ||TO_NUMBER(g_serial_attributes_tbl(42).column_value));
1244              -- invtrace('status id is ' ||l_status_id);
1245              -- invtrace('territory code is ' || g_serial_attributes_tbl(44).column_value);
1246              -- invtrace('cost group id is ' ||inv_cost_group_pub.g_cost_group_id);
1247              -- invtrace('organization type is ' ||NVL(p_organization_type, 2));
1248              -- invtrace('owning org id ' ||NVL(p_owning_org_id, p_organization_id));
1249              -- invtrace('owning tp type ' ||NVL(p_owning_tp_type, 2));
1250              -- invtrace('planning org id is ' ||NVL(p_planning_org_id, p_organization_id));
1251              -- invtrace('planning tp type is ' ||NVL(p_planning_tp_type, 2));
1252              -- invtrace('wip entity id is ' || p_wip_entity_id);
1253              -- invtrace('operation_seq_num is ' || p_operation_seq_num);
1254              -- invtrace('intraoperation_step_type is ' || p_intraoperation_step_type);
1255     END IF;
1256 
1257     x_return_status  := fnd_api.g_ret_sts_success;
1258 
1259     -- insert into the status history table for bug 1870120
1260     IF (l_status_id IS NOT NULL) THEN
1261       l_status_rec.update_method        := inv_material_status_pub.g_update_method_auto;
1262       l_status_rec.organization_id      := p_organization_id;
1263       l_status_rec.inventory_item_id    := p_inventory_item_id;
1264       l_status_rec.serial_number        := p_serial_number;
1265       l_status_rec.status_id            := l_status_id;
1266       l_status_rec.initial_status_flag  := 'Y';
1267       inv_material_status_pkg.insert_status_history(l_status_rec);
1268     END IF;
1269 
1270     -- Standard check of p_commit.
1271     IF fnd_api.to_boolean(p_commit) THEN
1272       COMMIT WORK;
1273     END IF;
1274 
1275     -- Standard call to get message count and if count is 1, get message info.
1276     fnd_msg_pub.count_and_get(p_encoded => fnd_api.g_false, p_count => x_msg_count, p_data => x_msg_data);
1277   EXCEPTION
1278     WHEN fnd_api.g_exc_error THEN
1279       ROLLBACK TO apiinsertserial_apipub;
1280       --Bug 3153585:Populating x_msg_data from message stack
1281       fnd_msg_pub.count_and_get(p_encoded => fnd_api.g_false, p_count => x_msg_count, p_data => x_msg_data);
1282       x_return_status  := fnd_api.g_ret_sts_error;
1283     WHEN OTHERS THEN
1284       ROLLBACK TO apiinsertserial_apipub;
1285 
1286       IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_unexp_error) THEN
1287         fnd_msg_pub.add_exc_msg('INV_SERIAL_NUMBER_PUB', 'insertSerial');
1288       END IF;
1289 
1290       --Bug 3153585:Populating x_msg_data from message stack
1291       fnd_msg_pub.count_and_get(p_encoded => fnd_api.g_false, p_count => x_msg_count, p_data => x_msg_data);
1292       x_return_status  := fnd_api.g_ret_sts_unexp_error;
1293   END insertserial;
1294 
1295    -- Procedure insertSerial for Serial Blacklist
1296   PROCEDURE insert_range_serial(
1297     p_api_version         IN            NUMBER
1298   , p_init_msg_list       IN            VARCHAR2 := fnd_api.g_false
1299   , p_commit              IN            VARCHAR2 := fnd_api.g_false
1300   , p_validation_level    IN            NUMBER := fnd_api.g_valid_level_full
1301   , p_inventory_item_id   IN            NUMBER
1302   , p_organization_id     IN            NUMBER
1303   , p_fm_serial_number    IN            VARCHAR2
1304   , p_to_serial_number    IN            VARCHAR2
1305   , p_current_status      IN            NUMBER
1306   , p_status_id           IN            NUMBER
1307   , p_group_mark_id       IN            NUMBER
1308   , p_lot_number          IN            VARCHAR2
1309   , p_initialization_date IN            DATE DEFAULT SYSDATE
1310   , x_return_status       OUT NOCOPY    VARCHAR2
1311   , x_msg_count           OUT NOCOPY    NUMBER
1312   , x_msg_data            OUT NOCOPY    VARCHAR2
1313   , p_organization_type   IN            NUMBER DEFAULT NULL
1314   , p_owning_org_id       IN            NUMBER DEFAULT NULL
1315   , p_owning_tp_type      IN            NUMBER DEFAULT NULL
1316   , p_planning_org_id     IN            NUMBER DEFAULT NULL
1317   , p_planning_tp_type    IN            NUMBER DEFAULT NULL
1318   ) IS
1319      l_lot_exists           NUMBER :=0;
1320      l_from_ser_number      NUMBER;
1321      l_to_ser_number        NUMBER;
1322      l_range_numbers        NUMBER;
1323      l_cur_ser_number       NUMBER;
1324      l_cur_serial_number    VARCHAR2(30);
1325      l_temp_prefix          VARCHAR2(30);
1326      l_api_version          CONSTANT NUMBER         := 1.0;
1327      l_api_name             CONSTANT VARCHAR2(30)   := 'insert_range_serial';
1328      l_userid               NUMBER;
1329      l_loginid              NUMBER;
1330      l_serial_control_code  NUMBER;
1331      l_serial_status_control NUMBER;
1332      l_return_status        VARCHAR2(1);
1333      l_msg_data             VARCHAR2(2000);
1334      l_msg_count            NUMBER;
1335      isunique               NUMBER;
1336      item_count             NUMBER;
1337      l_current_status       NUMBER;
1338      x_object_id            NUMBER;
1339      l_debug                NUMBER         := NVL(fnd_profile.VALUE('INV_DEBUG_TRACE'), 0);
1340   BEGIN
1341    -- Standard Start of API savepoint
1342    SAVEPOINT apiinsertserial_apipub;
1343 
1344    -- Standard call to check for call compatibility.
1345    IF NOT fnd_api.compatible_api_call(l_api_version, p_api_version, l_api_name, g_pkg_name) THEN
1346       RAISE fnd_api.g_exc_unexpected_error;
1347    END IF;
1348 
1349    -- Initialize message list if p_init_msg_list is set to TRUE.
1350    IF fnd_api.to_boolean(p_init_msg_list) THEN
1351       fnd_msg_pub.initialize;
1352    END IF;
1353 
1354    --  Initialize API return status to success
1355    -- API body
1356 
1357    --Block for Organization Validation
1358     BEGIN
1359        SELECT 1
1360          INTO item_count
1361          FROM mtl_parameters
1362          WHERE organization_id = p_organization_id;
1363     EXCEPTION
1364        WHEN NO_DATA_FOUND THEN
1365           item_count  := 0;
1366        WHEN OTHERS THEN
1367           IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_unexp_error) THEN
1368              fnd_msg_pub.add_exc_msg('INV_SERIAL_NUMBER_PUB', 'insert_range_serial');
1369           END IF;
1370 
1371           RAISE fnd_api.g_exc_unexpected_error;
1372     END;
1373 
1374     IF (item_count = 0) THEN
1375        fnd_message.set_name('INV', 'INVALID ORGANIZATION');
1376        fnd_msg_pub.ADD;
1377        RAISE fnd_api.g_exc_error;
1378     END IF;
1379 
1380     -- Block to check the Serial Control Code
1381     BEGIN
1382        SELECT serial_number_control_code
1383          INTO l_serial_control_code
1384          FROM mtl_system_items
1385          WHERE inventory_item_id = p_inventory_item_id
1386          AND organization_id = p_organization_id;
1387 
1388        IF (l_serial_control_code = 1) THEN
1389           fnd_message.set_name('INV', 'INV_ITEM_NOT_SERIAL_CONTROLLED');
1390           fnd_msg_pub.ADD;
1391           RAISE fnd_api.g_exc_error;
1392        END IF;
1393 
1394        l_current_status  := nvl(p_current_status,1);
1395        --bug10074753,we should populate the validate serial current status.
1396        IF(l_current_status NOT IN(1,3,4,5)) THEN
1397          fnd_message.set_name('INV', 'INV_SER_INVALID_STATUS');
1398          fnd_message.set_token('TOKEN',' ');
1399          fnd_msg_pub.ADD;
1400          RAISE fnd_api.g_exc_error;
1401        END IF;
1402 
1403     EXCEPTION
1404        WHEN fnd_api.g_exc_error THEN
1405           RAISE fnd_api.g_exc_error;
1406        WHEN NO_DATA_FOUND THEN
1407           fnd_message.set_name('INV', 'INV_INVALID_ITEM');
1408           fnd_msg_pub.ADD;
1409           RAISE fnd_api.g_exc_error;
1410        WHEN OTHERS THEN
1411           IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_unexp_error) THEN
1412              fnd_msg_pub.add_exc_msg('INV_SERIAL_NUMBER_PUB', 'insert_range_serial');
1413           END IF;
1414 
1415           RAISE fnd_api.g_exc_unexpected_error;
1416     END;
1417     --Block for material status validation
1418     BEGIN
1419     SELECT serial_control into l_serial_status_control
1420          from mtl_material_statuses
1421          WHERE status_id = p_status_id;
1422     --Check if the material status is serial control enabled.
1423     --If not then raise an error.
1424         IF (l_serial_status_control <> 1) THEN
1425           fnd_message.set_name('INV','INV_STATUS_NOT_APP'); --error messag
1426           fnd_msg_pub.ADD;
1427           RAISE fnd_api.g_exc_error;
1428        END IF;
1429 
1430     EXCEPTION
1431        WHEN fnd_api.g_exc_error THEN
1432           RAISE fnd_api.g_exc_error;
1433        WHEN NO_DATA_FOUND THEN
1434           fnd_message.set_name('INV', 'INV_STATUS_NOT_APP');
1435           fnd_msg_pub.ADD;
1436           RAISE fnd_api.g_exc_error;
1437        WHEN OTHERS THEN
1438           IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_unexp_error) THEN
1439              fnd_msg_pub.add_exc_msg('INV_SERIAL_NUMBER_PUB', 'insert_range_serial');
1440           END IF;
1441           RAISE fnd_api.g_exc_unexpected_error;
1442      END;
1443     --bug10074736,we should make sure the validate lot number here.
1444     --Block for lot number validation
1445     BEGIN
1446       IF nvl(p_lot_number,'!@') = '!@' THEN
1447         l_lot_exists := 0;
1448       ELSE
1449         SELECT 1 INTO l_lot_exists
1450          from mtl_lot_numbers
1451          WHERE inventory_item_id = p_inventory_item_id
1452           AND organization_id = p_organization_id
1453           AND  lot_number = p_lot_number;
1454 
1455         IF (l_lot_exists = 0) THEN
1456           fnd_message.set_name('INV','INV_INVALID_LOT'); --error messag
1457           fnd_msg_pub.ADD;
1458           RAISE fnd_api.g_exc_error;
1459         END IF;
1460       END IF;
1461     EXCEPTION
1462        WHEN fnd_api.g_exc_error THEN
1463           RAISE fnd_api.g_exc_error;
1464        WHEN NO_DATA_FOUND THEN
1465           l_lot_exists := 0;
1466           fnd_message.set_name('INV','INV_INVALID_LOT'); --error messag
1467           fnd_msg_pub.ADD;
1468           RAISE fnd_api.g_exc_error;
1469        WHEN OTHERS THEN
1470           IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_unexp_error) THEN
1471              fnd_msg_pub.add_exc_msg('INV_SERIAL_NUMBER_PUB', 'insert_range_serial');
1472           END IF;
1473           RAISE fnd_api.g_exc_unexpected_error;
1474      END;
1475     --bug10074682,validate the from serial number and to serial number available.
1476     --Block for from serial number and to serial number validation,it should be varchar.
1477      IF nvl(p_fm_serial_number,'!@') = '!@' OR nvl(p_to_serial_number,'!@') = '!@' THEN
1478        fnd_message.set_name('INV','INVALID_SERIAL_NUMBER'); --error messag
1479        fnd_msg_pub.ADD;
1480        RAISE fnd_api.g_exc_error;
1481      END IF;
1482      -- get the number part of the from serial
1483     inv_validate.number_from_sequence(p_fm_serial_number, l_temp_prefix, l_from_ser_number);
1484     -- get the number part of the to serial
1485     inv_validate.number_from_sequence(p_to_serial_number, l_temp_prefix, l_to_ser_number);
1486     -- total number of serials inserted into mtl_serial_numbers
1487     l_range_numbers  := l_to_ser_number - l_from_ser_number + 1;
1488     --bug10074682,from serial number and to serial number shoule be in sequence.
1489     IF l_range_numbers < 1 THEN --the range numbers with no sense,need enter the validate range nubmers
1490        fnd_message.set_name('INV','INVALID_SERIAL_NUMBER'); --error messag
1491        fnd_msg_pub.ADD;
1492        RAISE fnd_api.g_exc_error;
1493     END IF;
1494     FOR i IN 1 .. l_range_numbers LOOP
1495       l_cur_ser_number  := l_from_ser_number + i - 1;
1496       -- concatenate the serial number to be inserted
1497       IF (l_from_ser_number = -1
1498           AND l_to_ser_number = -1) THEN
1499         l_cur_serial_number  := p_fm_serial_number;
1500       ELSE
1501         l_cur_serial_number  := SUBSTR(p_fm_serial_number, 1, LENGTH(p_fm_serial_number) - LENGTH(l_cur_ser_number))
1502                                 || l_cur_ser_number;
1503       END IF;
1504       l_userid         := fnd_global.user_id;
1505       l_loginid        := fnd_global.login_id;
1506       isunique         := is_serial_unique(p_organization_id, p_inventory_item_id, l_cur_serial_number, x_msg_data);
1507       IF (isunique = 0) THEN
1508        SELECT mtl_gen_object_id_s.NEXTVAL
1509          INTO x_object_id
1510          FROM DUAL;
1511 
1512        INSERT INTO mtl_serial_numbers
1513          (
1514           inventory_item_id
1515           , serial_number
1516           , last_update_date
1517           , last_updated_by
1518           , creation_date
1519           , created_by
1520           , last_update_login
1521           , current_status
1522           , current_organization_id
1523           , status_id
1524           , group_mark_id
1525           , gen_object_id
1526           , lot_number
1527           , initialization_date
1528           , organization_type
1529           , owning_organization_id
1530           , owning_tp_type
1531           , planning_organization_id
1532           , planning_tp_type
1533           )
1534          VALUES (
1535                  p_inventory_item_id
1536                  , l_cur_serial_number
1537                  , SYSDATE
1538                  , l_userid
1539                  , SYSDATE
1540                  , l_userid
1541                  , l_loginid
1542                  , l_current_status
1543                  , p_organization_id
1544                  , p_status_id
1545                  , p_group_mark_id
1546                  , x_object_id
1547                  , p_lot_number
1548                  , p_initialization_date
1549                  , NVL(p_organization_type, 2)
1550                  , NVL(p_owning_org_id, p_organization_id)
1551                  , NVL(p_owning_tp_type, 2)
1552                  , NVL(p_planning_org_id, p_organization_id)
1553                  , NVL(p_planning_tp_type, 2)
1554                   );
1555       END IF;
1556     END LOOP;
1557 
1558     x_return_status  := fnd_api.g_ret_sts_success;
1559     -- End of API body.
1560     -- Standard check of p_commit.
1561     IF fnd_api.to_boolean(p_commit) THEN
1562       COMMIT WORK;
1563     END IF;
1564     -- Standard call to get message count and if count is 1, get message info.
1565     fnd_msg_pub.count_and_get(p_encoded => fnd_api.g_false, p_count => x_msg_count, p_data => x_msg_data);
1566   EXCEPTION
1567     WHEN fnd_api.g_exc_error THEN
1568       ROLLBACK TO apiinsertserial_apipub;
1569       --Bug 3153585:Populating x_msg_data from message stack
1570       fnd_msg_pub.count_and_get(p_encoded => fnd_api.g_false, p_count => x_msg_count, p_data => x_msg_data);
1571       x_return_status  := fnd_api.g_ret_sts_error;
1572     WHEN OTHERS THEN
1573       ROLLBACK TO apiinsertserial_apipub;
1574 
1575       IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_unexp_error) THEN
1576         fnd_msg_pub.add_exc_msg('INV_SERIAL_NUMBER_PUB', 'insert_range_serial');
1577       END IF;
1578 
1579       --Bug 3153585:Populating x_msg_data from message stack
1580       fnd_msg_pub.count_and_get(p_encoded => fnd_api.g_false, p_count => x_msg_count, p_data => x_msg_data);
1581       x_return_status  := fnd_api.g_ret_sts_unexp_error;
1582 
1583   END insert_range_serial;
1584 
1585   PROCEDURE insert_range_serial(
1586     p_api_version           IN            NUMBER
1587   , p_init_msg_list         IN            VARCHAR2 := fnd_api.g_false
1588   , p_commit                IN            VARCHAR2 := fnd_api.g_false
1589   , p_validation_level      IN            NUMBER := fnd_api.g_valid_level_full
1590   , p_inventory_item_id     IN            NUMBER
1591   , p_organization_id       IN            NUMBER
1592   , p_from_serial_number    IN            VARCHAR2
1593   , p_to_serial_number      IN            VARCHAR2
1594   , p_initialization_date   IN            DATE
1595   , p_completion_date       IN            DATE
1596   , p_ship_date             IN            DATE
1597   , p_revision              IN            VARCHAR2
1598   , p_lot_number            IN            VARCHAR2
1599   , p_current_locator_id    IN            NUMBER
1600   , p_subinventory_code     IN            VARCHAR2
1601   , p_trx_src_id            IN            NUMBER
1602   , p_unit_vendor_id        IN            NUMBER
1603   , p_vendor_lot_number     IN            VARCHAR2
1604   , p_vendor_serial_number  IN            VARCHAR2
1605   , p_receipt_issue_type    IN            NUMBER
1606   , p_txn_src_id            IN            NUMBER
1607   , p_txn_src_name          IN            VARCHAR2
1608   , p_txn_src_type_id       IN            NUMBER
1609   , p_transaction_id        IN            NUMBER
1610   , p_current_status        IN            NUMBER
1611   , p_parent_item_id        IN            NUMBER
1612   , p_parent_serial_number  IN            VARCHAR2
1613   , p_cost_group_id         IN            NUMBER
1614   , p_transaction_action_id IN            NUMBER
1615   , p_transaction_temp_id   IN            NUMBER
1616   , p_status_id             IN            NUMBER
1617   , p_inspection_status     IN            NUMBER
1618   , x_object_id             OUT NOCOPY    NUMBER
1619   , x_return_status         OUT NOCOPY    VARCHAR2
1620   , x_msg_count             OUT NOCOPY    NUMBER
1621   , x_msg_data              OUT NOCOPY    VARCHAR2
1622   , p_organization_type     IN            NUMBER DEFAULT NULL
1623   , p_owning_org_id         IN            NUMBER DEFAULT NULL
1624   , p_owning_tp_type        IN            NUMBER DEFAULT NULL
1625   , p_planning_org_id       IN            NUMBER DEFAULT NULL
1626   , p_planning_tp_type      IN            NUMBER DEFAULT NULL
1627   , p_rcv_serial_flag       IN            VARCHAR2 DEFAULT NULL
1628   ) IS
1629     l_from_ser_number      NUMBER;
1630     l_to_ser_number        NUMBER;
1631     l_range_numbers        NUMBER;
1632     l_temp_prefix          VARCHAR2(30);
1633     l_cur_serial_number    VARCHAR2(30);
1634     l_cur_ser_number       NUMBER;
1635     l_object_id            NUMBER;
1636     l_return_status        VARCHAR2(1)    := fnd_api.g_ret_sts_success;
1637     l_msg_count            NUMBER;
1638     l_msg_data             VARCHAR2(2000);
1639     l_current_status       NUMBER;
1640     l_group_mark_id        NUMBER;
1641     l_api_version CONSTANT NUMBER         := 1.0;
1642     l_api_name    CONSTANT VARCHAR2(30)   := 'insert_range_serial';
1643     l_debug                NUMBER         := NVL(fnd_profile.VALUE('INV_DEBUG_TRACE'), 0);
1644 	l_previous_status      NUMBER; -- 13564609
1645   BEGIN
1646     -- invtrace('INV_SERIAL_NUMBER_PUB', 'insert_range_serial - 10');
1647     SAVEPOINT sp_insert_range_serial;
1648 
1649     -- Standard call to check for call compatibility.
1650     IF NOT fnd_api.compatible_api_call(l_api_version, p_api_version, l_api_name, g_pkg_name) THEN
1651       RAISE fnd_api.g_exc_unexpected_error;
1652     END IF;
1653 
1654     -- Initialize message list if p_init_msg_list is set to TRUE.
1655     IF fnd_api.to_boolean(p_init_msg_list) THEN
1656       fnd_msg_pub.initialize;
1657     END IF;
1658 
1659     --  Initialize API return status to success
1660     x_return_status  := fnd_api.g_ret_sts_success;
1661     -- get the number part of the from serial
1662     inv_validate.number_from_sequence(p_from_serial_number, l_temp_prefix, l_from_ser_number);
1663     -- get the number part of the to serial
1664     inv_validate.number_from_sequence(p_to_serial_number, l_temp_prefix, l_to_ser_number);
1665     -- total number of serials inserted into mtl_serial_numbers
1666     l_range_numbers  := l_to_ser_number - l_from_ser_number + 1;
1667 
1668     FOR i IN 1 .. l_range_numbers LOOP
1669       l_cur_ser_number  := l_from_ser_number + i - 1;
1670 
1671       -- concatenate the serial number to be inserted
1672       IF (l_from_ser_number = -1
1673           AND l_to_ser_number = -1) THEN
1674         l_cur_serial_number  := p_from_serial_number;
1675       ELSE
1676         l_cur_serial_number  := SUBSTR(p_from_serial_number, 1, LENGTH(p_from_serial_number) - LENGTH(l_cur_ser_number))
1677                                 || l_cur_ser_number;
1678       END IF;
1679 
1680       -- check the status code and group_mark_id
1681       BEGIN
1682         SELECT current_status, previous_status  -- 13564609
1683              , NVL(group_mark_id, -1)
1684           INTO l_current_status, l_previous_status  -- 13564609
1685              , l_group_mark_id
1686           FROM mtl_serial_numbers
1687          WHERE serial_number = l_cur_serial_number
1688            AND inventory_item_id = p_inventory_item_id;
1689       EXCEPTION
1690         WHEN NO_DATA_FOUND THEN
1691           l_current_status  := -1;
1692           l_group_mark_id   := -2;
1693         WHEN OTHERS THEN
1694           NULL;
1695       END;
1696 
1697       --invtrace('INV_SERIAL_NUMBER_PUB', '  l_cur_serial_number, l_current_status AND l_group_mark_id  ' || l_cur_serial_number || ' ' || l_current_status
1698       -- || '   :   ' || l_group_mark_id);
1699 
1700       /* Bug #1767236
1701        * When the status is 4 (out of stores) then update the status do not insert
1702        */
1703       IF (l_current_status = 1
1704           AND l_group_mark_id = -1)
1705          OR(l_current_status = 4
1706             AND l_group_mark_id = -1)
1707          OR(l_current_status = 6
1708             AND l_group_mark_id = -1) THEN
1709 
1710         -- Bug 5385315, Update the current_organization_id to p_organization_id
1711         -- in mtl_serial_numbers while updating the current_status from 4 to 1.
1712 
1713         IF (p_current_status = 1 AND l_current_status = 4) THEN
1714            -- pre-defined serial, update status
1715            UPDATE mtl_serial_numbers
1716              SET current_status = p_current_status
1717                , inspection_status = p_inspection_status
1718                , lpn_id = null --bug 5152103
1719                , current_organization_id = p_organization_id
1720 			   , last_updated_by = fnd_global.user_id   -- 13564609
1721 			   , last_update_date = sysdate   -- 13564609
1722 			   , previous_status = l_current_status -- 13564609
1723            WHERE serial_number = l_cur_serial_number
1724              AND inventory_item_id = p_inventory_item_id;
1725         ELSE
1726           -- pre-defined serial, update status
1727           UPDATE mtl_serial_numbers
1728              SET current_status = p_current_status
1729                , inspection_status = p_inspection_status
1730 --             , lpn_id = decode(p_current_status,1,decode(current_status,4,null,lpn_id),lpn_id) --bug 5152103
1731 				, last_updated_by = fnd_global.user_id   -- 13564609
1732 			   , last_update_date = sysdate   -- 13564609
1733 			   , previous_status = l_current_status -- 13564609
1734            WHERE serial_number = l_cur_serial_number
1735              AND inventory_item_id = p_inventory_item_id;
1736         END IF;
1737       /* FP-J Lot/Serial Support Enhancement - Check for serial uniqueness
1738        * when the current status is Resides in receiving(7) also
1739        */
1740       ELSIF (l_current_status <> 5)
1741             OR(l_current_status = 5
1742                AND l_group_mark_id > 0)
1743             OR(l_current_status = 7
1744                AND l_group_mark_id > 0) THEN
1745         -- Need to do uniqueness check here.
1746         -- If any serial is in use, then discard the entire range insertion.
1747         IF is_serial_unique(p_org_id      => p_organization_id, p_item_id => p_inventory_item_id, p_serial => l_cur_serial_number
1748            , x_proc_msg                   => l_msg_data) = 1 THEN
1749           fnd_message.set_name('INV', 'INV_SERIAL_USED');
1750           fnd_msg_pub.ADD;
1751           RAISE fnd_api.g_exc_error;
1752         ELSE
1753           -- invtrace('INV_SERIAL_NUMBER_PUB', 'insert_range_serial - 60');
1754           -- uniqueness check passed
1755           -- and it is not a pre-defined serial
1756           inv_serial_number_pub.insertserial(
1757             p_api_version                => p_api_version
1758           , p_init_msg_list              => p_init_msg_list
1759           , p_commit                     => p_commit
1760           , p_validation_level           => p_validation_level
1761           , p_inventory_item_id          => p_inventory_item_id
1762           , p_organization_id            => p_organization_id
1763           , p_serial_number              => l_cur_serial_number
1764           , p_initialization_date        => p_initialization_date
1765           , p_completion_date            => p_completion_date
1766           , p_ship_date                  => p_ship_date
1767           , p_revision                   => p_revision
1768           , p_lot_number                 => p_lot_number
1769           , p_current_locator_id         => p_current_locator_id
1770           , p_subinventory_code          => p_subinventory_code
1771           , p_trx_src_id                 => p_trx_src_id
1772           , p_unit_vendor_id             => p_unit_vendor_id
1773           , p_vendor_lot_number          => p_vendor_lot_number
1774           , p_vendor_serial_number       => p_vendor_serial_number
1775           , p_receipt_issue_type         => p_receipt_issue_type
1776           , p_txn_src_id                 => p_txn_src_id
1777           , p_txn_src_name               => p_txn_src_name
1778           , p_txn_src_type_id            => p_txn_src_type_id
1779           , p_transaction_id             => p_transaction_id
1780           , p_current_status             => p_current_status
1781           , p_parent_item_id             => p_parent_item_id
1782           , p_parent_serial_number       => p_parent_serial_number
1783           , p_cost_group_id              => p_cost_group_id
1784           , p_transaction_action_id      => p_transaction_action_id
1785           , p_transaction_temp_id        => p_transaction_temp_id
1786           , p_status_id                  => p_status_id
1787           , x_object_id                  => l_object_id
1788           , x_return_status              => l_return_status
1789           , x_msg_count                  => l_msg_count
1790           , x_msg_data                   => l_msg_data
1791           , p_organization_type          => p_organization_type
1792           , p_owning_org_id              => p_owning_org_id
1793           , p_owning_tp_type             => p_owning_tp_type
1794           , p_planning_org_id            => p_planning_org_id
1795           , p_planning_tp_type           => p_planning_tp_type
1796           );
1797 
1798           IF (l_return_status <> fnd_api.g_ret_sts_success) THEN
1799             fnd_message.set_name('INV', 'INV_SERIAL');
1800             fnd_msg_pub.ADD;
1801             RAISE fnd_api.g_exc_unexpected_error;
1802           END IF;
1803         END IF;
1804       END IF;
1805 
1806       /* FP-J Lot/Serial Support Enhancement
1807        * If INV J and PO J are installed and this API is called from
1808        * the Mobile receiving UI, then we should only attach the revision and
1809        * lot number to the serial if it was newly created above (in which case
1810        * the current status of the serial would be defined but not used)
1811        * We should not be updating any other columns for the serial number
1812        * For this case, the flag p_rcv_serial_flag would have the value 'Y'
1813        *
1814        * If WMS or PO J are not installed or this API is called from other
1815        * routines, then updates to the serial number are retained
1816        */
1817       IF (NVL(p_rcv_serial_flag, 'N') <> 'Y') THEN
1818         UPDATE mtl_serial_numbers
1819            SET inspection_status = p_inspection_status
1820              , lot_number = p_lot_number
1821              , revision = p_revision
1822              , current_organization_id = p_organization_id
1823              , organization_type = NVL(p_organization_type, 2)
1824              , owning_organization_id = NVL(p_owning_org_id, p_organization_id)
1825              , owning_tp_type = NVL(p_owning_tp_type, 2)
1826              , planning_organization_id = NVL(p_planning_org_id, p_organization_id)
1827              , planning_tp_type = NVL(p_planning_tp_type, 2)
1828          WHERE serial_number = l_cur_serial_number
1829            AND inventory_item_id = p_inventory_item_id;
1830       ELSE
1831         UPDATE mtl_serial_numbers
1832            SET lot_number = p_lot_number
1833              , revision = p_revision
1834          WHERE serial_number = l_cur_serial_number
1835            AND inventory_item_id = p_inventory_item_id
1836            AND current_status IN(1, 4, 5, 6);
1837       END IF;
1838     END LOOP;
1839 
1840     x_return_status  := fnd_api.g_ret_sts_success;
1841 
1842     -- End of API body
1843     -- Standard check of p_commit.
1844     IF fnd_api.to_boolean(p_commit) THEN
1845       COMMIT WORK;
1846     END IF;
1847 
1848     -- Standard call to get message count and if count is 1,
1849     -- get message info.
1850     fnd_msg_pub.count_and_get(p_count => x_msg_count, p_data => x_msg_data);
1851   EXCEPTION
1852     WHEN fnd_api.g_exc_error THEN
1853       ROLLBACK TO sp_insert_range_serial;
1854       x_return_status  := fnd_api.g_ret_sts_error;
1855       fnd_msg_pub.count_and_get(p_count => x_msg_count, p_data => x_msg_data);
1856     WHEN fnd_api.g_exc_unexpected_error THEN
1857       ROLLBACK TO sp_insert_range_serial;
1858       x_return_status  := fnd_api.g_ret_sts_unexp_error;
1859       fnd_msg_pub.count_and_get(p_count => x_msg_count, p_data => x_msg_data);
1860     WHEN OTHERS THEN
1861       ROLLBACK TO sp_insert_range_serial;
1862       x_return_status  := fnd_api.g_ret_sts_unexp_error;
1863       fnd_msg_pub.count_and_get(p_count => x_msg_count, p_data => x_msg_data);
1864   END insert_range_serial;
1865 
1866   PROCEDURE updateserial(
1867     p_api_version              IN            NUMBER
1868   , p_init_msg_list            IN            VARCHAR2 := fnd_api.g_false
1869   , p_commit                   IN            VARCHAR2 := fnd_api.g_false
1870   , p_validation_level         IN            NUMBER := fnd_api.g_valid_level_full
1871   , p_inventory_item_id        IN            NUMBER
1872   , p_organization_id          IN            NUMBER
1873   , p_serial_number            IN            VARCHAR2
1874   , p_initialization_date      IN            DATE
1875   , p_completion_date          IN            DATE
1876   , p_ship_date                IN            DATE
1877   , p_revision                 IN            VARCHAR2
1878   , p_lot_number               IN            VARCHAR2
1879   , p_current_locator_id       IN            NUMBER
1880   , p_subinventory_code        IN            VARCHAR2
1881   , p_trx_src_id               IN            NUMBER
1882   , p_unit_vendor_id           IN            NUMBER
1883   , p_vendor_lot_number        IN            VARCHAR2
1884   , p_vendor_serial_number     IN            VARCHAR2
1885   , p_receipt_issue_type       IN            NUMBER
1886   , p_txn_src_id               IN            NUMBER
1887   , p_txn_src_name             IN            VARCHAR2
1888   , p_txn_src_type_id          IN            NUMBER
1889   , p_current_status           IN            NUMBER
1890   , p_parent_item_id           IN            NUMBER
1891   , p_parent_serial_number     IN            VARCHAR2
1892   , p_serial_temp_id           IN            NUMBER
1893   , p_last_status              IN            NUMBER
1894   , p_status_id                IN            NUMBER
1895   , x_object_id                OUT NOCOPY    NUMBER
1896   , x_return_status            OUT NOCOPY    VARCHAR2
1897   , x_msg_count                OUT NOCOPY    NUMBER
1898   , x_msg_data                 OUT NOCOPY    VARCHAR2
1899   , p_organization_type        IN            NUMBER DEFAULT NULL
1900   , p_owning_org_id            IN            NUMBER DEFAULT NULL
1901   , p_owning_tp_type           IN            NUMBER DEFAULT NULL
1902   , p_planning_org_id          IN            NUMBER DEFAULT NULL
1903   , p_planning_tp_type         IN            NUMBER DEFAULT NULL
1904   , p_transaction_action_id    IN            NUMBER DEFAULT NULL
1905   , p_wip_entity_id            IN            NUMBER DEFAULT NULL
1906   , p_operation_seq_num        IN            NUMBER DEFAULT NULL
1907   , p_intraoperation_step_type IN            NUMBER DEFAULT NULL
1908   , p_line_mark_id             IN            NUMBER DEFAULT NULL
1909   ) IS
1910     l_api_version      CONSTANT NUMBER         := 1.0;
1911     l_api_name         CONSTANT VARCHAR2(30)   := 'updateSerial';
1912     l_userid                    NUMBER;
1913     l_loginid                   NUMBER;
1914     l_serial_attribute_category VARCHAR2(150);
1915     l_origination_date          DATE;
1916     l_c_attribute1              VARCHAR2(150);
1917     l_c_attribute2              VARCHAR2(150);
1918     l_c_attribute3              VARCHAR2(150);
1919     l_c_attribute4              VARCHAR2(150);
1920     l_c_attribute5              VARCHAR2(150);
1921     l_c_attribute6              VARCHAR2(150);
1922     l_c_attribute7              VARCHAR2(150);
1923     l_c_attribute8              VARCHAR2(150);
1924     l_c_attribute9              VARCHAR2(150);
1925     l_c_attribute10             VARCHAR2(150);
1926     l_c_attribute11             VARCHAR2(150);
1927     l_c_attribute12             VARCHAR2(150);
1928     l_c_attribute13             VARCHAR2(150);
1929     l_c_attribute14             VARCHAR2(150);
1930     l_c_attribute15             VARCHAR2(150);
1931     l_c_attribute16             VARCHAR2(150);
1932     l_c_attribute17             VARCHAR2(150);
1933     l_c_attribute18             VARCHAR2(150);
1934     l_c_attribute19             VARCHAR2(150);
1935     l_c_attribute20             VARCHAR2(150);
1936     l_d_attribute1              DATE;
1937     l_d_attribute2              DATE;
1938     l_d_attribute3              DATE;
1939     l_d_attribute4              DATE;
1940     l_d_attribute5              DATE;
1941     l_d_attribute6              DATE;
1942     l_d_attribute7              DATE;
1943     l_d_attribute8              DATE;
1944     l_d_attribute9              DATE;
1945     l_d_attribute10             DATE;
1946     l_n_attribute1              NUMBER;
1947     l_n_attribute2              NUMBER;
1948     l_n_attribute3              NUMBER;
1949     l_n_attribute4              NUMBER;
1950     l_n_attribute5              NUMBER;
1951     l_n_attribute6              NUMBER;
1952     l_n_attribute7              NUMBER;
1953     l_n_attribute8              NUMBER;
1954     l_n_attribute9              NUMBER;
1955     l_n_attribute10             NUMBER;
1956     l_territory_code            VARCHAR2(150);
1957     l_wms_installed             BOOLEAN;
1958     l_return_status             VARCHAR2(1);
1959     l_msg_data                  VARCHAR2(2000);
1960     l_msg_count                 NUMBER;
1961     l_group_mark_id             NUMBER;
1962 
1963     CURSOR l_serial_attr_csr(p_serial_temp_id NUMBER) IS
1964       SELECT serial_attribute_category
1965            , origination_date
1966            , c_attribute1
1967            , c_attribute2
1968            , c_attribute3
1969            , c_attribute4
1970            , c_attribute5
1971            , c_attribute6
1972            , c_attribute7
1973            , c_attribute8
1974            , c_attribute9
1975            , c_attribute10
1976            , c_attribute11
1977            , c_attribute12
1978            , c_attribute13
1979            , c_attribute14
1980            , c_attribute15
1981            , c_attribute16
1982            , c_attribute17
1983            , c_attribute18
1984            , c_attribute19
1985            , c_attribute20
1986            , d_attribute1
1987            , d_attribute2
1988            , d_attribute3
1989            , d_attribute4
1990            , d_attribute5
1991            , d_attribute6
1992            , d_attribute7
1993            , d_attribute8
1994            , d_attribute9
1995            , d_attribute10
1996            , n_attribute1
1997            , n_attribute2
1998            , n_attribute3
1999            , n_attribute4
2000            , n_attribute5
2001            , n_attribute6
2002            , n_attribute7
2003            , n_attribute8
2004            , n_attribute9
2005            , n_attribute10
2006            , territory_code
2007         FROM mtl_serial_numbers_temp
2008        WHERE transaction_temp_id = p_serial_temp_id
2009          AND p_serial_number BETWEEN fm_serial_number AND NVL(to_serial_number, fm_serial_number);
2010 
2011     l_debug                     NUMBER         := NVL(fnd_profile.VALUE('INV_DEBUG_TRACE'), 0);
2012   BEGIN
2013     -- Standard Start of API savepoint
2014     SAVEPOINT apiupdateserial_apipub;
2015 
2016     IF (l_debug = 1) THEN
2017        invtrace('*** Inside UpdateSerial ****');
2018     END IF;
2019 
2020     -- Standard call to check for call compatibility.
2021     IF NOT fnd_api.compatible_api_call(l_api_version, p_api_version, l_api_name, g_pkg_name) THEN
2022       RAISE fnd_api.g_exc_unexpected_error;
2023     END IF;
2024 
2025     -- Initialize message list if p_init_msg_list is set to TRUE.
2026     IF fnd_api.to_boolean(p_init_msg_list) THEN
2027       fnd_msg_pub.initialize;
2028     END IF;
2029 
2030     --  Initialize API return status to success
2031     x_return_status  := fnd_api.g_ret_sts_success;
2032     -- API body
2033 
2034     IF (l_debug = 1) THEN
2035        invtrace('CurStat =' || p_current_status || ',CG=' ||
2036                 inv_cost_group_pub.g_cost_group_id || ',lastStat=' ||
2037                 p_last_status || 'p_wip_entity_id = ' || p_wip_entity_id ||
2038                 'SerialNumber = ' || p_serial_number);
2039     END IF;
2040     l_userid         := fnd_global.user_id;
2041     l_loginid        := fnd_global.login_id;
2042 
2043     -- Get serial-attributes only if the last-state of serialNumber
2044     -- is 'Defined But Not Used' (1) or 'Dynamically generated' (6)
2045     IF p_wip_entity_id IS NOT NULL THEN
2046       l_group_mark_id  := p_wip_entity_id;
2047     ELSE
2048       l_group_mark_id  := NULL;
2049     END IF;
2050 
2051     IF (p_last_status = 1)
2052        OR(p_last_status = 6) THEN
2053       l_wms_installed  :=
2054         wms_install.check_install(x_return_status => l_return_status, x_msg_count => l_msg_count, x_msg_data => l_msg_data
2055         , p_organization_id            => p_organization_id);
2056 
2057       IF (l_wms_installed AND p_serial_temp_id IS NOT NULL) THEN
2058         -- invtrace('wms is installed... opening l_serial_attr_csr with serial_temp_id as '|| p_serial_temp_id);
2059         OPEN l_serial_attr_csr(p_serial_temp_id);
2060 
2061         FETCH l_serial_attr_csr
2062          INTO l_serial_attribute_category
2063             , l_origination_date
2064             , l_c_attribute1
2065             , l_c_attribute2
2066             , l_c_attribute3
2067             , l_c_attribute4
2068             , l_c_attribute5
2069             , l_c_attribute6
2070             , l_c_attribute7
2071             , l_c_attribute8
2072             , l_c_attribute9
2073             , l_c_attribute10
2074             , l_c_attribute11
2075             , l_c_attribute12
2076             , l_c_attribute13
2077             , l_c_attribute14
2078             , l_c_attribute15
2079             , l_c_attribute16
2080             , l_c_attribute17
2081             , l_c_attribute18
2082             , l_c_attribute19
2083             , l_c_attribute20
2084             , l_d_attribute1
2085             , l_d_attribute2
2086             , l_d_attribute3
2087             , l_d_attribute4
2088             , l_d_attribute5
2089             , l_d_attribute6
2090             , l_d_attribute7
2091             , l_d_attribute8
2092             , l_d_attribute9
2093             , l_d_attribute10
2094             , l_n_attribute1
2095             , l_n_attribute2
2096             , l_n_attribute3
2097             , l_n_attribute4
2098             , l_n_attribute5
2099             , l_n_attribute6
2100             , l_n_attribute7
2101             , l_n_attribute8
2102             , l_n_attribute9
2103             , l_n_attribute10
2104             , l_territory_code;
2105       --END IF;
2106 
2107       -- invtrace('updating MSN with values ');
2108       -- invtrace('current_status '|| p_current_status);
2109            -- invtrace('initialization_date '|| initialization_date);
2110            -- invtrace('completion_date '|| p_completion_date);
2111            -- invtrace('ship_date '|| p_ship_date);
2112            -- invtrace('revision '|| p_revision);
2113            -- invtrace('lot_number '|| p_lot_number);
2114            -- do not update group mark id for staging transfer vipartha
2115            -- invtrace('group_mark_id '|| DECODE(p_transaction_action_id, 28, group_mark_id, NULL));
2116            -- invtrace('line_mark_id '|| NULL);
2117            -- invtrace('lot_line_mark_id '|| NULL);
2118            -- invtrace('current_organization_id '|| p_organization_id);
2119            -- invtrace('organization_type '|| NVL(p_organization_type, 2));
2120            -- invtrace('owning_organization_id '|| NVL(p_owning_org_id, p_organization_id));
2121            -- invtrace('owning_tp_type '|| NVL(p_owning_tp_type, 2));
2122            -- invtrace('planning_organization_id '|| NVL(p_planning_org_id, p_organization_id));
2123            -- invtrace('planning_tp_type '|| NVL(p_planning_tp_type, 2));
2124            -- invtrace('current_locator_id '|| p_current_locator_id);
2125            -- invtrace('current_subinventory_code ' || p_subinventory_code);
2126            -- invtrace('original_wip_entity_id ' || p_trx_src_id);
2127            -- invtrace('original_unit_vendor_id ' || p_unit_vendor_id);
2128            -- invtrace('vendor_lot_number ' || p_vendor_lot_number);
2129            -- invtrace('vendor_serial_number ' || p_vendor_serial_number);
2130            -- invtrace('last_receipt_issue_type ' || p_receipt_issue_type);
2131            -- invtrace('last_txn_source_id ' || p_txn_src_id);
2132            -- invtrace('last_txn_source_type_id ' || p_txn_src_type_id);
2133            -- invtrace('last_txn_source_name ' || p_txn_src_name);
2134            -- invtrace('last_update_date ' || SYSDATE);
2135            -- invtrace('last_updated_by ' || l_userid);
2136            -- invtrace('parent_item_id ' || p_parent_item_id);
2137            -- invtrace('parent_serial_number ' || p_parent_serial_number);
2138            -- invtrace('origination_date ' || l_origination_date);
2139            -- invtrace('c_attribute1 ' || l_c_attribute1);
2140            -- invtrace('c_attribute2 ' || l_c_attribute2);
2141            -- invtrace('c_attribute3 ' || l_c_attribute3);
2142            -- invtrace('c_attribute4 ' || l_c_attribute4);
2143            -- invtrace('c_attribute5 ' || l_c_attribute5);
2144            -- invtrace('c_attribute6 ' || l_c_attribute6);
2145            -- invtrace('c_attribute7 ' || l_c_attribute7);
2146            -- invtrace('c_attribute8 ' || l_c_attribute8);
2147            -- invtrace('c_attribute9 ' || l_c_attribute9);
2148            -- invtrace('c_attribute10 ' || l_c_attribute10);
2149            -- invtrace('c_attribute11 ' || l_c_attribute11);
2150            -- invtrace('c_attribute12 ' || l_c_attribute12);
2151            -- invtrace('c_attribute13 ' || l_c_attribute13);
2152            -- invtrace('c_attribute14 ' || l_c_attribute14);
2153            -- invtrace('c_attribute15 ' || l_c_attribute15);
2154            -- invtrace('c_attribute16 ' || l_c_attribute16);
2155            -- invtrace('c_attribute17 ' || l_c_attribute17);
2156            -- invtrace('c_attribute18 ' || l_c_attribute18);
2157            -- invtrace('c_attribute19 ' || l_c_attribute19);
2158            -- invtrace('c_attribute20 ' || l_c_attribute20);
2159            -- invtrace('d_attribute1 ' || l_d_attribute1);
2160            -- invtrace('d_attribute2 ' || l_d_attribute2);
2161            -- invtrace('d_attribute3 ' || l_d_attribute3);
2162            -- invtrace('d_attribute4 ' || l_d_attribute4);
2163            -- invtrace('d_attribute5 ' || l_d_attribute5);
2164            -- invtrace('d_attribute6 ' || l_d_attribute6);
2165            -- invtrace('d_attribute7 ' || l_d_attribute7);
2166            -- invtrace('d_attribute8 ' || l_d_attribute8);
2167            -- invtrace('d_attribute9 ' || l_d_attribute9);
2168            -- invtrace('d_attribute10 ' || l_d_attribute10);
2169            -- invtrace('n_attribute1 ' || l_n_attribute1);
2170            -- invtrace('n_attribute2 ' || l_n_attribute2);
2171            -- invtrace('n_attribute3 ' || l_n_attribute3);
2172            -- invtrace('n_attribute4 ' || l_n_attribute4);
2173            -- invtrace('n_attribute5 ' || l_n_attribute5);
2174            -- invtrace('n_attribute6 ' || l_n_attribute6);
2175            -- invtrace('n_attribute7 ' || l_n_attribute7);
2176            -- invtrace('n_attribute8 ' || l_n_attribute8);
2177            -- invtrace('n_attribute9 ' || l_n_attribute9);
2178            -- invtrace('n_attribute10 ' || l_n_attribute10);
2179            -- invtrace('territory_code ' || l_territory_code);
2180            -- invtrace('cost_group_id ' || inv_cost_group_pub.g_cost_group_id);
2181 
2182       UPDATE mtl_serial_numbers
2183          SET current_status = decode(p_current_status, null,
2184                                         decode(p_wip_entity_id, null, current_status, decode(current_status, 6, 1, current_status)),
2185                                         decode(p_wip_entity_id, null, p_current_status,decode(p_current_status, 6, 1, p_current_status)) )
2186            , initialization_date = initialization_date
2187            , completion_date = p_completion_date
2188            , ship_date = p_ship_date
2189            , revision = p_revision
2190            , lot_number = p_lot_number
2191            ,   -- do not update group mark id for staging transfer vipartha
2192              -- group_mark_id = DECODE(p_transaction_action_id, 28, group_mark_id, NULL)
2193              group_mark_id = DECODE(p_transaction_action_id, 28, group_mark_id, l_group_mark_id)
2194            , line_mark_id = p_line_mark_id
2195            , lot_line_mark_id = NULL
2196            , current_organization_id = p_organization_id
2197            , organization_type = NVL(p_organization_type, 2)
2198            , owning_organization_id = NVL(p_owning_org_id, p_organization_id)
2199            , owning_tp_type = NVL(p_owning_tp_type, 2)
2200            , planning_organization_id = NVL(p_planning_org_id, p_organization_id)
2201            , planning_tp_type = NVL(p_planning_tp_type, 2)
2202            , current_locator_id = p_current_locator_id
2203            , current_subinventory_code = p_subinventory_code
2204            , original_wip_entity_id = p_trx_src_id
2205            , original_unit_vendor_id = p_unit_vendor_id
2206            , vendor_lot_number = p_vendor_lot_number
2207            , vendor_serial_number = p_vendor_serial_number
2208            , last_receipt_issue_type = p_receipt_issue_type
2209            , last_txn_source_id = p_txn_src_id
2210            , last_txn_source_type_id = p_txn_src_type_id
2211            , last_txn_source_name = p_txn_src_name
2212            , last_update_date = SYSDATE
2213            , last_updated_by = l_userid
2214            , parent_item_id = p_parent_item_id
2215            , parent_serial_number = p_parent_serial_number
2216            , origination_date = l_origination_date
2217            , c_attribute1 = l_c_attribute1
2218            , c_attribute2 = l_c_attribute2
2219            , c_attribute3 = l_c_attribute3
2220            , c_attribute4 = l_c_attribute4
2221            , c_attribute5 = l_c_attribute5
2222            , c_attribute6 = l_c_attribute6
2223            , c_attribute7 = l_c_attribute7
2224            , c_attribute8 = l_c_attribute8
2225            , c_attribute9 = l_c_attribute9
2226            , c_attribute10 = l_c_attribute10
2227            , c_attribute11 = l_c_attribute11
2228            , c_attribute12 = l_c_attribute12
2229            , c_attribute13 = l_c_attribute13
2230            , c_attribute14 = l_c_attribute14
2231            , c_attribute15 = l_c_attribute15
2232            , c_attribute16 = l_c_attribute16
2233            , c_attribute17 = l_c_attribute17
2234            , c_attribute18 = l_c_attribute18
2235            , c_attribute19 = l_c_attribute19
2236            , c_attribute20 = l_c_attribute20
2237            , d_attribute1 = l_d_attribute1
2238            , d_attribute2 = l_d_attribute2
2239            , d_attribute3 = l_d_attribute3
2240            , d_attribute4 = l_d_attribute4
2241            , d_attribute5 = l_d_attribute5
2242            , d_attribute6 = l_d_attribute6
2243            , d_attribute7 = l_d_attribute7
2244            , d_attribute8 = l_d_attribute8
2245            , d_attribute9 = l_d_attribute9
2246            , d_attribute10 = l_d_attribute10
2247            , n_attribute1 = l_n_attribute1
2248            , n_attribute2 = l_n_attribute2
2249            , n_attribute3 = l_n_attribute3
2250            , n_attribute4 = l_n_attribute4
2251            , n_attribute5 = l_n_attribute5
2252            , n_attribute6 = l_n_attribute6
2253            , n_attribute7 = l_n_attribute7
2254            , n_attribute8 = l_n_attribute8
2255            , n_attribute9 = l_n_attribute9
2256            , n_attribute10 = l_n_attribute10
2257            , territory_code = l_territory_code
2258            , cost_group_id = inv_cost_group_pub.g_cost_group_id
2259            , wip_entity_id = p_wip_entity_id
2260            , operation_seq_num = p_operation_seq_num
2261            , intraoperation_step_type = p_intraoperation_step_type
2262        WHERE inventory_item_id = p_inventory_item_id
2263          AND serial_number = p_serial_number
2264          AND DECODE(current_status, 6, 1, current_status) = DECODE(p_last_status, 6, 1, p_last_status);
2265      ELSE
2266          UPDATE mtl_serial_numbers
2267          SET current_status = decode(p_current_status, null,
2268                                 decode(p_wip_entity_id, null, current_status, decode(current_status, 6, 1, current_Status)),
2269                                 decode(p_wip_entity_id, null, p_current_status, decode(p_current_status, 6, 1, p_current_status)))
2270            , initialization_date = initialization_date
2271            , completion_date = p_completion_date
2272            , ship_date = p_ship_date
2273            , revision = p_revision
2274            , lot_number = p_lot_number
2275            ,   -- do not update group mark id for staging transfer vipartha
2276              --group_mark_id = DECODE(p_transaction_action_id, 28, group_mark_id, NULL)
2277              group_mark_id = DECODE(p_transaction_action_id, 28, group_mark_id, l_group_mark_id)
2278            , line_mark_id = p_line_mark_id
2279            , lot_line_mark_id = NULL
2280            , current_organization_id = p_organization_id
2281            , current_locator_id = p_current_locator_id
2282            , current_subinventory_code = p_subinventory_code
2283            , original_wip_entity_id = p_trx_src_id
2284            , original_unit_vendor_id = p_unit_vendor_id
2285            , vendor_lot_number = p_vendor_lot_number
2286            , vendor_serial_number = p_vendor_serial_number
2287            , last_receipt_issue_type = p_receipt_issue_type
2288            , last_txn_source_id = p_txn_src_id
2289            , last_txn_source_type_id = p_txn_src_type_id
2290            , last_txn_source_name = p_txn_src_name
2291            , last_update_date = SYSDATE
2292            , last_updated_by = l_userid
2293            , parent_item_id = p_parent_item_id
2294            , parent_serial_number = p_parent_serial_number
2295            , wip_entity_id = p_wip_entity_id
2296            , operation_seq_num = p_operation_seq_num
2297            , intraoperation_step_type = p_intraoperation_step_type
2298        WHERE inventory_item_id = p_inventory_item_id
2299          AND serial_number = p_serial_number
2300          AND DECODE(current_status, 6, 1, current_status) = DECODE(p_last_status, 6, 1, p_last_status);
2301      END IF;    -- !wms_installed OR p_serial_temp_id is NULL. --Bug4535887
2302     ELSE
2303       -- invtrace('last status is neither 1 nor 6');
2304       -- invtrace('updating MSN WITH values ');
2305       -- invtrace('current_status ' || p_current_status);
2306           -- invtrace(' initialization_date ' || initialization_date);
2307           -- invtrace(' completion_date ' || p_completion_date);
2308           -- invtrace(' ship_date ' || p_ship_date);
2309           -- invtrace(' revision ' || p_revision);
2310           -- invtrace(' lot_number ' || p_lot_number);
2311           -- do not update group mark id for staging transfer vipartha);
2312           -- invtrace('group_mark_id ' || DECODE(p_transaction_action_id,28,group_mark_id, NULL));
2313           -- invtrace(' line_mark_id is NULL');
2314           -- invtrace(' lot_line_mark_id IS NULL');
2315           -- invtrace(' current_organization_id ' || p_organization_id);
2316           -- invtrace(' current_locator_id ' || p_current_locator_id);
2317           -- invtrace(' current_subinventory_code ' || p_subinventory_code);
2318           -- invtrace(' original_wip_entity_id ' || p_trx_src_id);
2319           -- invtrace(' original_unit_vendor_id ' || p_unit_vendor_id);
2320           -- invtrace(' vendor_lot_number ' || p_vendor_lot_number);
2321           -- invtrace(' vendor_serial_number ' || p_vendor_serial_number);
2322           -- invtrace(' last_receipt_issue_type ' || p_receipt_issue_type);
2323           -- invtrace(' last_txn_source_id ' || p_txn_src_id);
2324           -- invtrace(' last_txn_source_type_id ' || p_txn_src_type_id);
2325           -- invtrace(' last_txn_source_name ' || p_txn_src_name);
2326           -- invtrace(' last_update_date ' || SYSDATE);
2327           -- invtrace(' last_updated_by ' || l_userid);
2328           -- invtrace(' parent_item_id ' || p_parent_item_id);
2329           -- invtrace(' parent_serial_number ' || p_parent_serial_number);
2330       UPDATE mtl_serial_numbers
2331          SET current_status = decode(p_current_status, null,
2332                                 decode(p_wip_entity_id, null, current_status, decode(current_status, 6, 1, current_Status)),
2333                                 decode(p_wip_entity_id, null, p_current_status, decode(p_current_status, 6, 1, p_current_status)))
2334            , initialization_date = initialization_date
2335            , completion_date = p_completion_date
2336            , ship_date = p_ship_date
2337            , revision = p_revision
2338            , lot_number = p_lot_number
2339            ,   -- do not update group mark id for staging transfer vipartha
2340              --group_mark_id = DECODE(p_transaction_action_id, 28, group_mark_id, NULL)
2341              group_mark_id = DECODE(p_transaction_action_id, 28, group_mark_id, l_group_mark_id)
2342            , line_mark_id = p_line_mark_id
2343            , lot_line_mark_id = NULL
2344            , current_organization_id = p_organization_id
2345            , current_locator_id = p_current_locator_id
2346            , current_subinventory_code = p_subinventory_code
2347            , original_wip_entity_id = p_trx_src_id
2348            , original_unit_vendor_id = p_unit_vendor_id
2349            , vendor_lot_number = p_vendor_lot_number
2350            , vendor_serial_number = p_vendor_serial_number
2351            , last_receipt_issue_type = p_receipt_issue_type
2352            , last_txn_source_id = p_txn_src_id
2353            , last_txn_source_type_id = p_txn_src_type_id
2354            , last_txn_source_name = p_txn_src_name
2355            , last_update_date = SYSDATE
2356            , last_updated_by = l_userid
2357            , parent_item_id = p_parent_item_id
2358            , parent_serial_number = p_parent_serial_number
2359            , wip_entity_id = p_wip_entity_id
2360            , operation_seq_num = p_operation_seq_num
2361            , intraoperation_step_type = p_intraoperation_step_type
2362        WHERE inventory_item_id = p_inventory_item_id
2363          AND serial_number = p_serial_number
2364          AND DECODE(current_status, 6, 1, current_status) = DECODE(p_last_status, 6, 1, p_last_status);
2365     END IF;
2366 
2367     x_return_status  := fnd_api.g_ret_sts_success;
2368 
2369     -- End of API body.
2370     -- Standard check of p_commit.
2371     IF fnd_api.to_boolean(p_commit) THEN
2372       COMMIT WORK;
2373     END IF;
2374 
2375     -- Standard call to get message count and if count is 1, get message info.
2376     fnd_msg_pub.count_and_get(p_encoded => fnd_api.g_false, p_count => x_msg_count, p_data => x_msg_data);
2377   EXCEPTION
2378     WHEN OTHERS THEN
2379       ROLLBACK TO apiupdateserial_apipub;
2380 
2381       IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_unexp_error) THEN
2382         fnd_msg_pub.add_exc_msg('INV_SERIAL_NUMBER_PUB', 'updateSerial');
2383       END IF;
2384 
2385       x_return_status  := fnd_api.g_ret_sts_unexp_error;
2386   END updateserial;
2387 
2388   PROCEDURE insertunittrx(
2389     p_api_version           IN            NUMBER
2390   , p_init_msg_list         IN            VARCHAR2 := fnd_api.g_false
2391   , p_commit                IN            VARCHAR2 := fnd_api.g_false
2392   , p_validation_level      IN            NUMBER := fnd_api.g_valid_level_full
2393   , p_inventory_item_id     IN            NUMBER
2394   , p_organization_id       IN            NUMBER
2395   , p_serial_number         IN            VARCHAR2
2396   , p_current_locator_id    IN            NUMBER
2397   , p_subinventory_code     IN            VARCHAR2
2398   , p_transaction_date      IN            DATE
2399   , p_txn_src_id            IN            NUMBER
2400   , p_txn_src_name          IN            VARCHAR2
2401   , p_txn_src_type_id       IN            NUMBER
2402   , p_transaction_id        IN            NUMBER
2403   , p_transaction_action_id IN            NUMBER
2404   , p_transaction_temp_id   IN            NUMBER
2405   , p_receipt_issue_type    IN            NUMBER
2406   , p_customer_id           IN            NUMBER
2407   , p_ship_id               IN            NUMBER
2408   , p_status_id             IN            NUMBER
2409   , x_return_status         OUT NOCOPY    VARCHAR2
2410   , x_msg_count             OUT NOCOPY    NUMBER
2411   , x_msg_data              OUT NOCOPY    VARCHAR2
2412   ) IS
2413     l_api_version     CONSTANT NUMBER                                       := 1.0;
2414     l_api_name        CONSTANT VARCHAR2(30)                                 := 'insertSerial';
2415     l_userid                   NUMBER;
2416     l_loginid                  NUMBER;
2417     l_serial_control_code      NUMBER;
2418     l_attributes_default       inv_lot_sel_attr.lot_sel_attributes_tbl_type;
2419     l_attributes_default_count NUMBER;
2420     l_attributes_in            inv_lot_sel_attr.lot_sel_attributes_tbl_type;
2421     l_column_idx               BINARY_INTEGER                               := 44;
2422     l_return_status            VARCHAR2(1);
2423     l_msg_data                 VARCHAR2(2000);
2424     l_msg_count                NUMBER;
2425     l_wms_installed            BOOLEAN;
2426 
2427      l_sys_date date := NULL;
2428      l_date2    date := NULL;
2429      l_date23   date := NULL;
2430      l_date24   date := NULL;
2431      l_date25   date := NULL;
2432      l_date26   date := NULL;
2433      l_date27   date := NULL;
2434      l_date28   date := NULL;
2435      l_date29   date := NULL;
2436      l_date30   date := NULL;
2437      l_date31   date := NULL;
2438      l_date32   date := NULL;
2439 
2440      l_num33    NUMBER := NULL;
2441      l_num34    NUMBER := NULL;
2442      l_num35    NUMBER := NULL;
2443      l_num36    NUMBER := NULL;
2444      l_num37    NUMBER := NULL;
2445      l_num38    NUMBER := NULL;
2446      l_num39    NUMBER := NULL;
2447      l_num40    NUMBER := NULL;
2448      l_num41    NUMBER := NULL;
2449      l_num42    NUMBER := NULL;
2450 
2451     CURSOR serial_temp_csr(p_transaction_temp_id NUMBER) IS
2452       SELECT serial_attribute_category
2453            , fnd_date.date_to_canonical(origination_date)
2454            , c_attribute1
2455            , c_attribute2
2456            , c_attribute3
2457            , c_attribute4
2458            , c_attribute5
2459            , c_attribute6
2460            , c_attribute7
2461            , c_attribute8
2462            , c_attribute9
2463            , c_attribute10
2464            , c_attribute11
2465            , c_attribute12
2466            , c_attribute13
2467            , c_attribute14
2468            , c_attribute15
2469            , c_attribute16
2470            , c_attribute17
2471            , c_attribute18
2472            , c_attribute19
2473            , c_attribute20
2474            , fnd_date.date_to_canonical(d_attribute1)
2475            , fnd_date.date_to_canonical(d_attribute2)
2476            , fnd_date.date_to_canonical(d_attribute3)
2477            , fnd_date.date_to_canonical(d_attribute4)
2478            , fnd_date.date_to_canonical(d_attribute5)
2479            , fnd_date.date_to_canonical(d_attribute6)
2480            , fnd_date.date_to_canonical(d_attribute7)
2481            , fnd_date.date_to_canonical(d_attribute8)
2482            , fnd_date.date_to_canonical(d_attribute9)
2483            , fnd_date.date_to_canonical(d_attribute10)
2484            , TO_CHAR(n_attribute1)
2485            , TO_CHAR(n_attribute2)
2486            , TO_CHAR(n_attribute3)
2487            , TO_CHAR(n_attribute4)
2488            , TO_CHAR(n_attribute5)
2489            , TO_CHAR(n_attribute6)
2490            , TO_CHAR(n_attribute7)
2491            , TO_CHAR(n_attribute8)
2492            , TO_CHAR(n_attribute9)
2493            , TO_CHAR(n_attribute10)
2494            , status_id
2495            , territory_code
2496         FROM mtl_serial_numbers_temp
2497        WHERE transaction_temp_id = p_transaction_temp_id
2498          AND LPAD(p_serial_number,30) BETWEEN LPAD(fm_serial_number,30) AND LPAD(NVL(to_serial_number, fm_serial_number),30);
2499          /* Bug 3622025 -- Added the LPAD function in the above where clause */
2500 
2501     l_input_idx                BINARY_INTEGER;
2502     l_debug                    NUMBER                                       := NVL(fnd_profile.VALUE('INV_DEBUG_TRACE'), 0);
2503   BEGIN
2504     -- Standard Start of API savepoint
2505     SAVEPOINT apiinsertserial_apipub;
2506 
2507     -- Standard call to check for call compatibility.
2508     IF NOT fnd_api.compatible_api_call(l_api_version, p_api_version, l_api_name, g_pkg_name) THEN
2509       RAISE fnd_api.g_exc_unexpected_error;
2510     END IF;
2511 
2512     -- Initialize message list if p_init_msg_list is set to TRUE.
2513     IF fnd_api.to_boolean(p_init_msg_list) THEN
2514       fnd_msg_pub.initialize;
2515     END IF;
2516 
2517     --  Initialize API return status to success
2518 
2519     /**IF (p_transaction_action_id = 3 AND g_firstscan = FALSE) THEN
2520       x_return_status  := fnd_api.g_ret_sts_success;
2521     ELSE**/
2522     x_return_status  := fnd_api.g_ret_sts_success;
2523     l_wms_installed  :=
2524       wms_install.check_install(
2525         x_return_status              => l_return_status
2526       , x_msg_count                  => l_msg_count
2527       , x_msg_data                   => l_msg_data
2528       , p_organization_id            => NULL   --p_organization_id
2529       );
2530 
2531     IF (p_transaction_temp_id IS NOT NULL) THEN
2532       OPEN serial_temp_csr(p_transaction_temp_id);
2533 
2534       populateattributescolumn();
2535 
2536       FETCH serial_temp_csr
2537        INTO g_serial_attributes_tbl(1).column_value
2538           , g_serial_attributes_tbl(2).column_value
2539           , g_serial_attributes_tbl(3).column_value
2540           , g_serial_attributes_tbl(4).column_value
2541           , g_serial_attributes_tbl(5).column_value
2542           , g_serial_attributes_tbl(6).column_value
2543           , g_serial_attributes_tbl(7).column_value
2544           , g_serial_attributes_tbl(8).column_value
2545           , g_serial_attributes_tbl(9).column_value
2546           , g_serial_attributes_tbl(10).column_value
2547           , g_serial_attributes_tbl(11).column_value
2548           , g_serial_attributes_tbl(12).column_value
2549           , g_serial_attributes_tbl(13).column_value
2550           , g_serial_attributes_tbl(14).column_value
2551           , g_serial_attributes_tbl(15).column_value
2552           , g_serial_attributes_tbl(16).column_value
2553           , g_serial_attributes_tbl(17).column_value
2554           , g_serial_attributes_tbl(18).column_value
2555           , g_serial_attributes_tbl(19).column_value
2556           , g_serial_attributes_tbl(20).column_value
2557           , g_serial_attributes_tbl(21).column_value
2558           , g_serial_attributes_tbl(22).column_value
2559           , g_serial_attributes_tbl(23).column_value
2560           , g_serial_attributes_tbl(24).column_value
2561           , g_serial_attributes_tbl(25).column_value
2562           , g_serial_attributes_tbl(26).column_value
2563           , g_serial_attributes_tbl(27).column_value
2564           , g_serial_attributes_tbl(28).column_value
2565           , g_serial_attributes_tbl(29).column_value
2566           , g_serial_attributes_tbl(30).column_value
2567           , g_serial_attributes_tbl(31).column_value
2568           , g_serial_attributes_tbl(32).column_value
2569           , g_serial_attributes_tbl(33).column_value
2570           , g_serial_attributes_tbl(34).column_value
2571           , g_serial_attributes_tbl(35).column_value
2572           , g_serial_attributes_tbl(36).column_value
2573           , g_serial_attributes_tbl(37).column_value
2574           , g_serial_attributes_tbl(38).column_value
2575           , g_serial_attributes_tbl(39).column_value
2576           , g_serial_attributes_tbl(40).column_value
2577           , g_serial_attributes_tbl(41).column_value
2578           , g_serial_attributes_tbl(42).column_value
2579           , g_serial_attributes_tbl(43).column_value
2580           , g_serial_attributes_tbl(44).column_value;
2581 
2582       CLOSE serial_temp_csr;
2583 
2584       l_input_idx  := 0;
2585 
2586       IF l_wms_installed THEN
2587         FOR x IN 1 .. 44 LOOP
2588           IF (g_serial_attributes_tbl(x).column_value IS NOT NULL) THEN
2589             l_input_idx                                := l_input_idx + 1;
2590             l_attributes_in(l_input_idx).column_name   := g_serial_attributes_tbl(x).column_name;
2591             l_attributes_in(l_input_idx).column_type   := g_serial_attributes_tbl(x).column_type;
2592             l_attributes_in(l_input_idx).column_value  := g_serial_attributes_tbl(x).column_value;
2593           END IF;
2594         END LOOP;
2595       END IF;   -- if wms_installed is true
2596     END IF;   -- if transaction_temp_id is not null
2597 
2598     ----------------------------------------------------------
2599     -- call inv_lot_sel_attr.get_default to get the default value
2600     -- of the lot attributes
2601     ---------------------------------------------------------
2602     IF l_wms_installed THEN
2603       inv_lot_sel_attr.get_default(
2604         x_attributes_default         => l_attributes_default
2605       , x_attributes_default_count   => l_attributes_default_count
2606       , x_return_status              => l_return_status
2607       , x_msg_count                  => l_msg_count
2608       , x_msg_data                   => l_msg_data
2609       , p_table_name                 => 'MTL_SERIAL_NUMBERS'
2610       , p_attributes_name            => 'Serial Attributes'
2611       , p_inventory_item_id          => p_inventory_item_id
2612       , p_organization_id            => p_organization_id
2613       , p_lot_serial_number          => p_serial_number
2614       , p_attributes                 => l_attributes_in
2615       );
2616 
2617       IF (l_return_status <> fnd_api.g_ret_sts_success) THEN
2618         x_return_status  := l_return_status;
2619         RAISE fnd_api.g_exc_unexpected_error;
2620       END IF;
2621 
2622       /* Get the default attribs only when there is no value on the form (in MSNT).
2623        * In case the user changes the context and the attributes while recieving,
2624        * they would be lost if we get the default context again--2756040
2625        */
2626       IF (l_attributes_default_count > 0
2627           AND(g_serial_attributes_tbl(1).column_value = NULL)) THEN
2628         FOR i IN 1 .. l_attributes_default_count LOOP
2629           FOR j IN 1 .. g_serial_attributes_tbl.COUNT LOOP
2630             IF (l_attributes_default(i).column_name = g_serial_attributes_tbl(j).column_name) THEN
2631               g_serial_attributes_tbl(j).column_value  := l_attributes_default(i).column_value;
2632             END IF;
2633           END LOOP;
2634         END LOOP;
2635       END IF;
2636     END IF;   -- if wms install is true
2637 
2638     l_userid         := fnd_global.user_id;
2639     l_loginid        := fnd_global.login_id;
2640     l_sys_date       := SYSDATE;
2641 
2642     IF (p_transaction_action_id = 3 AND g_firstscan = FALSE) THEN
2643       INSERT INTO mtl_unit_transactions
2644                   (
2645                    transaction_id
2646                  , last_update_date
2647                  , last_updated_by
2648                  , creation_date
2649                  , created_by
2650                  , last_update_login
2651                  , serial_number
2652                  , inventory_item_id
2653                  , organization_id
2654                  , subinventory_code
2655                  , locator_id
2656                  , transaction_date
2657                  , transaction_source_id
2658                  , transaction_source_type_id
2659                  , transaction_source_name
2660                  , receipt_issue_type
2661                  , customer_id
2662                  , ship_id
2663                  , serial_attribute_category
2664                  , origination_date
2665                  , c_attribute1
2666                  , c_attribute2
2667                  , c_attribute3
2668                  , c_attribute4
2669                  , c_attribute5
2670                  , c_attribute6
2671                  , c_attribute7
2672                  , c_attribute8
2673                  , c_attribute9
2674                  , c_attribute10
2675                  , c_attribute11
2676                  , c_attribute12
2677                  , c_attribute13
2678                  , c_attribute14
2679                  , c_attribute15
2680                  , c_attribute16
2681                  , c_attribute17
2682                  , c_attribute18
2683                  , c_attribute19
2684                  , c_attribute20
2685                  , d_attribute1
2686                  , d_attribute2
2687                  , d_attribute3
2688                  , d_attribute4
2689                  , d_attribute5
2690                  , d_attribute6
2691                  , d_attribute7
2692                  , d_attribute8
2693                  , d_attribute9
2694                  , d_attribute10
2695                  , n_attribute1
2696                  , n_attribute2
2697                  , n_attribute3
2698                  , n_attribute4
2699                  , n_attribute5
2700                  , n_attribute6
2701                  , n_attribute7
2702                  , n_attribute8
2703                  , n_attribute9
2704                  , n_attribute10
2705                  , status_id
2706                  , territory_code
2707                  , time_since_new
2708                  , cycles_since_new
2709                  , time_since_overhaul
2710                  , cycles_since_overhaul
2711                  , time_since_repair
2712                  , cycles_since_repair
2713                  , time_since_visit
2714                  , cycles_since_visit
2715                  , time_since_mark
2716                  , cycles_since_mark
2717                  , number_of_repairs
2718                   )
2719         SELECT p_transaction_id
2720              , l_sys_date
2721              , l_userid
2722              , creation_date
2723              , created_by
2724              , l_loginid
2725              , p_serial_number
2726              , p_inventory_item_id
2727              , p_organization_id
2728              , p_subinventory_code
2729              , p_current_locator_id
2730              , p_transaction_date
2731              , p_txn_src_id
2732              , p_txn_src_type_id
2733              , p_txn_src_name
2734              , p_receipt_issue_type
2735              , p_customer_id
2736              , p_ship_id
2737              , serial_attribute_category
2738              , origination_date
2739              , c_attribute1
2740              , c_attribute2
2741              , c_attribute3
2742              , c_attribute4
2743              , c_attribute5
2744              , c_attribute6
2745              , c_attribute7
2746              , c_attribute8
2747              , c_attribute9
2748              , c_attribute10
2749              , c_attribute11
2750              , c_attribute12
2751              , c_attribute13
2752              , c_attribute14
2753              , c_attribute15
2754              , c_attribute16
2755              , c_attribute17
2756              , c_attribute18
2757              , c_attribute19
2758              , c_attribute20
2759              , d_attribute1
2760              , d_attribute2
2761              , d_attribute3
2762              , d_attribute4
2763              , d_attribute5
2764              , d_attribute6
2765              , d_attribute7
2766              , d_attribute8
2767              , d_attribute9
2768              , d_attribute10
2769              , n_attribute1
2770              , n_attribute2
2771              , n_attribute3
2772              , n_attribute4
2773              , n_attribute5
2774              , n_attribute6
2775              , n_attribute7
2776              , n_attribute8
2777              , n_attribute9
2778              , n_attribute10
2779              , status_id
2780              , territory_code
2781              , time_since_new
2782              , cycles_since_new
2783              , time_since_overhaul
2784              , cycles_since_overhaul
2785              , time_since_repair
2786              , cycles_since_repair
2787              , time_since_visit
2788              , cycles_since_visit
2789              , time_since_mark
2790              , cycles_since_mark
2791              , number_of_repairs
2792           FROM mtl_serial_numbers
2793          WHERE serial_number = p_serial_number
2794            AND current_organization_id = p_organization_id
2795            AND inventory_item_id = p_inventory_item_id;
2796     /* Bug 2207912 */
2797     /* The following not exists statement is commented out
2798     ** because  this part of the statement gets executed
2799     ** only for ORG TRANSFER and for the delivery side of
2800     ** of transaction as firstscan is false now, before this
2801     ** insert statement gets executed the mtl_serial_number is
2802     ** table is already updated with the organization_id of the
2803     ** delivered org and status from the TM, so there will be an entry always exist
2804     ** ing for the where condition specified in the exists clasue
2805     ** for mtl_serial_number table
2806     ** So the insert statement will always fail.
2807     */
2808     --and   not exists
2809     --   ( select NULL
2810     --  from mtl_serial_numbers sn
2811     --  where sn.serial_number = p_serial_number
2812     --  and sn.current_organization_id = p_organization_id
2813     -- and sn.inventory_item_id = p_inventory_item_id);
2814     ELSE
2815       IF l_wms_installed THEN
2816         /** 2756040 - Populate Serial Attribute Category info when it is not
2817          ** a receiving transaction **/
2818         IF ((g_serial_attributes_tbl(1).column_value = NULL)
2819             OR(p_transaction_action_id NOT IN(12, 27, 31))) THEN
2820           inv_lot_sel_attr.get_context_code(g_serial_attributes_tbl(1).column_value, p_organization_id, p_inventory_item_id
2821           , 'Serial Attributes');
2822         END IF;
2823       ELSE
2824         g_serial_attributes_tbl(1).column_value  := NULL;
2825       END IF;
2826 
2827        l_date2 := fnd_date.canonical_to_date(g_serial_attributes_tbl(2).COLUMN_VALUE);
2828        l_date23 := fnd_date.canonical_to_date(g_serial_attributes_tbl(23).COLUMN_VALUE);
2829        l_date24 := fnd_date.canonical_to_date(g_serial_attributes_tbl(24).COLUMN_VALUE);
2830        l_date25 := fnd_date.canonical_to_date(g_serial_attributes_tbl(25).COLUMN_VALUE);
2831        l_date26 := fnd_date.canonical_to_date(g_serial_attributes_tbl(26).COLUMN_VALUE);
2832        l_date27 := fnd_date.canonical_to_date(g_serial_attributes_tbl(27).COLUMN_VALUE);
2833        l_date28 := fnd_date.canonical_to_date(g_serial_attributes_tbl(28).COLUMN_VALUE);
2834        l_date29 := fnd_date.canonical_to_date(g_serial_attributes_tbl(29).COLUMN_VALUE);
2835        l_date30 := fnd_date.canonical_to_date(g_serial_attributes_tbl(30).COLUMN_VALUE);
2836        l_date31 := fnd_date.canonical_to_date(g_serial_attributes_tbl(31).COLUMN_VALUE);
2837        l_date32 := fnd_date.canonical_to_date(g_serial_attributes_tbl(32).COLUMN_VALUE);
2838        l_num33 := to_number(g_serial_attributes_tbl(33).COLUMN_VALUE);
2839        l_num34 := to_number(g_serial_attributes_tbl(34).COLUMN_VALUE);
2840        l_num35 := to_number(g_serial_attributes_tbl(35).COLUMN_VALUE);
2841        l_num36 := to_number(g_serial_attributes_tbl(36).COLUMN_VALUE);
2842        l_num37 := to_number(g_serial_attributes_tbl(37).COLUMN_VALUE);
2843        l_num38 := to_number(g_serial_attributes_tbl(38).COLUMN_VALUE);
2844        l_num39 := to_number(g_serial_attributes_tbl(39).COLUMN_VALUE);
2845        l_num40 := to_number(g_serial_attributes_tbl(40).COLUMN_VALUE);
2846        l_num41 := to_number(g_serial_attributes_tbl(41).COLUMN_VALUE);
2847        l_num42 := to_number(g_serial_attributes_tbl(42).COLUMN_VALUE);
2848 
2849       IF (p_transaction_temp_id > 0) THEN
2850         --Bug 2067223 paranthesis are added in the where clause
2851         -- of the select statement
2852         INSERT INTO mtl_unit_transactions
2853                     (
2854                      transaction_id
2855                    , last_update_date
2856                    , last_updated_by
2857                    , creation_date
2858                    , created_by
2859                    , last_update_login
2860                    , serial_number
2861                    , inventory_item_id
2862                    , organization_id
2863                    , subinventory_code
2864                    , locator_id
2865                    , transaction_date
2866                    , transaction_source_id
2867                    , transaction_source_type_id
2868                    , transaction_source_name
2869                    , receipt_issue_type
2870                    , customer_id
2871                    , ship_id
2872                    , serial_attribute_category
2873                    , origination_date
2874                    , c_attribute1
2875                    , c_attribute2
2876                    , c_attribute3
2877                    , c_attribute4
2878                    , c_attribute5
2879                    , c_attribute6
2880                    , c_attribute7
2881                    , c_attribute8
2882                    , c_attribute9
2883                    , c_attribute10
2884                    , c_attribute11
2885                    , c_attribute12
2886                    , c_attribute13
2887                    , c_attribute14
2888                    , c_attribute15
2889                    , c_attribute16
2890                    , c_attribute17
2891                    , c_attribute18
2892                    , c_attribute19
2893                    , c_attribute20
2894                    , d_attribute1
2895                    , d_attribute2
2896                    , d_attribute3
2897                    , d_attribute4
2898                    , d_attribute5
2899                    , d_attribute6
2900                    , d_attribute7
2901                    , d_attribute8
2902                    , d_attribute9
2903                    , d_attribute10
2904                    , n_attribute1
2905                    , n_attribute2
2906                    , n_attribute3
2907                    , n_attribute4
2908                    , n_attribute5
2909                    , n_attribute6
2910                    , n_attribute7
2911                    , n_attribute8
2912                    , n_attribute9
2913                    , n_attribute10
2914                    , status_id
2915                    , territory_code
2916                    , time_since_new
2917                    , cycles_since_new
2918                    , time_since_overhaul
2919                    , cycles_since_overhaul
2920                    , time_since_repair
2921                    , cycles_since_repair
2922                    , time_since_visit
2923                    , cycles_since_visit
2924                    , time_since_mark
2925                    , cycles_since_mark
2926                    , number_of_repairs
2927                    , product_code
2928                    , product_transaction_id
2929                    , attribute_category
2930                    , attribute1
2931                    , attribute2
2932                    , attribute3
2933                    , attribute4
2934                    , attribute5
2935                    , attribute6
2936                    , attribute7
2937                    , attribute8
2938                    , attribute9
2939                    , attribute10
2940                    , attribute11
2941                    , attribute12
2942                    , attribute13
2943                    , attribute14
2944                    , attribute15
2945                     )
2946           SELECT p_transaction_id
2947                , l_sys_date
2948                , l_userid
2949                , creation_date
2950                , l_userid
2951                , l_loginid
2952                , p_serial_number
2953                , p_inventory_item_id
2954                , p_organization_id
2955                , p_subinventory_code
2956                , p_current_locator_id
2957                , p_transaction_date
2958                , p_txn_src_id
2959                , p_txn_src_type_id
2960                , p_txn_src_name
2961                , p_receipt_issue_type
2962                , p_customer_id
2963                , p_ship_id
2964                , g_serial_attributes_tbl(1).column_value
2965                , l_date2
2966                , g_serial_attributes_tbl(3).column_value
2967                , g_serial_attributes_tbl(4).column_value
2968                , g_serial_attributes_tbl(5).column_value
2969                , g_serial_attributes_tbl(6).column_value
2970                , g_serial_attributes_tbl(7).column_value
2971                , g_serial_attributes_tbl(8).column_value
2972                , g_serial_attributes_tbl(9).column_value
2973                , g_serial_attributes_tbl(10).column_value
2974                , g_serial_attributes_tbl(11).column_value
2975                , g_serial_attributes_tbl(12).column_value
2976                , g_serial_attributes_tbl(13).column_value
2977                , g_serial_attributes_tbl(14).column_value
2978                , g_serial_attributes_tbl(15).column_value
2979                , g_serial_attributes_tbl(16).column_value
2980                , g_serial_attributes_tbl(17).column_value
2981                , g_serial_attributes_tbl(18).column_value
2982                , g_serial_attributes_tbl(19).column_value
2983                , g_serial_attributes_tbl(20).column_value
2984                , g_serial_attributes_tbl(21).column_value
2985                , g_serial_attributes_tbl(22).column_value
2986                , l_date23
2987                , l_date24
2988                , l_date25
2989                , l_date26
2990                , l_date27
2991                , l_date28
2992                , l_date29
2993                , l_date30
2994                , l_date31
2995                , l_date32
2996                , l_num33
2997                , l_num34
2998                , l_num35
2999                , l_num36
3000                , l_num37
3001                , l_num38
3002                , l_num39
3003                , l_num40
3004                , l_num41
3005                , l_num42
3006                , p_status_id
3007                , g_serial_attributes_tbl(44).column_value
3008                , time_since_new
3009                , cycles_since_new
3010                , time_since_overhaul
3011                , cycles_since_overhaul
3012                , time_since_repair
3013                , cycles_since_repair
3014                , time_since_visit
3015                , cycles_since_visit
3016                , time_since_mark
3017                , cycles_since_mark
3018                , number_of_repairs
3019                , product_code
3020                , product_transaction_id
3021                , attribute_category
3022                , attribute1
3023                , attribute2
3024                , attribute3
3025                , attribute4
3026                , attribute5
3027                , attribute6
3028                , attribute7
3029                , attribute8
3030                , attribute9
3031                , attribute10
3032                , attribute11
3033                , attribute12
3034                , attribute13
3035                , attribute14
3036                , attribute15
3037             FROM mtl_serial_numbers_temp
3038            WHERE transaction_temp_id = p_transaction_temp_id
3039              AND LPAD(p_serial_number,30) BETWEEN LPAD(fm_serial_number,30) AND LPAD(NVL(to_serial_number, fm_serial_number),30);
3040          /* Bug 3622025 -- Added the LPAD function in the above where clause */
3041       ELSE
3042         INSERT INTO mtl_unit_transactions
3043                     (
3044                      transaction_id
3045                    , last_update_date
3046                    , last_updated_by
3047                    , creation_date
3048                    , created_by
3049                    , last_update_login
3050                    , serial_number
3051                    , inventory_item_id
3052                    , organization_id
3053                    , subinventory_code
3054                    , locator_id
3055                    , transaction_date
3056                    , transaction_source_id
3057                    , transaction_source_type_id
3058                    , transaction_source_name
3059                    , receipt_issue_type
3060                    , customer_id
3061                    , ship_id
3062                    , serial_attribute_category
3063                    , origination_date
3064                    , c_attribute1
3065                    , c_attribute2
3066                    , c_attribute3
3067                    , c_attribute4
3068                    , c_attribute5
3069                    , c_attribute6
3070                    , c_attribute7
3071                    , c_attribute8
3072                    , c_attribute9
3073                    , c_attribute10
3074                    , c_attribute11
3075                    , c_attribute12
3076                    , c_attribute13
3077                    , c_attribute14
3078                    , c_attribute15
3079                    , c_attribute16
3080                    , c_attribute17
3081                    , c_attribute18
3082                    , c_attribute19
3083                    , c_attribute20
3084                    , d_attribute1
3085                    , d_attribute2
3086                    , d_attribute3
3087                    , d_attribute4
3088                    , d_attribute5
3089                    , d_attribute6
3090                    , d_attribute7
3091                    , d_attribute8
3092                    , d_attribute9
3093                    , d_attribute10
3094                    , n_attribute1
3095                    , n_attribute2
3096                    , n_attribute3
3097                    , n_attribute4
3098                    , n_attribute5
3099                    , n_attribute6
3100                    , n_attribute7
3101                    , n_attribute8
3102                    , n_attribute9
3103                    , n_attribute10
3104                    , status_id
3105                    , territory_code
3106                    , time_since_new
3107                    , cycles_since_new
3108                    , time_since_overhaul
3109                    , cycles_since_overhaul
3110                    , time_since_repair
3111                    , cycles_since_repair
3112                    , time_since_visit
3113                    , cycles_since_visit
3114                    , time_since_mark
3115                    , cycles_since_mark
3116                    , number_of_repairs
3117                     )
3118           SELECT p_transaction_id
3119                , SYSDATE
3120                , l_userid
3121                , SYSDATE
3122                , l_userid
3123                , l_loginid
3124                , p_serial_number
3125                , p_inventory_item_id
3126                , p_organization_id
3127                , p_subinventory_code
3128                , p_current_locator_id
3129                , p_transaction_date
3130                , p_txn_src_id
3131                , p_txn_src_type_id
3132                , p_txn_src_name
3133                , p_receipt_issue_type
3134                , p_customer_id
3135                , p_ship_id
3136                , g_serial_attributes_tbl(1).column_value
3137                , l_date2
3138                , g_serial_attributes_tbl(3).column_value
3139                , g_serial_attributes_tbl(4).column_value
3140                , g_serial_attributes_tbl(5).column_value
3141                , g_serial_attributes_tbl(6).column_value
3142                , g_serial_attributes_tbl(7).column_value
3143                , g_serial_attributes_tbl(8).column_value
3144                , g_serial_attributes_tbl(9).column_value
3145                , g_serial_attributes_tbl(10).column_value
3146                , g_serial_attributes_tbl(11).column_value
3147                , g_serial_attributes_tbl(12).column_value
3148                , g_serial_attributes_tbl(13).column_value
3149                , g_serial_attributes_tbl(14).column_value
3150                , g_serial_attributes_tbl(15).column_value
3151                , g_serial_attributes_tbl(16).column_value
3152                , g_serial_attributes_tbl(17).column_value
3153                , g_serial_attributes_tbl(18).column_value
3154                , g_serial_attributes_tbl(19).column_value
3155                , g_serial_attributes_tbl(20).column_value
3156                , g_serial_attributes_tbl(21).column_value
3157                , g_serial_attributes_tbl(22).column_value
3158                , l_date23
3159                , l_date24
3160                , l_date25
3161                , l_date26
3162                , l_date27
3163                , l_date28
3164                , l_date29
3165                , l_date30
3166                , l_date31
3167                , l_date32
3168                , l_num33
3169                , l_num34
3170                , l_num35
3171                , l_num36
3172                , l_num37
3173                , l_num38
3174                , l_num39
3175                , l_num40
3176                , l_num41
3177                , l_num42
3178                , p_status_id
3179                , g_serial_attributes_tbl(44).column_value
3180                , msn.time_since_new
3181                , msn.cycles_since_new
3182                , msn.time_since_overhaul
3183                , msn.cycles_since_overhaul
3184                , msn.time_since_repair
3185                , msn.cycles_since_repair
3186                , msn.time_since_visit
3187                , msn.cycles_since_visit
3188                , msn.time_since_mark
3189                , msn.cycles_since_mark
3190                , msn.number_of_repairs
3191             FROM mtl_serial_numbers msn
3192            WHERE inventory_item_id = p_inventory_item_id
3193              AND serial_number = p_serial_number;
3194       END IF;
3195     END IF;
3196 
3197      /*bug 2756040 Update MSN also with values from MSNT in case of
3198     receipt transaction or intransit receipt txn
3199     (transaction_action_id = 12 or 27) */
3200       IF (p_transaction_action_id IN(12, 27, 31)) THEN
3201          IF (l_debug = 1) THEN
3202             invtrace('transaction_action_id = ' || p_transaction_action_id
3203                      || ' org _id ' || p_organization_id || 'item ' ||
3204                      p_inventory_item_id);
3205          END IF;
3206 
3207       BEGIN
3208         UPDATE mtl_serial_numbers
3209            SET serial_attribute_category = g_serial_attributes_tbl(1).column_value
3210              , origination_date = l_date2
3211              , c_attribute1 = g_serial_attributes_tbl(3).column_value
3212              , c_attribute2 = g_serial_attributes_tbl(4).column_value
3213              , c_attribute3 = g_serial_attributes_tbl(5).column_value
3214              , c_attribute4 = g_serial_attributes_tbl(6).column_value
3215              , c_attribute5 = g_serial_attributes_tbl(7).column_value
3216              , c_attribute6 = g_serial_attributes_tbl(8).column_value
3217              , c_attribute7 = g_serial_attributes_tbl(9).column_value
3218              , c_attribute8 = g_serial_attributes_tbl(10).column_value
3219              , c_attribute9 = g_serial_attributes_tbl(11).column_value
3220              , c_attribute10 = g_serial_attributes_tbl(12).column_value
3221              , c_attribute11 = g_serial_attributes_tbl(13).column_value
3222              , c_attribute12 = g_serial_attributes_tbl(14).column_value
3223              , c_attribute13 = g_serial_attributes_tbl(15).column_value
3224              , c_attribute14 = g_serial_attributes_tbl(16).column_value
3225              , c_attribute15 = g_serial_attributes_tbl(17).column_value
3226              , c_attribute16 = g_serial_attributes_tbl(18).column_value
3227              , c_attribute17 = g_serial_attributes_tbl(19).column_value
3228              , c_attribute18 = g_serial_attributes_tbl(20).column_value
3229              , c_attribute19 = g_serial_attributes_tbl(21).column_value
3230              , c_attribute20 = g_serial_attributes_tbl(22).column_value
3231              , d_attribute1 = l_date23
3232              , d_attribute2 = l_date24
3233              , d_attribute3 = l_date25
3234              , d_attribute4 = l_date26
3235              , d_attribute5 = l_date27
3236              , d_attribute6 = l_date28
3237              , d_attribute7 = l_date29
3238              , d_attribute8 = l_date30
3239              , d_attribute9 = l_date31
3240              , d_attribute10 = l_date32
3241              , n_attribute1 = l_num33
3242              , n_attribute2 = l_num34
3243              , n_attribute3 = l_num35
3244              , n_attribute4 = l_num36
3245              , n_attribute5 = l_num37
3246              , n_attribute6 = l_num38
3247              , n_attribute7 = l_num39
3248              , n_attribute8 = l_num40
3249              , n_attribute9 = l_num41
3250              , n_attribute10 = l_num42
3251          WHERE serial_number = p_serial_number
3252            AND inventory_item_id = p_inventory_item_id
3253            AND current_organization_id = p_organization_id;
3254 
3255         IF (l_debug = 1) THEN
3256           invtrace('updating MSN with values ');
3257           invtrace('serial_attribute_category ' || g_serial_attributes_tbl(1).column_value);
3258           invtrace('origination_date ' || g_serial_attributes_tbl(2).column_value);
3259           invtrace(' C_ATTRIBUTE1 = ' || g_serial_attributes_tbl(3).column_value);
3260           invtrace('C_ATTRIBUTE2 = ' || g_serial_attributes_tbl(4).column_value);
3261           invtrace('C_ATTRIBUTE3 = ' || g_serial_attributes_tbl(5).column_value);
3262           invtrace('C_ATTRIBUTE4 = ' || g_serial_attributes_tbl(6).column_value);
3263           invtrace('C_ATTRIBUTE5 = ' || g_serial_attributes_tbl(7).column_value);
3264           invtrace('C_ATTRIBUTE6 = ' || g_serial_attributes_tbl(8).column_value);
3265           invtrace('C_ATTRIBUTE7 = ' || g_serial_attributes_tbl(9).column_value);
3266           invtrace('C_ATTRIBUTE8 = ' || g_serial_attributes_tbl(10).column_value);
3267           invtrace('C_ATTRIBUTE9 = ' || g_serial_attributes_tbl(11).column_value);
3268           invtrace('C_ATTRIBUTE10 = ' || g_serial_attributes_tbl(12).column_value);
3269           invtrace('C_ATTRIBUTE11 = ' || g_serial_attributes_tbl(13).column_value);
3270           invtrace('C_ATTRIBUTE12 = ' || g_serial_attributes_tbl(14).column_value);
3271           invtrace('C_ATTRIBUTE13 =  ' || g_serial_attributes_tbl(15).column_value);
3272           invtrace('C_ATTRIBUTE14 =  ' || g_serial_attributes_tbl(16).column_value);
3273           invtrace('C_ATTRIBUTE15 = ' || g_serial_attributes_tbl(17).column_value);
3274           invtrace('C_ATTRIBUTE16 = ' || g_serial_attributes_tbl(18).column_value);
3275           invtrace('C_ATTRIBUTE17 = ' || g_serial_attributes_tbl(19).column_value);
3276           invtrace('C_ATTRIBUTE18 =  ' || g_serial_attributes_tbl(20).column_value);
3277           invtrace('C_ATTRIBUTE19 = ' || g_serial_attributes_tbl(21).column_value);
3278           invtrace('C_ATTRIBUTE20 = ' || g_serial_attributes_tbl(22).column_value);
3279           invtrace('D_ATTRIBUTE1 =  ' || g_serial_attributes_tbl(23).column_value);
3280           invtrace('D_ATTRIBUTE2 =  ' || g_serial_attributes_tbl(24).column_value);
3281           invtrace('D_ATTRIBUTE3 =  ' || g_serial_attributes_tbl(25).column_value);
3282           invtrace('D_ATTRIBUTE4 =  ' || g_serial_attributes_tbl(26).column_value);
3283           invtrace('D_ATTRIBUTE5 = ' || g_serial_attributes_tbl(27).column_value);
3284           invtrace('D_ATTRIBUTE6 =  ' || g_serial_attributes_tbl(28).column_value);
3285           invtrace('D_ATTRIBUTE7 =  ' || g_serial_attributes_tbl(29).column_value);
3286           invtrace('D_ATTRIBUTE8 = ' || g_serial_attributes_tbl(30).column_value);
3287           invtrace('D_ATTRIBUTE9 = ' || g_serial_attributes_tbl(31).column_value);
3288           invtrace('D_ATTRIBUTE10 = ' || g_serial_attributes_tbl(32).column_value);
3289           invtrace('N_ATTRIBUTE1 =  ' || g_serial_attributes_tbl(33).column_value);
3290           invtrace('N_ATTRIBUTE2 =  ' || g_serial_attributes_tbl(34).column_value);
3291           invtrace('N_ATTRIBUTE3 =  ' || g_serial_attributes_tbl(35).column_value);
3292           invtrace('N_ATTRIBUTE4 =  ' || g_serial_attributes_tbl(36).column_value);
3293           invtrace('N_ATTRIBUTE5 =  ' || g_serial_attributes_tbl(37).column_value);
3294           invtrace('N_ATTRIBUTE6 =  ' || g_serial_attributes_tbl(38).column_value);
3295           invtrace('N_ATTRIBUTE7 =  ' || g_serial_attributes_tbl(39).column_value);
3296           invtrace('N_ATTRIBUTE8 =  ' || g_serial_attributes_tbl(40).column_value);
3297           invtrace('N_ATTRIBUTE9 =  ' || g_serial_attributes_tbl(41).column_value);
3298           invtrace('N_ATTRIBUTE10 = ' || g_serial_attributes_tbl(42).column_value);
3299           invtrace(' for the serial ' || p_serial_number);
3300         END IF;
3301       EXCEPTION
3302          WHEN NO_DATA_FOUND THEN
3303             IF (l_debug = 1) THEN
3304                invtrace('no data found while updating msn');
3305             END IF;
3306          WHEN OTHERS THEN
3307             IF (l_debug = 1) THEN
3308                invtrace('some other error' || SQLERRM);
3309             END IF;
3310       END;
3311     END IF;
3312 
3313     x_return_status  := fnd_api.g_ret_sts_success;
3314 
3315     -- End of API body.
3316     -- Standard check of p_commit.
3317     IF fnd_api.to_boolean(p_commit) THEN
3318       COMMIT WORK;
3319     END IF;
3320 
3321     -- Standard call to get message count and if count is 1, get message info.
3322     fnd_msg_pub.count_and_get(p_encoded => fnd_api.g_false, p_count => x_msg_count, p_data => l_msg_data);
3323     x_msg_data       := SUBSTR(l_msg_data, 0, 198);
3324   EXCEPTION
3325     WHEN OTHERS THEN
3326       ROLLBACK TO apiinsertserial_apipub;
3327 
3328       IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_unexp_error) THEN
3329         fnd_msg_pub.add_exc_msg('INV_SERIAL_NUMBER_PUB', 'insertUnitTrx');
3330       END IF;
3331 
3332       x_return_status  := fnd_api.g_ret_sts_unexp_error;
3333   END insertunittrx;
3334 
3335   ------------------------------------------------------------------------------
3336   --     Name: GENERATE_SERIALSJ
3337   --
3338   --     Input parameters:
3339   --       p_org_id             Organization ID
3340   --       p_item_id            Item ID
3341   --       p_qty                Count of Serial Numbers
3342   --       p_wip_id             Wip Entity ID
3343   --       p_rev                Revision
3344   --       p_lot                Lot Number
3345   --       p_skip_serial        0, do not skip, called in context of transaction
3346   --                                                         processing
3347   --                            1, skip-serials : concurrent-program
3348   --      Output parameters:
3349   --       x_proc_msg          Message from the Process-Manager
3350   --       return_status       0 on Success, 1 on Error
3351   --
3352   --      Function: Call specification for Java Stored Procedure. This function
3353   --      is not called directly but through GENERATE_SERIALS to support
3354   --      autonomous transaction
3355   --
3356   --
3357   FUNCTION generate_serialsj(
3358     p_org_id        IN            NUMBER
3359   , p_item_id       IN            NUMBER
3360   , p_qty           IN            NUMBER
3361   , p_wip_id        IN            NUMBER
3362   , p_rev           IN            VARCHAR2
3363   , p_lot           IN            VARCHAR2
3364   , p_skip_serial                 NUMBER
3365   , p_group_mark_id               NUMBER
3366   , p_line_mark_id                NUMBER
3367   , x_start_ser     OUT NOCOPY    VARCHAR2
3368   , x_end_ser       OUT NOCOPY    VARCHAR2
3369   , x_proc_msg      OUT NOCOPY    VARCHAR2
3370   )
3371     RETURN NUMBER AS
3372     LANGUAGE JAVA
3373     NAME 'oracle.apps.inv.transaction.server.TrxProcessor.generateSerials(java.lang.Long,
3374       java.lang.Long,
3375       java.lang.Long,
3376       java.lang.Long,
3377       java.lang.String,
3378       java.lang.String,
3379       java.lang.Long,
3380       java.lang.Long,
3381       java.lang.Long,
3382       java.lang.String[],
3383       java.lang.String[],
3384       java.lang.String[]) return java.lang.Integer';
3385 
3386   --
3387   --
3388   -- Purpose: This procedure will be called from Concurrent Manager. This Procedure
3389   -- is replacement for INCTSN.opp. It generates the serial number.
3390   --
3391   -- MODIFICATION HISTORY
3392   -- Person      Date    Comments
3393   -- ---------   ------  -------------------------------------------
3394   -- vipathak    8/31/01 Created.
3395   --
3396   -- Declare program variables as shown above
3397   PROCEDURE generate_serials(
3398     x_retcode       OUT NOCOPY    VARCHAR2
3399   , x_errbuf        OUT NOCOPY    VARCHAR2
3400   , p_org_id        IN            NUMBER
3401   , p_item_id       IN            NUMBER
3402   , p_qty           IN            NUMBER
3403   , p_serial_code   IN            VARCHAR2
3404   , p_wip_id        IN            NUMBER
3405   , p_rev           IN            NUMBER
3406   , p_lot           IN            NUMBER
3407   , p_group_mark_id IN            NUMBER DEFAULT NULL
3408   , p_line_mark_id  IN            NUMBER DEFAULT NULL
3409   ) IS
3410     PRAGMA AUTONOMOUS_TRANSACTION;
3411     v_commit      VARCHAR2(12)   := fnd_api.g_true;
3412     v_mesg        VARCHAR2(2000);
3413     l_start_ser   VARCHAR2(100);
3414     l_end_ser     VARCHAR2(100);
3415     v_retval      NUMBER;
3416     ret           BOOLEAN;
3417     l_skip_serial NUMBER         := 1;
3418     l_debug       NUMBER         := NVL(fnd_profile.VALUE('INV_DEBUG_TRACE'), 0);
3419   BEGIN
3420     v_retval  :=
3421       generate_serialsj(
3422         p_org_id                     => p_org_id
3423       , p_item_id                    => p_item_id
3424       , p_qty                        => p_qty
3425       , p_wip_id                     => p_wip_id
3426       , p_rev                        => p_rev
3427       , p_lot                        => p_lot
3428       , p_skip_serial                => l_skip_serial
3429       , p_group_mark_id              => p_group_mark_id
3430       , p_line_mark_id               => p_line_mark_id
3431       , x_start_ser                  => l_start_ser
3432       , x_end_ser                    => l_end_ser
3433       , x_proc_msg                   => v_mesg
3434       );
3435 
3436     IF (v_retval = 1) THEN
3437       ret        := fnd_concurrent.set_completion_status('ERROR', v_mesg);
3438       x_retcode  := 2;
3439       x_errbuf   := v_mesg;
3440     ELSIF(v_retval = 2) THEN
3441       ret        := fnd_concurrent.set_completion_status('WARNING', v_mesg);
3442       x_retcode  := 0;
3443     ELSE
3444       ret        := fnd_concurrent.set_completion_status('NORMAL', v_mesg);
3445       x_retcode  := 0;
3446     END IF;
3447 
3448     COMMIT;
3449   EXCEPTION
3450     WHEN OTHERS THEN
3451       x_retcode  := 2;
3452       x_errbuf   := SUBSTR(fnd_msg_pub.get(p_encoded => fnd_api.g_false), 1, 250);
3453       ret        := fnd_concurrent.set_completion_status('ERROR', v_mesg);
3454       RAISE;
3455   END generate_serials;
3456 
3457   /*-------------------------------------------------------------------------------
3458   --     Name: GENERATE_SERIALS
3459   --         Wrapper for GENERATE_SERIALSJ with Autonomous Tramsaction support
3460   --
3461   --     Input parameters:
3462   --       p_org_id             Organization ID
3463   --       p_item_id            Item ID
3464   --       p_qty                Count of Serial Numbers
3465   --       p_wip_id             Wip Entity ID
3466   --       p_rev                Revision
3467   --       p_lot                Lot Number
3468   --       l_calling_program    0, being called from mobile UI
3469   --      Output parameters:
3470   --       x_proc_msg          Message from the Process-Manager
3471   --       return_status       0 on Success, 1 on Error
3472   --
3473   --
3474   */
3475   FUNCTION generate_serials(
3476     p_org_id        IN            NUMBER
3477   , p_item_id       IN            NUMBER
3478   , p_qty           IN            NUMBER
3479   , p_wip_id        IN            NUMBER
3480   , p_rev           IN            VARCHAR2
3481   , p_lot           IN            VARCHAR2
3482   , p_group_mark_id IN            NUMBER DEFAULT NULL
3483   , p_line_mark_id  IN            NUMBER DEFAULT NULL
3484   , x_start_ser     OUT NOCOPY    VARCHAR2
3485   , x_end_ser       OUT NOCOPY    VARCHAR2
3486   , x_proc_msg      OUT NOCOPY    VARCHAR2
3487   , p_skip_serial   IN            NUMBER DEFAULT NULL
3488   )
3489     RETURN NUMBER AS
3490     PRAGMA AUTONOMOUS_TRANSACTION;
3491     l_retval      NUMBER;
3492     l_skip_serial NUMBER := NVL(p_skip_serial, 0);
3493     l_debug       NUMBER := NVL(fnd_profile.VALUE('INV_DEBUG_TRACE'), 0);
3494   BEGIN
3495     l_retval  :=
3496       generate_serialsj(
3497         p_org_id                     => p_org_id
3498       , p_item_id                    => p_item_id
3499       , p_qty                        => p_qty
3500       , p_wip_id                     => p_wip_id
3501       , p_rev                        => p_rev
3502       , p_lot                        => p_lot
3503       , p_skip_serial                => l_skip_serial
3504       , p_group_mark_id              => p_group_mark_id
3505       , p_line_mark_id               => p_line_mark_id
3506       , x_start_ser                  => x_start_ser
3507       , x_end_ser                    => x_end_ser
3508       , x_proc_msg                   => x_proc_msg
3509       );
3510     COMMIT;
3511     RETURN l_retval;
3512   END;
3513 
3514   --
3515   --     Name: IS_SERIAL_UNIQUE
3516   --
3517   --     Input parameters:
3518   --       p_org_id             Organization ID
3519   --       p_item_id            Item ID
3520   --       p_serial             Serial Number
3521   --
3522   --      Output parameters:
3523   --       x_proc_msg          Message from the Process-Manager
3524   --       return_status       0 on Success, 1 on Error
3525   --
3526   --
3527   FUNCTION is_serial_unique(p_org_id IN NUMBER, p_item_id IN NUMBER, p_serial IN VARCHAR2, x_proc_msg OUT NOCOPY VARCHAR2)
3528     RETURN NUMBER AS
3529     LANGUAGE JAVA
3530     NAME 'oracle.apps.inv.transaction.server.TrxProcessor.isSerialNumberUnique(java.lang.Long,
3531                                                 java.lang.Long,
3532                                                 java.lang.String,
3533                                                 java.lang.String[]) return java.lang.Integer';
3534 
3535   --
3536   --     Name: GET_SERIAL_DIFF
3537   --
3538   --     Input parameters:
3539   --       p_fm_serial          'from' Serial Number
3540   --       p_to_serial          'to'   Serial Number
3541   --
3542   --      Output parameters:
3543   --       return_status       quantity between passed serial numbers
3544   --
3545   FUNCTION get_serial_diff(p_fm_serial IN VARCHAR2, p_to_serial IN VARCHAR2)
3546     RETURN NUMBER AS
3547     LANGUAGE JAVA
3548     NAME 'oracle.apps.inv.transaction.server.TrxProcessor.getSerNumDiff(java.lang.String,
3549                            java.lang.String) return java.lang.Integer';
3550 
3551   -- Bug 7541512, added p_rcv_parent_txn_id to validate serial number on return to vendor transactions.
3552    /*Bug 6898933, 1.Added new parameter p_transaction_type_id in below procedure
3553                   2.Modified called to TrxProcessor.validateSerialNumbers by adding last parameter value*/
3554 
3555 
3556   FUNCTION validate_serialsj(
3557     p_org_id                IN            NUMBER
3558   , p_item_id               IN            NUMBER
3559   , p_qty                   IN OUT NOCOPY NUMBER
3560   , p_rev                   IN            VARCHAR2
3561   , p_lot                   IN            VARCHAR2
3562   , p_start_ser             IN            VARCHAR2
3563   , p_trx_src_id            IN            NUMBER
3564   , p_trx_action_id         IN            NUMBER
3565   , p_subinventory_code     IN            VARCHAR2
3566   , p_locator_id            IN            NUMBER
3567   , p_wip_entity_id         IN            NUMBER
3568   , p_group_mark_id         IN            NUMBER
3569   , p_line_mark_id          IN            NUMBER
3570   , p_issue_receipt         IN            VARCHAR2
3571   , x_end_ser               IN OUT NOCOPY VARCHAR2
3572   , x_proc_msg              OUT NOCOPY    VARCHAR2
3573   , p_check_for_grp_mark_id IN            VARCHAR2
3574   , p_rcv_validate          IN            VARCHAR2
3575   , p_rcv_source_line_id    IN            NUMBER
3576   , p_xfr_org_id            IN            NUMBER -- Bug#4153297
3577   , p_rcv_parent_txn_id     IN            NUMBER
3578   , p_transaction_type_id   IN            NUMBER
3579   , p_ship_header_id        IN            NUMBER -- Bug 14778131
3580   )   --Bug# 2656316
3581     RETURN NUMBER AS
3582     LANGUAGE JAVA
3583     NAME 'oracle.apps.inv.transaction.server.TrxProcessor.validateSerialNumbers(java.lang.Long,
3584                                                 java.lang.Long,
3585                                                 java.lang.Integer[],
3586                                                 java.lang.String,
3587                                                 java.lang.String,
3588                                                 java.lang.String,
3589                                                 java.lang.Integer,
3590                                                 java.lang.Integer,
3591                                                 java.lang.String,
3592                                                 java.lang.Long,
3593                                                 java.lang.Long,
3594                                                 java.lang.Long,
3595                                                 java.lang.Long,
3596                                                 java.lang.String,
3597                                                 java.lang.String[],
3598                                                 java.lang.String[],
3599                                                 java.lang.String,
3600                                                 java.lang.String,
3601                                                 java.lang.Long,
3602                                                 java.lang.Long,
3603                                                 java.lang.Long,
3604                                                 java.lang.Integer,
3605                                                 java.lang.Long
3606                                                 ) return java.lang.Integer';   --Bug# 2656316
3607 --Bug#4153297
3608 --
3609 -- Bug 3194093 added two more parameters to the below function
3610 -- validate_serials() and to the above function validate_serialsj()
3611 -- p_rcv_validate,p_rcv_shipment_line_id to support serial
3612 -- validation for intransit receipt transactions
3613 -- applicable for Inter-org,Internal sales order Intransit txns
3614 -- Bug 3384652 Changing the param name p_rcv_shipment_line_id to
3615 -- p_rcv_source_line_id.And the value passed to this is either
3616 -- shipment_line_id or ram_line_id depending on the transaction
3617 -- Source type and action.To support serial validation for RMA
3618 -- Bug 7541512, added p_rcv_parent_txn_id to validate serial numbers
3619 -- on return to vendor transactions.
3620  /* Bug 6898933  Added new parameter p_transaction_type_id in below procedure */
3621 -- Bug 14778131, added a new parameter p_ship_header_id to validate
3622 -- serial number while doing the deliver from mobile .
3623 -- Also passing the rcv Validate as M to make sure that the code is called
3624 -- from mobile only
3625 
3626   FUNCTION validate_serials(
3627     p_org_id                IN            NUMBER
3628   , p_item_id               IN            NUMBER
3629   , p_qty                   IN OUT NOCOPY NUMBER
3630   , p_rev                   IN            VARCHAR2 DEFAULT NULL
3631   , p_lot                   IN            VARCHAR2 DEFAULT NULL
3632   , p_start_ser             IN            VARCHAR2
3633   , p_trx_src_id            IN            NUMBER DEFAULT NULL
3634   , p_trx_action_id         IN            NUMBER DEFAULT NULL
3635   , p_subinventory_code     IN            VARCHAR2 DEFAULT NULL
3636   , p_locator_id            IN            NUMBER DEFAULT NULL
3637   , p_wip_entity_id         IN            NUMBER DEFAULT NULL
3638   , p_group_mark_id         IN            NUMBER DEFAULT NULL
3639   , p_line_mark_id          IN            NUMBER DEFAULT NULL
3640   , p_issue_receipt         IN            VARCHAR2 DEFAULT NULL
3641   , x_end_ser               IN OUT NOCOPY VARCHAR2
3642   , x_proc_msg              OUT NOCOPY    VARCHAR2
3643   , p_check_for_grp_mark_id IN            VARCHAR2
3644   , p_rcv_validate          IN            VARCHAR2 DEFAULT 'N'
3645   , p_rcv_source_line_id    IN            NUMBER   DEFAULT -1
3646   , p_xfr_org_id            IN            NUMBER   DEFAULT -1 -- Bug#4153297
3647   , p_rcv_parent_txn_id     IN            NUMBER   DEFAULT -1
3648   , p_transaction_type_id   IN            NUMBER   DEFAULT 0
3649   , p_ship_header_id        IN            NUMBER -- Bug 14778131
3650   )   --Bug# 2656316
3651     RETURN NUMBER AS
3652     ret_number       NUMBER := 0;
3653     local_locator_id NUMBER;
3654     l_debug          NUMBER := NVL(fnd_profile.VALUE('INV_DEBUG_TRACE'), 0);
3655   BEGIN
3656     IF (l_debug = 1) THEN
3657       inv_trx_util_pub.TRACE('About to call VALIDATE_SERIALSJ ', 'VALIDATE_SERIALS', 9);
3658     END IF;
3659 
3660     /* Bug 6898933 : passed new parameter p_transaction_type_id in below call */
3661         ret_number  :=
3662       validate_serialsj(
3663         p_org_id                     => p_org_id
3664       , p_item_id                    => p_item_id
3665       , p_qty                        => p_qty
3666       , p_rev                        => p_rev
3667       , p_lot                        => p_lot
3668       , p_start_ser                  => p_start_ser
3669       , p_trx_src_id                 => p_trx_src_id
3670       , p_trx_action_id              => p_trx_action_id
3671       , p_subinventory_code          => p_subinventory_code
3672       , p_locator_id                 => p_locator_id
3673       , p_wip_entity_id              => p_wip_entity_id
3674       , p_group_mark_id              => p_group_mark_id
3675       , p_line_mark_id               => p_line_mark_id
3676       , p_issue_receipt              => p_issue_receipt
3677       , x_end_ser                    => x_end_ser
3678       , x_proc_msg                   => x_proc_msg
3679       , p_check_for_grp_mark_id      => p_check_for_grp_mark_id   --Bug# 2656316
3680       , p_rcv_validate               => p_rcv_validate
3681       , p_rcv_source_line_id         => p_rcv_source_line_id
3682       , p_xfr_org_id                 => p_xfr_org_id
3683       , p_rcv_parent_txn_id          => p_rcv_parent_txn_id
3684       , p_transaction_type_id        => p_transaction_type_id
3685       , p_ship_header_id             => p_ship_header_id   -- Bug 14778131
3686       );
3687 
3688     IF (l_debug = 1) THEN
3689       inv_trx_util_pub.TRACE('Returned from VALIDATE_SERIALSJ ', 'VALIDATE_SERIALS', 9);
3690     END IF;
3691 
3692     RETURN ret_number;
3693   END validate_serials;
3694 
3695 
3696   FUNCTION increment_ser_num(p_curr_serial VARCHAR2, p_inc_value NUMBER) RETURN VARCHAR2 IS
3697     LANGUAGE JAVA NAME 'oracle.apps.inv.transaction.server.TrxProcessor.incrementSerNum(
3698                           java.lang.String
3699                         , java.lang.Long
3700                         ) return java.lang.String' ;
3701 
3702       --Procedure for validating and updating serial attributes.
3703       PROCEDURE validate_update_serial_att
3704       (x_return_status         OUT NOCOPY VARCHAR2,
3705        x_msg_count             OUT NOCOPY NUMBER,
3706        x_msg_data              OUT NOCOPY VARCHAR2,
3707        x_validation_status     OUT NOCOPY VARCHAR2,
3708        p_serial_number         IN  VARCHAR2,
3709        p_organization_id       IN  NUMBER,
3710        p_inventory_item_id     IN  NUMBER,
3711        p_serial_att_tbl    IN  inv_lot_sel_attr.lot_sel_attributes_tbl_type,
3712        p_validate_only         IN  BOOLEAN
3713        ) IS
3714           l_attributes_name VARCHAR2(50) := 'Serial Attributes';
3715           v_flexfield     fnd_dflex.dflex_r;
3716           v_flexinfo      fnd_dflex.dflex_dr;
3717           v_contexts      fnd_dflex.contexts_dr;
3718           v_segments      fnd_dflex.segments_dr;
3719           l_attributes_default_count NUMBER;
3720           l_enabled_attributes NUMBER;
3721           l_attributes_default INV_LOT_SEL_ATTR.Lot_Sel_Attributes_Tbl_Type;
3722           v_context_value mtl_flex_context.descriptive_flex_context_code%type;
3723           v_colName VARCHAR2(50);
3724           l_context_value VARCHAR2(150);
3725           l_return_status VARCHAR2(1);
3726           l_msg_data VARCHAR2(255);
3727           l_msg_count NUMBER;
3728           l_validation_status VARCHAR2(1);
3729           l_status BOOLEAN;
3730           l_count NUMBER := 0;
3731           l_rs_lot_attr_category VARCHAR2(30);
3732           l_st_lot_attr_category VARCHAR2(30);
3733           l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
3734       BEGIN
3735          IF (l_debug = 1) THEN
3736             invtrace('VALIDATE_UPDATE_SERIAL_ATT:Entered...');
3737          END IF;
3738 
3739          x_return_status := FND_API.G_RET_STS_SUCCESS;
3740 
3741          FND_MSG_PUB.Count_And_Get( p_count => x_msg_count, p_data => x_msg_data);
3742 
3743          IF (l_debug = 1) THEN
3744             invtrace('VALIDATE_UPDATE_SERIAL_ATT:p_inventory_item_id='||p_inventory_item_id);
3745             invtrace('VALIDATE_UPDATE_SERIAL_ATT:p_organization_id='||p_organization_id);
3746             invtrace('VALIDATE_UPDATE_SERIAL_ATT:p_serial_number='||p_serial_number);
3747          END IF;
3748 
3749          -- call to see if the Serial attributes is enabled for this item/org/category combination
3750          l_enabled_attributes := INV_LOT_SEL_ATTR.is_enabled(p_flex_name => l_attributes_name,
3751                                                              p_organization_id => p_organization_id,
3752                                                              p_inventory_item_id => p_inventory_item_id);
3753          IF (l_debug = 1) THEN
3754             invtrace('VALIDATE_UPDATE_SERIAL_ATT:l_enabled_attributes='||l_enabled_attributes);
3755          END IF;
3756          --bug9507720,if serial number attribute is not enabled,we should not do the attribute validation,
3757          --for the huge serial numbers,it cause the performance bottlenecks.
3758          IF (l_enabled_attributes = 0) THEN
3759             RETURN;
3760          END IF;
3761 
3762          --Populate serial attribute columns
3763 
3764          populateattributescolumn;
3765 
3766          IF (p_serial_att_tbl.COUNT <> 0 ) THEN
3767             -- derived from the start lot attributes
3768             FOR i IN 1..p_serial_att_tbl.COUNT LOOP
3769                FOR j IN 1..g_serial_attributes_tbl.COUNT LOOP
3770                    --bug9507720,since g_serial_attribute_tbl.column_name
3771                   -- and p_serial_att_tbl.column_name are populated with the same value,
3772                   -- use UPPER function causing the performance,just remove this function.
3773                   IF (g_serial_attributes_tbl(j).COLUMN_NAME = p_serial_att_tbl(i).COLUMN_NAME ) THEN
3774                      IF (l_debug = 1) THEN
3775                         invtrace('VALIDATE_UPDATE_SERIAL_ATT:'||g_serial_attributes_tbl(j).COLUMN_NAME);
3776                      END IF;
3777                      g_serial_attributes_tbl(j).COLUMN_VALUE := p_serial_att_tbl(i).COLUMN_VALUE;
3778                      IF (l_debug = 1) THEN
3779                         invtrace('VALIDATE_UPDATE_SERIAL_ATT:'||g_serial_attributes_tbl(j).COLUMN_NAME||':'||g_serial_attributes_tbl(j).COLUMN_VALUE);
3780                      END IF;
3781                   END IF;
3782                   EXIT WHEN (g_serial_attributes_tbl(j).COLUMN_NAME = p_serial_att_tbl(i).COLUMN_NAME);
3783                END LOOP;
3784             END LOOP;
3785          END IF;
3786 
3787          IF (l_debug = 1) THEN
3788             invtrace('VALIDATE_UPDATE_SERIAL_ATT:Calling inv_lot_sel_attr.get_default...');
3789          END IF;
3790 
3791          inv_lot_sel_attr.get_default(x_attributes_default         => l_attributes_default,
3792                                       x_attributes_default_count   => l_attributes_default_count,
3793                                       x_return_status              => l_return_status,
3794                                       x_msg_count                  => l_msg_count,
3795                                       x_msg_data                   => x_msg_data,
3796                                       p_table_name                 => 'MTL_SERIAL_NUMBERS',
3797                                       p_attributes_name            => 'Serial Attributes',
3798                                       p_inventory_item_id          => p_inventory_item_id,
3799                                       p_organization_id            => p_organization_id,
3800                                       p_lot_serial_number          => p_serial_number,
3801                                       p_attributes                 => g_serial_attributes_tbl);
3802 
3803          IF ( l_return_status <> FND_API.G_RET_STS_SUCCESS ) THEN
3804             x_validation_status := 'N';
3805             x_return_status := l_return_status;
3806             RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3807          END IF;
3808 
3809          IF (l_debug = 1) THEN
3810             invtrace('VALIDATE_UPDATE_SERIAL_ATT:l_attributes_default_count='||l_attributes_default_count);
3811          END IF;
3812 
3813          IF (l_attributes_default_count > 0) THEN
3814             FOR i IN 1..l_attributes_default_count LOOP
3815                FOR j IN 1..g_serial_attributes_tbl.COUNT LOOP
3816                   IF (Upper(l_attributes_default(i).COLUMN_NAME) = Upper(g_serial_attributes_tbl(j).COLUMN_NAME)
3817                       AND l_attributes_default(i).COLUMN_VALUE IS NOT NULL) THEN
3818                      IF (l_debug = 1) THEN
3819                         invtrace('VALIDATE_UPDATE_SERIAL_ATT:g_serial_attributes_tbl(j).COLUMN_VALUE='||g_serial_attributes_tbl(j).COLUMN_VALUE);
3820                         invtrace('VALIDATE_UPDATE_SERIAL_ATT:l_attributes_default(i).COLUMN_VALUE='||l_attributes_default(i).column_value);
3821                      END IF;
3822 
3823                      IF (g_serial_attributes_tbl(j).COLUMN_VALUE IS NULL) THEN
3824                         g_serial_attributes_tbl(j).COLUMN_VALUE := l_attributes_default(i).COLUMN_VALUE;
3825                      END IF;
3826 
3827                      g_serial_attributes_tbl(j).REQUIRED := l_attributes_default(i).REQUIRED;
3828 
3829                   END IF;
3830                   EXIT WHEN (Upper(l_attributes_default(i).COLUMN_NAME) = Upper(g_serial_attributes_tbl(j).COLUMN_NAME));
3831                END LOOP;
3832       END LOOP;
3833          END IF;
3834 
3835          IF (l_debug = 1) THEN
3836             invtrace('VALIDATE_UPDATE_SERIAL_ATT:Calling fnd_dflex.get_flexfield...');
3837          END IF;
3838          -- Get flexfield
3839          fnd_dflex.get_flexfield('INV', l_attributes_name, v_flexfield, v_flexinfo);
3840 
3841          IF (l_debug = 1) THEN
3842             invtrace('VALIDATE_UPDATE_SERIAL_ATT:Calling fnd_dflex.get_context...');
3843          END IF;
3844          -- Get Contexts
3845          l_context_value := NULL;
3846          fnd_dflex.get_contexts(v_flexfield, v_contexts);
3847 
3848          FOR i IN 1..g_serial_attributes_tbl.COUNT LOOP
3849             IF (Upper(g_serial_attributes_tbl(i).COLUMN_NAME) = 'SERIAL_ATTRIBUTE_CATEGORY'
3850                 AND g_serial_attributes_tbl(i).column_value IS NULL ) THEN
3851                inv_lot_sel_attr.get_context_code(l_context_value, p_organization_id,p_inventory_item_id,l_attributes_name);
3852                g_serial_attributes_tbl(i).column_value := l_context_value;
3853              ELSE
3854                l_context_value :=  g_serial_attributes_tbl(i).column_value;
3855             END IF;
3856             EXIT WHEN (Upper(g_serial_attributes_tbl(i).COLUMN_NAME) = 'SERIAL_ATTRIBUTE_CATEGORY');
3857          END LOOP;
3858 
3859          IF (l_debug = 1) THEN
3860             invtrace('VALIDATE_UPDATE_SERIAL_ATT:l_context_value='||l_context_value);
3861          END IF;
3862 
3863          IF ( (l_enabled_attributes = 0 ) OR ( l_context_value is null)) then
3864 
3865             IF (l_debug = 1) THEN
3866                invtrace('VALIDATE_UPDATE_SERIAL_ATT:l_context is null, attr enabaled=0');
3867             END IF;
3868 
3869             l_validation_status := 'Y';
3870             x_msg_count := 0;
3871             x_msg_data := NULL;
3872           ELSE --IF ( (l_enabled_attributes = 0 ) OR ( l_context_value is null)) then
3873             IF (l_debug = 1) THEN
3874                invtrace('VALIDATE_UPDATE_SERIAL_ATT:Calling fnd_flex_descval.set_context_value...');
3875             END IF;
3876 
3877             fnd_flex_descval.set_context_value(l_context_value);
3878 
3879             IF (l_debug = 1) THEN
3880                invtrace('VALIDATE_UPDATE_SERIAL_ATT:Calling fnd_flex_descval.clear_column_values...');
3881             END IF;
3882 
3883             fnd_flex_descval.clear_column_values;
3884 
3885             IF (l_debug = 1) THEN
3886                invtrace('VALIDATE_UPDATE_SERIAL_ATT:Calling fnd_flex_descval.set_column_values SERIAL_ATTRIBUTE_CATEGORY='||l_context_value);
3887             END IF;
3888 
3889             fnd_flex_descval.set_column_value('SERIAL_ATTRIBUTE_CATEGORY', l_context_value);
3890 
3891             -- Setting the Values for Validating
3892             IF (l_debug = 1) THEN
3893                invtrace('VALIDATE_UPDATE_SERIAL_ATT:g_serial_attributes_tbl.COUNT='||g_serial_attributes_tbl.COUNT);
3894             END IF;
3895 
3896             FOR i IN 1..v_contexts.ncontexts LOOP
3897                IF (v_contexts.is_enabled(i) AND ((UPPER(v_contexts.context_code(i)) = UPPER(l_context_value)) OR
3898                                                  v_contexts.is_global(i))) THEN
3899                   -- Get segments
3900                   IF (l_debug = 1) THEN
3901                      invtrace('VALIDATE_UPDATE_SERIAL_ATT:Calling fnd_dflex.get_segments...');
3902                   END IF;
3903 
3904                   fnd_dflex.get_segments(fnd_dflex.make_context(v_flexfield, v_contexts.context_code(i)), v_segments, TRUE);
3905                   <<segmentLoop>>
3906                     FOR j IN 1..v_segments.nsegments LOOP
3907                        IF v_segments.is_enabled(j) THEN
3908                           v_colName := v_segments.application_column_name(j);
3909 
3910                           IF (l_debug = 1) THEN
3911                              invtrace('VALIDATE_UPDATE_SERIAL_ATT:v_colName='||v_colName);
3912                           END IF;
3913 
3914                           <<columnLoop>>
3915                             FOR k IN 1..g_serial_attributes_tbl.COUNT LOOP
3916                                IF UPPER(v_colName) = UPPER(g_serial_attributes_tbl(k).column_name) THEN
3917                                   IF (l_debug = 1) THEN
3918                                      invtrace('VALIDATE_UPDATE_SERIAL_ATT:'||g_serial_attributes_tbl(k).Column_name);
3919                                   END IF;
3920                                   -- Sets the Values for Validation
3921                                   -- Setting the column data type for validation
3922                                   IF g_serial_attributes_tbl(k).column_type = 'DATE' THEN
3923                                      IF (l_debug = 1) THEN
3924                                         invtrace('VALIDATE_UPDATE_SERIAL_ATT:set_column_value='||g_serial_attributes_tbl(k).column_value);
3925                                      END IF;
3926                                      fnd_flex_descval.set_column_value(g_serial_attributes_tbl(k).column_name,
3927                                                                        fnd_date.canonical_to_date(fnd_date.date_to_canonical(g_serial_attributes_tbl(k).column_value)));
3928                                   END IF;
3929 
3930                                   IF g_serial_attributes_tbl(k).column_type = 'NUMBER' THEN
3931                                      IF (l_debug = 1) THEN
3932                                         invtrace('VALIDATE_UPDATE_SERIAL_ATT:set_column_value='||g_serial_attributes_tbl(k).column_value);
3933                                      END IF;
3934                                      fnd_flex_descval.set_column_value(g_serial_attributes_tbl(k).column_name,
3935                                                                        To_number(g_serial_attributes_tbl(k).column_value));
3936                                   END IF;
3937 
3938                                   IF g_serial_attributes_tbl(k).column_type = 'VARCHAR2' THEN
3939                                      IF (l_debug = 1) THEN
3940                                         invtrace('VALIDATE_UPDATE_SERIAL_ATT:set_column_value='||g_serial_attributes_tbl(k).column_value);
3941                                      END IF;
3942                                      fnd_flex_descval.set_column_value(g_serial_attributes_tbl(k).column_name,
3943                                                                        g_serial_attributes_tbl(k).column_value);
3944                                   END IF;
3945 
3946                                   IF (v_segments.is_required(j)) THEN
3947                                      IF (g_serial_attributes_tbl(k).COLUMN_VALUE IS NULL) THEN
3948                                         IF (l_debug = 1) THEN
3949                                            invtrace('VALIDATE_UPDATE_SERIAL_ATT:'||g_serial_attributes_tbl(k).COLUMN_NAME||':'||g_serial_attributes_tbl(k).COLUMN_VALUE);
3950                                         END IF;
3951                                         fnd_message.set_name('INV', 'INV_LOT_SEL_DEFAULT_REQUIRED');
3952                                         fnd_message.set_token('ATTRNAME',l_attributes_name);
3953                                         fnd_message.set_token('CONTEXTCODE', v_contexts.context_code(i));
3954                                         fnd_message.set_token('SEGMENT', v_segments.application_column_name(j));
3955                                         fnd_msg_pub.ADD;
3956                                      END IF;
3957                                   END IF;
3958                                END IF;
3959                                EXIT when (Upper(v_colName) = Upper(g_serial_attributes_tbl(k).column_name));
3960                             END LOOP;
3961                        END IF;
3962                     END LOOP;
3963                END IF;
3964             END LOOP;
3965             -- Call the  validating routine for Lot Attributes.
3966 
3967             IF (l_debug = 1) THEN
3968                invtrace('VALIDATE_UPDATE_SERIAL_ATT:Calling fnd_flex_descval.validate_desccols...');
3969             END IF;
3970             l_status := fnd_flex_descval.validate_desccols(appl_short_name => 'INV',
3971                                                            desc_flex_name => l_attributes_name);
3972             IF l_status = TRUE then
3973                IF (l_debug = 1) THEN
3974                   invtrace('VALIDATE_UPDATE_SERIAL_ATT:l_status is TRUE');
3975                END IF;
3976                l_validation_status := 'Y';
3977              ELSE
3978                IF (l_debug = 1) THEN
3979                   invtrace('VALIDATE_UPDATE_SERIAL_ATT:l_status is FALSE');
3980                END IF;
3981                l_validation_status := 'N';
3982                x_return_status := FND_API.G_RET_STS_ERROR ;
3983                x_msg_data := fnd_flex_descval.error_message;
3984                fnd_message.set_name('INV', 'GENERIC');
3985                fnd_message.set_token('MSGBODY', x_msg_data );
3986                fnd_msg_pub.ADD;
3987                x_msg_count := nvl(x_msg_count,0) + 1 ;
3988                RAISE FND_API.G_EXC_ERROR;
3989             END IF;
3990          END IF; -- if l_context_value is not null
3991 
3992          x_validation_status := l_validation_status;
3993 
3994          -- if validation passed then update the attributes.
3995 
3996          IF (l_debug = 1) THEN
3997             invtrace('VALIDATE_UPDATE_SERIAL_ATT:Updating the Attributes...');
3998          END IF;
3999 
4000          IF l_validation_status = 'Y' THEN
4001             IF NOT p_validate_only THEN
4002                UPDATE mtl_serial_numbers
4003                  SET serial_attribute_category = g_serial_attributes_tbl(1).COLUMN_VALUE
4004                  , origination_date = fnd_date.canonical_to_date(fnd_date.date_to_canonical(g_serial_attributes_tbl(2).COLUMN_VALUE))
4005                  , c_attribute1  = g_serial_attributes_tbl(3).COLUMN_VALUE
4006                  , c_attribute2  = g_serial_attributes_tbl(4).COLUMN_VALUE
4007                  , c_attribute3  = g_serial_attributes_tbl(5).COLUMN_VALUE
4008                  , c_attribute4  = g_serial_attributes_tbl(6).COLUMN_VALUE
4009                  , c_attribute5  = g_serial_attributes_tbl(7).COLUMN_VALUE
4010                  , c_attribute6  = g_serial_attributes_tbl(8).COLUMN_VALUE
4011                  , c_attribute7  = g_serial_attributes_tbl(9).COLUMN_VALUE
4012                  , c_attribute8  = g_serial_attributes_tbl(10).COLUMN_VALUE
4013                  , c_attribute9  = g_serial_attributes_tbl(11).COLUMN_VALUE
4014                  , c_attribute10 = g_serial_attributes_tbl(12).COLUMN_VALUE
4015                  , c_attribute11 = g_serial_attributes_tbl(13).COLUMN_VALUE
4016                  , c_attribute12 = g_serial_attributes_tbl(14).COLUMN_VALUE
4017                  , c_attribute13 = g_serial_attributes_tbl(15).COLUMN_VALUE
4018                  , c_attribute14 = g_serial_attributes_tbl(16).COLUMN_VALUE
4019                  , c_attribute15 = g_serial_attributes_tbl(17).COLUMN_VALUE
4020                  , c_attribute16 = g_serial_attributes_tbl(18).COLUMN_VALUE
4021                  , c_attribute17 = g_serial_attributes_tbl(19).COLUMN_VALUE
4022                  , c_attribute18 = g_serial_attributes_tbl(20).COLUMN_VALUE
4023                  , c_attribute19 = g_serial_attributes_tbl(21).COLUMN_VALUE
4024                  , c_attribute20 = g_serial_attributes_tbl(22).COLUMN_VALUE
4025                  , d_attribute1  = fnd_date.canonical_to_date(fnd_date.date_to_canonical(g_serial_attributes_tbl(23).COLUMN_VALUE))
4026                  , d_attribute2  = fnd_date.canonical_to_date(fnd_date.date_to_canonical(g_serial_attributes_tbl(24).COLUMN_VALUE))
4027                  , d_attribute3  = fnd_date.canonical_to_date(fnd_date.date_to_canonical(g_serial_attributes_tbl(25).COLUMN_VALUE))
4028                  , d_attribute4  = fnd_date.canonical_to_date(fnd_date.date_to_canonical(g_serial_attributes_tbl(26).COLUMN_VALUE))
4029                  , d_attribute5  = fnd_date.canonical_to_date(fnd_date.date_to_canonical(g_serial_attributes_tbl(27).COLUMN_VALUE))
4030                  , d_attribute6  = fnd_date.canonical_to_date(fnd_date.date_to_canonical(g_serial_attributes_tbl(28).COLUMN_VALUE))
4031                  , d_attribute7  = fnd_date.canonical_to_date(fnd_date.date_to_canonical(g_serial_attributes_tbl(29).COLUMN_VALUE))
4032                  , d_attribute8  = fnd_date.canonical_to_date(fnd_date.date_to_canonical(g_serial_attributes_tbl(30).COLUMN_VALUE))
4033                  , d_attribute9  = fnd_date.canonical_to_date(fnd_date.date_to_canonical(g_serial_attributes_tbl(31).COLUMN_VALUE))
4034                  , d_attribute10 = fnd_date.canonical_to_date(fnd_date.date_to_canonical(g_serial_attributes_tbl(32).COLUMN_VALUE))
4035                  , n_attribute1  = to_number(g_serial_attributes_tbl(33).COLUMN_VALUE)
4036                  , n_attribute2  = to_number(g_serial_attributes_tbl(34).COLUMN_VALUE)
4037                  , n_attribute3  = to_number(g_serial_attributes_tbl(35).COLUMN_VALUE)
4038                  , n_attribute4  = to_number(g_serial_attributes_tbl(36).COLUMN_VALUE)
4039                  , n_attribute5  = to_number(g_serial_attributes_tbl(37).COLUMN_VALUE)
4040                  , n_attribute6  = to_number(g_serial_attributes_tbl(38).COLUMN_VALUE)
4041                  , n_attribute7  = to_number(g_serial_attributes_tbl(39).COLUMN_VALUE)
4042                  , n_attribute8  = to_number(g_serial_attributes_tbl(40).COLUMN_VALUE)
4043                  , n_attribute9  = to_number(g_serial_attributes_tbl(41).COLUMN_VALUE)
4044                  , n_attribute10 = to_number(g_serial_attributes_tbl(42).COLUMN_VALUE)
4045                  , status_id = Nvl(to_number(g_serial_attributes_tbl(43).COLUMN_VALUE),status_id)
4046                  , territory_code = g_serial_attributes_tbl(44).COLUMN_VALUE
4047 				 , attribute_category = g_serial_attributes_tbl(45).COLUMN_VALUE
4048                  , attribute1  = g_serial_attributes_tbl(46).COLUMN_VALUE
4049                  , attribute2  = g_serial_attributes_tbl(47).COLUMN_VALUE
4050                  , attribute3  = g_serial_attributes_tbl(48).COLUMN_VALUE
4051                  , attribute4  = g_serial_attributes_tbl(49).COLUMN_VALUE
4052                  , attribute5  = g_serial_attributes_tbl(50).COLUMN_VALUE
4053                  , attribute6  = g_serial_attributes_tbl(51).COLUMN_VALUE
4054                  , attribute7  = g_serial_attributes_tbl(52).COLUMN_VALUE
4055                  , attribute8  = g_serial_attributes_tbl(53).COLUMN_VALUE
4056                  , attribute9  = g_serial_attributes_tbl(54).COLUMN_VALUE
4057                  , attribute10 = g_serial_attributes_tbl(55).COLUMN_VALUE
4058                  , attribute11 = g_serial_attributes_tbl(56).COLUMN_VALUE
4059                  , attribute12 = g_serial_attributes_tbl(57).COLUMN_VALUE
4060                  , attribute13 = g_serial_attributes_tbl(58).COLUMN_VALUE
4061                  , attribute14 = g_serial_attributes_tbl(59).COLUMN_VALUE
4062                  , attribute15 = g_serial_attributes_tbl(60).COLUMN_VALUE
4063                  WHERE inventory_item_id = p_inventory_item_id
4064                  AND serial_number = p_serial_number
4065                  AND current_organization_id = p_organization_id;
4066             END IF; -- IF NOT p_validate_only THEN
4067          END IF; --IF l_validation_status = 'Y' THEN
4068 
4069          IF (l_debug = 1) THEN
4070             invtrace('VALIDATE_UPDATE_SERIAL_ATT:Exitting...');
4071          END IF;
4072 
4073       EXCEPTION
4074          WHEN FND_API.G_EXC_ERROR THEN
4075             x_validation_status := l_validation_status;
4076             x_return_status := FND_API.G_RET_STS_ERROR;
4077             FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
4078          WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
4079             x_validation_status := l_validation_status;
4080             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4081             FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
4082          WHEN OTHERS THEN
4083             x_validation_status := l_validation_status;
4084             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4085             IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
4086                FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME,'Validate_Attributes');
4087             END IF;
4088             FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data => x_msg_data);
4089       END validate_update_serial_att;
4090 
4091 FUNCTION SNGetMask(P_txn_act_id          IN      NUMBER,
4092                    P_txn_src_type_id     IN      NUMBER,
4093                    P_serial_control      IN      NUMBER,
4094                    x_to_status           OUT NOCOPY    NUMBER,
4095                    x_dynamic_ok          OUT NOCOPY    NUMBER,
4096                    P_receipt_issue_flag  IN      VARCHAR2,
4097                    x_mask                OUT NOCOPY    VARCHAR2,
4098                    x_errorcode           OUT NOCOPY    NUMBER)
4099                    RETURN BOOLEAN IS
4100    --
4101    TYPE L_mask_tab IS TABLE OF VARCHAR2(17)
4102         INDEX BY BINARY_INTEGER;
4103    L_sn_mask  L_mask_tab;
4104    L_group NUMBER := 0;
4105    --
4106 BEGIN
4107    x_errorcode := 0;
4108    x_to_status := 0;
4109    x_dynamic_ok := 0;
4110 
4111   -- Bug 7427382, Modified the sn_mask array table to include statuses 6, 7 and 8 also.
4112   -- Bug 11699122 Modified L_sn_mask(7) from 'R0110001001000003' to 'R0110001001001003'
4113   --              to handle Direct Delivery txns against POs.
4114 
4115    L_sn_mask(1) := 'I0110100010000004';
4116    L_sn_mask(2) := 'I0000011010000014';
4117    L_sn_mask(3) := 'R0110001001000003';
4118    L_sn_mask(4) := 'R0000101991000013';
4119    L_sn_mask(5) := 'R0000011001000011';
4120    L_sn_mask(6) := '00000000000000000';
4121    L_sn_mask(7) := 'R0110001001001003';
4122    L_sn_mask(8) := 'R0000101001000013';
4123    L_sn_mask(9) := 'I0110100010000004';
4124    L_sn_mask(10):= '00000000000000000';
4125    L_sn_mask(11):= 'R0110110011000003';
4126    L_sn_mask(12):= 'I0110110010000004';
4127    L_sn_mask(13):= '00000000000000000';
4128    L_sn_mask(14):= 'R0110001001101003';
4129    L_sn_mask(15):= 'R0000101001101013';
4130    L_sn_mask(16):= 'I0110100010000005';
4131    L_sn_mask(17):= '00000000000000000';
4132    /*---------------------------------------------------------------------
4133    | Determine which group the transactions to.  the value of
4134    |  group will be used to provide the appropriate offset in the sn_mask
4135    |  array table
4136    +----------------------------------------------------------------------*/
4137    -- Sales Order [SO] - 2
4138    -- RMA              - 12
4139    -- SO RMA GROUP     - 0
4140    IF P_txn_src_type_id in (2,12) then
4141        L_group := 0;
4142    ELSE
4143       IF P_txn_act_id = 2 THEN                -- SUBXFR
4144          L_group := 10 ;                      -- SUB_XFER_GROUP
4145       ELSIF P_txn_act_id IN ( 12, 21 ) THEN   -- INTERECEIPT(12) or INTSHIP(21)
4146          L_group := 13 ;                      -- INTRANS_GROUP
4147       ELSE                                    -- Default Value
4148          L_group := 6 ;                       -- STD_GROUP
4149       END IF;
4150    END IF;
4151    L_group := L_group + 1;    -- It starts from 0th position, just to avoid
4152    x_mask := L_sn_mask(L_group);
4153    /*---------------------------------------------------------------------
4154    | Match up the transaction with the appropriate mas and get the assigned
4155    | status.  If there is no match, then to_status will still be zero after
4156    | the loop
4157    +-----------------------------------------------------------------------*/
4158    WHILE ( substr(x_mask,1,1) <> '0' )
4159    LOOP
4160       if ( substr(x_mask,1,1) = P_receipt_issue_flag ) AND
4161          ( substr(x_mask,P_serial_control+1,1) = '1' ) then
4162          x_to_status := to_number(substr(x_mask,17,1));  -- get the 17th character from mask
4163          x_dynamic_ok := to_number(substr(x_mask,16,1)); -- get the 16th character from mask
4164          exit;
4165       end if;
4166       L_group := L_group + 1;  -- go to next mask group
4167       x_mask := L_sn_mask(L_group);
4168    END LOOP;
4169 
4170    IF x_to_status = 0  then
4171       FND_MESSAGE.SET_NAME('INV', 'INV_INLTIS_SNGETMASK');
4172       FND_MSG_PUB.Add;
4173       x_errorcode := 123;
4174       return(FALSE);
4175    ELSE
4176       return(TRUE);
4177    END IF;
4178 
4179 EXCEPTION
4180    WHEN OTHERS THEN
4181      x_errorcode := -1;
4182      return(FALSE);
4183 END SNGetmask;
4184 
4185 PROCEDURE update_msn
4186  (x_return_status       OUT NOCOPY VARCHAR2,
4187   x_msg_count           OUT NOCOPY NUMBER,
4188   x_msg_data            OUT NOCOPY VARCHAR2,
4189    p_trxdate              IN    DATE,
4190    p_transaction_temp_id  IN    NUMBER,
4191    p_rev                  IN    VARCHAR2,
4192    p_lotnum               IN    VARCHAR2,
4193    p_orgid                IN    NUMBER,
4194    p_locid                IN    NUMBER, -- :lii,
4195    p_subinv               IN    VARCHAR2,
4196    p_trxsrctypid          IN    NUMBER,
4197    p_trxsrcid             IN    NUMBER,
4198    p_trx_act_id           IN    NUMBER,
4199    p_vendid               IN    NUMBER, -- :i_vendor_idi,
4200    p_venlot               IN    VARCHAR2,
4201    p_receipt_issue_type   IN    NUMBER,
4202    p_trxsname             IN    VARCHAR2,
4203    p_lstupdby             IN    NUMBER,
4204    p_parent_item_id       IN    NUMBER, -- :parent_item_i,
4205    p_parent_ser_num       IN    VARCHAR2, -- :parent_sn_i,
4206    p_ser_ctrl_code        IN    NUMBER,
4207    p_xfr_ser_ctrl_code    IN    NUMBER,
4208    p_trx_qty              IN    NUMBER,
4209    p_invitemid            IN    NUMBER,
4210    p_f_ser_num            IN    VARCHAR2,
4211    p_t_ser_num            IN    VARCHAR2,
4212    x_serial_updated      OUT NOCOPY NUMBER
4213 
4214 ) IS
4215    l_acct_prof_value VARCHAR2(1) := '';
4216    l_qty NUMBER := 0;
4217    l_last_status NUMBER := 0;
4218    l_to_status NUMBER := 0;
4219    l_canonical_trx_date DATE;
4220    l_sys_date           DATE := SYSDATE;
4221    l_init_date          DATE := trunc(sysdate);
4222    l_cg_id              NUMBER := nvl(inv_cost_group_pub.g_cost_group_id, 0);
4223    l_upd_count          NUMBER := 0;
4224    l_receipt_issue_flag VARCHAR2(1);
4225    l_error_code         NUMBER;
4226    l_dynamic_ok         NUMBER;
4227    l_mask               VARCHAR2(17); -- Bug 7427382
4228    l_status             BOOLEAN;
4229    l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
4230 BEGIN
4231    null;
4232 
4233    IF (p_trx_act_id = inv_globals.g_action_stgxfr) THEN
4234       IF (l_debug = 1) THEN
4235          invtrace('The transaction action is staging transfer. Bulk processing of serials are not supported for this transaction');
4236 
4237       END IF;
4238       RAISE FND_API.g_exc_unexpected_error;
4239    END IF;
4240 
4241    IF nvl(fnd_profile.value('INV_RESTRICT_RCPT_SER'), '2') = '1' THEN
4242         l_acct_prof_Value := 'Y';
4243    else
4244         l_acct_prof_value := 'N';
4245    end if;
4246 
4247    if( p_trx_qty < 0 ) THEN
4248         l_qty := -1 * p_trx_qty;
4249    else
4250         l_qty := p_trx_qty;
4251    end if;
4252    IF (l_debug = 1) THEN
4253       invtrace('l_acct_prof_value = ' || l_acct_prof_value);
4254       invtrace('p_trxdate = ' || p_trxdate);
4255       invtrace('p_transaction_temp_id = ' || p_transaction_temp_id);
4256       invtrace('p_rev = ' || p_rev);
4257       invtrace('p_lotnum = ' || p_lotnum);
4258       invtrace('p_orgid = ' || p_orgid);
4259       invtrace('p_locid = ' || p_locid);
4260       invtrace('p_subinv = ' || p_subinv);
4261       invtrace('p_trxsrctypid = ' || p_trxsrctypid);
4262       invtrace('p_trxsrcid = ' || p_trxsrcid);
4263       invtrace('p_trx_act_id = ' || p_trx_act_id);
4264       invtrace('p_vendid = ' || p_vendid);
4265       invtrace('p_venlot = ' || p_venlot);
4266       invtrace('p_receipt_issue_type = ' || p_receipt_issue_type);
4267       invtrace('p_trxsname = ' || p_trxsname);
4268       invtrace('p_lstupdby = ' || p_lstupdby);
4269       invtrace('p_parent_item_id = ' || p_parent_item_id);
4270       invtrace('p_parent_Ser_num = ' || p_parent_Ser_num);
4271       invtrace('p_ser_ctrl_code = ' || p_ser_ctrl_code);
4272       invtrace('p_xfr_ser_ctrl_code = ' || p_xfr_ser_ctrl_code);
4273       invtrace('p_trx_qty = ' || p_trx_qty);
4274       invtrace('p_invitemid = ' || p_invitemid);
4275       invtrace('p_f_ser_num = ' || p_f_ser_num);
4276       invtrace('p_t_ser_num = ' || p_t_ser_num);
4277    END IF;
4278 
4279    SELECT current_status
4280    INTO l_last_status
4281    FROM mtl_serial_numbers
4282    WHERE inventory_item_id = p_invitemid
4283      AND serial_number = p_f_ser_num;
4284 
4285    IF (l_debug = 1) THEN
4286       invtrace('l_last_status = ' || l_last_status);
4287    END IF;
4288 
4289    if( p_receipt_issue_type = 1 ) THEN
4290         l_receipt_issue_flag := 'I';
4291    else
4292         l_receipt_issue_flag := 'R';
4293    end if;
4294 
4295    IF (l_debug = 1) THEN
4296       invtrace('l_receipt_issue_flag = ' || l_receipt_issue_flag);
4297    END IF;
4298 
4299    l_status := SNGetMask(p_txn_act_id => p_trx_act_id,
4300                          p_txn_src_type_id => p_trxsrctypid,
4301                          p_serial_control  => p_ser_ctrl_code,
4302                          x_to_status       => l_to_status,
4303                          x_dynamic_ok      => l_dynamic_ok,
4304                          p_receipt_issue_flag => l_receipt_issue_flag,
4305                          x_mask               => l_mask,
4306                          x_errorcode          => l_error_code) ;
4307 
4308    IF (l_debug = 1) THEN
4309       invtrace('l_mask = ' || l_mask);
4310    END IF;
4311 
4312    if( l_status = FALSE ) THEN
4313       IF (l_debug = 1) THEN
4314          invtrace('error from SNGetMask');
4315       END IF;
4316         raise FND_API.G_EXC_UNEXPECTED_ERROR;
4317    end if;
4318 
4319    IF (l_debug = 1) THEN
4320       invtrace('l_to_status is ' || l_to_status);
4321    END IF;
4322 
4323    IF( p_trx_qty < 0 AND p_trx_act_id = 2 ) THEN
4324         l_status_after_p1 := l_to_status;
4325         l_status_before_p1 := l_last_status;
4326         x_return_status := 'S';
4327         x_msg_count := 0;
4328         x_msg_data := NULL;
4329         x_serial_updated := abs(p_trx_qty);
4330         IF( MSN_UPDATE_FIRST_PASS  ) THEN
4331             MSN_UPDATE_FIRST_PASS := FALSE;
4332         END if;
4333         return;
4334    else
4335         IF msn_update_first_pass THEN
4336            l_status_after_p1 := l_last_status;
4337            l_status_before_p1 := l_last_status;
4338         end if;
4339    end if;
4340 
4341    IF (l_debug = 1) THEN
4342       invtrace('About to call fnd_date.canonical_to_date');
4343       --l_canonical_trx_date := fnd_date.canonical_to_date(p_trxdate);
4344       invtrace('After call fnd_date.canonical_to_date');
4345    END IF;
4346 
4347    if( l_to_status in (1, 6) ) THEN
4348         UPDATE MTL_SERIAL_NUMBERS MSN
4349         SET msn.current_status = l_to_status,
4350             msn.initialization_date = l_init_date,
4351             msn.completion_date = null,
4352                      msn.SHIP_DATE = NULL,
4353          msn.REVISION = NULL,
4354          msn.LOT_NUMBER = NULL,
4355          msn.GROUP_MARK_ID = NULL,
4356          msn.LINE_MARK_ID = NULL,
4357          msn.LOT_LINE_MARK_ID = NULL,
4358          msn.CURRENT_ORGANIZATION_ID = p_orgid,
4359          msn.CURRENT_LOCATOR_ID = NULL,
4360          msn.CURRENT_SUBINVENTORY_CODE = NULL,
4361          msn.ORIGINAL_WIP_ENTITY_ID = NULL,
4362          msn.ORIGINAL_UNIT_VENDOR_ID = NULL,
4363          msn.VENDOR_LOT_NUMBER = NULL,
4364          msn.LAST_RECEIPT_ISSUE_TYPE = p_receipt_issue_type,
4365          msn.LAST_TXN_SOURCE_ID =NULL,
4366          msn.LAST_TXN_SOURCE_TYPE_ID = NULL,
4367          msn.LAST_TXN_SOURCE_NAME = NULL,
4368          msn.LAST_UPDATE_DATE = l_sys_date,
4369          msn.LAST_UPDATED_BY = p_lstupdby,
4370          msn.PARENT_ITEM_ID = p_parent_item_id, -- :parent_item_i,
4371          msn.PARENT_SERIAL_NUMBER = p_parent_ser_num, -- :parent_sn_i,
4372          msn.PREVIOUS_STATUS = l_status_after_p1, -- l_last_status, -- p_last_status,
4373          msn.STATUS_ID = NULL,
4374          msn.ORGANIZATION_TYPE = 2,
4375          msn.OWNING_ORGANIZATION_ID = p_orgid,
4376          msn.OWNING_TP_TYPE = 2,
4377          msn.PLANNING_ORGANIZATION_ID = p_orgid,
4378          msn.PLANNING_TP_TYPE = 2
4379          WHERE
4380              msn.INVENTORY_ITEM_ID = p_invitemid
4381          AND msn.SERIAL_NUMBER BETWEEN p_f_ser_num AND p_t_ser_num
4382 	 AND Length(msn.serial_number) = Length(p_f_ser_num)             -- Added as part of the bug 14736743
4383          AND Length(p_f_ser_num) = Length(Nvl(p_t_ser_num,p_f_ser_num))  -- Added as part of the bug 14736743
4384          AND decode( msn.CURRENT_STATUS, 6, 1, msn.CURRENT_STATUS ) = l_status_after_p1 -- l_last_status -- p_last_status
4385          AND Nvl(msn.owning_tp_type,2) <> 1
4386          AND Nvl(msn.owning_organization_id,msn.current_organization_id) = msn.current_organization_id
4387          AND inv_serial_number_pub.valsn(
4388                 p_trxsrctypid,       -- trx_src_typ_id       IN   NUMBER,
4389                 p_trx_act_id,        -- trx_action_id        IN   NUMBER,
4390                 p_rev,               -- revision             IN   VARCHAR2,
4391                 p_subinv,            -- curr_subinv_code     IN   VARCHAR2,
4392                 p_locid, -- :lii,         -- locator_id           IN   NUMBER,
4393                 p_invitemid,         -- item                 IN   NUMBER,
4394                 p_orgid,             -- curr_org_id          IN   NUMBER,
4395                 p_lotnum,            -- lot                  IN   VARCHAR2,
4396                 msn.serial_number,  -- curr_ser_num         IN   VARCHAR2,
4397                 p_ser_ctrl_code,     -- ser_num_ctrl_code    IN   NUMBER,
4398                 p_xfr_ser_ctrl_code,
4399                 p_trx_qty,         -- trx_qty              IN   NUMBER,
4400                 l_acct_prof_value,    -- acct_prof_value      IN   VARCHAR2,
4401                 l_mask,            -- P_mask               IN   VARCHAR2,
4402                 msn.current_status,  /* db_current_status  IN   NUMBER, */
4403                 msn.current_organization_id,    -- db_current_organization_id IN   NUMBER,
4404                 msn.revision,                   -- db_revision          IN   VARCHAR2,
4405                 msn.lot_number,                 -- db_lot_number        IN   VARCHAR2,
4406                 msn.current_subinventory_code,  -- db_current_subinventory_code IN   VARCHAR2,
4407                 msn.current_locator_id,         -- db_current_locator_id IN   NUMBER,
4408                 decode( nvl( msn.original_wip_entity_id, -1 ), -1, -1 , 1 ),  -- db_wip_ent_id_ind IN  NUMBER,
4409                 msn.last_txn_source_type_id     -- db_lst_txn_src_typ_id IN NUMBER
4410          ) = l_to_status;
4411 
4412    ELSE /* To status not in 1,6 */
4413 
4414       -- l_canonical_trx_date := NULL;
4415       --l_canonical_trx_date := fnd_date.canonical_to_date( p_trxdate );
4416       --dbms_output.put_line('tostatus not in 1, 6');
4417       IF (l_debug = 1) THEN
4418          invtrace( 'To Status not in 1,6');
4419       END IF;
4420 
4421       UPDATE  MTL_SERIAL_NUMBERS msn
4422       SET
4423          msn.CURRENT_STATUS = l_to_status, -- p_current_status,
4424          msn.COMPLETION_DATE = NVL( msn.COMPLETION_DATE, p_trxdate ),
4425          msn.SHIP_DATE = DECODE( l_to_status, 3, NULL, NVL( msn.SHIP_DATE, p_trxdate ) ),
4426          msn.REVISION = DECODE( l_last_status, 3, msn.REVISION, p_rev ),
4427          msn.LOT_NUMBER = DECODE( l_last_status, 3, msn.LOT_NUMBER, p_lotnum ),
4428          msn.CURRENT_ORGANIZATION_ID = p_orgid,
4429          msn.CURRENT_LOCATOR_ID = p_locid, -- :lii,
4430          msn.CURRENT_SUBINVENTORY_CODE = p_subinv,
4431          msn.ORIGINAL_WIP_ENTITY_ID = decode( p_trxsrctypid, 5, p_trxsrcid, 2, NULL, msn.ORIGINAL_WIP_ENTITY_ID ),
4432          msn.ORIGINAL_UNIT_VENDOR_ID = NVL( msn.ORIGINAL_UNIT_VENDOR_ID, p_vendid ), -- :i_vendor_idi),
4433          msn.VENDOR_LOT_NUMBER = NVL( msn.VENDOR_LOT_NUMBER,p_venlot ),
4434          msn.LAST_RECEIPT_ISSUE_TYPE = p_receipt_issue_type,
4435          msn.LAST_TXN_SOURCE_ID = p_trxsrcid,
4436          msn.LAST_TXN_SOURCE_TYPE_ID = p_trxsrctypid,
4437          msn.LAST_TXN_SOURCE_NAME = p_trxsname,
4438          msn.GROUP_MARK_ID = NULL,
4439          msn.LINE_MARK_ID = NULL,
4440          msn.LOT_LINE_MARK_ID = NULL,
4441          msn.LAST_UPDATE_DATE = l_sys_date,
4442          msn.LAST_UPDATED_BY = p_lstupdby,
4443          msn.PARENT_ITEM_ID = p_parent_item_id, -- :parent_item_i,
4444          msn.PARENT_SERIAL_NUMBER = p_parent_ser_num, -- :parent_sn_i,
4445          msn.COST_GROUP_ID =  l_cg_id,
4446          msn.ORGANIZATION_TYPE = 2,
4447          msn.OWNING_ORGANIZATION_ID = p_orgid,
4448          msn.OWNING_TP_TYPE = 2,
4449          msn.PLANNING_ORGANIZATION_ID = p_orgid,
4450          msn.PLANNING_TP_TYPE = 2
4451          WHERE
4452              msn.INVENTORY_ITEM_ID = p_invitemid
4453          AND msn.SERIAL_NUMBER BETWEEN p_f_ser_num AND p_t_ser_num
4454 	 AND Length(msn.serial_number) = Length(p_f_ser_num)             -- Added as part of the bug 14736743
4455          AND Length(p_f_ser_num) = Length(Nvl(p_t_ser_num,p_f_ser_num))  -- Added as part of the bug 14736743
4456          AND decode( msn.CURRENT_STATUS, 6, 1, msn.CURRENT_STATUS ) = l_last_status
4457          AND Nvl(msn.owning_organization_id,msn.current_organization_id) = msn.current_organization_id
4458          AND Nvl(msn.owning_tp_type,2) <> 1
4459          AND inv_serial_number_pub.valsn(
4460                 p_trxsrctypid,       -- trx_src_typ_id       IN   NUMBER,
4461                 p_trx_act_id,        -- trx_action_id        IN   NUMBER,
4462                 p_rev,               -- revision             IN   VARCHAR2,
4463                 p_subinv,            -- curr_subinv_code     IN   VARCHAR2,
4464                 p_locid, -- :lii,         -- locator_id           IN   NUMBER,
4465                 p_invitemid,         -- item                 IN   NUMBER,
4466                 p_orgid,             -- curr_org_id          IN   NUMBER,
4467                 p_lotnum,            -- lot                  IN   VARCHAR2,
4468                 msn.serial_number,  -- curr_ser_num         IN   VARCHAR2,
4469                 p_ser_ctrl_code,     -- ser_num_ctrl_code    IN   NUMBER,
4470                 nvl(p_xfr_ser_ctrl_code,1), -- p_xfr_ser_ctrl_code  IN   NUMBER
4471                 p_trx_qty,         -- trx_qty              IN   NUMBER,
4472                 l_acct_prof_value,    -- acct_prof_value      IN   VARCHAR2,
4473                 l_mask,            -- P_mask               IN   VARCHAR2,
4474                 msn.current_status,
4475                 msn.current_organization_id,    -- db_current_organization_id IN   NUMBER,
4476                 msn.revision,                   -- db_revision          IN   VARCHAR2,
4477                 msn.lot_number,                 -- db_lot_number        IN   VARCHAR2,
4478                 msn.current_subinventory_code,  -- db_current_subinventory_code IN   VARCHAR2,
4479                 msn.current_locator_id,         -- db_current_locator_id IN   NUMBER,
4480                 decode( nvl( msn.original_wip_entity_id, -1 ), -1, -1 , 1 ),  -- db_wip_ent_id_ind IN  NUMBER,
4481                 msn.last_txn_source_type_id     -- db_lst_txn_src_typ_id IN NUMBER
4482          ) > 0;
4483 
4484    end if;
4485 
4486    l_upd_count := SQL%ROWCOUNT;
4487    IF (l_debug = 1) THEN
4488       invtrace( 'updated=' || to_char( l_upd_count ));
4489    END IF;
4490 
4491    IF ( l_upd_count <> l_qty ) THEN
4492       IF (l_debug = 1) THEN
4493          invtrace( ' Updated not the same as the transaction. trx qty: ' || l_qty);
4494       END IF;
4495       x_return_status := 'W';
4496       x_msg_count := 0;
4497       x_msg_data  := 'Can only update ' || to_char( l_upd_count ) || ' of ' ||
4498                       to_char( l_qty ) || '. Rejecting update';
4499     ELSE
4500       IF (l_debug = 1) THEN
4501          invtrace( ' Updated  same as the transaction. Success');
4502       END IF;
4503       x_serial_updated := l_upd_count;
4504       x_return_status := 'S';
4505       x_msg_count := 0;
4506       x_msg_data := NULL;
4507    END IF;
4508 EXCEPTION
4509    WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
4510         x_return_status := 'U';
4511         x_msg_data := substr(sqlerrm, 1, 255);
4512         x_msg_count := 1;
4513         IF (l_debug = 1) THEN
4514            invtrace( ' Unexpected error in update_msn API');
4515         END IF;
4516 
4517    WHEN OTHERS THEN
4518       x_return_status := 'U';
4519       x_msg_data := substr( sqlerrm,1 , 255);
4520       IF (l_debug = 1) THEN
4521          invtrace( 'in when others');
4522          invtrace( 'x_return_status=' || x_return_status);
4523          invtrace( 'x_msg_data = ' || x_msg_data );
4524          IF (l_debug = 1) THEN
4525            invtrace( ' Error in update_msn API');
4526         END IF;
4527       END IF;
4528 
4529 END update_msn;
4530 
4531 FUNCTION getGroupId(
4532    p_trx_source_type_id         IN NUMBER,
4533    p_trx_action_id              IN NUMBER) RETURN NUMBER
4534 IS
4535    l_groupId NUMBER := 0;
4536    /*
4537    Trx_source_Type_id
4538   ------------------------
4539    2 - Sales Order
4540    12 - RMA
4541    8  - Internal Order
4542    7  - Internal Requisition
4543    16 - Project Contracts
4544 
4545     TRX Action:
4546     ------------------
4547     2 - Sub Transfer
4548     5 - Planning Transfer
4549     6 - Consign Transfer
4550     12 - Intransit receipt
4551     21 - Intransit Shipment
4552     50 - pack
4553     51 - unpack
4554     52 - LPN Split
4555 
4556     Group Id
4557     1 - SO_RMA_GROUP
4558     2 - SUB_XFER_GROUP
4559     3 - INTRANS_GROUP
4560     4 - PACKUNPACK_GROUP
4561     5 - STD_GROUP
4562    */
4563 
4564 BEGIN
4565   if( p_trx_source_Type_id in (2, 7, 8, 12, 16 )) THEN
4566       l_groupId := 1;
4567   else
4568       if( p_trx_action_id in ( 2, 5, 6)  ) THEN
4569         l_groupId := 2;
4570       elsif( p_trx_action_id in (12, 21) ) THEN
4571         l_groupId := 3;
4572       elsif( p_trx_action_id in (50, 51, 52 )) THEN
4573         l_groupId := 4;
4574       else
4575         l_groupId := 5;
4576       end if;
4577   END IF;
4578   return l_groupId;
4579 END getGroupId;
4580 
4581 FUNCTION validate_status(
4582    p_trx_src_type_id         IN number,
4583    p_trx_action_id           IN number,
4584    p_isIssue                 IN boolean,
4585    p_ser_num_ctrl_code       IN number,
4586    p_curr_status             IN number,
4587    p_last_trx_src_type_id    IN NUMBER,
4588    p_xfr_Ser_num_ctrl_code   IN NUMBER,
4589    p_isRestrictRcptSerial    IN NUMBER
4590 ) return number
4591 IS
4592     --l_debug                NUMBER         := NVL(fnd_profile.VALUE('INV_DEBUG_TRACE'), 0);
4593     l_groupId              NUMBER := 0;
4594     l_newStatus            NUMBER := p_curr_status;
4595     l_isRestrictRcptSerial NUMBER := p_isRestrictRcptSerial;
4596     l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
4597 
4598 BEGIN
4599     if( l_debug = 1 ) then
4600         invtrace('inside validate_status, p_trx_src_type_id = ' || p_trx_src_type_id);
4601         invtrace('inside validate_status, p_trx_action_id = ' || p_trx_action_id);
4602         invtrace('inside validate_status, p_ser_num_ctrl_code = ' || p_ser_num_ctrl_code);
4603         invtrace('inside validate_status, p_curr_status = ' || p_curr_status);
4604         invtrace('inside validate_status, p_last_trx_src_type_id = ' || p_last_trx_src_type_id);
4605         invtrace('inside validate_status, p_xfr_ser_num_ctrl_code = ' || p_xfr_ser_num_ctrl_code);
4606     end if;
4607     l_groupId := getGroupId(p_trx_src_type_id, p_trx_action_id);
4608 
4609     --l_isRestrictRcptSerial := fnd_profile.value('INV_RESTRICT_RCPT_SER');
4610 
4611     /*if( l_debug = 1 ) then
4612         invtrace('l_groupId = ' || l_groupId);
4613     end if;*/
4614 
4615     if( l_groupId = 1 )THEN
4616         if( p_isIssue ) THEN
4617             if( p_ser_num_ctrl_code in (2, 3, 5)) THEN
4618                 if( p_trx_src_type_id = 8 AND p_trx_action_id = 21 ) THEN
4619                     if( p_curr_status = 3 ) THEN
4620                        if( p_xfr_ser_num_ctrl_code = 1 ) THEN
4621                             l_newStatus := 4;
4622                        else
4623                             l_newStatus := 5;
4624                        end if;
4625                     end if;
4626                 elsif( p_curr_status = 3 ) THEN
4627                     l_newStatus := 4;
4628                 else
4629                     --FND_MESSAGE.SET_NAME('INV', 'INV_INVALID_SERIAL');
4630                     --FND_MSG_PUB.ADD;
4631                     return -1;
4632                 end if;
4633             elsif( p_ser_num_ctrl_code = 6 ) THEN
4634                 if( p_trx_src_type_id = 8 AND p_trx_action_id = 21 ) THEN
4635                     if( p_curr_status in (1, 3, 6) ) then
4636                         l_newStatus := 5;
4637                     end if;
4638                 elsif( p_curr_status in (1, 3, 6) ) THEN
4639                    l_newStatus := 4;
4640                 else
4641                     --FND_MESSAGE.SET_NAME('INV', 'INV_INVALID_SERIAL');
4642                     --FND_MSG_PUB.ADD;
4643                     return -2;
4644                 end if;
4645            end if;
4646         else -- p_isIssue is false;
4647            if( p_ser_num_ctrl_code in (2, 3, 5) ) THEN
4648                 if( p_curr_status in (1, 4, 6)) THEN
4649                     l_newStatus := 3;
4650                 else
4651                     if( (p_trx_src_type_id in (12, 7)) AND (p_curr_status in (5, 7))) THEN
4652                         l_newStatus := 4;
4653                     else
4654                         --FND_MESSAGE.SET_NAME('INV', 'INV_INVALID_SERIAL');
4655                         --FND_MSG_PUB.ADD;
4656                         return -3;
4657                     end if;
4658                 end if;
4659            elsif( p_ser_num_ctrl_code = 6 ) THEN
4660                 if( p_last_trx_src_type_id = 12 AND p_curr_status = 1 AND l_isRestrictRcptSerial = 1 ) THEN
4661                     --FND_MESSAGE.SET_NAME('INV', 'INV_INVALID_SERIAL');
4662                     --FND_MSG_PUB.ADD;
4663                     return -1;
4664                 elsif( (p_trx_src_type_id = 7 OR p_trx_action_id = 12) AND (p_curr_status in (5, 7 ))) THEN
4665                     l_newStatus := 1;
4666                 else
4667                     if( p_curr_status in (1, 4, 5, 6, 7 ) ) THEN
4668                         l_newStatus := 1;
4669                     else
4670                         --FND_MESSAGE.SET_NAME('INV', 'INV_INVALID_SERIAL');
4671                         --FND_MSG_PUB.ADD;
4672                         return -1;
4673                     end if;
4674                 end if;
4675            end if;
4676         end if;
4677    elsif( l_groupId = 2 ) THEN
4678         if( p_ser_num_ctrl_code in (2, 3, 5)) THEN
4679             if( p_curr_status = 3 ) THEN
4680                 l_newStatus := 3;
4681             else
4682                 --FND_MESSAGE.SET_NAME('INV', 'INV_INVALID_SERIAL');
4683                 --FND_MSG_PUB.ADD;
4684                 return -1;
4685             end if;
4686         end if;
4687    elsif( l_groupId = 3 ) THEN
4688         if( p_isIssue ) THEN
4689             if( p_ser_num_ctrl_code in (2, 3, 5) ) then
4690                 if( p_curr_status = 3 ) THEN
4691                     if( p_xfr_ser_num_ctrl_code = 1 ) THEN
4692                         l_newStatus := 4;
4693                     else
4694                         l_newStatus := 5;
4695                     end if;
4696                 else
4697                    --FND_MESSAGE.SET_NAME('INV', 'INV_INVALID_SERIAL');
4698                    --FND_MSG_PUB.ADD;
4699                    return -1;
4700                 end if;
4701             end if;
4702         else
4703             if( p_ser_num_ctrl_code in (2, 3, 5) ) THEN
4704                 if( p_curr_status in (1, 4, 5, 6, 7) ) THEN
4705                     l_newStatus := 3;
4706                 else
4707                     --FND_MESSAGE.SET_NAME('INV', 'INV_INVALID_SERIAL');
4708                     --FND_MSG_PUB.ADD;
4709                     return -1;
4710                 end if;
4711             elsif( p_ser_num_ctrl_code = 6 ) THEN
4712                 if( p_curr_status in (5,7) AND ( p_trx_src_type_id = 7 OR p_trx_action_id = 12) ) THEN
4713                    l_newStatus := 1;
4714                 else
4715                     --FND_MESSAGE.SET_NAME('INV', 'INV_INVALID_SERIAL');
4716                     --FND_MSG_PUB.ADD;
4717                     return -1;
4718                 end if;
4719             end if;
4720         end if;
4721    elsif( l_groupId = 4 ) THEN
4722         if( p_curr_status <> 3 ) THEN
4723             --FND_MESSAGE.SET_NAME('INV', 'INV_INVALID_SERIAL');
4724             --FND_MSG_PUB.ADD;
4725             return -1;
4726         end if;
4727    elsif( l_groupId = 5 ) THEN
4728         if( p_isIssue ) THEN
4729            if( p_ser_num_ctrl_code in (2, 3, 5)) THEN
4730                 if( p_curr_status = 3 ) then
4731                     l_newStatus := 4;
4732                 else
4733                     --FND_MESSAGE.SET_NAME('INV', 'INV_INVALID_SERIAL');
4734                     --FND_MSG_PUB.ADD;
4735                     return -1;
4736                 end if;
4737            end if;
4738         else
4739            if( p_ser_num_ctrl_code in (2, 3, 5) ) THEN
4740                if( l_isRestrictRcptSerial = 1 AND p_trx_action_id = 27 AND
4741                     p_curr_status = 4 AND p_last_trx_src_Type_id = 2 ) THEN
4742                     --FND_MESSAGE.SET_NAME('INV', 'INV_INVALID_SERIAL');
4743                     --FND_MSG_PUB.ADD;
4744                     return -1;
4745                 end if;
4746                 if( p_curr_status in (1, 4, 6)) THEN
4747                      if( p_trx_action_id = 3 AND p_xfr_ser_num_ctrl_code = 6 ) THEN
4748                          l_newStatus := 1;
4749                      else
4750                          l_newStatus := 4;
4751                      end if;
4752                 else
4753                      if( (p_trx_src_type_id in (1, 5) AND p_curr_status = 5 )OR
4754                          (p_trx_src_type_id = 1 AND p_curr_status = 7 )) THEN
4755                           l_newStatus := 3;
4756                      else
4757                          --FND_MESSAGE.SET_NAME('INV', 'INV_INVALID_SERIAL');
4758                          --FND_MSG_PUB.ADD;
4759                          return -1;
4760                      end if;
4761                 end if;
4762              end if;
4763         end if;
4764    end if;
4765 
4766    return l_newStatus;
4767 End validate_status;
4768 
4769 FUNCTION valsn(
4770    p_trx_src_type_id              IN   NUMBER,
4771    p_trx_action_id                IN   NUMBER,
4772    p_revision                     IN   VARCHAR2,
4773    p_curr_subinv_code             IN   VARCHAR2,
4774    p_locator_id                   IN   NUMBER,
4775    p_item                         IN   NUMBER,
4776    p_curr_org_id                  IN   NUMBER,
4777    p_lot                          IN   VARCHAR2,
4778    p_curr_ser_num                 IN   VARCHAR2,
4779    p_ser_num_ctrl_code            IN   NUMBER,
4780    p_xfr_ser_num_ctrl_code        IN   NUMBER,
4781    p_trx_qty                      IN   NUMBER,
4782    p_acct_prof_value              IN   VARCHAR2,
4783    p_mask                         IN   VARCHAR2,
4784    p_db_current_status            IN   NUMBER,
4785    p_db_current_organization_id   IN   NUMBER,
4786    p_db_revision                  IN   VARCHAR2,
4787    p_db_lot_number                IN   VARCHAR2,
4788    p_db_current_subinventory_code IN   VARCHAR2,
4789    p_db_current_locator_id        IN   NUMBER,
4790    p_db_wip_ent_id_ind            IN   NUMBER,
4791    p_db_lst_txn_src_type_id       IN   NUMBER
4792 ) RETURN NUMBER IS
4793    l_isIssue BOOLEAN := FALSE;
4794 
4795    l_newStatus NUMBER := 0;
4796    l_retval NUMBER := 0;
4797    l_parent_ser_number VARCHAR2(30) := '';
4798    l_isRestrictRcptSerial NUMBER;
4799    l_groupId NUMBER := 0;
4800    l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
4801 BEGIN
4802    --null;
4803    IF (l_debug = 1) THEN
4804       invtrace('p_trx_src_type_id = ' || p_trx_src_type_id);
4805       invtrace('p_trx_action_id = ' || p_trx_action_id);
4806       invtrace('p_revision = ' || p_revision);
4807       invtrace('p_curr_subinv_code = ' || p_curr_subinv_code);
4808       invtrace('p_locator_id = ' || p_locator_id);
4809       invtrace('p_item = ' || p_item);
4810       invtrace('p_curr_org_id = ' || p_curr_org_id);
4811       invtrace('p_lot = ' || p_lot);
4812       invtrace('p_curr_ser_num = ' || p_curr_ser_num);
4813       invtrace('p_ser_num_ctrl_code = ' || p_ser_num_ctrl_code);
4814       invtrace('p_xfr_ser_num_ctrl_code = ' || p_xfr_ser_num_ctrl_code);
4815       invtrace('p_trx_qty = ' || p_trx_qty);
4816       invtrace('p_acct_prof_value = ' || p_acct_prof_value);
4817       invtrace('p_mask = ' || p_mask);
4818       invtrace('p_db_current_status = ' || p_db_current_status);
4819       invtrace('p_db_current_organization_id = ' || p_db_current_organization_id);
4820       invtrace('p_db_revision = ' || p_db_revision);
4821       invtrace('p_db_lot_number = ' || p_db_lot_number);
4822       invtrace('p_db_current_subinventory_code = ' || p_db_current_subinventory_code);
4823       invtrace('p_db_current_locator_id = ' || p_db_current_locator_id);
4824       invtrace('p_db_wip_ent_id_ind = ' || p_db_wip_ent_id_ind);
4825       invtrace('p_db_lst_txn_src_type_id = ' || p_db_lst_txn_src_type_id);
4826    END IF;
4827 
4828    if( p_trx_qty < 0 ) THEN
4829       l_isIssue := TRUE;
4830       IF (l_debug = 1) THEN
4831          invtrace('l_isIssue is true');
4832       END IF;
4833    else
4834       l_isIssue := FALSE;
4835       IF (l_debug = 1) THEN
4836          invtrace('l_isIssue is false');
4837       END IF;
4838    end if;
4839 
4840    IF p_acct_prof_value = 'Y' THEN
4841       l_isRestrictRcptSerial := 1;
4842    else
4843       l_isRestrictRcptSerial := 0;
4844    end if;
4845 
4846    -- getting the group id
4847   if( p_trx_src_Type_id in (2, 7, 8, 12, 16 )) THEN
4848       l_groupId := 1;
4849   else
4850       if( p_trx_action_id in ( 2, 5, 6)  ) THEN
4851         l_groupId := 2;
4852       elsif( p_trx_action_id in (12, 21) ) THEN
4853         l_groupId := 3;
4854       elsif( p_trx_action_id in (50, 51, 52 )) THEN
4855         l_groupId := 4;
4856       else
4857         l_groupId := 5;
4858       end if;
4859   END IF;
4860 
4861   --dbms_output.put_line('inside valsn, l_groupId = ' || l_groupId);
4862   IF (l_debug = 1) THEN
4863      invtrace('substr(p_mask, pdbcurrstats+7) = ' || substr(p_mask, p_db_current_status+7, 1));
4864      invtrace('l_groupId = ' || l_groupId);
4865   END IF;
4866 
4867    IF substr( P_mask, p_db_current_status + 7, 1 )= '0' THEN
4868       -- return to_number( 'A' );
4869       -- ppush( 'avd_debug','db_current_status='|| to_char( db_current_status ) );
4870       -- ppush( 'avd_debug','curr_ser_num='|| curr_ser_num );
4871       -- ppush( 'avd_debug', '923');
4872       return -923;
4873    END IF;
4874 
4875       -- Bug 7427382, supporting statuses 6, 7 and 8 also.
4876    IF ( p_db_current_status = -1 or p_db_current_status = 2 or
4877         p_db_current_status < 1 or p_db_current_status > 8 or p_db_current_status is NULL ) THEN
4878       --fnd_message.set_name( 'INV', 'INV_INVALID_SERIAL' );
4879       return  -913;
4880    END IF;
4881 
4882   -- validate status
4883     if( l_groupId = 1 )THEN
4884         if( l_isIssue ) THEN
4885             if( p_ser_num_ctrl_code in (2, 3, 5)) THEN
4886                 if( p_trx_src_type_id = 8 AND p_trx_action_id = 21 ) THEN
4887                     if( p_db_current_status = 3 ) THEN
4888                        if( nvl(p_xfr_ser_num_ctrl_code, 0) = 1 ) THEN
4889                             l_newStatus := 4;
4890                        else
4891                             l_newStatus := 5;
4892                        end if;
4893                     end if;
4894                 elsif( p_db_current_status = 3 ) THEN
4895                     l_newStatus := 4;
4896                 else
4897                     l_retval := -901;
4898                 end if;
4899             elsif( p_ser_num_ctrl_code = 6 ) THEN
4900                 if( p_trx_src_type_id = 8 AND p_trx_action_id = 21 ) THEN
4901                     if( p_db_current_status in (1, 3, 6) ) then
4902                         l_newStatus := 5;
4903                     end if;
4904                 elsif( p_db_current_status in (1, 3, 6) ) THEN
4905                    l_newStatus := 4;
4906                 else
4907                     --FND_MESSAGE.SET_NAME('INV', 'INV_INVALID_SERIAL');
4908                     --FND_MSG_PUB.ADD;
4909                     l_retval := -902;
4910                 end if;
4911            end if;
4912         else -- p_isIssue is false;
4913            if( p_ser_num_ctrl_code in (2, 3, 5) ) THEN
4914                 if( p_db_current_status in (1, 4, 6)) THEN
4915                     l_newStatus := 3;
4916                 else
4917                     if( (p_trx_src_type_id in (12, 7)) AND (p_db_current_status in (5, 7))) THEN
4918                         l_newStatus := 4;
4919                     else
4920                         --FND_MESSAGE.SET_NAME('INV', 'INV_INVALID_SERIAL');
4921                         --FND_MSG_PUB.ADD;
4922                         l_retval := -903;
4923                     end if;
4924                 end if;
4925            elsif( p_ser_num_ctrl_code = 6 ) THEN
4926                 if( p_db_lst_txn_src_type_id = 12 AND p_db_current_status = 1 AND l_isRestrictRcptSerial = 1 ) THEN
4927                     --FND_MESSAGE.SET_NAME('INV', 'INV_INVALID_SERIAL');
4928                     --FND_MSG_PUB.ADD;
4929                     l_retval := -904;
4930                 elsif( (p_trx_src_type_id = 7 OR p_trx_action_id = 12) AND (p_db_current_status in (5, 7 ))) THEN
4931                     l_newStatus := 1;
4932                 else
4933                     if( p_db_current_status in (1, 4, 5, 6, 7 ) ) THEN
4934                         l_newStatus := 1;
4935                     else
4936                         --FND_MESSAGE.SET_NAME('INV', 'INV_INVALID_SERIAL');
4937                         --FND_MSG_PUB.ADD;
4938                         l_retval := -905;
4939                     end if;
4940                 end if;
4941            end if;
4942         end if;
4943    elsif( l_groupId = 2 ) THEN
4944         if( p_ser_num_ctrl_code in (2, 3, 5)) THEN
4945             if( p_db_current_status = 3 ) THEN
4946                 l_newStatus := 3;
4947             else
4948                 --FND_MESSAGE.SET_NAME('INV', 'INV_INVALID_SERIAL');
4949                 --FND_MSG_PUB.ADD;
4950                 l_retval := -906;
4951             end if;
4952         end if;
4953    elsif( l_groupId = 3 ) THEN
4954         if( l_isIssue ) THEN
4955             if( p_ser_num_ctrl_code in (2, 3, 5) ) then
4956                 if( p_db_current_status = 3 ) THEN
4957                     if( p_xfr_ser_num_ctrl_code = 1 ) THEN
4958                         l_newStatus := 4;
4959                     else
4960                         l_newStatus := 5;
4961                     end if;
4962                 else
4963                    --FND_MESSAGE.SET_NAME('INV', 'INV_INVALID_SERIAL');
4964                    --FND_MSG_PUB.ADD;
4965                    l_retval := -907;
4966                 end if;
4967             end if;
4968         else
4969             if( p_ser_num_ctrl_code in (2, 3, 5) ) THEN
4970                 if( p_db_current_status in (1, 4, 5, 6, 7) ) THEN
4971                     l_newStatus := 3;
4972                 else
4973                     --FND_MESSAGE.SET_NAME('INV', 'INV_INVALID_SERIAL');
4974                     --FND_MSG_PUB.ADD;
4975                     l_retval := -908;
4976                 end if;
4977             elsif( p_ser_num_ctrl_code = 6 ) THEN
4978                 if( p_db_current_status in (5,7) AND ( p_trx_src_type_id = 7 OR p_trx_action_id = 12) ) THEN
4979                    l_newStatus := 1;
4980                 else
4981                     --FND_MESSAGE.SET_NAME('INV', 'INV_INVALID_SERIAL');
4982                     --FND_MSG_PUB.ADD;
4983                     l_retval := -908;
4984                 end if;
4985             end if;
4986         end if;
4987    elsif( l_groupId = 4 ) THEN
4988         if( p_db_current_status <> 3 ) THEN
4989             --FND_MESSAGE.SET_NAME('INV', 'INV_INVALID_SERIAL');
4990             --FND_MSG_PUB.ADD;
4991             l_retval := -909;
4992         end if;
4993    elsif( l_groupId = 5 ) THEN
4994         --dbms_output.put_line('standard group');
4995         if( l_isIssue ) THEN
4996            if( p_ser_num_ctrl_code in (2, 3, 5)) THEN
4997                 if( p_db_current_status = 3 ) then
4998                     l_newStatus := 4;
4999                 else
5000                     --FND_MESSAGE.SET_NAME('INV', 'INV_INVALID_SERIAL');
5001                     --FND_MSG_PUB.ADD;
5002                     l_retval := -910;
5003                 end if;
5004            end if;
5005         else
5006            --dbms_output.put_line('inside receipt part');
5007            if( p_ser_num_ctrl_code in (2, 3, 5) ) THEN
5008                if( l_isRestrictRcptSerial = 1 AND p_trx_action_id = 27 AND
5009                     p_db_current_status = 4 AND p_db_lst_txn_src_Type_id = 2 ) THEN
5010                     --FND_MESSAGE.SET_NAME('INV', 'INV_INVALID_SERIAL');
5011                     --FND_MSG_PUB.ADD;
5012                     l_retval := -911;
5013                 end if;
5014                 if( p_db_current_status in (1, 4, 6)) THEN
5015                      if( p_trx_action_id = 3 AND p_xfr_ser_num_ctrl_code = 6 ) THEN
5016                          l_newStatus := 1;
5017                      else
5018                          l_newStatus := 3;
5019                      end if;
5020                 else
5021                      if( (p_trx_src_type_id in (1, 5) AND p_db_current_status = 5 )OR
5022                          (p_trx_src_type_id = 1 AND p_db_current_status = 7 )) THEN
5023                           l_newStatus := 3;
5024                      else
5025                          --FND_MESSAGE.SET_NAME('INV', 'INV_INVALID_SERIAL');
5026                          --FND_MSG_PUB.ADD;
5027                          l_retval := -912;
5028                      end if;
5029                 end if;
5030              end if;
5031         end if;
5032    end if;
5033 
5034    /*l_NewStatus := validate_Status(p_trx_src_type_id, p_trx_action_id, l_isIssue, p_ser_num_ctrl_code, p_db_current_status,
5035         p_db_lst_txn_src_type_id, p_xfr_ser_num_ctrl_code, l_isRestrictRcptSerial);*/
5036 
5037    IF ( ( p_db_current_status = 3 OR p_db_current_status = 1 )
5038         AND p_db_current_organization_id <> p_curr_org_id ) THEN
5039       --fnd_message.set_name( 'INV', 'INV_SER_ORG_INVALID' );
5040       l_retval := -914;
5041    END IF;
5042 
5043 
5044    IF (p_db_current_status = 3) THEN
5045       IF (p_db_revision IS NOT NULL AND p_db_revision <> p_revision ) THEN
5046 
5047          --fnd_message.set_name('INV', 'INV_SER_REV_INVALID');
5048          --fnd_message.set_Token('TOKEN1', p_db_Revision);
5049          --fnd_message.set_Token('TOKEN2', p_revision);
5050          l_retval := -915;
5051       END IF;
5052 
5053       IF ( p_db_lot_number IS NOT NULL AND p_db_Lot_Number <> p_lot ) THEN
5054          --fnd_message.set_name('INV', 'INV_SER_LOT_INVALID');
5055          --fnd_message.set_Token('TOKEN1', p_curr_ser_num);
5056          --fnd_message.set_Token('TOKEN2', p_db_Lot_Number);
5057          l_retval := -916;
5058       END IF;
5059    END IF;
5060 
5061    /* commented out because of db_lpn_id...do not know why used */
5062    -- IF (bool AND db_current_status = 3 AND db_lpn_id = 0) THEN
5063    IF (l_isIssue AND p_db_current_status = 3 ) THEN
5064 
5065       IF (p_db_current_subinventory_code IS NOT NULL AND
5066           p_db_current_subinventory_code <> p_curr_subinv_code) THEN
5067          --fnd_message.set_name('INV', 'INV_SER_SUB_INVALID');
5068          --fnd_message.set_Token('TOKEN1', p_curr_ser_num);
5069          --fnd_message.set_Token('TOKEN2', p_db_current_subinventory_code);
5070          l_retval := -917;
5071       END IF;
5072 
5073       IF (p_db_current_locator_id <> 0 AND
5074           p_db_current_locator_id <> p_locator_id ) THEN
5075          --fnd_message.set_name('INV', 'INV_SER_LOC_INVALID');
5076          --fnd_message.set_Token('TOKEN1', p_curr_ser_num);
5077          l_retval := -918;
5078       END IF;
5079 
5080    END IF;
5081 
5082 
5083     IF (p_trx_src_type_id = 5 ) THEN -- {
5084         IF ((p_trx_action_id = 31 AND p_db_current_status <> 1)
5085             OR (p_trx_action_id = 32)
5086             OR (p_trx_action_id = 27)) THEN -- {
5087             IF (p_db_wip_ent_id_ind = -1) THEN -- {
5088                --fnd_message.set_name('INV', 'INV_SER_STATUS_NA');
5089                --fnd_message.set_Token('TOKEN1', p_curr_ser_num);
5090                l_retval := -919; -- return(FALSE);
5091             END IF; -- }
5092         END IF; -- }
5093     END IF; -- }
5094 
5095    -- For any receipt into warehouse for Serial Control - Dyn. at inv. receipt
5096    -- LOV does not validate the serial number entered.
5097    -- So any serial number with current status = 4 gets successfully received .
5098 
5099     IF ( (p_ser_num_ctrl_code = 5) AND (p_db_current_status = 4 )
5100          AND (p_trx_qty > 0 ) AND ( p_trx_action_id =27 )
5101          AND (p_trx_src_type_id <> 5) AND (p_db_wip_ent_id_ind <> -1)
5102          AND ( p_acct_prof_value = 'Y' /*1*/) AND (p_db_lst_txn_src_type_id = 5 )) THEN -- {
5103 
5104        --fnd_message.set_name('INV', 'INV_SER_STATUS_NA');
5105        --fnd_message.set_Token('TOKEN1', p_curr_ser_num);
5106        l_retval := -920; -- return(FALSE);
5107 
5108     END IF; -- }
5109 
5110     IF ( (p_ser_num_ctrl_code = 5) AND (p_db_current_status = 4 )
5111          AND (p_trx_qty > 0 ) AND ( p_trx_action_id = 27 )
5112          AND (p_trx_src_type_id <> 5) AND (p_db_wip_ent_id_ind <> -1)
5113          AND (p_acct_prof_value = 'Y' /*1*/) AND (p_db_lst_txn_src_type_id = 6 )
5114          AND (p_trx_src_type_id <> 6 )) THEN -- {
5115 
5116        --fnd_message.set_name('INV', 'INV_SER_STATUS_NA');
5117        --fnd_message.set_Token('TOKEN1', p_curr_ser_num);
5118        l_retval := -920; -- return(FALSE);
5119 
5120     END IF; -- }
5121 
5122     IF ( (p_ser_num_ctrl_code = 5) AND (p_db_current_status = 4 )
5123          AND (( p_trx_action_id = 31 ) OR (p_trx_action_id = 1))
5124          AND (p_trx_src_type_id = 5) AND (p_db_wip_ent_id_ind <> -1)
5125          AND (p_acct_prof_value = 'Y' /*1*/)
5126          AND ((p_db_lst_txn_src_type_id = 5) OR (p_db_lst_txn_src_type_id = 6 ))) THEN -- {
5127 
5128        --fnd_message.set_name('INV', 'INV_SER_STATUS_NA');
5129        --fnd_message.set_Token('TOKEN1', p_curr_ser_num);
5130        l_retval := -921; -- return(FALSE);
5131 
5132     END IF; -- }
5133 
5134     IF (l_debug = 1) THEN
5135        invtrace('l_retval = ' || l_retval);
5136     END IF;
5137 
5138    IF ( l_retval > -900 ) then
5139       RETURN l_newstatus;
5140       -- RETURN validateStatus(trx_src_typ_id, trx_action_id, bool, ser_num_ctrl_code, db_current_status);
5141    ELSE
5142       RETURN l_retval;
5143    END IF;
5144    EXCEPTION
5145       WHEN OTHERS THEN
5146       RAISE;
5147 END valsn;
5148 
5149 PROCEDURE insertRangeUnitTrx(
5150             p_api_version               IN  NUMBER,
5151             p_init_msg_list             IN  VARCHAR2 := FND_API.G_FALSE,
5152             p_commit                    IN  VARCHAR2 := FND_API.G_FALSE,
5153             p_validation_level          IN  NUMBER   := FND_API.G_VALID_LEVEL_FULL,
5154             p_inventory_item_id         IN NUMBER,
5155             p_organization_id           IN NUMBER,
5156             p_fm_serial_number          IN VARCHAR2,
5157             p_to_serial_number          IN VARCHAR2,
5158             p_current_locator_id        IN NUMBER,
5159             p_subinventory_code         IN VARCHAR2,
5160             p_transaction_date          IN DATE,
5161             p_txn_src_id                IN NUMBER,
5162             p_txn_src_name              IN VARCHAR2,
5163             p_txn_src_type_id           IN NUMBER,
5164             p_transaction_id            IN NUMBER,
5165             p_transaction_action_id     IN NUMBER,
5166             p_transaction_temp_id       IN NUMBER,
5167             p_receipt_issue_type        IN NUMBER,
5168             p_customer_id               IN NUMBER,
5169             p_ship_id                   IN NUMBER,
5170             p_status_id                 IN NUMBER,
5171             x_return_status             OUT nOCOPY VARCHAR2,
5172             x_msg_count                 OUT nOCOPY NUMBER,
5173             x_msg_data                  OUT nOCOPY VARCHAR2)
5174 IS
5175      l_api_version                 CONSTANT NUMBER := 1.0;
5176      l_api_name                    CONSTANT VARCHAR2(30):= 'insertRangeUnitTrx';
5177      l_userid                      NUMBER;
5178      l_loginid                     NUMBER;
5179      l_serial_control_code         NUMBER;
5180      l_attributes_default          INV_LOT_SEL_ATTR.LOT_SEL_ATTRIBUTES_TBL_TYPE;
5181      l_attributes_default_count    NUMBER;
5182      l_attributes_in               INV_LOT_SEL_ATTR.LOT_SEL_ATTRIBUTES_TBL_TYPE;
5183      l_column_idx                  BINARY_INTEGER := 44;
5184      l_return_status               VARCHAR2(1);
5185      l_msg_data                    VARCHAR2(2000);
5186      l_msg_count                   NUMBER;
5187      l_upd_count                   NUMBER;
5188      l_TIME_SINCE_NEW          mtl_serial_numbers_temp.TIME_SINCE_NEW%type;
5189      l_CYCLES_SINCE_NEW        mtl_serial_numbers_temp.CYCLES_SINCE_NEW%type;
5190      l_TIME_SINCE_OVERHAUL     mtl_serial_numbers_temp.TIME_SINCE_OVERHAUL%type := NULL;
5191      l_CYCLES_SINCE_OVERHAUL   mtl_serial_numbers_temp.CYCLES_SINCE_OVERHAUL%type;
5192      l_TIME_SINCE_REPAIR       mtl_serial_numbers_temp.TIME_SINCE_REPAIR%type;
5193      l_CYCLES_SINCE_REPAIR     mtl_serial_numbers_temp.CYCLES_SINCE_REPAIR%type;
5194      l_TIME_SINCE_VISIT        mtl_serial_numbers_temp.TIME_SINCE_VISIT%type;
5195      l_CYCLES_SINCE_VISIT      mtl_serial_numbers_temp.CYCLES_SINCE_VISIT%type;
5196      l_TIME_SINCE_MARK         mtl_serial_numbers_temp.TIME_SINCE_MARK%type;
5197      l_CYCLES_SINCE_MARK       mtl_serial_numbers_temp.CYCLES_SINCE_MARK%type;
5198      l_NUMBER_OF_REPAIRS       mtl_serial_numbers_temp.NUMBER_OF_REPAIRS%type;
5199 
5200 
5201      l_sys_date date := NULL;
5202      l_date2    date := NULL;
5203      l_date23   date := NULL;
5204      l_date24   date := NULL;
5205      l_date25   date := NULL;
5206      l_date26   date := NULL;
5207      l_date27   date := NULL;
5208      l_date28   date := NULL;
5209      l_date29   date := NULL;
5210      l_date30   date := NULL;
5211      l_date31   date := NULL;
5212      l_date32   date := NULL;
5213 
5214      l_num33    NUMBER := NULL;
5215      l_num34    NUMBER := NULL;
5216      l_num35    NUMBER := NULL;
5217      l_num36    NUMBER := NULL;
5218      l_num37    NUMBER := NULL;
5219      l_num38    NUMBER := NULL;
5220      l_num39    NUMBER := NULL;
5221      l_num40    NUMBER := NULL;
5222      l_num41    NUMBER := NULL;
5223      l_num42    NUMBER := NULL;
5224 
5225         cursor serial_temp_csr(p_transaction_temp_id NUMBER) is
5226             select SERIAL_ATTRIBUTE_CATEGORY
5227                    , fnd_date.date_to_canonical(ORIGINATION_DATE )
5228                    , C_ATTRIBUTE1
5229                    , C_ATTRIBUTE2
5230                    , C_ATTRIBUTE3
5231                    , C_ATTRIBUTE4
5232                    , C_ATTRIBUTE5
5233                    , C_ATTRIBUTE6
5234                    , C_ATTRIBUTE7
5235                    , C_ATTRIBUTE8
5236                    , C_ATTRIBUTE9
5237                    , C_ATTRIBUTE10
5238                    , C_ATTRIBUTE11
5239                    , C_ATTRIBUTE12
5240                    , C_ATTRIBUTE13
5241                    , C_ATTRIBUTE14
5242                    , C_ATTRIBUTE15
5243                    , C_ATTRIBUTE16
5244                    , C_ATTRIBUTE17
5245                    , C_ATTRIBUTE18
5246                    , C_ATTRIBUTE19
5247                    , C_ATTRIBUTE20
5248                    , fnd_date.date_to_canonical(D_ATTRIBUTE1 )
5249                    , fnd_date.date_to_canonical(D_ATTRIBUTE2 )
5250                    , fnd_date.date_to_canonical(D_ATTRIBUTE3 )
5251                    , fnd_date.date_to_canonical(D_ATTRIBUTE4 )
5252                    , fnd_date.date_to_canonical(D_ATTRIBUTE5 )
5253                    , fnd_date.date_to_canonical(D_ATTRIBUTE6 )
5254                    , fnd_date.date_to_canonical(D_ATTRIBUTE7)
5255                    , fnd_date.date_to_canonical(D_ATTRIBUTE8)
5256                    , fnd_date.date_to_canonical( D_ATTRIBUTE9)
5257                    , fnd_date.date_to_canonical(D_ATTRIBUTE10 )
5258                    , to_char(N_ATTRIBUTE1 )
5259                    , to_char(N_ATTRIBUTE2)
5260                    , to_char(N_ATTRIBUTE3)
5261                    , to_char(N_ATTRIBUTE4)
5262                    , to_char(N_ATTRIBUTE5)
5263                    , to_char(N_ATTRIBUTE6)
5264                    , to_char(N_ATTRIBUTE7)
5265                    , to_char(N_ATTRIBUTE8)
5266                    , to_char( N_ATTRIBUTE9)
5267                    , to_char(N_ATTRIBUTE10)
5268                    , STATUS_ID
5269                    , TERRITORY_CODE
5270                    , TIME_SINCE_NEW
5271                    , CYCLES_SINCE_NEW
5272                    , TIME_SINCE_OVERHAUL
5273                    , CYCLES_SINCE_OVERHAUL
5274                    , TIME_SINCE_REPAIR
5275                    , CYCLES_SINCE_REPAIR
5276                    , TIME_SINCE_VISIT
5277                    , CYCLES_SINCE_VISIT
5278                    , TIME_SINCE_MARK
5279                    , CYCLES_SINCE_MARK
5280                    , NUMBER_OF_REPAIRS
5281             from mtl_serial_numbers_temp
5282             where transaction_temp_id = p_transaction_temp_id
5283             and fm_serial_number = p_fm_serial_number and to_serial_number = p_to_serial_number;
5284     l_input_idx BINARY_INTEGER;
5285 
5286     l_fm_serial_number VARCHAR2(30) := lpad(p_fm_serial_number, 30);
5287     l_to_serial_number VARCHAR2(30) := lpad(p_to_serial_number, 30);
5288     l_wms_installed BOOLEAN;
5289     l_debug NUMBER := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
5290 BEGIN
5291    IF (l_debug = 1) THEN
5292       invtrace('Inside InsertRangeUnitTrx');
5293       invtrace('l_fm_serial_number is ' || l_fm_serial_number);
5294       invtrace('l_to_serial_number is ' || l_to_serial_number);
5295    END IF;
5296 
5297    --Bug# 6825191, Commenting out the code below.
5298    --It is safe to comment the following code because
5299    -- 1. variables G_first_row_of_trx, G_first_row_trx_tmp_id are
5300    --    not referenced anytime later.
5301    -- 2. having this code introduces two problems
5302    --    a. It inserts MUT only for the first MSNT in multiple MSNT scenario.
5303    --    b. It does not insert MUT's for receipt side in transfer transaction flows.
5304 /*
5305    IF ( G_first_row_of_trx ) THEN
5306       IF (l_debug = 1) THEN
5307          invtrace('setting G_first_row_of_trx');
5308       END IF;
5309 
5310       G_first_row_of_trx := FALSE;
5311       G_first_row_trx_tmp_id := p_transaction_temp_id ;
5312       IF (l_debug = 1) THEN
5313          invtrace('G_first_row_trx_tmp_id = ' || G_first_row_trx_tmp_id);
5314       END IF;
5315     ELSE
5316        IF ( p_transaction_temp_id <> g_first_row_trx_tmp_id ) THEN
5317           g_first_row_trx_tmp_id := p_transaction_temp_id;
5318        ELSE
5319           x_return_status := FND_API.G_RET_STS_SUCCESS;
5320           RETURN;
5321        END IF;
5322     END IF;
5323 */
5324     -- Standard Start of API savepoint
5325     SAVEPOINT apiinsertserial_apipub;
5326 
5327     -- Standard call to check for call compatibility.
5328     IF NOT fnd_api.compatible_api_call(l_api_version, p_api_version, l_api_name, g_pkg_name) THEN
5329       RAISE fnd_api.g_exc_unexpected_error;
5330     END IF;
5331     -- Initialize message list if p_init_msg_list is set to TRUE.
5332     IF fnd_api.to_boolean(p_init_msg_list) THEN
5333       fnd_msg_pub.initialize;
5334     END IF;
5335 
5336     --  Initialize API return status to success
5337 
5338     /**IF (p_transaction_action_id = 3 AND g_firstscan = FALSE) THEN
5339       x_return_status  := fnd_api.g_ret_sts_success;
5340     ELSE**/
5341     x_return_status  := fnd_api.g_ret_sts_success;
5342     l_wms_installed  :=
5343       wms_install.check_install(
5344         x_return_status              => l_return_status
5345       , x_msg_count                  => l_msg_count
5346       , x_msg_data                   => l_msg_data
5347       , p_organization_id            => NULL   --p_organization_id
5348       );
5349 
5350     IF (p_transaction_temp_id IS NOT NULL) THEN
5351        IF (l_debug = 1) THEN
5352           invtrace('p_transaction_temp_id is notnull');
5353        END IF;
5354 
5355       OPEN serial_temp_csr(p_transaction_temp_id);
5356 
5357       populateattributescolumn();
5358 
5359       FETCH serial_temp_csr
5360        INTO g_serial_attributes_tbl(1).column_value
5361           , g_serial_attributes_tbl(2).column_value
5362           , g_serial_attributes_tbl(3).column_value
5363           , g_serial_attributes_tbl(4).column_value
5364           , g_serial_attributes_tbl(5).column_value
5365           , g_serial_attributes_tbl(6).column_value
5366           , g_serial_attributes_tbl(7).column_value
5367           , g_serial_attributes_tbl(8).column_value
5368           , g_serial_attributes_tbl(9).column_value
5369           , g_serial_attributes_tbl(10).column_value
5370           , g_serial_attributes_tbl(11).column_value
5371           , g_serial_attributes_tbl(12).column_value
5372           , g_serial_attributes_tbl(13).column_value
5373           , g_serial_attributes_tbl(14).column_value
5374           , g_serial_attributes_tbl(15).column_value
5375           , g_serial_attributes_tbl(16).column_value
5376           , g_serial_attributes_tbl(17).column_value
5377           , g_serial_attributes_tbl(18).column_value
5378           , g_serial_attributes_tbl(19).column_value
5379           , g_serial_attributes_tbl(20).column_value
5380           , g_serial_attributes_tbl(21).column_value
5381           , g_serial_attributes_tbl(22).column_value
5382           , g_serial_attributes_tbl(23).column_value
5383           , g_serial_attributes_tbl(24).column_value
5384           , g_serial_attributes_tbl(25).column_value
5385           , g_serial_attributes_tbl(26).column_value
5386           , g_serial_attributes_tbl(27).column_value
5387           , g_serial_attributes_tbl(28).column_value
5388           , g_serial_attributes_tbl(29).column_value
5389           , g_serial_attributes_tbl(30).column_value
5390           , g_serial_attributes_tbl(31).column_value
5391           , g_serial_attributes_tbl(32).column_value
5392           , g_serial_attributes_tbl(33).column_value
5393           , g_serial_attributes_tbl(34).column_value
5394           , g_serial_attributes_tbl(35).column_value
5395           , g_serial_attributes_tbl(36).column_value
5396           , g_serial_attributes_tbl(37).column_value
5397           , g_serial_attributes_tbl(38).column_value
5398           , g_serial_attributes_tbl(39).column_value
5399           , g_serial_attributes_tbl(40).column_value
5400           , g_serial_attributes_tbl(41).column_value
5401           , g_serial_attributes_tbl(42).column_value
5402           , g_serial_attributes_tbl(43).column_value
5403           , g_serial_attributes_tbl(44).column_value
5404           , l_TIME_SINCE_NEW, l_CYCLES_SINCE_NEW, l_TIME_SINCE_OVERHAUL, l_CYCLES_SINCE_OVERHAUL,
5405                   l_TIME_SINCE_REPAIR, l_CYCLES_SINCE_REPAIR , l_TIME_SINCE_VISIT, l_CYCLES_SINCE_VISIT,
5406                   l_TIME_SINCE_MARK, l_CYCLES_SINCE_MARK, l_NUMBER_OF_REPAIRS;
5407 
5408       CLOSE serial_temp_csr;
5409 
5410       l_input_idx  := 0;
5411 
5412       IF l_wms_installed THEN
5413         FOR x IN 1 .. 44 LOOP
5414           IF (g_serial_attributes_tbl(x).column_value IS NOT NULL) THEN
5415             l_input_idx                                := l_input_idx + 1;
5416             l_attributes_in(l_input_idx).column_name   := g_serial_attributes_tbl(x).column_name;
5417             l_attributes_in(l_input_idx).column_type   := g_serial_attributes_tbl(x).column_type;
5418             l_attributes_in(l_input_idx).column_value  := g_serial_attributes_tbl(x).column_value;
5419           END IF;
5420         END LOOP;
5421       END IF;   -- if wms_installed is true
5422     END IF;   -- if transaction_temp_id is not null
5423 
5424     ----------------------------------------------------------
5425     -- call inv_lot_sel_attr.get_default to get the default value
5426     -- of the lot attributes
5427     ---------------------------------------------------------
5428     IF l_wms_installed THEN
5429       inv_lot_sel_attr.get_default(
5430         x_attributes_default         => l_attributes_default
5431       , x_attributes_default_count   => l_attributes_default_count
5432       , x_return_status              => l_return_status
5433       , x_msg_count                  => l_msg_count
5434       , x_msg_data                   => l_msg_data
5435       , p_table_name                 => 'MTL_SERIAL_NUMBERS'
5436       , p_attributes_name            => 'Serial Attributes'
5437       , p_inventory_item_id          => p_inventory_item_id
5438       , p_organization_id            => p_organization_id
5439       , p_lot_serial_number          => p_fm_serial_number
5440       , p_attributes                 => l_attributes_in
5441       );
5442 
5443       IF (l_return_status <> fnd_api.g_ret_sts_success) THEN
5444         x_return_status  := l_return_status;
5445         RAISE fnd_api.g_exc_unexpected_error;
5446       END IF;
5447 
5448       /* Get the default attribs only when there is no value on the form (in MSNT).
5449        * In case the user changes the context and the attributes while recieving,
5450        * they would be lost if we get the default context again--2756040
5451        */
5452       IF (l_attributes_default_count > 0
5453           AND(g_serial_attributes_tbl(1).column_value = NULL)) THEN
5454         FOR i IN 1 .. l_attributes_default_count LOOP
5455           FOR j IN 1 .. g_serial_attributes_tbl.COUNT LOOP
5456             IF (l_attributes_default(i).column_name = g_serial_attributes_tbl(j).column_name) THEN
5457               g_serial_attributes_tbl(j).column_value  := l_attributes_default(i).column_value;
5458             END IF;
5459           END LOOP;
5460         END LOOP;
5461       END IF;
5462     END IF;   -- if wms install is true
5463 
5464     l_userid         := fnd_global.user_id;
5465     l_loginid        := fnd_global.login_id;
5466     l_sys_date       := SYSDATE;
5467 
5468     IF (p_transaction_action_id = 3 AND g_firstscan = FALSE) THEN
5469        IF (l_debug = 1) THEN
5470           invtrace('p_transaction_action_id = 3 and g_firstscan is false');
5471        END IF;
5472       INSERT INTO mtl_unit_transactions
5473                   (
5474                    transaction_id
5475                  , last_update_date
5476                  , last_updated_by
5477                  , creation_date
5478                  , created_by
5479                  , last_update_login
5480                  , serial_number
5481                  , inventory_item_id
5482                  , organization_id
5483                  , subinventory_code
5484                  , locator_id
5485                  , transaction_date
5486                  , transaction_source_id
5487                  , transaction_source_type_id
5488                  , transaction_source_name
5489                  , receipt_issue_type
5490                  , customer_id
5491                  , ship_id
5492                  , serial_attribute_category
5493                  , origination_date
5494                  , c_attribute1
5495                  , c_attribute2
5496                  , c_attribute3
5497                  , c_attribute4
5498                  , c_attribute5
5499                  , c_attribute6
5500                  , c_attribute7
5501                  , c_attribute8
5502                  , c_attribute9
5503                  , c_attribute10
5504                  , c_attribute11
5505                  , c_attribute12
5506                  , c_attribute13
5507                  , c_attribute14
5508                  , c_attribute15
5509                  , c_attribute16
5510                  , c_attribute17
5511                  , c_attribute18
5512                  , c_attribute19
5513                  , c_attribute20
5514                  , d_attribute1
5515                  , d_attribute2
5516                  , d_attribute3
5517                  , d_attribute4
5518                  , d_attribute5
5519                  , d_attribute6
5520                  , d_attribute7
5521                  , d_attribute8
5522                  , d_attribute9
5523                  , d_attribute10
5524                  , n_attribute1
5525                  , n_attribute2
5526                  , n_attribute3
5527                  , n_attribute4
5528                  , n_attribute5
5529                  , n_attribute6
5530                  , n_attribute7
5531                  , n_attribute8
5532                  , n_attribute9
5533                  , n_attribute10
5534                  , status_id
5535                  , territory_code
5536                  , time_since_new
5537                  , cycles_since_new
5538                  , time_since_overhaul
5539                  , cycles_since_overhaul
5540                  , time_since_repair
5541                  , cycles_since_repair
5542                  , time_since_visit
5543                  , cycles_since_visit
5544                  , time_since_mark
5545                  , cycles_since_mark
5546                  , number_of_repairs
5547                   )
5548         SELECT p_transaction_id
5549              , l_sys_date
5550              , l_userid
5551              , msn.creation_date
5552              , msn.created_by
5553              , l_loginid
5554              , msn.serial_number
5555              , p_inventory_item_id
5556              , p_organization_id
5557              , p_subinventory_code
5558              , p_current_locator_id
5559              , p_transaction_date
5560              , p_txn_src_id
5561              , p_txn_src_type_id
5562              , p_txn_src_name
5563              , p_receipt_issue_type
5564              , p_customer_id
5565              , p_ship_id
5566              , msn.serial_attribute_category
5567              , msn.origination_date
5568              , msn.c_attribute1
5569              , msn.c_attribute2
5570              , msn.c_attribute3
5571              , msn.c_attribute4
5572              , msn.c_attribute5
5573              , msn.c_attribute6
5574              , msn.c_attribute7
5575              , msn.c_attribute8
5576              , msn.c_attribute9
5577              , msn.c_attribute10
5578              , msn.c_attribute11
5579              , msn.c_attribute12
5580              , msn.c_attribute13
5581              , msn.c_attribute14
5582              , msn.c_attribute15
5583              , msn.c_attribute16
5584              , msn.c_attribute17
5585              , msn.c_attribute18
5586              , msn.c_attribute19
5587              , msn.c_attribute20
5588              , msn.d_attribute1
5589              , msn.d_attribute2
5590              , msn.d_attribute3
5591              , msn.d_attribute4
5592              , msn.d_attribute5
5593              , msn.d_attribute6
5594              , msn.d_attribute7
5595              , msn.d_attribute8
5596              , msn.d_attribute9
5597              , msn.d_attribute10
5598              , msn.n_attribute1
5599              , msn.n_attribute2
5600              , msn.n_attribute3
5601              , msn.n_attribute4
5602              , msn.n_attribute5
5603              , msn.n_attribute6
5604              , msn.n_attribute7
5605              , msn.n_attribute8
5606              , msn.n_attribute9
5607              , msn.n_attribute10
5608              , msn.status_id
5609              , msn.territory_code
5610              , msn.time_since_new
5611              , msn.cycles_since_new
5612              , msn.time_since_overhaul
5613              , msn.cycles_since_overhaul
5614              , msn.time_since_repair
5615              , msn.cycles_since_repair
5616              , msn.time_since_visit
5617              , msn.cycles_since_visit
5618              , msn.time_since_mark
5619              , msn.cycles_since_mark
5620              , msn.number_of_repairs
5621           FROM mtl_serial_numbers msn
5622          WHERE msn.serial_number between  p_fm_serial_number and p_to_serial_number
5623            AND msn.current_organization_id = p_organization_id
5624            AND msn.inventory_item_id = p_inventory_item_id;
5625     /* Bug 2207912 */
5626     /* The following not exists statement is commented out
5627     ** because  this part of the statement gets executed
5628     ** only for ORG TRANSFER and for the delivery side of
5629     ** of transaction as firstscan is false now, before this
5630     ** insert statement gets executed the mtl_serial_number is
5631     ** table is already updated with the organization_id of the
5632     ** delivered org and status from the TM, so there will be an entry always exist
5633     ** ing for the where condition specified in the exists clasue
5634     ** for mtl_serial_number table
5635     ** So the insert statement will always fail.
5636     */
5637     --and   not exists
5638     --   ( select NULL
5639     --  from mtl_serial_numbers sn
5640     --  where sn.serial_number = p_serial_number
5641     --  and sn.current_organization_id = p_organization_id
5642     -- and sn.inventory_item_id = p_inventory_item_id);
5643       ELSE
5644        IF (l_debug = 1) THEN
5645           invtrace('not org transfer');
5646        END IF;
5647       IF l_wms_installed THEN
5648         /** 2756040 - Populate Serial Attribute Category info when it is not
5649          ** a receiving transaction **/
5650         IF ((g_serial_attributes_tbl(1).column_value = NULL)
5651             OR(p_transaction_action_id NOT IN(12, 27, 31))) THEN
5652           inv_lot_sel_attr.get_context_code(g_serial_attributes_tbl(1).column_value, p_organization_id, p_inventory_item_id
5653           , 'Serial Attributes');
5654         END IF;
5655       ELSE
5656         g_serial_attributes_tbl(1).column_value  := NULL;
5657       END IF;
5658 
5659       l_date2 := fnd_date.canonical_to_date(g_serial_attributes_tbl(2).COLUMN_VALUE);
5660        l_date23 := fnd_date.canonical_to_date(g_serial_attributes_tbl(23).COLUMN_VALUE);
5661        l_date24 := fnd_date.canonical_to_date(g_serial_attributes_tbl(24).COLUMN_VALUE);
5662        l_date25 := fnd_date.canonical_to_date(g_serial_attributes_tbl(25).COLUMN_VALUE);
5663        l_date26 := fnd_date.canonical_to_date(g_serial_attributes_tbl(26).COLUMN_VALUE);
5664        l_date27 := fnd_date.canonical_to_date(g_serial_attributes_tbl(27).COLUMN_VALUE);
5665        l_date28 := fnd_date.canonical_to_date(g_serial_attributes_tbl(28).COLUMN_VALUE);
5666        l_date29 := fnd_date.canonical_to_date(g_serial_attributes_tbl(29).COLUMN_VALUE);
5667        l_date30 := fnd_date.canonical_to_date(g_serial_attributes_tbl(30).COLUMN_VALUE);
5668        l_date31 := fnd_date.canonical_to_date(g_serial_attributes_tbl(31).COLUMN_VALUE);
5669        l_date32 := fnd_date.canonical_to_date(g_serial_attributes_tbl(32).COLUMN_VALUE);
5670        l_num33 := to_number(g_serial_attributes_tbl(33).COLUMN_VALUE);
5671        l_num34 := to_number(g_serial_attributes_tbl(34).COLUMN_VALUE);
5672        l_num35 := to_number(g_serial_attributes_tbl(35).COLUMN_VALUE);
5673        l_num36 := to_number(g_serial_attributes_tbl(36).COLUMN_VALUE);
5674        l_num37 := to_number(g_serial_attributes_tbl(37).COLUMN_VALUE);
5675        l_num38 := to_number(g_serial_attributes_tbl(38).COLUMN_VALUE);
5676        l_num39 := to_number(g_serial_attributes_tbl(39).COLUMN_VALUE);
5677        l_num40 := to_number(g_serial_attributes_tbl(40).COLUMN_VALUE);
5678        l_num41 := to_number(g_serial_attributes_tbl(41).COLUMN_VALUE);
5679        l_num42 := to_number(g_serial_attributes_tbl(42).COLUMN_VALUE);
5680 
5681       IF (p_transaction_temp_id > 0) THEN
5682         --Bug 2067223 paranthesis are added in the where clause
5683         -- of the select statement
5684 
5685          -- Bug 3772309: Removing this sql as this is not being used
5686          -- anywhere. for performance reason.
5687          /*****
5688          SELECT count(*)
5689            into l_upd_count
5690            FROM mtl_serial_numbers msn, mtl_serial_numbers_temp msnt
5691            WHERE msnt.transaction_temp_id = p_transaction_temp_id
5692            AND lpad(msn.serial_number, 30) between lpad(msnt.fm_serial_number,30) AND LPAD(NVL(msnt.to_serial_number, msnt.fm_serial_number),30)
5693            AND Lpad(msnt.fm_serial_number,30) = l_fm_serial_number
5694            AND Lpad(msnt.to_serial_number,30) = l_to_serial_number;
5695            IF (l_debug = 1) THEN
5696            invtrace('l_upd_count = ' || l_upd_count);
5697            end if;
5698            ****/
5699            IF (l_debug = 1) THEN
5700               invtrace('insert into mut with tempid = ' ||
5701                        p_transaction_temp_id);
5702            END IF;
5703 -- Bug 3772309: Making some changes to the insert statement as it does full
5704          -- tablescan on MSN.
5705          IF (p_to_serial_number IS NOT NULL AND p_to_serial_number <>
5706              p_fm_serial_number) THEN
5707             IF (l_debug = 1) THEN
5708                invtrace('inside to_serial different from from_serial.');
5709                invtrace('from serial =. ' || p_fm_serial_number);
5710                invtrace('to serial =. ' || p_to_serial_number);
5711             END IF;
5712 
5713             INSERT INTO mtl_unit_transactions
5714               (
5715                transaction_id
5716                , last_update_date
5717                , last_updated_by
5718                , creation_date
5719                , created_by
5720                , last_update_login
5721                , serial_number
5722                , inventory_item_id
5723                , organization_id
5724                , subinventory_code
5725                , locator_id
5726                , transaction_date
5727                , transaction_source_id
5728                , transaction_source_type_id
5729                , transaction_source_name
5730                , receipt_issue_type
5731                , customer_id
5732                , ship_id
5733                , serial_attribute_category
5734                , origination_date
5735                , c_attribute1
5736                , c_attribute2
5737                , c_attribute3
5738                , c_attribute4
5739                , c_attribute5
5740                , c_attribute6
5741                , c_attribute7
5742                , c_attribute8
5743                , c_attribute9
5744                , c_attribute10
5745                , c_attribute11
5746                , c_attribute12
5747                , c_attribute13
5748                , c_attribute14
5749                , c_attribute15
5750                , c_attribute16
5751                , c_attribute17
5752                , c_attribute18
5753                , c_attribute19
5754                , c_attribute20
5755               , d_attribute1
5756               , d_attribute2
5757               , d_attribute3
5758               , d_attribute4
5759               , d_attribute5
5760               , d_attribute6
5761               , d_attribute7
5762               , d_attribute8
5763               , d_attribute9
5764               , d_attribute10
5765               , n_attribute1
5766               , n_attribute2
5767               , n_attribute3
5768               , n_attribute4
5769               , n_attribute5
5770               , n_attribute6
5771               , n_attribute7
5772               , n_attribute8
5773               , n_attribute9
5774               , n_attribute10
5775               , status_id
5776               , territory_code
5777               , time_since_new
5778               , cycles_since_new
5779               , time_since_overhaul
5780               , cycles_since_overhaul
5781               , time_since_repair
5782               , cycles_since_repair
5783               , time_since_visit
5784               , cycles_since_visit
5785               , time_since_mark
5786               , cycles_since_mark
5787               , number_of_repairs
5788               , product_code
5789               , product_transaction_id
5790               , attribute_category
5791               , attribute1
5792               , attribute2
5793               , attribute3
5794               , attribute4
5795               , attribute5
5796               , attribute6
5797               , attribute7
5798               , attribute8
5799               , attribute9
5800               , attribute10
5801               , attribute11
5802               , attribute12
5803               , attribute13
5804               , attribute14
5805               , attribute15
5806               )
5807               SELECT p_transaction_id
5808               , l_sys_date
5809               , l_userid
5810               , l_sys_date
5811               , l_userid
5812               , l_loginid
5813               , msn.serial_number
5814               , p_inventory_item_id
5815               , p_organization_id
5816               , p_subinventory_code
5817               , p_current_locator_id
5818               , p_transaction_date
5819               , p_txn_src_id
5820               , p_txn_src_type_id
5821               , p_txn_src_name
5822               , p_receipt_issue_type
5823               , p_customer_id
5824               , p_ship_id
5825               , g_serial_attributes_tbl(1).column_value
5826               , l_date2
5827               , g_serial_attributes_tbl(3).column_value
5828               , g_serial_attributes_tbl(4).column_value
5829               , g_serial_attributes_tbl(5).column_value
5830               , g_serial_attributes_tbl(6).column_value
5831               , g_serial_attributes_tbl(7).column_value
5832               , g_serial_attributes_tbl(8).column_value
5833               , g_serial_attributes_tbl(9).column_value
5834               , g_serial_attributes_tbl(10).column_value
5835               , g_serial_attributes_tbl(11).column_value
5836               , g_serial_attributes_tbl(12).column_value
5837               , g_serial_attributes_tbl(13).column_value
5838               , g_serial_attributes_tbl(14).column_value
5839               , g_serial_attributes_tbl(15).column_value
5840               , g_serial_attributes_tbl(16).column_value
5841               , g_serial_attributes_tbl(17).column_value
5842               , g_serial_attributes_tbl(18).column_value
5843               , g_serial_attributes_tbl(19).column_value
5844               , g_serial_attributes_tbl(20).column_value
5845               , g_serial_attributes_tbl(21).column_value
5846               , g_serial_attributes_tbl(22).column_value
5847               , l_date23
5848               , l_date24
5849               , l_date25
5850               , l_date26
5851               , l_date27
5852               , l_date28
5853               , l_date29
5854               , l_date30
5855               , l_date31
5856               , l_date32
5857               , l_num33
5858               , l_num34
5859               , l_num35
5860               , l_num36
5861               , l_num37
5862               , l_num38
5863               , l_num39
5864               , l_num40
5865               , l_num41
5866               , l_num42
5867               , p_status_id
5868               , g_serial_attributes_tbl(44).column_value
5869               , l_time_since_new
5870               , l_cycles_since_new
5871               , l_time_since_overhaul
5872               , l_cycles_since_overhaul
5873               , l_time_since_repair
5874               , l_cycles_since_repair
5875               , l_time_since_visit
5876               , l_cycles_since_visit
5877               , l_time_since_mark
5878               , l_cycles_since_mark
5879               , l_number_of_repairs
5880               , msnt.product_code
5881               , msnt.product_transaction_id
5882               , msnt.attribute_category
5883               , msnt.attribute1
5884               , msnt.attribute2
5885               , msnt.attribute3
5886               , msnt.attribute4
5887               , msnt.attribute5
5888               , msnt.attribute6
5889               , msnt.attribute7
5890               , msnt.attribute8
5891               , msnt.attribute9
5892               , msnt.attribute10
5893               , msnt.attribute11
5894               , msnt.attribute12
5895               , msnt.attribute13
5896               , msnt.attribute14
5897               , msnt.attribute15
5898               FROM mtl_serial_numbers_temp msnt, mtl_serial_numbers msn
5899               WHERE msnt.transaction_temp_id = p_transaction_temp_id
5900               AND  msn.current_organization_id = p_organization_id
5901               AND msn.inventory_item_id = p_inventory_item_id
5902               AND lpad(msn.serial_number,30) between lpad(msnt.fm_serial_number,30) AND lpad(msnt.to_serial_number,30)
5903               AND lpad(msnt.fm_serial_number,30) = l_fm_serial_number
5904               AND lpad(msnt.to_serial_number,30) = l_to_serial_number;
5905             /* Bug 3622025 -- Added the LPAD function in the above where clause */
5906 
5907             l_upd_count := SQL%ROWCOUNT;
5908             IF (l_debug = 1) THEN
5909                invtrace('l_upd_count = ' || l_upd_count);
5910             END IF;
5911 
5912           ELSE -- to_serial is either null or is the same as from serial
5913             IF (l_debug = 1) THEN
5914                invtrace('inside to_serial is either null or the same.');
5915                invtrace('from serial =. ' || p_fm_serial_number);
5916                invtrace('to serial =. ' || p_to_serial_number);
5917             END IF;
5918 
5919             INSERT INTO mtl_unit_transactions
5920               (
5921                transaction_id
5922                , last_update_date
5923                , last_updated_by
5924                , creation_date
5925                , created_by
5926                , last_update_login
5927                , serial_number
5928                , inventory_item_id
5929                , organization_id
5930                , subinventory_code
5931                , locator_id
5932                , transaction_date
5933                , transaction_source_id
5934                , transaction_source_type_id
5935                , transaction_source_name
5936                , receipt_issue_type
5937                , customer_id
5938                , ship_id
5939                , serial_attribute_category
5940                , origination_date
5941                , c_attribute1
5942                , c_attribute2
5943                , c_attribute3
5944                , c_attribute4
5945                , c_attribute5
5946                , c_attribute6
5947                , c_attribute7
5948                , c_attribute8
5949                , c_attribute9
5950                , c_attribute10
5951                , c_attribute11
5952                , c_attribute12
5953                , c_attribute13
5954                , c_attribute14
5955                , c_attribute15
5956                , c_attribute16
5957                , c_attribute17
5958                , c_attribute18
5959                , c_attribute19
5960                , c_attribute20
5961               , d_attribute1
5962               , d_attribute2
5963               , d_attribute3
5964               , d_attribute4
5965               , d_attribute5
5966               , d_attribute6
5967               , d_attribute7
5968               , d_attribute8
5969               , d_attribute9
5970               , d_attribute10
5971               , n_attribute1
5972               , n_attribute2
5973               , n_attribute3
5974               , n_attribute4
5975               , n_attribute5
5976               , n_attribute6
5977               , n_attribute7
5978               , n_attribute8
5979               , n_attribute9
5980               , n_attribute10
5981               , status_id
5982               , territory_code
5983               , time_since_new
5984               , cycles_since_new
5985               , time_since_overhaul
5986               , cycles_since_overhaul
5987               , time_since_repair
5988               , cycles_since_repair
5989               , time_since_visit
5990               , cycles_since_visit
5991               , time_since_mark
5992               , cycles_since_mark
5993               , number_of_repairs
5994               , product_code
5995               , product_transaction_id
5996               , attribute_category
5997               , attribute1
5998               , attribute2
5999               , attribute3
6000               , attribute4
6001               , attribute5
6002               , attribute6
6003               , attribute7
6004               , attribute8
6005               , attribute9
6006               , attribute10
6007               , attribute11
6008               , attribute12
6009               , attribute13
6010               , attribute14
6011               , attribute15
6012               )
6013               SELECT p_transaction_id
6014               , l_sys_date
6015               , l_userid
6016               , l_sys_date
6017               , l_userid
6018               , l_loginid
6019               , msn.serial_number
6020               , p_inventory_item_id
6021               , p_organization_id
6022               , p_subinventory_code
6023               , p_current_locator_id
6024               , p_transaction_date
6025               , p_txn_src_id
6026               , p_txn_src_type_id
6027               , p_txn_src_name
6028               , p_receipt_issue_type
6029               , p_customer_id
6030               , p_ship_id
6031               , g_serial_attributes_tbl(1).column_value
6032               , l_date2
6033               , g_serial_attributes_tbl(3).column_value
6034               , g_serial_attributes_tbl(4).column_value
6035               , g_serial_attributes_tbl(5).column_value
6036               , g_serial_attributes_tbl(6).column_value
6037               , g_serial_attributes_tbl(7).column_value
6038               , g_serial_attributes_tbl(8).column_value
6039               , g_serial_attributes_tbl(9).column_value
6040               , g_serial_attributes_tbl(10).column_value
6041               , g_serial_attributes_tbl(11).column_value
6042               , g_serial_attributes_tbl(12).column_value
6043               , g_serial_attributes_tbl(13).column_value
6044               , g_serial_attributes_tbl(14).column_value
6045               , g_serial_attributes_tbl(15).column_value
6046               , g_serial_attributes_tbl(16).column_value
6047               , g_serial_attributes_tbl(17).column_value
6048               , g_serial_attributes_tbl(18).column_value
6049               , g_serial_attributes_tbl(19).column_value
6050               , g_serial_attributes_tbl(20).column_value
6051               , g_serial_attributes_tbl(21).column_value
6052               , g_serial_attributes_tbl(22).column_value
6053               , l_date23
6054               , l_date24
6055               , l_date25
6056               , l_date26
6057               , l_date27
6058               , l_date28
6059               , l_date29
6060               , l_date30
6061               , l_date31
6062               , l_date32
6063               , l_num33
6064               , l_num34
6065               , l_num35
6066               , l_num36
6067               , l_num37
6068               , l_num38
6069               , l_num39
6070               , l_num40
6071               , l_num41
6072               , l_num42
6073               , p_status_id
6074               , g_serial_attributes_tbl(44).column_value
6075               , l_time_since_new
6076               , l_cycles_since_new
6077               , l_time_since_overhaul
6078               , l_cycles_since_overhaul
6079               , l_time_since_repair
6080               , l_cycles_since_repair
6081               , l_time_since_visit
6082               , l_cycles_since_visit
6083               , l_time_since_mark
6084               , l_cycles_since_mark
6085               , l_number_of_repairs
6086               , msnt.product_code
6087               , msnt.product_transaction_id
6088               , msnt.attribute_category
6089               , msnt.attribute1
6090               , msnt.attribute2
6091               , msnt.attribute3
6092               , msnt.attribute4
6093               , msnt.attribute5
6094               , msnt.attribute6
6095               , msnt.attribute7
6096               , msnt.attribute8
6097               , msnt.attribute9
6098               , msnt.attribute10
6099               , msnt.attribute11
6100               , msnt.attribute12
6101               , msnt.attribute13
6102               , msnt.attribute14
6103               , msnt.attribute15
6104               FROM mtl_serial_numbers_temp msnt, mtl_serial_numbers msn
6105               WHERE msnt.transaction_temp_id = p_transaction_temp_id
6106               AND  msn.current_organization_id = p_organization_id
6107               AND msn.inventory_item_id = p_inventory_item_id
6108               AND lpad(msn.serial_number,30) = lpad(msnt.fm_serial_number,30)
6109               AND lpad(msnt.fm_serial_number,30) = l_fm_serial_number;
6110             /* Bug 3622025 -- Added the LPAD function in the above where clause */
6111          END IF;
6112 
6113          -- End changes to bug 3772309
6114        ELSE
6115          IF (l_debug = 1) THEN
6116             invtrace('no transaction temp id');
6117          END IF;
6118 
6119        INSERT INTO mtl_unit_transactions
6120                     (
6121                      transaction_id
6122                    , last_update_date
6123                    , last_updated_by
6124                    , creation_date
6125                    , created_by
6126                    , last_update_login
6127                    , serial_number
6128                    , inventory_item_id
6129                    , organization_id
6130                    , subinventory_code
6131                    , locator_id
6132                    , transaction_date
6133                    , transaction_source_id
6134                    , transaction_source_type_id
6135                    , transaction_source_name
6136                    , receipt_issue_type
6137                    , customer_id
6138                    , ship_id
6139                    , serial_attribute_category
6140                    , origination_date
6141                    , c_attribute1
6142                    , c_attribute2
6143                    , c_attribute3
6144                    , c_attribute4
6145                    , c_attribute5
6146                    , c_attribute6
6147                    , c_attribute7
6148                    , c_attribute8
6149                    , c_attribute9
6150                    , c_attribute10
6151                    , c_attribute11
6152                    , c_attribute12
6153                    , c_attribute13
6154                    , c_attribute14
6155                    , c_attribute15
6156                    , c_attribute16
6157                    , c_attribute17
6158                    , c_attribute18
6159                    , c_attribute19
6160                    , c_attribute20
6161                    , d_attribute1
6162                    , d_attribute2
6163                    , d_attribute3
6164                    , d_attribute4
6165                    , d_attribute5
6166                    , d_attribute6
6167                    , d_attribute7
6168                    , d_attribute8
6169                    , d_attribute9
6170                    , d_attribute10
6171                    , n_attribute1
6172                    , n_attribute2
6173                    , n_attribute3
6174                    , n_attribute4
6175                    , n_attribute5
6176                    , n_attribute6
6177                    , n_attribute7
6178                    , n_attribute8
6179                    , n_attribute9
6180                    , n_attribute10
6181                    , status_id
6182                    , territory_code
6183                    , time_since_new
6184                    , cycles_since_new
6185                    , time_since_overhaul
6186                    , cycles_since_overhaul
6187                    , time_since_repair
6188                    , cycles_since_repair
6189                    , time_since_visit
6190                    , cycles_since_visit
6191                    , time_since_mark
6192                    , cycles_since_mark
6193                    , number_of_repairs
6194                     )
6195           SELECT p_transaction_id
6196                , SYSDATE
6197                , l_userid
6198                , SYSDATE
6199                , l_userid
6200                , l_loginid
6201                , msn.serial_number
6202                , p_inventory_item_id
6203                , p_organization_id
6204                , p_subinventory_code
6205                , p_current_locator_id
6206                , p_transaction_date
6207                , p_txn_src_id
6208                , p_txn_src_type_id
6209                , p_txn_src_name
6210                , p_receipt_issue_type
6211                , p_customer_id
6212                , p_ship_id
6213                , g_serial_attributes_tbl(1).column_value
6214                , l_date2
6215                , g_serial_attributes_tbl(3).column_value
6216                , g_serial_attributes_tbl(4).column_value
6217                , g_serial_attributes_tbl(5).column_value
6218                , g_serial_attributes_tbl(6).column_value
6219                , g_serial_attributes_tbl(7).column_value
6220                , g_serial_attributes_tbl(8).column_value
6221                , g_serial_attributes_tbl(9).column_value
6222                , g_serial_attributes_tbl(10).column_value
6223                , g_serial_attributes_tbl(11).column_value
6224                , g_serial_attributes_tbl(12).column_value
6225                , g_serial_attributes_tbl(13).column_value
6226                , g_serial_attributes_tbl(14).column_value
6227                , g_serial_attributes_tbl(15).column_value
6228                , g_serial_attributes_tbl(16).column_value
6229                , g_serial_attributes_tbl(17).column_value
6230                , g_serial_attributes_tbl(18).column_value
6231                , g_serial_attributes_tbl(19).column_value
6232                , g_serial_attributes_tbl(20).column_value
6233                , g_serial_attributes_tbl(21).column_value
6234                , g_serial_attributes_tbl(22).column_value
6235                , l_date23
6236                , l_date24
6237                , l_date25
6238                , l_date26
6239                , l_date27
6240                , l_date28
6241                , l_date29
6242                , l_date30
6243                , l_date31
6244                , l_date32
6245                , l_num33
6246                , l_num34
6247                , l_num35
6248                , l_num36
6249                , l_num37
6250                , l_num38
6251                , l_num39
6252                , l_num40
6253                , l_num41
6254                , l_num42
6255                , p_status_id
6256                , g_serial_attributes_tbl(44).column_value
6257                , l_time_since_new
6258                , l_cycles_since_new
6259                , l_time_since_overhaul
6260                , l_cycles_since_overhaul
6261                , l_time_since_repair
6262                , l_cycles_since_repair
6263                , l_time_since_visit
6264                , l_cycles_since_visit
6265                , l_time_since_mark
6266                , l_cycles_since_mark
6267                , l_number_of_repairs
6268             FROM mtl_serial_numbers msn
6269            WHERE inventory_item_id = p_inventory_item_id
6270              AND serial_number between p_fm_serial_number AND p_to_serial_number;
6271       END IF;
6272     END IF;
6273 
6274      /*bug 2756040 Update MSN also with values from MSNT in case of
6275     receipt transaction or intransit receipt txn
6276     (transaction_action_id = 12 or 27) */
6277       IF (p_transaction_action_id IN(12, 27, 31)) THEN
6278          IF (l_debug = 1) THEN
6279             invtrace('transaction_action_id = ' || p_transaction_action_id
6280                      || ' org _id ' || p_organization_id || 'item ' ||
6281                      p_inventory_item_id);
6282          END IF;
6283       BEGIN
6284         UPDATE mtl_serial_numbers
6285            SET serial_attribute_category = g_serial_attributes_tbl(1).column_value
6286              , origination_date = l_date2
6287              , c_attribute1 = g_serial_attributes_tbl(3).column_value
6288              , c_attribute2 = g_serial_attributes_tbl(4).column_value
6289              , c_attribute3 = g_serial_attributes_tbl(5).column_value
6290              , c_attribute4 = g_serial_attributes_tbl(6).column_value
6291              , c_attribute5 = g_serial_attributes_tbl(7).column_value
6292              , c_attribute6 = g_serial_attributes_tbl(8).column_value
6293              , c_attribute7 = g_serial_attributes_tbl(9).column_value
6294              , c_attribute8 = g_serial_attributes_tbl(10).column_value
6295              , c_attribute9 = g_serial_attributes_tbl(11).column_value
6296              , c_attribute10 = g_serial_attributes_tbl(12).column_value
6297              , c_attribute11 = g_serial_attributes_tbl(13).column_value
6298              , c_attribute12 = g_serial_attributes_tbl(14).column_value
6299              , c_attribute13 = g_serial_attributes_tbl(15).column_value
6300              , c_attribute14 = g_serial_attributes_tbl(16).column_value
6301              , c_attribute15 = g_serial_attributes_tbl(17).column_value
6302              , c_attribute16 = g_serial_attributes_tbl(18).column_value
6303              , c_attribute17 = g_serial_attributes_tbl(19).column_value
6304              , c_attribute18 = g_serial_attributes_tbl(20).column_value
6305              , c_attribute19 = g_serial_attributes_tbl(21).column_value
6306              , c_attribute20 = g_serial_attributes_tbl(22).column_value
6307              , d_attribute1 = l_date23
6308              , d_attribute2 = l_date24
6309              , d_attribute3 = l_date25
6310              , d_attribute4 = l_date26
6311              , d_attribute5 = l_date27
6312              , d_attribute6 = l_date28
6313              , d_attribute7 = l_date29
6314              , d_attribute8 = l_date30
6315              , d_attribute9 = l_date31
6316              , d_attribute10 = l_date32
6317              , n_attribute1 = l_num33
6318              , n_attribute2 = l_num34
6319              , n_attribute3 = l_num35
6320              , n_attribute4 = l_num36
6321              , n_attribute5 = l_num37
6322             , n_attribute6 = l_num38
6323              , n_attribute7 = l_num39
6324              , n_attribute8 = l_num40
6325              , n_attribute9 = l_num41
6326              , n_attribute10 = l_num42
6327          WHERE serial_number between p_fm_serial_number and p_to_serial_number
6328            AND inventory_item_id = p_inventory_item_id
6329            AND current_organization_id = p_organization_id;
6330 
6331         IF (l_debug = 1) THEN
6332            invtrace('updating MSN with values ');
6333            invtrace('serial_attribute_category ' || g_serial_attributes_tbl(1).column_value);
6334            invtrace('origination_date ' || g_serial_attributes_tbl(2).column_value);
6335            invtrace(' C_ATTRIBUTE1 = ' || g_serial_attributes_tbl(3).column_value);
6336            invtrace('C_ATTRIBUTE2 = ' || g_serial_attributes_tbl(4).column_value);
6337            invtrace('C_ATTRIBUTE3 = ' || g_serial_attributes_tbl(5).column_value);
6338            invtrace('C_ATTRIBUTE4 = ' || g_serial_attributes_tbl(6).column_value);
6339            invtrace('C_ATTRIBUTE5 = ' || g_serial_attributes_tbl(7).column_value);
6340            invtrace('C_ATTRIBUTE6 = ' || g_serial_attributes_tbl(8).column_value);
6341            invtrace('C_ATTRIBUTE7 = ' || g_serial_attributes_tbl(9).column_value);
6342            invtrace('C_ATTRIBUTE8 = ' || g_serial_attributes_tbl(10).column_value);
6343            invtrace('C_ATTRIBUTE9 = ' || g_serial_attributes_tbl(11).column_value);
6344            invtrace('C_ATTRIBUTE10 = ' || g_serial_attributes_tbl(12).column_value);
6345            invtrace('C_ATTRIBUTE11 = ' || g_serial_attributes_tbl(13).column_value);
6346            invtrace('C_ATTRIBUTE12 = ' || g_serial_attributes_tbl(14).column_value);
6347            invtrace('C_ATTRIBUTE13 =  ' || g_serial_attributes_tbl(15).column_value);
6348            invtrace('C_ATTRIBUTE14 =  ' || g_serial_attributes_tbl(16).column_value);
6349            invtrace('C_ATTRIBUTE15 = ' || g_serial_attributes_tbl(17).column_value);
6350            invtrace('C_ATTRIBUTE16 = ' || g_serial_attributes_tbl(18).column_value);
6351            invtrace('C_ATTRIBUTE17 = ' || g_serial_attributes_tbl(19).column_value);
6352            invtrace('C_ATTRIBUTE18 =  ' || g_serial_attributes_tbl(20).column_value);
6353            invtrace('C_ATTRIBUTE19 = ' || g_serial_attributes_tbl(21).column_value);
6354            invtrace('C_ATTRIBUTE20 = ' || g_serial_attributes_tbl(22).column_value);
6355            invtrace('D_ATTRIBUTE1 =  ' || g_serial_attributes_tbl(23).column_value);
6356            invtrace('D_ATTRIBUTE2 =  ' || g_serial_attributes_tbl(24).column_value);
6357            invtrace('D_ATTRIBUTE3 =  ' || g_serial_attributes_tbl(25).column_value);
6358            invtrace('D_ATTRIBUTE4 =  ' || g_serial_attributes_tbl(26).column_value);
6359            invtrace('D_ATTRIBUTE5 = ' || g_serial_attributes_tbl(27).column_value);
6360            invtrace('D_ATTRIBUTE6 =  ' || g_serial_attributes_tbl(28).column_value);
6361            invtrace('D_ATTRIBUTE7 =  ' || g_serial_attributes_tbl(29).column_value);
6362            invtrace('D_ATTRIBUTE8 = ' || g_serial_attributes_tbl(30).column_value);
6363            invtrace('D_ATTRIBUTE9 = ' || g_serial_attributes_tbl(31).column_value);
6364            invtrace('D_ATTRIBUTE10 = ' || g_serial_attributes_tbl(32).column_value);
6365            invtrace('N_ATTRIBUTE1 =  ' || g_serial_attributes_tbl(33).column_value);
6366            invtrace('N_ATTRIBUTE2 =  ' || g_serial_attributes_tbl(34).column_value);
6367            invtrace('N_ATTRIBUTE3 =  ' || g_serial_attributes_tbl(35).column_value);
6368            invtrace('N_ATTRIBUTE4 =  ' || g_serial_attributes_tbl(36).column_value);
6369            invtrace('N_ATTRIBUTE5 =  ' || g_serial_attributes_tbl(37).column_value);
6370            invtrace('N_ATTRIBUTE6 =  ' || g_serial_attributes_tbl(38).column_value);
6371            invtrace('N_ATTRIBUTE7 =  ' || g_serial_attributes_tbl(39).column_value);
6372            invtrace('N_ATTRIBUTE8 =  ' || g_serial_attributes_tbl(40).column_value);
6373            invtrace('N_ATTRIBUTE9 =  ' || g_serial_attributes_tbl(41).column_value);
6374            invtrace('N_ATTRIBUTE10 = ' || g_serial_attributes_tbl(42).column_value);
6375 		   invtrace('attribute_category ' || g_serial_attributes_tbl(45).column_value);
6376            invtrace('ATTRIBUTE1 = ' || g_serial_attributes_tbl(46).column_value);
6377            invtrace('ATTRIBUTE2 = ' || g_serial_attributes_tbl(47).column_value);
6378            invtrace('ATTRIBUTE3 = ' || g_serial_attributes_tbl(48).column_value);
6379            invtrace('ATTRIBUTE4 = ' || g_serial_attributes_tbl(49).column_value);
6380            invtrace('ATTRIBUTE5 = ' || g_serial_attributes_tbl(50).column_value);
6381            invtrace('ATTRIBUTE6 = ' || g_serial_attributes_tbl(51).column_value);
6382            invtrace('ATTRIBUTE7 = ' || g_serial_attributes_tbl(52).column_value);
6383            invtrace('ATTRIBUTE8 = ' || g_serial_attributes_tbl(53).column_value);
6384            invtrace('ATTRIBUTE9 = ' || g_serial_attributes_tbl(54).column_value);
6385            invtrace('ATTRIBUTE10 = ' || g_serial_attributes_tbl(55).column_value);
6386            invtrace('ATTRIBUTE11 = ' || g_serial_attributes_tbl(56).column_value);
6387            invtrace('ATTRIBUTE12 = ' || g_serial_attributes_tbl(57).column_value);
6388            invtrace('ATTRIBUTE13 =  ' || g_serial_attributes_tbl(58).column_value);
6389            invtrace('ATTRIBUTE14 =  ' || g_serial_attributes_tbl(59).column_value);
6390            invtrace('ATTRIBUTE15 = ' || g_serial_attributes_tbl(60).column_value);
6391            invtrace(' for the serial ' || p_fm_serial_number);
6392         END IF;
6393       EXCEPTION
6394          WHEN NO_DATA_FOUND THEN
6395             IF (l_debug = 1) THEN
6396                invtrace('no data found while updating msn');
6397             END IF;
6398 
6399          WHEN OTHERS THEN
6400             IF (l_debug = 1) THEN
6401                invtrace('some other error' || SQLERRM);
6402             END IF;
6403 
6404       END;
6405     END IF;
6406 
6407     x_return_status  := fnd_api.g_ret_sts_success;
6408    -- End of API body.
6409     -- Standard check of p_commit.
6410     IF fnd_api.to_boolean(p_commit) THEN
6411       COMMIT WORK;
6412     END IF;
6413 
6414     -- Standard call to get message count and if count is 1, get message info.
6415     fnd_msg_pub.count_and_get(p_encoded => fnd_api.g_false, p_count => x_msg_count, p_data => l_msg_data);
6416     x_msg_data       := SUBSTR(l_msg_data, 0, 198);
6417   EXCEPTION
6418     WHEN OTHERS THEN
6419       ROLLBACK TO apiinsertserial_apipub;
6420 
6421       IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_unexp_error) THEN
6422         fnd_msg_pub.add_exc_msg('INV_SERIAL_NUMBER_PUB', 'insertRangeUnitTrx');
6423       END IF;
6424 
6425       x_return_status  := fnd_api.g_ret_sts_unexp_error;
6426 END insertRangeUnitTrx;
6427 
6428 --serial tagging
6429 -- Output variables
6430 -- x_serial_control: 1 => No, 2=> Yes
6431 PROCEDURE is_serial_controlled(
6432             p_inventory_item_id         IN NUMBER,
6433             p_organization_id           IN NUMBER,
6434             p_transfer_org_id           IN NUMBER DEFAULT NULL,
6435             p_txn_type_id               IN NUMBER DEFAULT NULL,
6436             p_txn_src_type_id           IN NUMBER DEFAULT NULL,
6437             p_txn_action_id             IN NUMBER DEFAULT NULL,
6438             p_serial_control            IN NUMBER DEFAULT NULL,
6439             p_xfer_serial_control       IN NUMBER DEFAULT NULL,
6440             x_serial_control            OUT NOCOPY NUMBER,
6441             x_return_status             OUT NOCOPY VARCHAR2)
6442 IS
6443     l_serial_control_code       NUMBER;
6444     l_xfer_serial_control_code  NUMBER := 1;
6445     l_tagged                    NUMBER;
6446     l_txn_type_id               NUMBER;
6447     l_debug NUMBER := NVL(fnd_profile.VALUE('INV_DEBUG_TRACE'), 0);
6448   BEGIN
6449 
6450     x_serial_control := 1;
6451     x_return_status  := fnd_api.g_ret_sts_success;
6452     IF p_txn_type_id = 1005 THEN
6453         l_txn_type_id := 36;
6454     ELSE
6455         l_txn_type_id := p_txn_type_id;
6456     END IF;
6457 
6458     --Assume x_serial_control holds serial_control_code if passed
6459     IF l_debug = 1 THEN
6460         invtrace('is_serial_controlled:'||p_inventory_item_id||' '||p_organization_id||' '||l_txn_type_id||' '||p_txn_src_type_id||' '||p_txn_action_id);
6461         invtrace(p_serial_control||' '||p_xfer_serial_control||' '||p_transfer_org_id);
6462     END IF;
6463     IF p_serial_control IS NULL THEN
6464 
6465       SELECT serial_number_control_code
6466         INTO l_serial_control_code
6467         FROM mtl_system_items
6468        WHERE inventory_item_id = p_inventory_item_id
6469          AND organization_id = p_organization_id;
6470     ELSE
6471       l_serial_control_code := p_serial_control;
6472     END IF;
6473 
6474     IF l_debug = 1 THEN
6475         invtrace('serial_control:'||l_serial_control_code);
6476     END IF;
6477 
6478     IF l_serial_control_code IN (2,5) THEN
6479       x_serial_control := 2;
6480       RETURN;
6481 
6482     ELSIF l_serial_control_code IN (1,6) THEN
6483 
6484       IF p_xfer_serial_control IS NULL
6485          AND (p_transfer_org_id IS NOT NULL AND p_transfer_org_id NOT IN (0,-1))
6486       THEN
6487 
6488         BEGIN
6489             SELECT serial_number_control_code
6490               INTO l_xfer_serial_control_code
6491               FROM mtl_system_items
6492              WHERE inventory_item_id = p_inventory_item_id
6493                AND organization_id = p_transfer_org_id;
6494         EXCEPTION
6495             WHEN No_Data_Found THEN
6496                 l_xfer_serial_control_code := 1;
6497         END;
6498       ELSIF p_xfer_serial_control IS NOT NULL THEN
6499         l_xfer_serial_control_code := p_xfer_serial_control;
6500       END IF;
6501 
6502       l_tagged := inv_cache.get_serial_tagged(p_organization_id, p_inventory_item_id, l_txn_type_id);
6503       /*
6504       BEGIN
6505         SELECT Count(1) INTO l_tagged
6506           FROM MTL_SERIAL_TAGGING_ASSIGNMENTS
6507           WHERE ORGANIZATION_ID = p_organization_id
6508           AND INVENTORY_ITEM_ID = p_inventory_item_id
6509           AND TRANSACTION_TYPE_ID = p_txn_type_id
6510           AND rownum = 1;
6511       EXCEPTION
6512           WHEN OTHERS THEN
6513            l_tagged := 0;
6514       END;
6515       */
6516 
6517 
6518       /* Bug 3644289: Separating the conditions for internal order and internal reqs.
6519          Bug 3644289: Checking to see if it is an internal req intransit receipt and if control is at SO issue,
6520                       we should be checking for serial numbers, only if the source org is either serial at
6521                       receipt or predefined or sales order issue.
6522                       If the source has no control,we should not be checking the serials or updating their status.
6523          Bug 5507524: If transaction source type is internal req and action is org xfer (transaction type is
6524                       internal req direct org transfer), it should be considered as serialized transaction
6525          Bug 3318924: Allow receipt of serials into stores against an intransit receipt even if the serial control
6526                       is dynamic at SO Issue if serials were shipped (serial control code in the source org is
6527                       predefined or dynamic at receipt). The status of these serials would be updated to
6528                       "Defined but not used" upon receipt
6529          Bug 6798024: should transfer serials for Internal order direct-org xfers/sub-xfers if the item is at
6530                       SO Issue serial control in the destination org or sub
6531       */
6532       IF l_debug = 1 THEN
6533         invtrace('Serial tagged: '||l_tagged);
6534       END IF;
6535 
6536       IF  (( l_serial_control_code = 6 AND
6537             (   -- SO Issue or Project Contract Issue
6538                ((p_txn_src_type_id = 2 OR p_txn_src_type_id = 16) AND p_txn_action_id = 1)
6539                -- RMA
6540             OR (p_txn_src_type_id = 12)
6541                -- Int Ord Issue/Sub xfer/Direct Org Xfer/Intransit Org
6542             OR (p_txn_src_type_id = 8 AND p_txn_action_id IN (1,2,3,21))
6543                -- Int Req Sub xfer/Receipt/Direct Transfer
6544             OR (p_txn_src_type_id = 7 AND p_txn_action_id IN (2,3,12) AND l_xfer_serial_control_code IN (2,5,6)
6545                )
6546                -- Intransit shipment receipt
6547             OR (p_txn_src_type_id = 13 AND p_txn_action_id = 12 AND l_xfer_serial_control_code IN (2,5)
6548                )
6549             )
6550            )
6551             --serial tagging
6552             OR (l_serial_control_code IN (1,6) AND l_tagged = 2)
6553           )
6554       THEN
6555         x_serial_control := 2;
6556         RETURN;
6557       END IF;
6558 
6559     END IF; --l_serial_control_code IN (1,6)
6560 
6561   EXCEPTION
6562     WHEN OTHERS THEN
6563       IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_unexp_error) THEN
6564         fnd_msg_pub.add_exc_msg('INV_SERIAL_NUMBER_PUB', 'is_serial_controlled');
6565         IF l_debug = 1 THEN
6566             invtrace('Exception:'||SQLERRM);
6567         END IF;
6568 
6569       END IF;
6570       x_serial_control := 1;
6571       x_return_status  := fnd_api.g_ret_sts_unexp_error;
6572   END is_serial_controlled;
6573 
6574   --serial tagging
6575   FUNCTION is_serial_tagged(
6576               p_inventory_item_id         IN NUMBER,
6577               p_organization_id           IN NUMBER
6578   ) RETURN NUMBER IS
6579   BEGIN
6580     RETURN is_serial_tagged(p_inventory_item_id, p_organization_id, NULL);
6581   END is_serial_tagged;
6582 
6583   FUNCTION is_serial_tagged(
6584               p_inventory_item_id         IN NUMBER DEFAULT NULL,
6585               p_organization_id           IN NUMBER DEFAULT NULL,
6586               p_template_id               IN NUMBER
6587   ) RETURN NUMBER IS
6588     l_exists NUMBER := 1;
6589   BEGIN
6590     IF p_template_id IS NOT NULL THEN
6591       BEGIN
6592         SELECT 2 INTO l_exists
6593         FROM DUAL
6594         WHERE EXISTS (SELECT 1 FROM mtl_serial_tagging_assignments
6595                       WHERE NVL(organization_id,-1) = NVL(p_organization_id,-1)
6596                       AND template_id = p_template_id
6597                      );
6598       EXCEPTION
6599         WHEN Others THEN
6600           null;
6601       END;
6602     ELSIF p_organization_id IS NULL OR p_inventory_item_id IS NULL THEN
6603       NULL;
6604     ELSE
6605       BEGIN
6606         SELECT 2 INTO l_exists
6607         FROM DUAL
6608         WHERE EXISTS (SELECT 1 FROM mtl_serial_tagging_assignments
6609                       WHERE organization_id = p_organization_id
6610                       AND inventory_item_id = p_inventory_item_id
6611                      );
6612       EXCEPTION
6613         WHEN Others THEN
6614           --l_exists := 1;
6615           null;
6616       END;
6617     END IF;
6618 
6619     RETURN l_exists;
6620 
6621   END is_serial_tagged;
6622 
6623   --serial tagging
6624   PROCEDURE copy_serial_tag_assignments(
6625             p_from_org_id               IN NUMBER DEFAULT NULL,
6626             p_from_item_id              IN NUMBER DEFAULT NULL,
6627             p_from_template_id          IN NUMBER DEFAULT NULL,
6628             p_to_org_id                 IN NUMBER DEFAULT NULL,
6629             p_to_item_id                IN NUMBER DEFAULT NULL,
6630             p_to_template_id            IN NUMBER DEFAULT NULL,
6631             x_return_status             OUT NOCOPY VARCHAR2)
6632   IS
6633     l_debug          NUMBER := NVL(fnd_profile.VALUE('INV_DEBUG_TRACE'), 0);
6634     l_userid         NUMBER := fnd_global.user_id;
6635     l_loginid        NUMBER := fnd_global.login_id;
6636   BEGIN
6637 
6638     x_return_status := fnd_api.g_ret_sts_success;
6639 
6640     IF ( (     p_to_item_id     IS NULL
6641            AND p_to_template_id IS NOT NULL)
6642          OR
6643          (     p_to_org_id      IS NOT NULL
6644            AND p_to_item_id     IS NOT NULL
6645            AND p_to_template_id IS NULL)
6646        )
6647     THEN
6648         NULL;
6649     ELSE
6650         x_return_status := fnd_api.g_ret_sts_error;
6651         IF l_debug = 1 THEN
6652             invtrace('Incorrect Destination org/item/template Combination :' ||
6653                       p_to_org_id || ':' || p_to_item_id || ':' || p_to_template_id );
6654         END IF;
6655         RETURN;
6656     END IF;
6657 
6658     IF ( (     p_from_item_id     IS NULL
6659            AND p_from_template_id IS NOT NULL)
6660          OR
6661          (     p_from_org_id      IS NOT NULL
6662            AND p_from_item_id     IS NOT NULL
6663            AND p_from_template_id IS NULL)
6664        )
6665     THEN
6666         NULL;
6667     ELSE
6668         x_return_status := fnd_api.g_ret_sts_error;
6669         IF l_debug = 1 THEN
6670             invtrace('Incorrect Source org/item/template Combination :' ||
6671                       p_from_org_id || ':' || p_from_item_id || ':' || p_from_template_id );
6672         END IF;
6673         RETURN;
6674     END IF;
6675 
6676     IF p_from_item_id IS NOT NULL AND p_to_item_id IS NOT NULL THEN
6677       BEGIN
6678         INSERT INTO mtl_serial_tagging_assignments
6679           (  ORGANIZATION_ID , INVENTORY_ITEM_ID , TEMPLATE_ID , TRANSACTION_TYPE_ID
6680            , CREATED_BY , CREATION_DATE , LAST_UPDATED_BY , LAST_UPDATE_DATE , LAST_UPDATE_LOGIN , CONTEXT )
6681           SELECT p_to_org_id , p_to_item_id , p_to_template_id , transaction_type_id
6682                , l_userid , SYSDATE , l_userid , SYSDATE , l_loginid , context
6683           FROM mtl_serial_tagging_assignments msta1
6684           WHERE organization_id = p_from_org_id
6685           AND inventory_item_id = p_from_item_id
6686           AND NOT EXISTS (SELECT 1
6687                           FROM mtl_serial_tagging_assignments msta2
6688                           WHERE msta2.organization_id   = p_to_org_id
6689                           AND msta2.inventory_item_id   = p_to_item_id
6690                           AND msta2.transaction_type_id = msta1.transaction_type_id
6691                          )
6692         ;
6693 
6694       EXCEPTION
6695         WHEN others THEN
6696           x_return_status := fnd_api.g_ret_sts_error;
6697           IF l_debug = 1 THEN
6698             invtrace('Exception in copyTagAssignments 1:'||SQLERRM);
6699           END IF;
6700       END;
6701     ELSIF p_from_item_id IS NOT NULL AND p_to_template_id IS NOT NULL THEN
6702       BEGIN
6703         INSERT INTO mtl_serial_tagging_assignments
6704           (  ORGANIZATION_ID , INVENTORY_ITEM_ID , TEMPLATE_ID , TRANSACTION_TYPE_ID
6705            , CREATED_BY , CREATION_DATE , LAST_UPDATED_BY , LAST_UPDATE_DATE , LAST_UPDATE_LOGIN , CONTEXT )
6706           SELECT p_to_org_id , p_to_item_id , p_to_template_id , transaction_type_id
6707                , l_userid , SYSDATE , l_userid , SYSDATE , l_loginid , context
6708           FROM mtl_serial_tagging_assignments msta1
6709           WHERE organization_id = p_from_org_id
6710           AND inventory_item_id = p_from_item_id
6711           AND NOT EXISTS (SELECT 1
6712                           FROM mtl_serial_tagging_assignments msta2
6713                           WHERE NVL(msta2.organization_id,-1)   = NVL(p_to_org_id,-1)
6714                           AND msta2.template_id         = p_to_template_id
6715                           AND msta2.transaction_type_id = msta1.transaction_type_id
6716                          )
6717         ;
6718 
6719       EXCEPTION
6720         WHEN others THEN
6721           x_return_status := fnd_api.g_ret_sts_error;
6722           IF l_debug = 1 THEN
6723             invtrace('Exception in copyTagAssignments 2:'||SQLERRM);
6724           END IF;
6725       END;
6726     ELSIF p_from_template_id IS NOT NULL AND p_to_item_id IS NOT NULL THEN
6727       BEGIN
6728         INSERT INTO mtl_serial_tagging_assignments
6729           (  ORGANIZATION_ID , INVENTORY_ITEM_ID , TEMPLATE_ID , TRANSACTION_TYPE_ID
6730            , CREATED_BY , CREATION_DATE , LAST_UPDATED_BY , LAST_UPDATE_DATE , LAST_UPDATE_LOGIN , CONTEXT )
6731           SELECT p_to_org_id , p_to_item_id , p_to_template_id , transaction_type_id
6732                , l_userid , SYSDATE , l_userid , SYSDATE , l_loginid , context
6733           FROM mtl_serial_tagging_assignments msta1
6734           WHERE NVL(organization_id,-1) = NVL(p_from_org_id,-1)
6735           AND template_id = p_from_template_id
6736           AND NOT EXISTS (SELECT 1
6737                           FROM mtl_serial_tagging_assignments msta2
6738                           WHERE msta2.organization_id   = p_to_org_id
6739                           AND msta2.inventory_item_id   = p_to_item_id
6740                           AND msta2.transaction_type_id = msta1.transaction_type_id
6741                          )
6742         ;
6743 
6744       EXCEPTION
6745         WHEN others THEN
6746           x_return_status := fnd_api.g_ret_sts_error;
6747           IF l_debug = 1 THEN
6748             invtrace('Exception in copyTagAssignments 3:'||SQLERRM);
6749           END IF;
6750       END;
6751     ELSIF p_from_template_id IS NOT NULL AND p_to_template_id IS NOT NULL THEN
6752       BEGIN
6753         INSERT INTO mtl_serial_tagging_assignments
6754           (  ORGANIZATION_ID , INVENTORY_ITEM_ID , TEMPLATE_ID , TRANSACTION_TYPE_ID
6755            , CREATED_BY , CREATION_DATE , LAST_UPDATED_BY , LAST_UPDATE_DATE , LAST_UPDATE_LOGIN , CONTEXT )
6756           SELECT p_to_org_id , p_to_item_id , p_to_template_id , transaction_type_id
6757                , l_userid , SYSDATE , l_userid , SYSDATE , l_loginid , context
6758           FROM mtl_serial_tagging_assignments msta1
6759           WHERE NVL(organization_id,-1) = NVL(p_from_org_id,-1)
6760           AND template_id = p_from_template_id
6761           AND NOT EXISTS (SELECT 1
6762                           FROM mtl_serial_tagging_assignments msta2
6763                           WHERE NVL(msta2.organization_id,-1)   = NVL(p_to_org_id,-1)
6764                           AND msta2.template_id         = p_to_template_id
6765                           AND msta2.transaction_type_id = msta1.transaction_type_id
6766                          )
6767         ;
6768 
6769       EXCEPTION
6770         WHEN others THEN
6771           x_return_status := fnd_api.g_ret_sts_error;
6772           IF l_debug = 1 THEN
6773             invtrace('Exception in copyTagAssignments 4:'||SQLERRM);
6774           END IF;
6775       END;
6776     END IF;
6777 
6778 
6779   EXCEPTION
6780     WHEN OTHERS THEN
6781 
6782       x_return_status  := fnd_api.g_ret_sts_unexp_error;
6783       IF l_debug = 1 THEN
6784         invtrace('Exception in copyTagAssignments 4:'||SQLERRM);
6785       END IF;
6786   END copy_serial_tag_assignments;
6787 
6788   PROCEDURE delete_serial_tag_assignments(
6789             p_inventory_item_id         IN NUMBER,
6790             p_organization_id           IN NUMBER,
6791             x_return_status             OUT NOCOPY VARCHAR2) IS
6792   BEGIN
6793     delete_serial_tag_assignments(p_inventory_item_id, p_organization_id, NULL, x_return_status);
6794   END delete_serial_tag_assignments;
6795 
6796   PROCEDURE delete_serial_tag_assignments(
6797             p_inventory_item_id         IN NUMBER DEFAULT NULL,
6798             p_organization_id           IN NUMBER DEFAULT NULL,
6799             p_template_id               IN NUMBER,
6800             x_return_status             OUT NOCOPY VARCHAR2) IS
6801     l_debug          NUMBER := NVL(fnd_profile.VALUE('INV_DEBUG_TRACE'), 0);
6802   BEGIN
6803     x_return_status := fnd_api.g_ret_sts_success;
6804 
6805     IF (        p_inventory_item_id     IS NULL
6806             AND p_template_id           IS NOT NULL)
6807     THEN
6808         DELETE FROM MTL_SERIAL_TAGGING_ASSIGNMENTS
6809         WHERE template_id = p_template_id
6810          AND NVL(organization_id,-99) = NVL(p_organization_id,-99);
6811 
6812     ELSIF (     p_inventory_item_id     IS NOT NULL
6813             AND p_organization_id       IS NOT NULL
6814             AND p_template_id           IS NULL)
6815     THEN
6816         DELETE FROM MTL_SERIAL_TAGGING_ASSIGNMENTS
6817         WHERE inventory_item_id = p_inventory_item_id
6818         AND   organization_id   = p_organization_id;
6819     ELSE
6820         x_return_status := fnd_api.g_ret_sts_error;
6821         IF l_debug = 1 THEN
6822             invtrace('Incorrect org/item/template Combination :' ||
6823                p_organization_id || ':' || p_inventory_item_id || ':' || p_template_id );
6824         END IF;
6825     END IF;
6826 
6827   EXCEPTION
6828     WHEN OTHERS THEN
6829         x_return_status := fnd_api.g_ret_sts_unexp_error;
6830         IF l_debug = 1 THEN
6831             invtrace('Exception in delete_serial_tag_assignments:' || sqlerrm );
6832         END IF;
6833 
6834   END delete_serial_tag_assignments;
6835 
6836 END inv_serial_number_pub;