DBA Data[Home] [Help]

PACKAGE BODY: APPS.CSI_WIP_TRXS_PKG

Source


1 PACKAGE BODY csi_wip_trxs_pkg AS
2 /* $Header: csipiwpb.pls 120.21.12010000.2 2008/10/09 08:30:45 rsinn ship $ */
3 
4   l_debug_level  number := fnd_profile.value('csi_debug_level');
5 
6   PROCEDURE debug(
7     p_message IN varchar2)
8   IS
9   BEGIN
10     IF l_debug_level > 0 THEN
11       csi_t_gen_utility_pvt.add(p_message);
12     END IF;
13   END debug;
14 
15   PROCEDURE api_log(
16     p_api_name IN varchar2,
17     p_pkg_name IN varchar2 default 'csi_wip_trxs_pkg')
18   IS
19   BEGIN
20     IF l_debug_level > 0 THEN
21       g_api_name := p_pkg_name||'.'||p_api_name;
22       csi_t_gen_utility_pvt.add('Inside API : '||p_pkg_name||'.'||p_api_name);
23     END IF;
24   END api_log;
25 
26   PROCEDURE dump_assy_comp_relation(
27     p_assy_comp_map_tbl   IN assy_comp_map_tbl)
28   IS
29     l_rec assy_comp_map_rec;
30   BEGIN
31     IF p_assy_comp_map_tbl.COUNT > 0 THEN
32       debug('Assembly Instance   Component Instance  Component Quantity');
33       debug('-----------------   ------------------  ------------------');
34       FOR l_ind IN p_assy_comp_map_tbl.FIRST .. p_assy_comp_map_tbl.LAST
35       LOOP
36         l_rec := p_assy_comp_map_tbl(l_ind);
37         debug(rpad(to_char(l_rec.assy_instance_id), 20, ' ')||
38               rpad(to_char(l_rec.comp_instance_id), 20, ' ')||
39               to_char(l_rec.comp_quantity));
40       END LOOP;
41     END IF;
42   END dump_assy_comp_relation;
43 
44   PROCEDURE dump_mmt_tbl(
45     p_mmt_tbl  IN mmt_tbl)
46   IS
47     l_string varchar2(240);
48     l_rec mmt_rec;
49   BEGIN
50     IF p_mmt_tbl.count > 0 THEN
51 
52       l_string := rpad('subinventory', 20, ' ')||
53                   rpad('serial_number', 20, ' ')||
54                   rpad('lot_number', 12, ' ')||
55                   rpad('quantity', 10, ' ')||
56                   rpad('loc_id', 10, ' ');
57       debug(l_string);
58 
59       l_string := rpad('------------', 20, ' ')||
60                   rpad('-------------', 20, ' ')||
61                   rpad('----------', 12, ' ')||
62                   rpad('--------', 10, ' ')||
63                   rpad('------', 10, ' ');
64       debug(l_string);
65 
66       FOR l_ind IN p_mmt_tbl.FIRST .. p_mmt_tbl.LAST
67       LOOP
68 
69         l_rec := p_mmt_tbl(l_ind);
70 
71         l_string := rpad(l_rec.subinventory_code, 20, ' ')||
72                     rpad(nvl(l_rec.serial_number,' '), 20, ' ')||
73                     rpad(nvl(l_rec.lot_number,' '), 12, ' ')||
74                     rpad(l_rec.instance_quantity, 10, ' ')||
75                     rpad(l_rec.locator_id, 10, ' ');
76         debug(l_string);
77 
78       END LOOP;
79     END IF;
80   END dump_mmt_tbl;
81 
82   PROCEDURE get_mmt_info(
83     p_transaction_id     IN  number,
84     x_txn_ref            OUT nocopy txn_ref,
85     x_mmt_tbl            OUT nocopy mmt_tbl,
86     x_return_status      OUT nocopy varchar2)
87   IS
88 
89     l_mmt_tbl            mmt_tbl;
90     l_txn_ref            txn_ref;
91     l_ind                binary_integer  := 0;
92 
93     CURSOR c_mmt IS
94       SELECT mmt.creation_date               creation_date,
95              mmt.transaction_id              transaction_id,
96              mmt.inventory_item_id           inventory_item_id,
97              mmt.organization_id             organization_id,
98              mmt.subinventory_code           subinventory_code,
99              mmt.revision                    revision,
100              mmt.transaction_quantity        transaction_quantity,
101              mmt.transaction_uom             transaction_uom,
102              mmt.transaction_type_id         transaction_type_id,
103              mmt.transaction_action_id       transaction_action_id,
104              mmt.transaction_source_id       transaction_source_id,
105              mmt.locator_id                  locator_id,
106              mmt.transaction_date            transaction_date,
107              mut.serial_number               serial_number,
108              mtln.lot_number                 lot_number,
109              msi.location_id                 subinv_location_id,
110              haou.location_id                hr_location_id,
111              abs(mmt.primary_quantity)       mmt_primary_quantity,
112              abs(mtln.primary_quantity)      lot_primary_quantity,
113              mmt.transaction_set_id          transaction_set_id --bug 5376024
114       FROM   hr_all_organization_units       haou,
115              mtl_transaction_lot_numbers     mtln,
116              mtl_unit_transactions           mut,
117              mtl_secondary_inventories       msi,
118              mtl_material_transactions       mmt
119       WHERE  mmt.transaction_id       = p_transaction_id
120       AND    mmt.transaction_id       = mut.transaction_id(+)
121       AND    mmt.transaction_id       = mtln.transaction_id(+)
122       AND    mmt.subinventory_code    = msi.secondary_inventory_name
123       AND    mmt.organization_id      = msi.organization_id
124       AND    haou.organization_id     = mmt.organization_id;
125 
126     CURSOR c_lotsrl_mmt IS
127       SELECT mmt.creation_date               creation_date,
128              mmt.transaction_id              transaction_id,
129              mmt.inventory_item_id           inventory_item_id,
130              mmt.organization_id             organization_id,
131              mmt.subinventory_code           subinventory_code,
132              mmt.revision                    revision,
133              mmt.transaction_quantity        transaction_quantity,
134              mmt.transaction_uom             transaction_uom,
135              mmt.transaction_type_id         transaction_type_id,
136              mmt.transaction_action_id       transaction_action_id,
137              mmt.transaction_source_id       transaction_source_id,
138              mmt.locator_id                  locator_id,
139              mmt.transaction_date            transaction_date,
140              mut.serial_number               serial_number,
141              mtln.lot_number                 lot_number,
142              msi.location_id                 subinv_location_id,
143              haou.location_id                hr_location_id,
144              abs(mmt.primary_quantity)       mmt_primary_quantity,
145              abs(mtln.primary_quantity)      lot_primary_quantity,
146              mmt.transaction_set_id          transaction_set_id --bug 5376024
147       FROM   hr_all_organization_units    haou,
148              mtl_transaction_lot_numbers  mtln,
149              mtl_unit_transactions        mut,
150              mtl_secondary_inventories    msi,
151              mtl_material_transactions    mmt
152       WHERE  mmt.transaction_id       = p_transaction_id
153       AND    mmt.subinventory_code    = msi.secondary_inventory_name
154       AND    mmt.organization_id      = msi.organization_id
155       AND    mtln.transaction_id      = mmt.transaction_id
156       AND    mut.transaction_id       = mtln.serial_transaction_id
157       AND    mmt.organization_id      = haou.organization_id;
158 
159   BEGIN
160 
161     x_return_status := fnd_api.g_ret_sts_success;
162 
163     api_log('get_mmt_info');
164 
165     BEGIN
166 
167       SELECT transaction_id,
168              transaction_date,
169              inventory_item_id,
170              organization_id,
171              abs(primary_quantity),
172              transaction_type_id,
173              transaction_source_type_id,
174              transaction_action_id,
175              transaction_source_id,
176              creation_date
177       INTO   l_txn_ref.transaction_id,
178              l_txn_ref.transaction_date,
179              l_txn_ref.inventory_item_id,
180              l_txn_ref.organization_id,
181              l_txn_ref.primary_quantity,
182              l_txn_ref.transaction_type_id,
183              l_txn_ref.transaction_source_type_id,
184              l_txn_ref.transaction_action_id,
185              l_txn_ref.wip_entity_id,
186              l_txn_ref.creation_date
187       FROM   mtl_material_transactions
188       WHERE  transaction_id = p_transaction_id;
189 
190       SELECT master_organization_id
191       INTO   l_txn_ref.master_organization_id
192       FROM   mtl_parameters
193       WHERE  organization_id = l_txn_ref.organization_id;
194 
195       SELECT primary_uom_code,
196              serial_number_control_code,
197              lot_control_code,
198              revision_qty_control_code,
199              location_control_code,
200              comms_nl_trackable_flag,
201              bom_item_type,
202              segment1,
203              eam_item_type
204       INTO   l_txn_ref.primary_uom_code,
205              l_txn_ref.srl_control_code,
206              l_txn_ref.lot_control_code,
207              l_txn_ref.rev_control_code,
208              l_txn_ref.loc_control_code,
209              l_txn_ref.ib_trackable_flag,
210              l_txn_ref.bom_item_type,
211              l_txn_ref.item,
212              l_txn_ref.eam_item_type
213       FROM   mtl_system_items
214       WHERE  inventory_item_id = l_txn_ref.inventory_item_id
215       AND    organization_id   = l_txn_ref.organization_id;
216 
217       BEGIN
218 
219         SELECT wip_entity_name,
220                entity_type
221         INTO   l_txn_ref.wip_entity_name,
222                l_txn_ref.wip_entity_type
223         FROM   wip_entities
224         WHERE  wip_entity_id   = l_txn_ref.wip_entity_id
225         AND    organization_id = l_txn_ref.organization_id;
226 
227         BEGIN
228           IF l_txn_ref.wip_entity_type = 4 THEN  -- flow schedules
229             SELECT primary_item_id,
230                    quantity_completed,
231                    quantity_completed,
232                    status
233             INTO   l_txn_ref.wip_assembly_item_id,
234                    l_txn_ref.wip_start_quantity, -- wo less case compl qty is job qty
235                    l_txn_ref.wip_completed_quantity,
236                    l_txn_ref.wip_status_type
237             FROM   wip_flow_schedules
238             WHERE  wip_entity_id   = l_txn_ref.wip_entity_id
239             AND    organization_id = l_txn_ref.organization_id;
240           ELSE -- discrete jobs
241             SELECT primary_item_id,
242                    start_quantity,
243                    quantity_completed,
244                    job_type,
245                    status_type,
246                    nvl(maintenance_object_source, 0),
247                    source_code,
248                    source_line_id,
249                    maintenance_object_type,
250                    maintenance_object_id
251             INTO   l_txn_ref.wip_assembly_item_id,
252                    l_txn_ref.wip_start_quantity,
253                    l_txn_ref.wip_completed_quantity,
254                    l_txn_ref.wip_job_type,
255                    l_txn_ref.wip_status_type,
256                    l_txn_ref.wip_maint_source_code,
257                    l_txn_ref.wip_source_code,
258                    l_txn_ref.wip_source_line_id,
259                    l_txn_ref.wip_maint_obj_type,
260                    l_txn_ref.wip_maint_obj_id
261             FROM   wip_discrete_jobs
262             WHERE  wip_entity_id   = l_txn_ref.wip_entity_id
263             AND    organization_id = l_txn_ref.organization_id;
264           END  IF;
265         EXCEPTION
266           WHEN no_data_found THEN
267             l_txn_ref.wip_start_quantity := 0;
268         END;
269 
270       EXCEPTION
271         WHEN no_data_found THEN
272           null;
273       END;
274 
275     EXCEPTION
276       WHEN no_data_found THEN
277         fnd_message.set_name('CSI','CSI_NO_INVENTORY_RECORDS');
278         fnd_message.set_token('MTL_TRANSACTION_ID',p_transaction_id);
279         fnd_msg_pub.add;
280         RAISE fnd_api.g_exc_error;
281     END;
282 
283     debug('  item              : '||l_txn_ref.item);
284     debug('  inventory_item_id : '||l_txn_ref.inventory_item_id);
285     debug('  organization_id   : '||l_txn_ref.organization_id);
286     debug('  srl_control_code  : '||l_txn_ref.srl_control_code);
287     debug('  lot_control_code  : '||l_txn_ref.lot_control_code);
288     debug('  rev_control_code  : '||l_txn_ref.rev_control_code);
289     debug('  loc_control_code  : '||l_txn_ref.loc_control_code);
290     debug('  mtl_txn_type_id   : '||l_txn_ref.transaction_type_id);
291     debug('  mtl_src_type_id   : '||l_txn_ref.transaction_source_type_id);
292     debug('  mtl_action_id     : '||l_txn_ref.transaction_action_id);
293     debug('  mtl_txn_date      : '||l_txn_ref.transaction_date);
294     debug('  primary_quantity  : '||l_txn_ref.primary_quantity);
295     debug('  primary_uom       : '||l_txn_ref.primary_uom_code);
296     debug('  wip_entity_name   : '||l_txn_ref.wip_entity_name);
297     debug('  wip_entity_id     : '||l_txn_ref.wip_entity_id);
298     debug('  wip_entity_type   : '||l_txn_ref.wip_entity_type);
299     debug('  wip_status_type   : '||l_txn_ref.wip_status_type);
300     debug('  assy_item_id      : '||l_txn_ref.wip_assembly_item_id);
301     debug('  maint_source_code : '||l_txn_ref.wip_maint_source_code);
302     debug('  job_quantity      : '||l_txn_ref.wip_start_quantity);
303     debug('  completed_qty     : '||l_txn_ref.wip_completed_quantity);
304 
305     IF ((l_txn_ref.srl_control_code IN (1, 6)) AND (l_txn_ref.lot_control_code = 2))  -- Only Lot
306         OR
307        ((l_txn_ref.lot_control_code = 1) AND (l_txn_ref.srl_control_code <> 1)) -- Only Serial
308         OR
309        ((l_txn_ref.lot_control_code = 1) AND (l_txn_ref.srl_control_code = 1))  -- No Lot, No Serial
310     THEN
311 
312       FOR r_mmt IN c_mmt LOOP
313 
314         l_ind := c_mmt%rowcount;
315 
316         l_mmt_tbl(l_ind).inventory_item_id        := r_mmt.inventory_item_id;
317         l_mmt_tbl(l_ind).organization_id          := r_mmt.organization_id;
318         l_mmt_tbl(l_ind).subinventory_code        := r_mmt.subinventory_code;
319         l_mmt_tbl(l_ind).revision                 := r_mmt.revision;
320         l_mmt_tbl(l_ind).transaction_source_id    := r_mmt.transaction_source_id;
321         l_mmt_tbl(l_ind).transaction_quantity     := r_mmt.transaction_quantity;
322         l_mmt_tbl(l_ind).transaction_uom          := r_mmt.transaction_uom;
323         l_mmt_tbl(l_ind).locator_id               := r_mmt.locator_id;
324         l_mmt_tbl(l_ind).transaction_date         := r_mmt.transaction_date;
325         l_mmt_tbl(l_ind).serial_number            := r_mmt.serial_number;
326         l_mmt_tbl(l_ind).lot_number               := r_mmt.lot_number;
327         l_mmt_tbl(l_ind).subinv_location_id       := r_mmt.subinv_location_id;
328         l_mmt_tbl(l_ind).hr_location_id           := r_mmt.hr_location_id;
329         l_mmt_tbl(l_ind).mmt_primary_quantity     := r_mmt.mmt_primary_quantity;
330         l_mmt_tbl(l_ind).lot_primary_quantity     := r_mmt.lot_primary_quantity;
331         l_mmt_tbl(l_ind).transaction_set_id       := r_mmt.transaction_set_id; --bug 5376024
332 
333         IF r_mmt.serial_number IS NOT NULL THEN
334           l_mmt_tbl(l_ind).instance_quantity := 1;
335         ELSE
336           IF r_mmt.lot_number IS NOT NULL THEN
337             l_mmt_tbl(l_ind).instance_quantity := r_mmt.lot_primary_quantity;
338           ELSE
339             l_mmt_tbl(l_ind).instance_quantity := r_mmt.mmt_primary_quantity;
340           END IF;
341         END IF;
342 
343       END LOOP;
344 
345     ELSIF ((l_txn_ref.lot_control_code = 2) AND (l_txn_ref.srl_control_code <> 1)) THEN  --Lot+Srl
346 
347       FOR r_mmt IN c_lotsrl_mmt
348       LOOP
349 
350         l_ind := c_lotsrl_mmt%rowcount;
351 
352         l_mmt_tbl(l_ind).inventory_item_id        := r_mmt.inventory_item_id;
353         l_mmt_tbl(l_ind).organization_id          := r_mmt.organization_id;
354         l_mmt_tbl(l_ind).subinventory_code        := r_mmt.subinventory_code;
355         l_mmt_tbl(l_ind).revision                 := r_mmt.revision;
356         l_mmt_tbl(l_ind).transaction_source_id    := r_mmt.transaction_source_id;
357         l_mmt_tbl(l_ind).transaction_quantity     := r_mmt.transaction_quantity;
358         l_mmt_tbl(l_ind).transaction_uom          := r_mmt.transaction_uom;
359         l_mmt_tbl(l_ind).locator_id               := r_mmt.locator_id;
360         l_mmt_tbl(l_ind).serial_number            := r_mmt.serial_number;
361         l_mmt_tbl(l_ind).lot_number               := r_mmt.lot_number;
362         l_mmt_tbl(l_ind).subinv_location_id       := r_mmt.subinv_location_id;
363         l_mmt_tbl(l_ind).hr_location_id           := r_mmt.hr_location_id;
364         l_mmt_tbl(l_ind).mmt_primary_quantity     := r_mmt.mmt_primary_quantity;
365         l_mmt_tbl(l_ind).lot_primary_quantity     := r_mmt.lot_primary_quantity;
366         l_mmt_tbl(l_ind).transaction_set_id       := r_mmt.transaction_set_id; --bug 5376024
367 
368         IF r_mmt.serial_number IS NOT NULL THEN
369           l_mmt_tbl(l_ind).instance_quantity := 1;
370         ELSE
371           IF r_mmt.lot_number IS NOT NULL THEN
372             l_mmt_tbl(l_ind).instance_quantity := r_mmt.lot_primary_quantity;
373           ELSE
374             l_mmt_tbl(l_ind).instance_quantity := r_mmt.mmt_primary_quantity;
375           END IF;
376         END IF;
377 
378       END LOOP;
379     END IF;
380 
381     debug('  mmt_tbl.count     : '||l_mmt_tbl.count);
382 
383     IF l_mmt_tbl.COUNT = 0 THEN
384       fnd_message.set_name('CSI','CSI_NO_INVENTORY_RECORDS');
385       fnd_message.set_token('MTL_TRANSACTION_ID',p_transaction_id);
386       fnd_msg_pub.add;
387       RAISE fnd_api.g_exc_error;
388     END IF;
389 
390     dump_mmt_tbl(l_mmt_tbl);
391 
392     x_txn_ref := l_txn_ref;
393     x_mmt_tbl := l_mmt_tbl;
394 
395   EXCEPTION
396     WHEN fnd_api.g_exc_error THEN
397       x_return_status := fnd_api.g_ret_sts_error;
398   END get_mmt_info;
399 
400   PROCEDURE make_non_hdr_rec(
401     p_instance_hdr_rec  IN         csi_datastructures_pub.instance_header_rec,
402     x_instance_rec      OUT NOCOPY csi_datastructures_pub.instance_rec,
403     x_return_status     OUT NOCOPY varchar2)
404   IS
405 
406     l_instance_hdr_tbl  csi_datastructures_pub.instance_header_tbl;
407     l_instance_tbl      csi_datastructures_pub.instance_tbl;
408 
409     l_return_status     varchar2(1) := fnd_api.g_ret_sts_success;
410 
411   BEGIN
412 
413     x_return_status := l_return_status;
414 
415     api_log('make_non_hdr_rec');
416 
417 
418     l_instance_hdr_tbl(1) := p_instance_hdr_rec;
419 
420     csi_utl_pkg.make_non_header_tbl(
421       p_instance_header_tbl => l_instance_hdr_tbl,
422       x_instance_tbl        => l_instance_tbl,
423       x_return_status       => l_return_status);
424 
425     IF l_return_status <> fnd_api.g_ret_sts_success THEN
426       RAISE fnd_api.g_exc_error;
427     END IF;
428 
429     x_instance_rec := l_instance_tbl(1);
430 
431   EXCEPTION
432     WHEN fnd_api.g_exc_error THEN
433       x_return_status := fnd_api.g_ret_sts_error;
434   END make_non_hdr_rec;
435 
436   PROCEDURE increment_comp_instance(
437     p_instance_id          IN number,
438     p_quantity             IN number,
439     px_csi_txn_rec         IN OUT NOCOPY csi_datastructures_pub.transaction_rec,
440     x_return_status        OUT NOCOPY varchar2)
441   IS
442 
443     l_u_instance_rec        csi_datastructures_pub.instance_rec;
444     l_u_parties_tbl         csi_datastructures_pub.party_tbl;
445     l_u_pty_accts_tbl       csi_datastructures_pub.party_account_tbl;
446     l_u_org_units_tbl       csi_datastructures_pub.organization_units_tbl;
447     l_u_ea_values_tbl       csi_datastructures_pub.extend_attrib_values_tbl;
448     l_u_pricing_tbl         csi_datastructures_pub.pricing_attribs_tbl;
449     l_u_assets_tbl          csi_datastructures_pub.instance_asset_tbl;
450     l_u_instance_ids_list   csi_datastructures_pub.id_tbl;
451 
452     l_return_status       varchar2(1) := fnd_api.g_ret_sts_success;
453     l_msg_count           number;
454     l_msg_data            varchar2(2000);
455   BEGIN
456 
457     x_return_status := fnd_api.g_ret_sts_success;
458 
459     api_log('increment_comp_instance');
460 
461     l_u_instance_rec.instance_id := p_instance_id;
462 
463     SELECT quantity + p_quantity,
464            object_version_number
465     INTO   l_u_instance_rec.quantity,
466            l_u_instance_rec.object_version_number
467     FROM   csi_item_instances
468     WHERE  instance_id = p_instance_id;
469 
470     api_log(
471       p_pkg_name => 'csi_item_instance_pub',
472       p_api_name => 'update_item_instance');
473 
474     debug('  instance_id       : '||l_u_instance_rec.instance_id);
475     debug('  quantity          : '||l_u_instance_rec.quantity);
476     debug('  instance_ovn      : '||l_u_instance_rec.object_version_number);
477 
478     -- update item_instance
479     csi_item_instance_pub.update_item_instance(
480       p_api_version           => 1.0,
481       p_commit                => fnd_api.g_false,
482       p_init_msg_list         => fnd_api.g_true,
483       p_validation_level      => fnd_api.g_valid_level_full,
484       p_instance_rec          => l_u_instance_rec,
485       p_party_tbl             => l_u_parties_tbl,
486       p_account_tbl           => l_u_pty_accts_tbl,
487       p_org_assignments_tbl   => l_u_org_units_tbl,
488       p_ext_attrib_values_tbl => l_u_ea_values_tbl,
489       p_pricing_attrib_tbl    => l_u_pricing_tbl,
490       p_asset_assignment_tbl  => l_u_assets_tbl,
491       p_txn_rec               => px_csi_txn_rec,
492       x_instance_id_lst       => l_u_instance_ids_list,
493       x_return_status         => l_return_status,
494       x_msg_count             => l_msg_count,
495       x_msg_data              => l_msg_data);
496 
497     -- For Bug 4057183
498     -- IF l_return_status <> fnd_api.g_ret_sts_success THEN
499     IF l_return_status not in (fnd_api.g_ret_sts_success,'W') THEN
500       RAISE fnd_api.g_exc_error;
501     END IF;
502 
503   EXCEPTION
504     WHEN fnd_api.g_exc_error THEN
505       x_return_status := fnd_api.g_ret_sts_error;
506   END increment_comp_instance;
507 
508 
509   PROCEDURE decrement_wip_instance(
510     p_instance_id          IN number,
511     p_quantity             IN number,
512     px_csi_txn_rec         IN OUT NOCOPY csi_datastructures_pub.transaction_rec,
513     x_return_status        OUT NOCOPY varchar2)
514   IS
515 
516     l_u_instance_rec       csi_datastructures_pub.instance_rec;
517     l_u_parties_tbl        csi_datastructures_pub.party_tbl;
518     l_u_pty_accts_tbl      csi_datastructures_pub.party_account_tbl;
519     l_u_org_units_tbl      csi_datastructures_pub.organization_units_tbl;
520     l_u_ea_values_tbl      csi_datastructures_pub.extend_attrib_values_tbl;
521     l_u_pricing_tbl        csi_datastructures_pub.pricing_attribs_tbl;
522     l_u_assets_tbl         csi_datastructures_pub.instance_asset_tbl;
523     l_u_instance_ids_list  csi_datastructures_pub.id_tbl;
524 
525     l_return_status        varchar2(1) := fnd_api.g_ret_sts_success;
526     l_msg_count            number;
527     l_msg_data             varchar2(2000);
528   BEGIN
529 
530     x_return_status := fnd_api.g_ret_sts_success;
531 
532     api_log('decrement_wip_instance');
533 
534     l_u_instance_rec.instance_id := p_instance_id;
535 
536     SELECT quantity - p_quantity,
537            object_version_number
538     INTO   l_u_instance_rec.quantity,
539            l_u_instance_rec.object_version_number
540     FROM   csi_item_instances
541     WHERE  instance_id = l_u_instance_rec.instance_id;
542 
543     api_log(
544       p_pkg_name => 'csi_item_instance_pub',
545       p_api_name => 'update_item_instance');
546 
547     debug('  instance_id       : '||l_u_instance_rec.instance_id);
548     debug('  quantity          : '||l_u_instance_rec.quantity);
549     debug('  instance_ovn      : '||l_u_instance_rec.object_version_number);
550 
551     -- update item_instance
552     csi_item_instance_pub.update_item_instance(
553       p_api_version           => 1.0,
554       p_commit                => fnd_api.g_false,
555       p_init_msg_list         => fnd_api.g_true,
556       p_validation_level      => fnd_api.g_valid_level_full,
557       p_instance_rec          => l_u_instance_rec,
558       p_party_tbl             => l_u_parties_tbl,
559       p_account_tbl           => l_u_pty_accts_tbl,
560       p_org_assignments_tbl   => l_u_org_units_tbl,
561       p_ext_attrib_values_tbl => l_u_ea_values_tbl,
562       p_pricing_attrib_tbl    => l_u_pricing_tbl,
563       p_asset_assignment_tbl  => l_u_assets_tbl,
564       p_txn_rec               => px_csi_txn_rec,
565       x_instance_id_lst       => l_u_instance_ids_list,
566       x_return_status         => l_return_status,
567       x_msg_count             => l_msg_count,
568       x_msg_data              => l_msg_data);
569 
570     -- For Bug 4057183
571     -- IF l_return_status <> fnd_api.g_ret_sts_success THEN
572     IF l_return_status not in (fnd_api.g_ret_sts_success,'W') THEN
573       RAISE fnd_api.g_exc_error;
574     END IF;
575 
576   EXCEPTION
577     WHEN fnd_api.g_exc_error THEN
578       x_return_status := fnd_api.g_ret_sts_error;
579   END decrement_wip_instance;
580 
581 
582   PROCEDURE create_wip_instance_as(
583     p_instance_id         IN     number,
584     p_quantity            IN     number,
585     p_organization_id     IN     number,
586     x_new_instance_id        OUT NOCOPY number,
587     px_csi_txn_rec        IN OUT NOCOPY csi_datastructures_pub.transaction_rec,
588     x_return_status          OUT NOCOPY varchar2)
589   IS
590 
591     l_return_status         varchar2(1) := fnd_api.g_ret_sts_success;
592     l_msg_data              varchar2(2000);
593     l_msg_count             number;
594 
595     -- get_item_instance_details variables
596     l_g_instance_rec        csi_datastructures_pub.instance_header_rec;
597     l_g_ph_tbl              csi_datastructures_pub.party_header_tbl;
598     l_g_pah_tbl             csi_datastructures_pub.party_account_header_tbl;
599     l_g_ouh_tbl             csi_datastructures_pub.org_units_header_tbl;
600     l_g_pa_tbl              csi_datastructures_pub.pricing_attribs_tbl;
601     l_g_eav_tbl             csi_datastructures_pub.extend_attrib_values_tbl;
602     l_g_ea_tbl              csi_datastructures_pub.extend_attrib_tbl;
603     l_g_iah_tbl             csi_datastructures_pub.instance_asset_header_tbl;
604     l_g_time_stamp          date;
605 
606     -- make_non_hdr variables
607     l_instance_rec          csi_datastructures_pub.instance_rec;
608 
609     -- create_item_instance varaibles
610     l_c_instance_rec        csi_datastructures_pub.instance_rec;
611     l_c_parties_tbl         csi_datastructures_pub.party_tbl;
612     l_c_pty_accts_tbl       csi_datastructures_pub.party_account_tbl;
613     l_c_org_units_tbl       csi_datastructures_pub.organization_units_tbl;
614     l_c_ea_values_tbl       csi_datastructures_pub.extend_attrib_values_tbl;
615     l_c_pricing_tbl         csi_datastructures_pub.pricing_attribs_tbl;
616     l_c_assets_tbl          csi_datastructures_pub.instance_asset_tbl;
617 
618     c_pa_ind                binary_integer := 0;
619 
620   BEGIN
621 
622     x_return_status := fnd_api.g_ret_sts_success;
623     api_log('create_wip_instance_as');
624 
625     l_g_instance_rec.instance_id := p_instance_id;
626 
627     api_log(
628       p_pkg_name => 'csi_item_instance_pub',
629       p_api_name => 'get_item_instance_details');
630 
631     -- get the instance party and party account info
632     csi_item_instance_pub.get_item_instance_details(
633       p_api_version           => 1.0,
634       p_commit                => fnd_api.g_false,
635       p_init_msg_list         => fnd_api.g_true,
636       p_validation_level      => fnd_api.g_valid_level_full,
637       p_instance_rec          => l_g_instance_rec,
638       p_get_parties           => fnd_api.g_true,
639       p_party_header_tbl      => l_g_ph_tbl,
640       p_get_accounts          => fnd_api.g_true,
641       p_account_header_tbl    => l_g_pah_tbl,
642       p_get_org_assignments   => fnd_api.g_false,
643       p_org_header_tbl        => l_g_ouh_tbl,
644       p_get_pricing_attribs   => fnd_api.g_false,
645       p_pricing_attrib_tbl    => l_g_pa_tbl,
646       p_get_ext_attribs       => fnd_api.g_false,
647       p_ext_attrib_tbl        => l_g_eav_tbl,
648       p_ext_attrib_def_tbl    => l_g_ea_tbl,
649       p_get_asset_assignments => fnd_api.g_false,
650       p_asset_header_tbl      => l_g_iah_tbl,
651       p_time_stamp            => l_g_time_stamp,
652       x_return_status         => l_return_status,
653       x_msg_count             => l_msg_count,
654       x_msg_data              => l_msg_data);
655 
656     IF l_return_status <> fnd_api.g_ret_sts_success THEN
657       RAISE fnd_api.g_exc_error;
658     END IF;
659 
660     make_non_hdr_rec(
661       p_instance_hdr_rec => l_g_instance_rec,
662       x_instance_rec     => l_instance_rec,
663       x_return_status    => l_return_status);
664 
665     debug('  instance_id       : '||l_instance_rec.instance_id);
666 
667     l_c_instance_rec := l_instance_rec;
668 
669     -- substitute create specific attributes
670     l_c_instance_rec.instance_id           := fnd_api.g_miss_num;
671     l_c_instance_rec.instance_number       := fnd_api.g_miss_char;
672     l_c_instance_rec.object_version_number := 1.0;
673     l_c_instance_rec.vld_organization_id   := p_organization_id;
674     l_c_instance_rec.quantity              := p_quantity;
675 
676     debug('  new instance qty  :'||l_c_instance_rec.quantity);
677 
678     -- build party
679     l_c_parties_tbl.DELETE;
680     l_c_pty_accts_tbl.DELETE;
681 
682     IF l_g_ph_tbl.COUNT > 0 THEN
683 
684       FOR l_pt_ind IN l_g_ph_tbl.FIRST ..l_g_ph_tbl.LAST
685       LOOP
686 
687         l_c_parties_tbl(l_pt_ind).instance_party_id  := fnd_api.g_miss_num;
688         l_c_parties_tbl(l_pt_ind).instance_id        := fnd_api.g_miss_num;
689         l_c_parties_tbl(l_pt_ind).party_id           := l_g_ph_tbl(l_pt_ind).party_id;
690         l_c_parties_tbl(l_pt_ind).party_source_table := l_g_ph_tbl(l_pt_ind).party_source_table;
691         l_c_parties_tbl(l_pt_ind).relationship_type_code :=
692                              l_g_ph_tbl(l_pt_ind).relationship_type_code;
693         l_c_parties_tbl(l_pt_ind).contact_flag       := 'N';
694 
695         -- build party account
696         IF l_g_pah_tbl.COUNT > 0 THEN
697           FOR l_pa_ind IN l_g_pah_tbl.FIRST..l_g_pah_tbl.LAST
698           LOOP
699             IF l_g_pah_tbl(l_pa_ind).instance_party_id = l_g_ph_tbl(l_pt_ind).instance_party_id
700             THEN
701               c_pa_ind := c_pa_ind + 1;
702               l_c_pty_accts_tbl(c_pa_ind).parent_tbl_index   := l_pt_ind;
703               l_c_pty_accts_tbl(c_pa_ind).ip_account_id      := fnd_api.g_miss_num;
704               l_c_pty_accts_tbl(c_pa_ind).instance_party_id  := fnd_api.g_miss_num;
705               l_c_pty_accts_tbl(c_pa_ind).party_account_id   :=
706                                           l_g_pah_tbl(l_pa_ind).party_account_id;
707               l_c_pty_accts_tbl(c_pa_ind).relationship_type_code :=
708                                           l_g_pah_tbl(l_pa_ind).relationship_type_code;
709             END IF;
710           END LOOP;
711         END IF;
712 
713       END LOOP;
714     END IF;
715 
716     -- create a new instance for the decremented qty
717     api_log(
718       p_pkg_name => 'csi_item_instance_pub',
719       p_api_name => 'create_item_instance');
720 
721     csi_item_instance_pub.create_item_instance(
722       p_api_version           => 1.0,
723       p_commit                => fnd_api.g_false,
724       p_init_msg_list         => fnd_api.g_true,
725       p_validation_level      => fnd_api.g_valid_level_full,
726       p_instance_rec          => l_c_instance_rec,
727       p_party_tbl             => l_c_parties_tbl,
728       p_account_tbl           => l_c_pty_accts_tbl,
729       p_org_assignments_tbl   => l_c_org_units_tbl,
730       p_ext_attrib_values_tbl => l_c_ea_values_tbl,
731       p_pricing_attrib_tbl    => l_c_pricing_tbl,
732       p_asset_assignment_tbl  => l_c_assets_tbl,
733       p_txn_rec               => px_csi_txn_rec,
734       x_return_status         => l_return_status,
735       x_msg_count             => l_msg_count,
736       x_msg_data              => l_msg_data );
737 
738     -- For Bug 4057183
739     -- IF l_return_status <> fnd_api.g_ret_sts_success THEN
740     IF l_return_status not in (fnd_api.g_ret_sts_success,'W') THEN
741       RAISE fnd_api.g_exc_error;
742     END IF;
743 
744     debug('  new instance_id   : '||l_c_instance_rec.instance_id);
745 
746     x_new_instance_id := l_c_instance_rec.instance_id;
747 
748   EXCEPTION
749     WHEN fnd_api.g_exc_error THEN
750       x_return_status := fnd_api.g_ret_sts_error;
751   END create_wip_instance_as;
752 
753   PROCEDURE apportion_always(
754     p_assembly_instances  IN  csi_datastructures_pub.instance_tbl,
755     p_splitted_instances  IN  csi_datastructures_pub.instance_tbl,
756     p_job_quantity        IN  number,
757     p_comp_serial_code    IN  number,
758     x_assy_comp_map_tbl   OUT NOCOPY assy_comp_map_tbl,
759     x_return_status       OUT NOCOPY varchar2)
760   IS
761 
762    l_assy_tbl             csi_datastructures_pub.instance_tbl;
763    l_issues_tbl           csi_datastructures_pub.instance_tbl;
764 
765    l_ac_mapping_tbl       assy_comp_map_tbl;
766    l_ac_ind               binary_integer;
767    l_remaining_quantity   number;
768    l_allocated_quantity   number;
769    l_reverse_ind          number;
770 
771    --Included for bug 4941800
772    l_gen_child_qty        number;
773    l_qty_ratio            number;
774 
775    l_genealogy_traced     boolean := FALSE;
776 
777    l_parent_object_id     number;
778    l_parent_serial_number mtl_serial_numbers.serial_number%type;
779    l_parent_item_id       number;
780    l_c_ind                binary_integer;
781 
782    CURSOR mog_cur(p_parent_object_id IN number) IS
783      SELECT msn.serial_number child_serial_number
784      FROM   mtl_object_genealogy mog,
785             mtl_serial_numbers   msn
786      WHERE  mog.parent_object_type = 2
787      AND    mog.parent_object_id   = p_parent_object_id
788      AND    mog.object_type        = 2
789      AND    msn.gen_object_id      = mog.object_id
790      AND    sysdate BETWEEN nvl(mog.start_date_active, sysdate-1)
791                     AND     nvl(mog.end_date_active,   sysdate+1);
792 
793   BEGIN
794 
795     x_return_status := fnd_api.g_ret_sts_success;
796 
797     api_log('apportion_always');
798 
799     l_issues_tbl := p_splitted_instances;
800     l_assy_tbl   := p_assembly_instances;
801 
802     l_ac_ind := 0;
803     --Included for bug 4941800
804     BEGIN
805         l_qty_ratio := l_issues_tbl.COUNT / p_job_quantity;
806       EXCEPTION
807         WHEN zero_divide THEN
808           l_qty_ratio := 0;
809           --seed message appropriately
810     END;
811 
812 
813     /* for non serialized items the instances are splitted in the
814        split issued instances routine in the appropriate ratio
815     */
816     IF p_comp_serial_code IN (1, 6) THEN
817       IF l_assy_tbl.COUNT > 0 THEN
818         FOR l_a_ind IN l_assy_tbl.FIRST .. l_assy_tbl.LAST
819         LOOP
820 
821           IF l_issues_tbl.COUNT > 0 THEN
822             l_c_ind := 0;
823             LOOP
824               l_c_ind := l_issues_tbl.NEXT(l_c_ind);
825               EXIT when l_c_ind is null;
826 
827               l_ac_ind := l_ac_ind + 1;
828 
829               l_ac_mapping_tbl(l_ac_ind).assy_instance_id :=
830                                          l_assy_tbl(l_a_ind).instance_id;
831               l_ac_mapping_tbl(l_ac_ind).comp_instance_id :=
832                                          l_issues_tbl(l_c_ind).instance_id;
833               l_ac_mapping_tbl(l_ac_ind).comp_quantity :=
834                                          l_issues_tbl(l_c_ind).quantity;
835 
836               l_issues_tbl.DELETE(l_c_ind);
837               EXIT;
838             END LOOP;
839           END IF;
840         END LOOP;
841       END IF;
842     ELSE -- serialized case
843 
844       IF l_assy_tbl.COUNT > 0 THEN
845         /* making an assumption here for serialized components the total
846            issued component quantity is the count of the table */
847         l_remaining_quantity := l_issues_tbl.COUNT;
848 
849         --l_reverse_ind      := l_assy_tbl.COUNT;
850         l_reverse_ind        := p_job_quantity;
851 
852         -- check genealogy here if genealogy can be traced then map accordingly
853         debug('Parse I - Genealogy check.');
854 
855         FOR l_a_ind IN l_assy_tbl.FIRST .. l_assy_tbl.LAST
856         LOOP
857 
858           debug('  Parent Serial   :'||l_assy_tbl(l_a_ind).serial_number);
859 
860           BEGIN
861             l_genealogy_traced := FALSE;
862 	    l_gen_child_qty    := 0; --fix for bug4941800
863 
864             SELECT gen_object_id
865             INTO   l_parent_object_id
866             FROM   mtl_serial_numbers
867             WHERE  inventory_item_id = l_assy_tbl(l_a_ind).inventory_item_id
868             AND    serial_number     = l_assy_tbl(l_a_ind).serial_number;
869 
870             FOR mog_rec in mog_cur (l_parent_object_id)
871             LOOP
872 
873               l_genealogy_traced := TRUE;
874               debug('    Child Serial(G)'||mog_rec.child_serial_number);
875 
876               IF l_issues_tbl.COUNT > 0 THEN
877                 l_c_ind := 0;
878                 LOOP
879 
880                   l_c_ind := l_issues_tbl.NEXT(l_c_ind);
881                   EXIT when l_c_ind is null;
882 
883                   IF  mog_rec.child_serial_number = l_issues_tbl(l_c_ind).serial_number THEN
884 
885 
886                     l_ac_ind := l_ac_ind + 1;
887                     l_ac_mapping_tbl(l_ac_ind).assy_instance_id :=
888                                          l_assy_tbl(l_a_ind).instance_id;
889                     l_ac_mapping_tbl(l_ac_ind).comp_instance_id :=
890                                          l_issues_tbl(l_c_ind).instance_id;
891                     l_ac_mapping_tbl(l_ac_ind).comp_quantity :=
892                                          l_issues_tbl(l_c_ind).quantity;
893                     l_issues_tbl.DELETE(l_c_ind);
894                     l_remaining_quantity := l_remaining_quantity - 1;
895 		    l_gen_child_qty	 := l_gen_child_qty + 1; --fix for bug4941800
896 
897                   END IF;
898                 END LOOP;
899 
900               END IF;
901 
902             END LOOP;
903           -- exception to be handled
904           END;
905 
906           /* do not get confused here. Using the processed flag in instance rec
907              just to mark that genealogy is found for this assembly and skip this
908              for random allocation
909           */
910   	  --Included for bug 4941800:processed_flag set to 'Y' only if all geneology child
911 	  -- specified are picked for building relationship.
912           IF l_genealogy_traced AND l_gen_child_qty >= l_qty_ratio THEN
913             l_assy_tbl(l_a_ind).processed_flag := 'Y';
914           ELSE
915             l_assy_tbl(l_a_ind).processed_flag := 'N';
916           END IF;
917 
918 	END LOOP;
919 
920         --for the ones that genealogy is not specified then
921 
922         debug('Parse II - Random allocation.');
923 
924         FOR l_a_ind IN l_assy_tbl.FIRST .. l_assy_tbl.LAST
925         LOOP
926 
927           debug('  Parent Serial   :'||l_assy_tbl(l_a_ind).serial_number);
928 
929           IF nvl(l_assy_tbl(l_a_ind).processed_flag,'N') <> 'Y' THEN
930 
931             IF l_issues_tbl.COUNT > 0 THEN
932 
933               l_allocated_quantity := CEIL(l_remaining_quantity/l_reverse_ind);
934               l_reverse_ind        := l_reverse_ind - 1;
935               l_remaining_quantity := l_remaining_quantity - l_allocated_quantity;
936 
937               l_c_ind := 0;
938               LOOP
939                 l_c_ind := l_issues_tbl.NEXT(l_c_ind);
940                 EXIT when l_c_ind is null;
941 
942                 l_ac_ind := l_ac_ind + 1;
943 
944                 l_ac_mapping_tbl(l_ac_ind).assy_instance_id :=
945                                          l_assy_tbl(l_a_ind).instance_id;
946                 l_ac_mapping_tbl(l_ac_ind).comp_instance_id :=
947                                          l_issues_tbl(l_c_ind).instance_id;
948                 l_ac_mapping_tbl(l_ac_ind).comp_quantity :=
949                                          l_issues_tbl(l_c_ind).quantity;
950 
951                 debug('    Child Serial  :'||l_issues_tbl(l_c_ind).serial_number);
952 
953                 l_issues_tbl.DELETE(l_c_ind);
954                 l_allocated_quantity := l_allocated_quantity - 1;
955                 IF l_allocated_quantity = 0 THEN
956                   EXIT;
957                 END IF;
958               END LOOP;
959             END IF;
960           END IF;
961 
962         END LOOP; --assy table loop;
963       END IF; -- assy table count > 0
964     END IF; -- serial check
965 
966     x_assy_comp_map_tbl := l_ac_mapping_tbl;
967 
968   EXCEPTION
969     WHEN fnd_api.g_exc_error THEN
970       x_return_status := fnd_api.g_ret_sts_error;
971   END apportion_always;
972 
973 
974   /* this routine gets the instances created for the asssembly completion instances
975      and are in inventory location . Just created instances before they move to another
976      location like WIP or customer location
977   */
978 
979   PROCEDURE get_assembly_instances(
980     p_wip_entity_id       IN  number,
981     p_organization_id     IN  number,
982     p_assembly_item_id    IN  number,
983     p_completion_quantity IN  number,
984     p_location_code       IN  varchar2,
985     x_instance_tbl        OUT NOCOPY csi_datastructures_pub.instance_tbl,
986     x_return_status       OUT NOCOPY varchar2)
987   IS
988 
989     --l_inventory_item_id     wip_discrete_jobs.primary_item_id%TYPE;
990     l_completion_quantity   number;
991     l_relation_found        varchar2(1) := 'N';
992 
993     -- get_item_instances variables
994     l_inst_query_rec        csi_datastructures_pub.instance_query_rec;
995     l_party_query_rec       csi_datastructures_pub.party_query_rec;
996     l_pty_acct_query_rec    csi_datastructures_pub.party_account_query_rec;
997 
998     --
999     l_instance_hdr_tbl      csi_datastructures_pub.instance_header_tbl;
1000     l_instance_tbl          csi_datastructures_pub.instance_tbl;
1001 
1002     l_return_status         varchar2(1) := fnd_api.g_ret_sts_success;
1003     l_msg_data              varchar2(2000);
1004     l_msg_count             number;
1005 
1006   BEGIN
1007 
1008     x_return_status := fnd_api.g_ret_sts_success;
1009 
1010     api_log('get_assembly_instances');
1011 
1012     l_completion_quantity  := p_completion_quantity;
1013 
1014     -- instance query parameters
1015 
1016     l_inst_query_rec.inventory_item_id   := p_assembly_item_id;
1017     l_inst_query_rec.last_wip_job_id     := p_wip_entity_id;
1018 
1019     -- qeury by last_vld_organization_id is appropriate
1020     -- but since there is no column in instance_query_record
1021 
1022     IF p_location_code = 'INVENTORY' THEN
1023       l_inst_query_rec.location_type_code  := 'INVENTORY';
1024       l_inst_query_rec.instance_usage_code := 'IN_INVENTORY';
1025       l_inst_query_rec.inv_organization_id := p_organization_id;
1026     END IF;
1027 
1028     csi_t_gen_utility_pvt.dump_instance_query_rec(l_inst_query_rec);
1029 
1030     api_log(
1031       p_api_name => 'get_item_instances',
1032       p_pkg_name => 'csi_item_instance_pub');
1033 
1034     csi_item_instance_pub.get_item_instances(
1035       p_api_version          =>  1.0,
1036       p_commit               =>  fnd_api.g_false,
1037       p_init_msg_list        =>  fnd_api.g_true,
1038       p_validation_level     =>  fnd_api.g_valid_level_full,
1039       p_instance_query_rec   =>  l_inst_query_rec,
1040       p_party_query_rec      =>  l_party_query_rec,
1041       p_account_query_rec    =>  l_pty_acct_query_rec,
1042       p_transaction_id       =>  null,
1043       p_resolve_id_columns   =>  fnd_api.g_false,
1044       p_active_instance_only =>  fnd_api.g_true,
1045       x_instance_header_tbl  =>  l_instance_hdr_tbl,
1046       x_return_status        =>  l_return_status,
1047       x_msg_count            =>  l_msg_count,
1048       x_msg_data             =>  l_msg_data);
1049 
1050     IF l_return_status <> fnd_api.g_ret_sts_success THEN
1051       RAISE fnd_api.g_exc_error;
1052     END IF;
1053 
1054     debug('Assembly instances count :'||l_instance_hdr_tbl.COUNT);
1055 
1056     IF l_instance_hdr_tbl.COUNT > 0 THEN
1057 
1058       csi_utl_pkg.make_non_header_tbl(
1059         p_instance_header_tbl => l_instance_hdr_tbl,
1060         x_instance_tbl        => l_instance_tbl,
1061         x_return_status       => l_return_status);
1062 
1063       IF l_return_status <> fnd_api.g_ret_sts_success THEN
1064         RAISE fnd_api.g_exc_error;
1065       END IF;
1066 
1067     END IF;
1068 
1069     x_instance_tbl := l_instance_tbl;
1070 
1071   EXCEPTION
1072     WHEN fnd_api.g_exc_error THEN
1073       x_return_status := fnd_api.g_ret_sts_error;
1074 
1075   END get_assembly_instances;
1076 
1077   PROCEDURE get_qty_per_assembly(
1078     p_organization_id      IN number,
1079     p_wip_entity_id        IN number,
1080     p_component_item_id    IN number,
1081     x_qty_per_assembly     OUT NOCOPY number,
1082     x_return_status        OUT NOCOPY varchar2)
1083   IS
1084     l_qty_per_assy  number;
1085   BEGIN
1086 
1087     x_return_status := fnd_api.g_ret_sts_success;
1088 
1089     api_log('get_qty_per_assembly');
1090 
1091     SELECT sum(nvl(quantity_per_assembly,0))
1092     INTO   l_qty_per_assy
1093     FROM   wip_requirement_operations
1094     WHERE  organization_id   = p_organization_id
1095     AND    wip_entity_id     = p_wip_entity_id
1096     AND    inventory_item_id = p_component_item_id;
1097 
1098     debug('  qty_per_assy :'||l_qty_per_assy);
1099 
1100     x_qty_per_assembly := abs(l_qty_per_assy);
1101 
1102   EXCEPTION
1103     WHEN fnd_api.g_exc_error THEN
1104       x_return_status := fnd_api.g_ret_sts_error;
1105   END get_qty_per_assembly;
1106 
1107   PROCEDURE get_issued_requirements (
1108     p_wip_entity_id    IN  number,
1109     p_organization_id  IN  number,
1110     p_assembly_item_id IN  number,
1111     p_auto_allocate    IN  varchar2,
1112     x_requirements_tbl OUT NOCOPY requirements_tbl,
1113     x_return_status    OUT NOCOPY varchar2)
1114   IS
1115 
1116     CURSOR wro_cur_all IS
1117       SELECT wip.inventory_item_id,
1118              sum(required_quantity)     qty_required,
1119              sum(quantity_issued)       qty_issued,
1120              nvl(sum(nvl(quantity_per_assembly,0)),0) qty_per_assy
1121       FROM   wip_requirement_operations wip, mtl_system_items msi
1122       WHERE  wip.wip_entity_id         = p_wip_entity_id
1123       AND    wip.organization_id   = p_organization_id
1124       AND    wip.inventory_item_id <> p_assembly_item_id
1125       AND    wip.inventory_item_id = msi.inventory_item_id
1126       AND    wip.organization_id   = msi.organization_id
1127       AND    nvl(msi.comms_nl_trackable_flag, 'N') = 'Y'
1128       AND    (nvl(quantity_issued,0) > 0
1129               OR
1130               EXISTS (
1131                 SELECT 'X' FROM mtl_material_transactions mmt
1132                 WHERE  mmt.transaction_action_id      in (1,34)
1133                 AND    mmt.transaction_source_type_id = 5
1134                 AND    mmt.transaction_source_id      = wip.wip_entity_id
1135                 AND    mmt.inventory_item_id          = wip.inventory_item_id))
1136       GROUP BY wip.inventory_item_id;
1137 
1138     CURSOR wro_cur_required IS
1139       SELECT wip.inventory_item_id,
1140              sum(required_quantity)     qty_required,
1141              sum(quantity_issued)       qty_issued,
1142              nvl(sum(nvl(quantity_per_assembly,0)),0) qty_per_assy
1143       FROM   wip_requirement_operations wip, mtl_system_items msi
1144       WHERE  wip.wip_entity_id         = p_wip_entity_id
1145       AND    wip.organization_id   = p_organization_id
1146       AND    wip.inventory_item_id <> p_assembly_item_id
1147       AND    wip.inventory_item_id = msi.inventory_item_id
1148       AND    wip.organization_id   = msi.organization_id
1149       AND    nvl(msi.comms_nl_trackable_flag, 'N') = 'Y'
1150       AND    nvl(quantity_per_assembly, 0) > 0
1151       AND    (nvl(quantity_issued,0) > 0
1152               OR
1153               EXISTS (
1154                 SELECT 'X' FROM mtl_material_transactions mmt
1155                 WHERE  mmt.transaction_action_id      in (1,34)
1156                 AND    mmt.transaction_source_type_id = 5
1157                 AND    mmt.transaction_source_id      = wip.wip_entity_id
1158                 AND    mmt.inventory_item_id          = wip.inventory_item_id))
1159       GROUP BY wip.inventory_item_id;
1160 
1161     l_job_quantity         number;
1162     l_requirements_tbl     requirements_tbl;
1163     l_ind                  binary_integer;
1164     l_qty_per_assy         number;
1165     l_return_status        varchar2(1) := fnd_api.g_ret_sts_success;
1166 
1167   BEGIN
1168 
1169     x_return_status := fnd_api.g_ret_sts_success;
1170 
1171     api_log('get_issued_requirements');
1172 
1173     BEGIN
1174       SELECT start_quantity
1175       INTO   l_job_quantity
1176       FROM   wip_discrete_jobs
1177       WHERE  wip_entity_id   = p_wip_entity_id
1178       AND    organization_id = p_organization_id;
1179     EXCEPTION
1180       WHEN no_data_found THEN
1181         l_job_quantity := 0;
1182     END;
1183 
1184     IF p_auto_allocate = 'Y' OR l_job_quantity = 1 THEN
1185 
1186       FOR req_rec IN wro_cur_all
1187       LOOP
1188 
1189         l_ind := wro_cur_all%ROWCOUNT;
1190 
1191         l_requirements_tbl(l_ind).wip_entity_id     := p_wip_entity_id;
1192         l_requirements_tbl(l_ind).organization_id   := p_organization_id;
1193         l_requirements_tbl(l_ind).inventory_item_id := req_rec.inventory_item_id;
1194         l_requirements_tbl(l_ind).required_quantity := req_rec.qty_required;
1195         l_requirements_tbl(l_ind).issued_quantity   := req_rec.qty_issued;
1196         l_requirements_tbl(l_ind).quantity_per_assy := req_rec.qty_per_assy;
1197 
1198         IF l_requirements_tbl(l_ind).issued_quantity = 0 THEN
1199           SELECT sum(nvl(abs(transaction_quantity),0))
1200           INTO   l_requirements_tbl(l_ind).issued_quantity
1201           FROM   mtl_material_transactions mmt
1202           WHERE  mmt.transaction_action_id      in (1,34)
1203           AND    mmt.transaction_source_type_id = 5
1204           AND    mmt.inventory_item_id          = l_requirements_tbl(l_ind).inventory_item_id
1205           AND    mmt.transaction_source_id      = p_wip_entity_id;
1206         END IF;
1207       END LOOP;
1208 
1209     ELSE
1210 
1211       debug('  Restricted Mode Requirements..');
1212 
1213       FOR req_rec IN wro_cur_required
1214       LOOP
1215 
1216         l_ind := wro_cur_required%ROWCOUNT;
1217 
1218         l_requirements_tbl(l_ind).wip_entity_id     := p_wip_entity_id;
1219         l_requirements_tbl(l_ind).organization_id   := p_organization_id;
1220         l_requirements_tbl(l_ind).inventory_item_id := req_rec.inventory_item_id;
1221         l_requirements_tbl(l_ind).required_quantity := req_rec.qty_required;
1222         l_requirements_tbl(l_ind).issued_quantity   := req_rec.qty_issued;
1223 
1224         get_qty_per_assembly(
1225           p_organization_id      => p_organization_id,
1226           p_wip_entity_id        => p_wip_entity_id,
1227           p_component_item_id    => req_rec.inventory_item_id,
1228           x_qty_per_assembly     => l_qty_per_assy,
1229           x_return_status        => l_return_status);
1230 
1231         IF l_return_status <> fnd_api.g_ret_sts_success THEN
1232           RAISE fnd_api.g_exc_error;
1233         END IF;
1234 
1235         l_requirements_tbl(l_ind).quantity_per_assy := l_qty_per_assy;
1236 
1237         IF l_requirements_tbl(l_ind).issued_quantity = 0 THEN
1238           SELECT sum(nvl(abs(transaction_quantity),0))
1239           INTO   l_requirements_tbl(l_ind).issued_quantity
1240           FROM   mtl_material_transactions mmt
1241           WHERE  mmt.transaction_action_id      in (1,34)
1242           AND    mmt.transaction_source_type_id = 5
1243           AND    mmt.inventory_item_id          = l_requirements_tbl(l_ind).inventory_item_id
1244           AND    mmt.transaction_source_id      = p_wip_entity_id;
1245         END IF;
1246 
1247       END LOOP;
1248 
1249     END IF;
1250 
1251     x_requirements_tbl := l_requirements_tbl;
1252 
1253   EXCEPTION
1254     WHEN fnd_api.g_exc_error THEN
1255       x_return_status := fnd_api.g_ret_sts_error;
1256   END get_issued_requirements;
1257 
1258   PROCEDURE get_issued_instances(
1259     p_wip_entity_id       IN  number,
1260     p_organization_id     IN  number,
1261     p_inventory_item_id   IN  number,
1262     p_serial_number       IN  varchar2,
1263     x_instance_tbl        OUT NOCOPY csi_datastructures_pub.instance_tbl,
1264     x_return_status       OUT NOCOPY varchar2)
1265   IS
1266 
1267     -- get_item_instances variables
1268     l_inst_query_rec      csi_datastructures_pub.instance_query_rec;
1269     l_party_query_rec     csi_datastructures_pub.party_query_rec;
1270     l_pty_acct_query_rec  csi_datastructures_pub.party_account_query_rec;
1271 
1272     l_instance_hdr_tbl    csi_datastructures_pub.instance_header_tbl;
1273 
1274     l_instance_tbl        csi_datastructures_pub.instance_tbl;
1275     --
1276     l_return_status       varchar2(1) := fnd_api.g_ret_sts_success;
1277     l_msg_data            varchar2(2000);
1278     l_msg_count           number;
1279 
1280   BEGIN
1281 
1282     x_return_status := fnd_api.g_ret_sts_success;
1283 
1284     api_log('get_issued_instances');
1285 
1286     l_inst_query_rec.wip_job_id          := p_wip_entity_id;
1287     l_inst_query_rec.location_type_code  := 'WIP';
1288     l_inst_query_rec.inventory_item_id   := p_inventory_item_id;
1289     l_inst_query_rec.serial_number       := p_serial_number;
1290     l_inst_query_rec.instance_usage_code := 'IN_WIP';
1291 
1292     api_log(
1293       p_api_name => 'get_item_instances',
1294       p_pkg_name => 'csi_item_instance_pub');
1295 
1296     csi_item_instance_pub.get_item_instances(
1297       p_api_version          =>  1.0,
1298       p_commit               =>  fnd_api.g_false,
1299       p_init_msg_list        =>  fnd_api.g_true,
1300       p_validation_level     =>  fnd_api.g_valid_level_full,
1301       p_instance_query_rec   =>  l_inst_query_rec,
1302       p_party_query_rec      =>  l_party_query_rec,
1303       p_account_query_rec    =>  l_pty_acct_query_rec,
1304       p_transaction_id       =>  null,
1305       p_resolve_id_columns   =>  fnd_api.g_false,
1306       p_active_instance_only =>  fnd_api.g_true,
1307       x_instance_header_tbl  =>  l_instance_hdr_tbl,
1308       x_return_status        =>  l_return_status,
1309       x_msg_count            =>  l_msg_count,
1310       x_msg_data             =>  l_msg_data  );
1311 
1312     IF l_return_status <> fnd_api.g_ret_sts_success THEN
1313       RAISE fnd_api.g_exc_error;
1314     END IF;
1315 
1316     IF l_instance_hdr_tbl.COUNT > 0 THEN
1317       debug('Issued instances found for inventory item id: '||p_inventory_item_id);
1318     ELSE
1319       debug('Issued instances not found for inventory item id: '||p_inventory_item_id);
1320     END IF;
1321 
1322     csi_utl_pkg.make_non_header_tbl(
1323       p_instance_header_tbl => l_instance_hdr_tbl,
1324       x_instance_tbl        => l_instance_tbl,
1325       x_return_status       => l_return_status);
1326 
1327     IF l_return_status <> fnd_api.g_ret_sts_success THEN
1328       RAISE fnd_api.g_exc_error;
1329     END IF;
1330 
1331     x_instance_tbl := l_instance_tbl;
1332 
1333   EXCEPTION
1334     WHEN fnd_api.g_exc_error THEN
1335       x_return_status := fnd_api.g_ret_sts_error;
1336 
1337   END get_issued_instances;
1338 
1339   PROCEDURE get_serial_instance(
1340     p_inventory_item_id   IN  number,
1341     p_serial_number       IN  varchar2,
1342     x_instance_tbl        OUT NOCOPY csi_datastructures_pub.instance_tbl,
1343     x_return_status       OUT NOCOPY varchar2)
1344   IS
1345 
1346     -- get_item_instances variables
1347     l_inst_query_rec      csi_datastructures_pub.instance_query_rec;
1348     l_party_query_rec     csi_datastructures_pub.party_query_rec;
1349     l_pty_acct_query_rec  csi_datastructures_pub.party_account_query_rec;
1350 
1351     l_instance_hdr_tbl    csi_datastructures_pub.instance_header_tbl;
1352     l_instance_tbl        csi_datastructures_pub.instance_tbl;
1353 
1354     --
1355     l_return_status       varchar2(1) := fnd_api.g_ret_sts_success;
1356     l_msg_data            varchar2(2000);
1357     l_msg_count           number;
1358 
1359     l_t_ind               binary_integer := 0;
1360     l_tmp_inst_hdr_tbl    csi_datastructures_pub.instance_header_tbl;
1361 
1362   BEGIN
1363 
1364     x_return_status := fnd_api.g_ret_sts_success;
1365 
1366     api_log('get_serial_instance');
1367 
1368     l_inst_query_rec.inventory_item_id   := p_inventory_item_id;
1369     l_inst_query_rec.serial_number       := p_serial_number;
1370 
1371     csi_t_gen_utility_pvt.dump_api_info(
1372       p_api_name => 'get_item_instances',
1373       p_pkg_name => 'csi_item_instance_pub');
1374 
1375     csi_item_instance_pub.get_item_instances(
1376       p_api_version          =>  1.0,
1377       p_commit               =>  fnd_api.g_false,
1378       p_init_msg_list        =>  fnd_api.g_true,
1379       p_validation_level     =>  fnd_api.g_valid_level_full,
1380       p_instance_query_rec   =>  l_inst_query_rec,
1381       p_party_query_rec      =>  l_party_query_rec,
1382       p_account_query_rec    =>  l_pty_acct_query_rec,
1383       p_transaction_id       =>  null,
1384       p_resolve_id_columns   =>  fnd_api.g_false,
1385       p_active_instance_only =>  fnd_api.g_false,
1386       x_instance_header_tbl  =>  l_instance_hdr_tbl,
1387       x_return_status        =>  l_return_status,
1388       x_msg_count            =>  l_msg_count,
1389       x_msg_data             =>  l_msg_data);
1390 
1391     IF l_return_status <> fnd_api.g_ret_sts_success THEN
1392       RAISE fnd_api.g_exc_error;
1393     END IF;
1394 
1395     IF l_instance_hdr_tbl.COUNT > 0 THEN
1396       debug('instance tbl count :'||l_instance_hdr_tbl.COUNT);
1397       csi_utl_pkg.make_non_header_tbl(
1398         p_instance_header_tbl => l_instance_hdr_tbl,
1399         x_instance_tbl        => l_instance_tbl,
1400         x_return_status       => l_return_status);
1401 
1402       /* this is just for debugging */
1403       IF l_instance_tbl.count > 0 THEN
1404         FOR l_ind IN l_instance_tbl.FIRST .. l_instance_tbl.LAST
1405         LOOP
1406           debug('  instance_id             :'||l_instance_tbl(l_ind).instance_id);
1407           debug('    accounting_class_code :'||l_instance_tbl(l_ind).accounting_class_code);
1408           debug('    location_type_code    :'||l_instance_tbl(l_ind).location_type_code);
1409           debug('    instance_usage_code   :'||l_instance_tbl(l_ind).instance_usage_code);
1410           debug('    wip_job_id            :'||l_instance_tbl(l_ind).wip_job_id);
1411           debug('    last_oe_rma_line_id   :'||l_instance_tbl(l_ind).last_oe_rma_line_id);
1412           debug('    last_oe_order_line_id :'||l_instance_tbl(l_ind).last_oe_order_line_id);
1413           debug('    active_end_date       :'||l_instance_tbl(l_ind).active_end_date);
1414         END LOOP;
1415       END IF;
1416 
1417     END IF;
1418 
1419     x_instance_tbl := l_instance_tbl;
1420 
1421   EXCEPTION
1422     WHEN fnd_api.g_exc_error THEN
1423       x_return_status := fnd_api.g_ret_sts_error;
1424   END get_serial_instance;
1425 
1426   PROCEDURE split_instance_using_ratio(
1427     p_instance_id         IN     number,
1428     p_qty_ratio           IN     number,
1429     p_qty_completed       IN     number,
1430     p_organization_id     IN     number,
1431     px_csi_txn_rec        IN OUT NOCOPY csi_datastructures_pub.transaction_rec,
1432     x_splitted_instances     OUT NOCOPY csi_datastructures_pub.instance_tbl,
1433     x_return_status          OUT NOCOPY varchar2)
1434   IS
1435 
1436     l_qty_remaining         number;
1437 
1438     l_init_instance_rec     csi_datastructures_pub.instance_rec;
1439 
1440     l_return_status         varchar2(1) := fnd_api.g_ret_sts_success;
1441     l_msg_data              varchar2(2000);
1442     l_msg_count             number;
1443 
1444     l_split_flag            boolean := FALSE;
1445 
1446     l_splitted_instances    csi_datastructures_pub.instance_tbl;
1447     l_s_ind                 binary_integer;
1448 
1449     -- get_item_instance_details variables
1450     l_g_instance_rec        csi_datastructures_pub.instance_header_rec;
1451     l_g_ph_tbl              csi_datastructures_pub.party_header_tbl;
1452     l_g_pah_tbl             csi_datastructures_pub.party_account_header_tbl;
1453     l_g_ouh_tbl             csi_datastructures_pub.org_units_header_tbl;
1454     l_g_pa_tbl              csi_datastructures_pub.pricing_attribs_tbl;
1455     l_g_eav_tbl             csi_datastructures_pub.extend_attrib_values_tbl;
1456     l_g_ea_tbl              csi_datastructures_pub.extend_attrib_tbl;
1457     l_g_iah_tbl             csi_datastructures_pub.instance_asset_header_tbl;
1458     l_g_time_stamp          date;
1459 
1460     -- make_non_hdr variables
1461     l_instance_rec          csi_datastructures_pub.instance_rec;
1462 
1463     -- update_item_instance variables
1464     l_u_instance_rec        csi_datastructures_pub.instance_rec;
1465     l_u_parties_tbl         csi_datastructures_pub.party_tbl;
1466     l_u_pty_accts_tbl       csi_datastructures_pub.party_account_tbl;
1467     l_u_org_units_tbl       csi_datastructures_pub.organization_units_tbl;
1468     l_u_ea_values_tbl       csi_datastructures_pub.extend_attrib_values_tbl;
1469     l_u_pricing_tbl         csi_datastructures_pub.pricing_attribs_tbl;
1470     l_u_assets_tbl          csi_datastructures_pub.instance_asset_tbl;
1471     l_u_instance_ids_list   csi_datastructures_pub.id_tbl;
1472 
1473     -- create_item_instance varaibles
1474     l_c_instance_rec        csi_datastructures_pub.instance_rec;
1475     l_c_parties_tbl         csi_datastructures_pub.party_tbl;
1476     l_c_pty_accts_tbl       csi_datastructures_pub.party_account_tbl;
1477     l_c_org_units_tbl       csi_datastructures_pub.organization_units_tbl;
1478     l_c_ea_values_tbl       csi_datastructures_pub.extend_attrib_values_tbl;
1479     l_c_pricing_tbl         csi_datastructures_pub.pricing_attribs_tbl;
1480     l_c_assets_tbl          csi_datastructures_pub.instance_asset_tbl;
1481     c_pa_ind                binary_integer;
1482 
1483   BEGIN
1484 
1485     x_return_status := fnd_api.g_ret_sts_success;
1486 
1487     api_log('split_instance_using_ratio');
1488 
1489     l_s_ind := 0;
1490 
1491     l_g_instance_rec.instance_id := p_instance_id;
1492 
1493     api_log(
1494       p_pkg_name => 'csi_item_instance_pub',
1495       p_api_name => 'get_item_instance_details');
1496 
1497     -- get the instance party and party account info
1498     csi_item_instance_pub.get_item_instance_details(
1499       p_api_version           => 1.0,
1500       p_commit                => fnd_api.g_false,
1501       p_init_msg_list         => fnd_api.g_true,
1502       p_validation_level      => fnd_api.g_valid_level_full,
1503       p_instance_rec          => l_g_instance_rec,
1504       p_get_parties           => fnd_api.g_true,
1505       p_party_header_tbl      => l_g_ph_tbl,
1506       p_get_accounts          => fnd_api.g_true,
1507       p_account_header_tbl    => l_g_pah_tbl,
1508       p_get_org_assignments   => fnd_api.g_false,
1509       p_org_header_tbl        => l_g_ouh_tbl,
1510       p_get_pricing_attribs   => fnd_api.g_false,
1511       p_pricing_attrib_tbl    => l_g_pa_tbl,
1512       p_get_ext_attribs       => fnd_api.g_false,
1513       p_ext_attrib_tbl        => l_g_eav_tbl,
1514       p_ext_attrib_def_tbl    => l_g_ea_tbl,
1515       p_get_asset_assignments => fnd_api.g_false,
1516       p_asset_header_tbl      => l_g_iah_tbl,
1517       p_time_stamp            => l_g_time_stamp,
1518       x_return_status         => l_return_status,
1519       x_msg_count             => l_msg_count,
1520       x_msg_data              => l_msg_data);
1521 
1522     IF l_return_status <> fnd_api.g_ret_sts_success THEN
1523       RAISE fnd_api.g_exc_error;
1524     END IF;
1525 
1526     make_non_hdr_rec(
1527       p_instance_hdr_rec => l_g_instance_rec,
1528       x_instance_rec     => l_instance_rec,
1529       x_return_status    => l_return_status);
1530 
1531     debug('  Component Instance ID :'||l_instance_rec.instance_id);
1532     debug('  Component Quantity    :'||l_instance_rec.quantity);
1533 
1534     l_qty_remaining := l_g_instance_rec.quantity;
1535 
1536     FOR ind IN 1 .. p_qty_completed
1537     LOOP
1538 
1539       IF l_qty_remaining > p_qty_ratio THEN
1540 
1541         l_split_flag := TRUE;
1542 
1543         -- initialize the record structure
1544         l_c_instance_rec := l_init_instance_rec;
1545         l_u_instance_rec := l_init_instance_rec;
1546 
1547         l_qty_remaining := l_qty_remaining - p_qty_ratio;
1548 
1549         debug('  Allocated Qty(NEW) :'||p_qty_ratio);
1550         debug('  Remaining Qty(UPD) :'||l_qty_remaining );
1551 
1552         l_c_instance_rec := l_instance_rec;
1553 
1554         -- substitute create specific attributes
1555         l_c_instance_rec.instance_id           := fnd_api.g_miss_num;
1556         l_c_instance_rec.instance_number       := fnd_api.g_miss_char;
1557         l_c_instance_rec.object_version_number := 1.0;
1558         l_c_instance_rec.vld_organization_id   := p_organization_id;
1559         l_c_instance_rec.quantity              := p_qty_ratio;
1560 
1561         -- build party
1562         l_c_parties_tbl.DELETE;
1563         l_c_pty_accts_tbl.DELETE;
1564         c_pa_ind := 0;
1565 
1566         IF l_g_ph_tbl.COUNT > 0 THEN
1567 
1568           FOR l_pt_ind IN l_g_ph_tbl.FIRST ..l_g_ph_tbl.LAST
1569           LOOP
1570             l_c_parties_tbl(l_pt_ind).instance_party_id  := fnd_api.g_miss_num;
1571             l_c_parties_tbl(l_pt_ind).instance_id        := fnd_api.g_miss_num;
1572             l_c_parties_tbl(l_pt_ind).party_id           :=
1573                             l_g_ph_tbl(l_pt_ind).party_id;
1574             l_c_parties_tbl(l_pt_ind).party_source_table :=
1575                              l_g_ph_tbl(l_pt_ind).party_source_table;
1576             l_c_parties_tbl(l_pt_ind).relationship_type_code :=
1577                              l_g_ph_tbl(l_pt_ind).relationship_type_code;
1578             l_c_parties_tbl(l_pt_ind).contact_flag       := 'N';
1579 
1580             -- build party account
1581             IF l_g_pah_tbl.COUNT > 0 THEN
1582               FOR l_pa_ind IN l_g_pah_tbl.FIRST..l_g_pah_tbl.LAST
1583               LOOP
1584                 IF l_g_pah_tbl(l_pa_ind).instance_party_id = l_g_ph_tbl(l_pt_ind).instance_party_id
1585                 THEN
1586                   c_pa_ind := c_pa_ind + 1;
1587                   l_c_pty_accts_tbl(c_pa_ind).parent_tbl_index   := l_pt_ind;
1588                   l_c_pty_accts_tbl(c_pa_ind).ip_account_id      := fnd_api.g_miss_num;
1589                   l_c_pty_accts_tbl(c_pa_ind).instance_party_id  := fnd_api.g_miss_num;
1590                   l_c_pty_accts_tbl(c_pa_ind).party_account_id       :=
1591                                               l_g_pah_tbl(l_pa_ind).party_account_id;
1592                   l_c_pty_accts_tbl(c_pa_ind).relationship_type_code :=
1593                             l_g_pah_tbl(l_pa_ind).relationship_type_code;
1594                 END IF;
1595               END LOOP;
1596             END IF;
1597 
1598           END LOOP;
1599         END IF;
1600 
1601         -- create a new instance for the decremented qty
1602         api_log(
1603           p_pkg_name => 'csi_item_instance_pub',
1604           p_api_name => 'create_item_instance');
1605 
1606         csi_item_instance_pub.create_item_instance(
1607           p_api_version           => 1.0,
1608           p_commit                => fnd_api.g_false,
1609           p_init_msg_list         => fnd_api.g_true,
1610           p_validation_level      => fnd_api.g_valid_level_full,
1611           p_instance_rec          => l_c_instance_rec,
1612           p_party_tbl             => l_c_parties_tbl,
1613           p_account_tbl           => l_c_pty_accts_tbl,
1614           p_org_assignments_tbl   => l_c_org_units_tbl,
1615           p_ext_attrib_values_tbl => l_c_ea_values_tbl,
1616           p_pricing_attrib_tbl    => l_c_pricing_tbl,
1617           p_asset_assignment_tbl  => l_c_assets_tbl,
1618           p_txn_rec               => px_csi_txn_rec,
1619           x_return_status         => l_return_status,
1620           x_msg_count             => l_msg_count,
1621           x_msg_data              => l_msg_data );
1622 
1623         -- For Bug 4057183
1624         -- IF l_return_status <> fnd_api.g_ret_sts_success THEN
1625         IF l_return_status not in (fnd_api.g_ret_sts_success,'W') THEN
1626           RAISE fnd_api.g_exc_error;
1627         END IF;
1628 
1629         debug('  New Instance ID :'||l_c_instance_rec.instance_id);
1630 
1631         l_s_ind := l_s_ind + 1;
1632         l_splitted_instances(l_s_ind) := l_c_instance_rec;
1633 
1634         -- decrementing the existing wip instance with the remaining quantity
1635         l_u_instance_rec.instance_id         := p_instance_id;
1636         l_u_instance_rec.quantity            := l_qty_remaining;
1637         l_u_instance_rec.vld_organization_id := p_organization_id;
1638 
1639         SELECT object_version_number
1640         INTO   l_u_instance_rec.object_version_number
1641         FROM   csi_item_instances
1642         WHERE  instance_id = l_u_instance_rec.instance_id;
1643 
1644         api_log(
1645           p_pkg_name => 'csi_item_instance_pub',
1646           p_api_name => 'update_item_instance');
1647 
1648         csi_item_instance_pub.update_item_instance(
1649           p_api_version           => 1.0,
1650           p_commit                => fnd_api.g_false,
1651           p_init_msg_list         => fnd_api.g_true,
1652           p_validation_level      => fnd_api.g_valid_level_full,
1653           p_instance_rec          => l_u_instance_rec,
1654           p_party_tbl             => l_u_parties_tbl,
1655           p_account_tbl           => l_u_pty_accts_tbl,
1656           p_org_assignments_tbl   => l_u_org_units_tbl,
1657           p_ext_attrib_values_tbl => l_u_ea_values_tbl,
1658           p_pricing_attrib_tbl    => l_u_pricing_tbl,
1659           p_asset_assignment_tbl  => l_u_assets_tbl,
1660           p_txn_rec               => px_csi_txn_rec,
1661           x_instance_id_lst       => l_u_instance_ids_list,
1662           x_return_status         => l_return_status,
1663           x_msg_count             => l_msg_count,
1664           x_msg_data              => l_msg_data);
1665 
1666         -- For Bug 4057183
1667         -- IF l_return_status <> fnd_api.g_ret_sts_success THEN
1668         IF l_return_status not in (fnd_api.g_ret_sts_success,'W') THEN
1669           RAISE fnd_api.g_exc_error;
1670         END IF;
1671 
1672       ELSE
1673 
1674         -- we get two cases here < and =
1675         -- when the remaining qty is < ratio do not allocate it to an assy instance
1676         -- making sure that assy instances are always getting the full ratio. this
1677         -- simplifies the process of elliminating assy instances when further partial
1678         -- issues are done. otherwise it is difficult to get the partially allocated
1679         -- component instance and update it with the remaining ratio qty blah blah blah
1680         --(just simplifying my coding)
1681 
1682         IF l_qty_remaining < p_qty_ratio THEN
1683           NULL;
1684         ELSE
1685 
1686           l_s_ind := l_s_ind + 1;
1687 
1688           IF l_split_flag THEN
1689             l_splitted_instances(l_s_ind) := l_u_instance_rec;
1690           ELSE
1691             l_splitted_instances(l_s_ind) := l_instance_rec;
1692           END IF;
1693 
1694         END IF;
1695 
1696         EXIT;
1697 
1698       END IF;
1699 
1700     END LOOP;
1701 
1702     debug('  Splitted instances count :'||l_splitted_instances.COUNT);
1703 
1704     x_splitted_instances := l_splitted_instances;
1705 
1706   EXCEPTION
1707     WHEN fnd_api.g_exc_error THEN
1708       x_return_status := fnd_api.g_ret_sts_error;
1709   END split_instance_using_ratio;
1710 
1711 
1712   PROCEDURE split_instances_using_ratio(
1713     p_qty_ratio           IN number,
1714     p_qty_completed       IN number,
1715     p_organization_id     IN number,
1716     p_issued_instances    IN csi_datastructures_pub.instance_tbl,
1717     px_csi_txn_rec        IN OUT NOCOPY csi_datastructures_pub.transaction_rec,
1718     x_splitted_instances     OUT NOCOPY csi_datastructures_pub.instance_tbl,
1719     x_return_status          OUT NOCOPY varchar2)
1720   IS
1721     l_return_status          varchar2(1) := fnd_api.g_ret_sts_success;
1722     l_splitted_instances     csi_datastructures_pub.instance_tbl;
1723   BEGIN
1724 
1725     x_return_status := fnd_api.g_ret_sts_success;
1726 
1727     api_log('split_instances_using_ratio');
1728 
1729     IF p_issued_instances.COUNT > 0 THEN
1730       FOR l_ind IN p_issued_instances.FIRST .. p_issued_instances.LAST
1731       LOOP
1732 
1733         split_instance_using_ratio(
1734           p_instance_id         => p_issued_instances(l_ind).instance_id,
1735           p_qty_ratio           => p_qty_ratio,
1736           p_qty_completed       => p_qty_completed,
1737           p_organization_id     => p_organization_id,
1738           px_csi_txn_rec        => px_csi_txn_rec,
1739           x_splitted_instances  => l_splitted_instances,
1740           x_return_status       => l_return_status);
1741 
1742         IF l_return_status <> fnd_api.g_ret_sts_success THEN
1743           RAISE fnd_api.g_exc_error;
1744         END IF;
1745 
1746       END LOOP;
1747     END IF;
1748 
1749     x_splitted_instances := l_splitted_instances;
1750 
1751   EXCEPTION
1752     WHEN fnd_api.g_exc_error THEN
1753       x_return_status := fnd_api.g_ret_sts_success;
1754   END split_instances_using_ratio;
1755 
1756 
1757   PROCEDURE split_issued_instances(
1758     p_organization_id     IN     number,
1759     p_job_quantity        IN     number,
1760     p_completion_quantity IN     number,
1761     px_issued_instances   IN OUT NOCOPY csi_datastructures_pub.instance_tbl,
1762     px_csi_txn_rec        IN OUT NOCOPY csi_datastructures_pub.transaction_rec,
1763     x_splitted_instances     OUT NOCOPY csi_datastructures_pub.instance_tbl,
1764     x_return_status          OUT NOCOPY varchar2)
1765   IS
1766 
1767     l_allocated_quantity    number;
1768     l_remaining_quantity    number;
1769 
1770     l_new_instance_rec      csi_datastructures_pub.instance_rec;
1771 
1772     l_return_status         varchar2(1) := fnd_api.g_ret_sts_success;
1773     l_msg_data              varchar2(2000);
1774     l_msg_count             number;
1775 
1776     l_split_counter         number;
1777 
1778     l_splitted_instances    csi_datastructures_pub.instance_tbl;
1779     l_s_ind                 binary_integer;
1780 
1781     -- get_item_instance_details variables
1782     l_g_instance_rec        csi_datastructures_pub.instance_header_rec;
1783     l_g_ph_tbl              csi_datastructures_pub.party_header_tbl;
1784     l_g_pah_tbl             csi_datastructures_pub.party_account_header_tbl;
1785     l_g_ouh_tbl             csi_datastructures_pub.org_units_header_tbl;
1786     l_g_pa_tbl              csi_datastructures_pub.pricing_attribs_tbl;
1787     l_g_eav_tbl             csi_datastructures_pub.extend_attrib_values_tbl;
1788     l_g_ea_tbl              csi_datastructures_pub.extend_attrib_tbl;
1789     l_g_iah_tbl             csi_datastructures_pub.instance_asset_header_tbl;
1790     l_g_time_stamp          date;
1791 
1792     -- update_item_instance variables
1793     l_u_instance_rec        csi_datastructures_pub.instance_rec;
1794     l_u_parties_tbl         csi_datastructures_pub.party_tbl;
1795     l_u_pty_accts_tbl       csi_datastructures_pub.party_account_tbl;
1796     l_u_org_units_tbl       csi_datastructures_pub.organization_units_tbl;
1797     l_u_ea_values_tbl       csi_datastructures_pub.extend_attrib_values_tbl;
1798     l_u_pricing_tbl         csi_datastructures_pub.pricing_attribs_tbl;
1799     l_u_assets_tbl          csi_datastructures_pub.instance_asset_tbl;
1800     l_u_instance_ids_list   csi_datastructures_pub.id_tbl;
1801 
1802     -- create_item_instance varaibles
1803     l_c_instance_rec        csi_datastructures_pub.instance_rec;
1804     l_c_parties_tbl         csi_datastructures_pub.party_tbl;
1805     l_c_pty_accts_tbl       csi_datastructures_pub.party_account_tbl;
1806     l_c_org_units_tbl       csi_datastructures_pub.organization_units_tbl;
1807     l_c_ea_values_tbl       csi_datastructures_pub.extend_attrib_values_tbl;
1808     l_c_pricing_tbl         csi_datastructures_pub.pricing_attribs_tbl;
1809     l_c_assets_tbl          csi_datastructures_pub.instance_asset_tbl;
1810     c_pa_ind                binary_integer;
1811 
1812     l_instance_rec          csi_datastructures_pub.instance_rec;
1813     --
1814 
1815   BEGIN
1816 
1817     x_return_status := fnd_api.g_ret_sts_success;
1818 
1819     api_log('split_issued_instances');
1820 
1821     l_s_ind := 0;
1822 
1823     l_split_counter := p_completion_quantity;
1824 
1825     IF px_issued_instances.COUNT > 0 THEN
1826 
1827       FOR l_ind IN px_issued_instances.FIRST .. px_issued_instances.LAST
1828       LOOP
1829 
1830         debug('  Component Instance ID :'||px_issued_instances(l_ind).instance_id);
1831         debug('  Component Instance Qty:'||px_issued_instances(l_ind).quantity);
1832 
1833 	--Fix for bug 5015147:If condition added to allow aplit only if inst_qty > 1
1834 	IF px_issued_instances(l_ind).quantity > 1 THEN
1835 
1836         l_g_instance_rec.instance_id := px_issued_instances(l_ind).instance_id;
1837 
1838         api_log(
1839           p_pkg_name => 'csi_item_instance_pub',
1840           p_api_name => 'get_item_instance_details');
1841 
1842         -- get the instance party and party account info
1843         csi_item_instance_pub.get_item_instance_details(
1844           p_api_version           => 1.0,
1845           p_commit                => fnd_api.g_false,
1846           p_init_msg_list         => fnd_api.g_true,
1847           p_validation_level      => fnd_api.g_valid_level_full,
1848           p_instance_rec          => l_g_instance_rec,
1849           p_get_parties           => fnd_api.g_true,
1850           p_party_header_tbl      => l_g_ph_tbl,
1851           p_get_accounts          => fnd_api.g_true,
1852           p_account_header_tbl    => l_g_pah_tbl,
1853           p_get_org_assignments   => fnd_api.g_false,
1854           p_org_header_tbl        => l_g_ouh_tbl,
1855           p_get_pricing_attribs   => fnd_api.g_false,
1856           p_pricing_attrib_tbl    => l_g_pa_tbl,
1857           p_get_ext_attribs       => fnd_api.g_false,
1858           p_ext_attrib_tbl        => l_g_eav_tbl,
1859           p_ext_attrib_def_tbl    => l_g_ea_tbl,
1860           p_get_asset_assignments => fnd_api.g_false,
1861           p_asset_header_tbl      => l_g_iah_tbl,
1862           p_time_stamp            => l_g_time_stamp,
1863           x_return_status         => l_return_status,
1864           x_msg_count             => l_msg_count,
1865           x_msg_data              => l_msg_data);
1866 
1867         IF l_return_status <> fnd_api.g_ret_sts_success THEN
1868           RAISE fnd_api.g_exc_error;
1869         END IF;
1870 
1871         l_remaining_quantity := l_g_instance_rec.quantity;
1872 
1873         make_non_hdr_rec(
1874           p_instance_hdr_rec  => l_g_instance_rec,
1875           x_instance_rec      => l_instance_rec,
1876           x_return_status     => l_return_status);
1877 
1878         debug('Splitting the comp instance for the job quantity '||p_job_quantity);
1879 
1880         FOR i IN REVERSE 1..p_job_quantity
1881         LOOP
1882 
1883           l_allocated_quantity := CEIL(l_remaining_quantity/i);
1884           l_remaining_quantity := l_remaining_quantity - l_allocated_quantity;
1885 
1886           debug('  Allocated Qty(NEW) :'||l_allocated_quantity);
1887           debug('  Remaining Qty(UPD) :'||l_remaining_quantity);
1888 
1889           -- take all that is in issued instance rec
1890           l_c_instance_rec := l_instance_rec;
1891 
1892           -- substitute create specific attributes
1893           l_c_instance_rec.instance_id           := fnd_api.g_miss_num;
1894           l_c_instance_rec.instance_number       := fnd_api.g_miss_char;
1895           l_c_instance_rec.object_version_number := 1.0;
1896           l_c_instance_rec.vld_organization_id   := p_organization_id;
1897           l_c_instance_rec.quantity              := l_allocated_quantity;
1898 
1899           -- build party
1900           l_c_parties_tbl.DELETE;
1901           l_c_pty_accts_tbl.DELETE;
1902           c_pa_ind := 0;
1903 
1904           IF l_g_ph_tbl.COUNT > 0 THEN
1905             FOR l_pt_ind IN l_g_ph_tbl.FIRST ..l_g_ph_tbl.LAST
1906             LOOP
1907               l_c_parties_tbl(l_pt_ind).instance_party_id  := fnd_api.g_miss_num;
1908               l_c_parties_tbl(l_pt_ind).instance_id        := fnd_api.g_miss_num;
1909               l_c_parties_tbl(l_pt_ind).party_id           :=
1910                            l_g_ph_tbl(l_pt_ind).party_id;
1911               l_c_parties_tbl(l_pt_ind).party_source_table :=
1912                              l_g_ph_tbl(l_pt_ind).party_source_table;
1913               l_c_parties_tbl(l_pt_ind).relationship_type_code :=
1914                              l_g_ph_tbl(l_pt_ind).relationship_type_code;
1915               l_c_parties_tbl(l_pt_ind).contact_flag       := 'N';
1916 
1917               -- build party account
1918 
1919               IF l_g_pah_tbl.COUNT > 0 THEN
1920                 FOR l_pa_ind IN l_g_pah_tbl.FIRST..l_g_pah_tbl.LAST
1921                 LOOP
1922                   IF l_g_pah_tbl(l_pa_ind).instance_party_id =
1923                      l_g_ph_tbl(l_pt_ind).instance_party_id
1924                   THEN
1925                     c_pa_ind := c_pa_ind + 1;
1926                     l_c_pty_accts_tbl(c_pa_ind).parent_tbl_index   := l_pt_ind;
1927                     l_c_pty_accts_tbl(c_pa_ind).ip_account_id      := fnd_api.g_miss_num;
1928                     l_c_pty_accts_tbl(c_pa_ind).instance_party_id  := fnd_api.g_miss_num;
1929                     l_c_pty_accts_tbl(c_pa_ind).party_account_id       :=
1930                           l_g_pah_tbl(l_pa_ind).party_account_id;
1931                     l_c_pty_accts_tbl(c_pa_ind).relationship_type_code :=
1932                           l_g_pah_tbl(l_pa_ind).relationship_type_code;
1933                   END IF;
1934                 END LOOP;
1935               END IF;
1936 
1937             END LOOP;
1938           END IF;
1939 
1940           -- create a new instance for the decremented qty
1941           api_log(
1942             p_pkg_name => 'csi_item_instance_pub',
1943             p_api_name => 'create_item_instance');
1944 
1945           csi_item_instance_pub.create_item_instance(
1946             p_api_version           => 1.0,
1947             p_commit                => fnd_api.g_false,
1948             p_init_msg_list         => fnd_api.g_true,
1949             p_validation_level      => fnd_api.g_valid_level_full,
1950             p_instance_rec          => l_c_instance_rec,
1951             p_party_tbl             => l_c_parties_tbl,
1952             p_account_tbl           => l_c_pty_accts_tbl,
1953             p_org_assignments_tbl   => l_c_org_units_tbl,
1954             p_ext_attrib_values_tbl => l_c_ea_values_tbl,
1955             p_pricing_attrib_tbl    => l_c_pricing_tbl,
1956             p_asset_assignment_tbl  => l_c_assets_tbl,
1957             p_txn_rec               => px_csi_txn_rec,
1958             x_return_status         => l_return_status,
1959             x_msg_count             => l_msg_count,
1960             x_msg_data              => l_msg_data );
1961 
1962           -- For Bug 4057183
1963           -- IF l_return_status <> fnd_api.g_ret_sts_success THEN
1964           IF l_return_status not in (fnd_api.g_ret_sts_success,'W') THEN
1965             RAISE fnd_api.g_exc_error;
1966           END IF;
1967 
1968           debug('  New Instance ID :'||l_c_instance_rec.instance_id);
1969 
1970           l_s_ind := l_s_ind + 1;
1971           l_splitted_instances(l_s_ind) := l_c_instance_rec;
1972 
1973 
1974           -- decrementing the existing wip instance with the new quantity (l_new_qty)
1975           l_u_instance_rec.instance_id         := px_issued_instances(l_ind).instance_id;
1976           l_u_instance_rec.quantity            := l_remaining_quantity;
1977           l_u_instance_rec.vld_organization_id := p_organization_id;
1978 
1979           SELECT object_version_number
1980           INTO   l_u_instance_rec.object_version_number
1981           FROM   csi_item_instances
1982           WHERE  instance_id = l_u_instance_rec.instance_id;
1983 
1984           api_log(
1985             p_pkg_name => 'csi_item_instance_pub',
1986             p_api_name => 'update_item_instance');
1987 
1988           csi_item_instance_pub.update_item_instance(
1989             p_api_version           => 1.0,
1990             p_commit                => fnd_api.g_false,
1991             p_init_msg_list         => fnd_api.g_true,
1992             p_validation_level      => fnd_api.g_valid_level_full,
1993             p_instance_rec          => l_u_instance_rec,
1994             p_party_tbl             => l_u_parties_tbl,
1995             p_account_tbl           => l_u_pty_accts_tbl,
1996             p_org_assignments_tbl   => l_u_org_units_tbl,
1997             p_ext_attrib_values_tbl => l_u_ea_values_tbl,
1998             p_pricing_attrib_tbl    => l_u_pricing_tbl,
1999             p_asset_assignment_tbl  => l_u_assets_tbl,
2000             p_txn_rec               => px_csi_txn_rec,
2001             x_instance_id_lst       => l_u_instance_ids_list,
2002             x_return_status         => l_return_status,
2003             x_msg_count             => l_msg_count,
2004             x_msg_data              => l_msg_data);
2005 
2006           -- For Bug 4057183
2007           -- IF l_return_status <> fnd_api.g_ret_sts_success THEN
2008           IF l_return_status not in (fnd_api.g_ret_sts_success,'W') THEN
2009             RAISE fnd_api.g_exc_error;
2010           END IF;
2011 
2012           IF l_remaining_quantity <= l_allocated_quantity THEN
2013             l_s_ind := l_s_ind + 1;
2014             l_splitted_instances(l_s_ind) := l_u_instance_rec;
2015             EXIT;
2016           END IF;
2017 
2018           l_split_counter := l_split_counter - 1;
2019           IF l_split_counter = 0 THEN
2020             EXIT;
2021           END IF;
2022 
2023         END LOOP;
2024 	ELSE --Fix for bug 5015147
2025 	  l_s_ind := l_s_ind + 1;
2026           l_splitted_instances(l_s_ind) := px_issued_instances(l_ind);
2027           debug('Since Instance quantity is not more than than one,no split is done');
2028         END IF;
2029        END LOOP;
2030     END IF;
2031 
2032     x_splitted_instances := l_splitted_instances;
2033 
2034   EXCEPTION
2035     WHEN fnd_api.g_exc_error THEN
2036       x_return_status := fnd_api.g_ret_sts_error;
2037   END split_issued_instances;
2038 
2039   PROCEDURE create_assy_comp_relation(
2040     p_assy_comp_map_tbl   IN  assy_comp_map_tbl,
2041     px_csi_txn_rec        IN OUT NOCOPY csi_datastructures_pub.transaction_rec,
2042     x_return_status       OUT NOCOPY varchar2)
2043   IS
2044 
2045     l_ii_rltns_tbl        csi_datastructures_pub.ii_relationship_tbl;
2046 
2047     l_return_status       varchar2(1) := fnd_api.g_ret_sts_success;
2048     l_msg_count           number;
2049     l_msg_data            varchar2(2000);
2050     l_rltn_exists         varchar2(1) := 'N';
2051 
2052     l_iir_ind             binary_integer := 0;
2053 
2054   BEGIN
2055 
2056     x_return_status := fnd_api.g_ret_sts_success;
2057 
2058     api_log('create_assy_comp_relation');
2059 
2060     IF p_assy_comp_map_tbl.COUNT > 0 THEN
2061       FOR l_ind IN p_assy_comp_map_tbl.FIRST .. p_assy_comp_map_tbl.LAST
2062       LOOP
2063 
2064         -- Added for Ikon . Bug 2443204.
2065         -- This is to rebuild the correct configuration in IB when Users work on an
2066         -- already existing assembly in IB. shegde.
2067         Begin
2068 
2069           l_rltn_exists := 'N';
2070 
2071           SELECT 'Y'
2072           INTO   l_rltn_exists
2073           FROM   csi_ii_relationships
2074           WHERE  subject_id = p_assy_comp_map_tbl(l_ind).comp_instance_id
2075           AND    object_id  = p_assy_comp_map_tbl(l_ind).assy_instance_id
2076           AND    relationship_type_code = 'COMPONENT-OF'
2077           AND    active_end_date is NULL OR active_end_date > sysdate;
2078 
2079         EXCEPTION
2080           WHEN no_data_found THEN
2081             l_rltn_exists := 'N';
2082         END;
2083 
2084         IF l_rltn_exists = 'N' THEN
2085           l_iir_ind := l_iir_ind + 1;
2086           l_ii_rltns_tbl(l_iir_ind).relationship_id := fnd_api.g_miss_num;
2087           l_ii_rltns_tbl(l_iir_ind).subject_id := p_assy_comp_map_tbl(l_ind).comp_instance_id;
2088           l_ii_rltns_tbl(l_iir_ind).object_id  := p_assy_comp_map_tbl(l_ind).assy_instance_id;
2089           l_ii_rltns_tbl(l_iir_ind).relationship_type_code := 'COMPONENT-OF';
2090         END IF;
2091         -- End Bug 2443204
2092 
2093       END LOOP;
2094     END IF;
2095 
2096     api_log(
2097       p_pkg_name => 'csi_ii_relationships_pub',
2098       p_api_name => 'create_relationship');
2099 
2100     csi_ii_relationships_pub.create_relationship(
2101       p_api_version      => 1.0,
2102       p_commit           => fnd_api.g_false,
2103       p_init_msg_list    => fnd_api.g_true,
2104       p_validation_level => fnd_api.g_valid_level_full,
2105       p_relationship_tbl => l_ii_rltns_tbl,
2106       p_txn_rec          => px_csi_txn_rec,
2107       x_return_status    => l_return_status,
2108       x_msg_count        => l_msg_count,
2109       x_msg_data         => l_msg_data);
2110 
2111     IF l_return_status <> fnd_api.g_ret_sts_success THEN
2112       debug('Error in csi_ii_relationships_pub.create_relationship.');
2113       RAISE fnd_api.g_exc_error;
2114     END IF;
2115 
2116 
2117   EXCEPTION
2118     WHEN fnd_api.g_exc_error THEN
2119       x_return_status := fnd_api.g_ret_sts_error;
2120   END create_assy_comp_relation;
2121 
2122   PROCEDURE get_genealogy_children(
2123     px_assembly_instances  IN OUT NOCOPY csi_datastructures_pub.instance_tbl,
2124     x_assy_comp_map_tbl       OUT NOCOPY assy_comp_map_tbl,
2125     x_return_status           OUT NOCOPY varchar2)
2126   IS
2127 
2128     CURSOR mog_cur(p_parent_object_id IN number) IS
2129       SELECT msn.serial_number      child_serial_number,
2130              msn.inventory_item_id  child_item_id
2131       FROM   mtl_object_genealogy mog,
2132              mtl_serial_numbers   msn
2133       WHERE  mog.parent_object_type = 2
2134       AND    mog.parent_object_id   = p_parent_object_id
2135       AND    mog.object_type        = 2
2136       AND    msn.gen_object_id      = mog.object_id
2137       AND    sysdate BETWEEN nvl(mog.start_date_active, sysdate-1)
2138                      AND     nvl(mog.end_date_active,   sysdate+1);
2139 
2140     l_ac_map_tbl           assy_comp_map_tbl;
2141     l_ac_ind               binary_integer := 0;
2142     l_assy_tbl             csi_datastructures_pub.instance_tbl;
2143     l_parent_object_id     number;
2144     l_children_count       number;
2145 
2146     l_child_instance_id    number;
2147 
2148   BEGIN
2149 
2150     x_return_status := fnd_api.g_ret_sts_success;
2151     api_log('get_genealogy_children');
2152 
2153     l_assy_tbl := px_assembly_instances;
2154 
2155     IF l_assy_tbl.count > 0 THEN
2156       FOR l_ind IN l_assy_tbl.FIRST .. l_assy_tbl.LAST
2157       LOOP
2158 
2159         debug('Parent Serial :'||l_assy_tbl(l_ind).serial_number);
2160 
2161         SELECT gen_object_id
2162         INTO   l_parent_object_id
2163         FROM   mtl_serial_numbers
2164         WHERE  inventory_item_id = l_assy_tbl(l_ind).inventory_item_id
2165         AND    serial_number     = l_assy_tbl(l_ind).serial_number;
2166 
2167         l_children_count := 0;
2168 
2169         FOR mog_rec in mog_cur(l_parent_object_id)
2170         LOOP
2171 
2172           debug('  Genealogy Child :'||mog_rec.child_serial_number);
2173 
2174           l_children_count := l_children_count + 1;
2175 
2176           BEGIN
2177 
2178             SELECT instance_id
2179             INTO   l_child_instance_id
2180             FROM   csi_item_instances
2181             WHERE  inventory_item_id = mog_rec.child_item_id
2182             AND    serial_number     = mog_rec.child_serial_number;
2183 
2184             debug('  Instance ID :'||l_child_instance_id);
2185 
2186             l_ac_ind := l_ac_ind + 1;
2187             l_ac_map_tbl(l_ac_ind).assy_instance_id := l_assy_tbl(l_ind).instance_id;
2188             l_ac_map_tbl(l_ac_ind).comp_instance_id := l_child_instance_id;
2189             l_ac_map_tbl(l_ac_ind).comp_quantity    := 1;
2190 
2191           EXCEPTION
2192             WHEN no_data_found THEN
2193               debug('  Genealogy child instance not in IB yet.');
2194               l_child_instance_id := null;
2195           END;
2196 
2197         END LOOP;
2198 
2199         l_assy_tbl(l_ind).attribute1 := l_children_count;
2200 
2201       END LOOP;
2202     END IF;
2203 
2204     px_assembly_instances := l_assy_tbl;
2205     x_assy_comp_map_tbl   := l_ac_map_tbl;
2206 
2207   EXCEPTION
2208     WHEN fnd_api.g_exc_error THEN
2209       x_return_status := fnd_api.g_ret_sts_success;
2210   END get_genealogy_children;
2211 
2212   PROCEDURE get_parent_serial_number(
2213      p_child_item_id        IN  number,
2214      p_child_serial_number  IN  varchar2,
2215      x_parent_item_id       OUT NOCOPY varchar2,
2216      x_parent_serial_number OUT NOCOPY varchar2,
2217      x_return_status        OUT NOCOPY varchar2)
2218   IS
2219     l_child_object_id       number;
2220     l_parent_item_id        number;
2221     l_parent_serial_number  varchar2(80);
2222   BEGIN
2223 
2224     x_return_status := fnd_api.g_ret_sts_success;
2225 
2226     api_log('get_parent_serial_number');
2227 
2228     SELECT gen_object_id,
2229            parent_serial_number
2230     INTO   l_child_object_id,
2231            l_parent_serial_number
2232     FROM   mtl_serial_numbers
2233     WHERE  inventory_item_id = p_child_item_id
2234     and    serial_number     = p_child_serial_number;
2235 
2236     IF l_parent_serial_number is not null THEN
2237       BEGIN
2238         SELECT msn.serial_number,
2239                msn.inventory_item_id
2240         INTO   l_parent_serial_number,
2241                l_parent_item_id
2242         FROM   mtl_object_genealogy mog,
2243                mtl_serial_numbers   msn
2244         WHERE  mog.object_type        = 2  -- serial genealogy
2245         AND    mog.object_id          = l_child_object_id
2246         AND    mog.parent_object_type = 2  -- serial genealogy
2247         AND    msn.gen_object_id      = mog.parent_object_id
2248         AND    sysdate BETWEEN nvl(mog.start_date_active, sysdate-1)
2249                        AND     nvl(mog.end_date_active,   sysdate+1);
2250       EXCEPTION
2251         WHEN no_data_found THEN
2252           null;
2253       END;
2254     END IF;
2255 
2256     debug('  Parent Serial Number :'||l_parent_serial_number);
2257 
2258     x_parent_item_id       := l_parent_item_id;
2259     x_parent_serial_number := l_parent_serial_number;
2260 
2261   EXCEPTION
2262     WHEN fnd_api.g_exc_error THEN
2263       x_return_status := fnd_api.g_ret_sts_error;
2264   END get_parent_serial_number;
2265 
2266 
2267   PROCEDURE apportion_serialized(
2268     p_context              IN varchar2,
2269     p_requirements_flag    IN varchar2,
2270     p_qty_per_assy         IN number,
2271     p_total_qty_issued     IN number,
2272     p_job_qty              IN number,
2273     p_component_item_id    IN number,
2274     p_assembly_instances   IN csi_datastructures_pub.instance_tbl,
2275     p_component_instances  IN csi_datastructures_pub.instance_tbl,
2276     px_assy_comp_map_tbl   IN OUT NOCOPY assy_comp_map_tbl,
2277     x_return_status        IN OUT NOCOPY varchar2)
2278   IS
2279 
2280     l_qty_remaining        number;
2281 
2282     l_assy_tbl             csi_datastructures_pub.instance_tbl;
2283     l_comp_tbl             csi_datastructures_pub.instance_tbl;
2284     l_ac_map_tbl           assy_comp_map_tbl;
2285 
2286     l_already_alloc_count  number := 0;
2287     l_c_ind                binary_integer := 0;
2288     l_nac_ind              binary_integer := 0;
2289 
2290     l_tot_qty_remaining    number := 0;
2291     l_assy_counter         number := 0;
2292 
2293 --Fix for bug 4705806
2294     l_parent_item_id       number;
2295     l_parent_serial_number varchar2(80)   := null;
2296     l_return_status        varchar2(1) := fnd_api.g_ret_sts_success;
2297 
2298 
2299     FUNCTION alloc_count(p_object_id IN number, p_comp_item_id IN number)
2300     RETURN number
2301     IS
2302       l_alloc_count number := 0;
2303     BEGIN
2304       SELECT count(*)
2305       INTO   l_alloc_count
2306       FROM   csi_ii_relationships cir,
2307              csi_item_instances   cii
2308       WHERE  cir.object_id = p_object_id
2309       AND    cir.relationship_type_code = 'COMPONENT-OF'
2310       AND    sysdate BETWEEN nvl(cir.active_start_date, sysdate-1)
2311                      AND     nvl(cir.active_end_date, sysdate+1)
2312       AND    cii.instance_id = cir.subject_id
2313       AND    cii.inventory_item_id = p_comp_item_id;
2314       RETURN l_alloc_count;
2315     END alloc_count;
2316 
2317   BEGIN
2318 
2319     x_return_status := fnd_api.g_ret_sts_success;
2320     api_log('apportion_serialized');
2321 
2322     l_assy_tbl   := p_assembly_instances;
2323     l_comp_tbl   := p_component_instances;
2324     l_ac_map_tbl := px_assy_comp_map_tbl;
2325 
2326     l_assy_counter      := p_job_qty;
2327     l_tot_qty_remaining := p_total_qty_issued;
2328 
2329     IF p_context = 'COMPLETION' THEN
2330 
2331       IF l_assy_tbl.COUNT > 0 THEN
2332 
2333         FOR l_a_ind IN l_assy_tbl.FIRST .. l_assy_tbl.LAST
2334         LOOP
2335 
2336           IF p_requirements_flag = 'Y' THEN
2337             l_qty_remaining     := abs(p_qty_per_assy);
2338           ELSE
2339             l_qty_remaining     := ceil(l_tot_qty_remaining/l_assy_counter);
2340 
2341             l_tot_qty_remaining := l_tot_qty_remaining - l_qty_remaining;
2342             l_assy_counter      := l_assy_counter - 1;
2343           END IF;
2344 
2345           l_already_alloc_count := to_number(l_assy_tbl(l_a_ind).attribute1);
2346           l_qty_remaining       := l_qty_remaining - l_already_alloc_count;
2347 
2348           IF l_qty_remaining > 0 THEN
2349 
2350             debug('    Parent Serial :'||l_assy_tbl(l_a_ind).serial_number);
2351             IF l_comp_tbl.COUNT > 0 THEN
2352 
2353               l_c_ind := 0;
2354               LOOP
2355                 l_c_ind := l_comp_tbl.NEXT(l_c_ind);
2356                 EXIT when l_c_ind is null;
2357 		--Fix for bug 4705806:Here we ensure that if issued component has a genealogy
2358 		--parent,we avoid that instance getting in relationship with other parent randomly.
2359 		get_parent_serial_number(
2360                       p_child_item_id        => l_comp_tbl(l_c_ind).inventory_item_id,
2361                       p_child_serial_number  => l_comp_tbl(l_c_ind).serial_number,
2362                       x_parent_item_id       => l_parent_item_id,
2363                       x_parent_serial_number => l_parent_serial_number,
2364                       x_return_status        => l_return_status );
2365                 IF l_return_status <> fnd_api.g_ret_sts_success THEN
2366                       RAISE fnd_api.g_exc_error;
2367                 END IF;
2368 		IF l_parent_serial_number IS NOT NULL THEN
2369                     l_comp_tbl.DELETE(l_c_ind);
2370                 ELSE	--end of bug fix 4705806
2371 
2372                 l_nac_ind := l_ac_map_tbl.COUNT + 1;
2373 
2374                 l_ac_map_tbl(l_nac_ind).assy_instance_id := l_assy_tbl(l_a_ind).instance_id;
2375                 l_ac_map_tbl(l_nac_ind).comp_instance_id := l_comp_tbl(l_c_ind).instance_id;
2376                 l_ac_map_tbl(l_nac_ind).comp_quantity    := 1;
2377 
2378                 debug('      Child Serial  :'||l_comp_tbl(l_c_ind).serial_number);
2379 
2380                 l_comp_tbl.DELETE(l_c_ind);
2381                 l_qty_remaining  := l_qty_remaining - 1;
2382                 IF l_qty_remaining = 0 THEN
2383                   EXIT;
2384                 END IF;
2385 		END IF;
2386               END LOOP;
2387             END IF;
2388           END IF;
2389 
2390         END LOOP; --assy table loop;
2391       END IF; -- assy table count > 0
2392     ELSIF p_context = 'ISSUE' THEN
2393 
2394       IF l_assy_tbl.COUNT > 0 THEN
2395         FOR l_a_ind IN l_assy_tbl.FIRST .. l_assy_tbl.LAST
2396         LOOP
2397 
2398           IF p_requirements_flag = 'Y' THEN
2399             l_qty_remaining     := p_qty_per_assy;
2400           ELSE
2401             l_qty_remaining     := ceil(l_tot_qty_remaining/l_assy_counter);
2402 
2403             l_tot_qty_remaining := l_tot_qty_remaining - l_qty_remaining;
2404             l_assy_counter      := l_assy_counter - 1;
2405           END IF;
2406 
2407           l_already_alloc_count := alloc_count(l_assy_tbl(l_a_ind).instance_id, p_component_item_id);
2408 
2409           IF l_ac_map_tbl.COUNT > 0 THEN
2410             FOR l_ac_ind IN l_ac_map_tbl.FIRST .. l_ac_map_tbl.LAST
2411             LOOP
2412               IF l_ac_map_tbl(l_ac_ind).assy_instance_id = l_assy_tbl(l_a_ind).instance_id THEN
2413                 l_already_alloc_count := l_already_alloc_count + 1;
2414               END IF;
2415             END LOOP;
2416           END IF;
2417 
2418           l_qty_remaining := l_qty_remaining - l_already_alloc_count;
2419 
2420           IF l_qty_remaining > 0 THEN
2421 
2422             debug('    Parent Serial :'||l_assy_tbl(l_a_ind).serial_number);
2423             IF l_comp_tbl.COUNT > 0 THEN
2424               l_c_ind := 0;
2425               LOOP
2426                 l_c_ind := l_comp_tbl.NEXT(l_c_ind);
2427                 EXIT when l_c_ind is null;
2428 		--Fix for bug 4705806
2429 		get_parent_serial_number(
2430                       p_child_item_id        => l_comp_tbl(l_c_ind).inventory_item_id,
2431                       p_child_serial_number  => l_comp_tbl(l_c_ind).serial_number,
2432                       x_parent_item_id       => l_parent_item_id,
2433                       x_parent_serial_number => l_parent_serial_number,
2434                       x_return_status        => l_return_status );
2435                 IF l_return_status <> fnd_api.g_ret_sts_success THEN
2436                       RAISE fnd_api.g_exc_error;
2437                 END IF;
2438                 IF l_parent_serial_number IS NOT NULL THEN
2439                     l_comp_tbl.DELETE(l_c_ind);
2440                 ELSE --end of bug fix 4705806
2441 
2442                 l_nac_ind := l_ac_map_tbl.COUNT + 1;
2443 
2444                 l_ac_map_tbl(l_nac_ind).assy_instance_id := l_assy_tbl(l_a_ind).instance_id;
2445                 l_ac_map_tbl(l_nac_ind).comp_instance_id := l_comp_tbl(l_c_ind).instance_id;
2446                 l_ac_map_tbl(l_nac_ind).comp_quantity    := 1;
2447                 debug('      Child Serial  :'||l_comp_tbl(l_c_ind).serial_number);
2448 
2449                 l_comp_tbl.DELETE(l_c_ind);
2450 
2451                 l_qty_remaining := l_qty_remaining - 1;
2452 
2453                 IF l_qty_remaining = 0 THEN
2454                   EXIT;
2455                 END IF;
2456 		END IF;
2457               END LOOP;
2458             END IF;
2459 
2460           END IF;
2461 
2462         END LOOP;
2463       END IF;
2464     END IF;
2465 
2466     px_assy_comp_map_tbl := l_ac_map_tbl;
2467 
2468   EXCEPTION
2469     WHEN fnd_api.g_exc_error THEN
2470       x_return_status := fnd_api.g_ret_sts_error;
2471   END apportion_serialized;
2472 
2473   PROCEDURE apportion_nonserial_instance(
2474     p_requirements_flag    IN varchar2,
2475     p_qty_per_assy         IN number,
2476     p_qty_issued           IN number,
2477     p_total_qty_issued     IN number,
2478     p_job_qty              IN number,
2479     p_organization_id      IN number,
2480     p_assembly_instances   IN csi_datastructures_pub.instance_tbl,
2481     p_component_instance   IN csi_datastructures_pub.instance_rec,
2482     px_csi_txn_rec         IN OUT NOCOPY csi_datastructures_pub.transaction_rec,
2483     x_assy_comp_map_tbl    OUT NOCOPY assy_comp_map_tbl,
2484     x_return_status        IN OUT NOCOPY varchar2)
2485   IS
2486 
2487     CURSOR comp_cur (p_object_id in number, p_comp_item_id in number) IS
2488       SELECT cir.subject_id, cii.quantity
2489       FROM   csi_ii_relationships cir,
2490              csi_item_instances   cii
2491       WHERE  cir.object_id = p_object_id
2492       AND    cir.relationship_type_code = 'COMPONENT-OF'
2493       AND    cii.instance_id = cir.subject_id
2494       AND    cii.inventory_item_id = p_comp_item_id
2495       AND    nvl(cii.active_end_date,sysdate+1) > sysdate; --Added end date condition for bug 5376024
2496 
2497     l_qty_remaining        number := 0;
2498     l_qty_available        number := 0;
2499     l_qty_allocated        number := 0;
2500     l_already_allocated    number := 0;
2501 
2502     l_assy_counter         number := 0;
2503     l_tot_qty_remaining    number := 0;
2504 
2505     l_comp_found           boolean := FALSE;
2506 
2507     l_assy_tbl             csi_datastructures_pub.instance_tbl;
2508     l_comp_rec             csi_datastructures_pub.instance_rec;
2509 
2510     l_ac_ind               binary_integer := 0;
2511     l_ac_map_tbl           assy_comp_map_tbl;
2512 
2513     l_new_instance_id      number;
2514 
2515     l_instance_rec         csi_datastructures_pub.instance_rec;
2516 
2517     -- update_item_instance variables
2518     l_u_instance_rec       csi_datastructures_pub.instance_rec;
2519     l_u_parties_tbl        csi_datastructures_pub.party_tbl;
2520     l_u_pty_accts_tbl      csi_datastructures_pub.party_account_tbl;
2521     l_u_org_units_tbl      csi_datastructures_pub.organization_units_tbl;
2522     l_u_ea_values_tbl      csi_datastructures_pub.extend_attrib_values_tbl;
2523     l_u_pricing_tbl        csi_datastructures_pub.pricing_attribs_tbl;
2524     l_u_assets_tbl         csi_datastructures_pub.instance_asset_tbl;
2525     l_u_instance_ids_list  csi_datastructures_pub.id_tbl;
2526 
2527     l_return_status         varchar2(1) := fnd_api.g_ret_sts_success;
2528     l_msg_data              varchar2(2000);
2529     l_msg_count             number;
2530 
2531     FUNCTION alloc_quantity(p_object_id IN number, p_comp_item_id IN number)
2532     RETURN number
2533     IS
2534       l_alloc_qty number := 0;
2535     BEGIN
2536       SELECT sum(cii.quantity)
2537       INTO   l_alloc_qty
2538       FROM   csi_ii_relationships cir,
2539              csi_item_instances   cii
2540       WHERE  cir.object_id = p_object_id
2541       AND    cir.relationship_type_code = 'COMPONENT-OF'
2542       AND    cii.instance_id = cir.subject_id
2543       AND    cii.inventory_item_id = p_comp_item_id;
2544       RETURN l_alloc_qty;
2545     EXCEPTION
2546       WHEN others THEN
2547         RETURN l_alloc_qty;
2548     END alloc_quantity;
2549 
2550   BEGIN
2551 
2552     x_return_status := fnd_api.g_ret_sts_success;
2553 
2554     api_log('apportion_nonserial_instance');
2555 
2556     debug('  requirements_flag '||p_requirements_flag);
2557     debug('  quantity_per_assy '||p_qty_per_assy);
2558 
2559     l_assy_tbl          := p_assembly_instances;
2560     l_comp_rec          := p_component_instance;
2561     l_qty_remaining     := l_comp_rec.quantity;
2562 
2563     -- to process no requirement ratio
2564     l_assy_counter      := p_job_qty;
2565     l_tot_qty_remaining := p_total_qty_issued;
2566 
2567     IF l_assy_tbl.COUNT > 0 THEN
2568 
2569       FOR l_a_ind IN l_assy_tbl.FIRST .. l_assy_tbl.LAST
2570       LOOP
2571 
2572         debug('  qty_remaining     :'||l_qty_remaining);
2573 
2574 
2575         IF l_qty_remaining > 0 THEN
2576 
2577           IF p_requirements_flag = 'Y' THEN
2578             l_qty_available     := p_qty_per_assy;
2579           ELSE
2580             l_qty_available     := ceil(l_tot_qty_remaining/l_assy_counter);
2581             l_tot_qty_remaining := l_tot_qty_remaining - l_qty_available;
2582             l_assy_counter      := l_assy_counter - 1;
2583           END IF;
2584 
2585           l_already_allocated := nvl(alloc_quantity(l_assy_tbl(l_a_ind).instance_id,
2586                                                 l_comp_rec.inventory_item_id),0);
2587 
2588           debug('  already_allocated :'||l_already_allocated );
2589 
2590           l_qty_available     := l_qty_available - l_already_allocated ;
2591 
2592           debug('  qty_available     :'||l_qty_available );
2593 
2594           IF l_qty_available > 0 THEN
2595 
2596             IF l_qty_remaining > l_qty_available THEN
2597               l_qty_allocated := l_qty_available;
2598             ELSE
2599               l_qty_allocated := l_qty_remaining;
2600             END IF;
2601 
2602             debug('  qty_allocated     :'||l_qty_allocated );
2603 
2604             l_comp_found := FALSE;
2605 
2606             FOR comp_rec IN comp_cur(l_assy_tbl(l_a_ind).instance_id, l_comp_rec.inventory_item_id)
2607             LOOP
2608 
2609               l_comp_found := TRUE;
2610 
2611               --update comp instance with the new qty
2612               increment_comp_instance(
2613                 p_instance_id         => comp_rec.subject_id,
2614                 p_quantity            => l_qty_allocated,
2615                 px_csi_txn_rec        => px_csi_txn_rec,
2616                 x_return_status       => l_return_status);
2617 
2618               IF l_return_status <> fnd_api.g_ret_sts_success THEN
2619                 RAISE fnd_api.g_exc_error;
2620               END IF;
2621 
2622               --decrement the wip instance
2623               decrement_wip_instance(
2624                 p_instance_id         => l_comp_rec.instance_id,
2625                 p_quantity            => l_qty_allocated,
2626                 px_csi_txn_rec        => px_csi_txn_rec,
2627                 x_return_status       => l_return_status);
2628 
2629               IF l_return_status <> fnd_api.g_ret_sts_success THEN
2630                 RAISE fnd_api.g_exc_error;
2631               END IF;
2632 
2633               exit;
2634             END LOOP;
2635 
2636             IF NOT(l_comp_found) THEN
2637 
2638               IF l_qty_allocated = l_qty_remaining THEN
2639 
2640                 -- just build the ac_map tbl
2641                 l_ac_ind := l_ac_ind + 1;
2642                 l_ac_map_tbl(l_ac_ind).assy_instance_id := l_assy_tbl(l_a_ind).instance_id;
2643                 l_ac_map_tbl(l_ac_ind).comp_instance_id := l_comp_rec.instance_id;
2644                 l_ac_map_tbl(l_ac_ind).comp_quantity    := l_qty_allocated;
2645 
2646               ELSE
2647 
2648                 --create a WIP instance and make it component for in_relation
2649                 create_wip_instance_as(
2650                   p_instance_id      => l_comp_rec.instance_id,
2651                   p_quantity         => l_qty_allocated,
2652                   p_organization_id  => p_organization_id,
2653                   x_new_instance_id  => l_new_instance_id,
2654                   px_csi_txn_rec     => px_csi_txn_rec,
2655                   x_return_status    => l_return_status);
2656 
2657                 IF l_return_status <> fnd_api.g_ret_sts_success THEN
2658                   RAISE fnd_api.g_exc_error;
2659                 END IF;
2660 
2661                 --decrement the wip instance
2662                 decrement_wip_instance(
2663                   p_instance_id         => l_comp_rec.instance_id,
2664                   p_quantity            => l_qty_allocated,
2665                   px_csi_txn_rec        => px_csi_txn_rec,
2666                   x_return_status       => l_return_status);
2667 
2668                 IF l_return_status <> fnd_api.g_ret_sts_success THEN
2669                   RAISE fnd_api.g_exc_error;
2670                 END IF;
2671 
2672                 l_ac_ind := l_ac_ind + 1;
2673                 l_ac_map_tbl(l_ac_ind).assy_instance_id := l_assy_tbl(l_a_ind).instance_id;
2674                 l_ac_map_tbl(l_ac_ind).comp_instance_id := l_new_instance_id;
2675                 l_ac_map_tbl(l_ac_ind).comp_quantity    := l_qty_allocated;
2676 
2677               END IF;
2678 
2679             END IF;
2680 
2681             l_qty_remaining := l_qty_remaining - l_qty_allocated;
2682 
2683           END IF;
2684 
2685         END IF;
2686 
2687       END LOOP;
2688     END IF;
2689 
2690     debug('  Assy Comp Map Tbl Count :'||l_ac_map_tbl.COUNT);
2691 
2692     x_assy_comp_map_tbl := l_ac_map_tbl;
2693 
2694   EXCEPTION
2695     WHEN fnd_api.g_exc_error THEN
2696       x_return_status := fnd_api.g_ret_sts_error;
2697   END apportion_nonserial_instance;
2698 
2699   PROCEDURE apportion_non_serialized(
2700     p_context              IN varchar2,
2701     p_requirements_flag    IN varchar2,
2702     p_qty_per_assy         IN number,
2703     p_qty_issued           IN number,
2704     p_total_qty_issued     IN number,
2705     p_job_qty              IN number,
2706     p_organization_id      IN number,
2707     p_assembly_instances   IN csi_datastructures_pub.instance_tbl,
2708     p_component_instances  IN csi_datastructures_pub.instance_tbl,
2709     px_csi_txn_rec         IN OUT NOCOPY csi_datastructures_pub.transaction_rec,
2710     x_assy_comp_map_tbl       OUT NOCOPY assy_comp_map_tbl,
2711     x_return_status        IN OUT NOCOPY varchar2)
2712   IS
2713 
2714     l_tmp_ac_map_tbl       assy_comp_map_tbl;
2715     l_ac_ind               binary_integer := 0;
2716     l_ac_map_tbl           assy_comp_map_tbl;
2717     l_return_status        varchar2(1);
2718 
2719   BEGIN
2720 
2721     x_return_status := fnd_api.g_ret_sts_success;
2722     api_log('apportion_non_serialized');
2723 
2724     IF p_component_instances.COUNT > 0 THEN
2725       FOR l_ind IN p_component_instances.FIRST .. p_component_instances.LAST
2726       LOOP
2727 
2728         apportion_nonserial_instance(
2729           p_requirements_flag    => p_requirements_flag,
2730           p_qty_per_assy         => p_qty_per_assy,
2731           p_qty_issued           => p_qty_issued,
2732           p_total_qty_issued     => p_total_qty_issued,
2733           p_job_qty              => p_job_qty,
2734           p_organization_id      => p_organization_id,
2735           p_assembly_instances   => p_assembly_instances,
2736           p_component_instance   => p_component_instances(l_ind),
2737           px_csi_txn_rec         => px_csi_txn_rec,
2738           x_assy_comp_map_tbl    => l_tmp_ac_map_tbl,
2739           x_return_status        => l_return_status);
2740 
2741         IF l_return_status <> fnd_api.g_ret_sts_success THEN
2742           RAISE fnd_api.g_exc_error;
2743         END IF;
2744 
2745         IF l_tmp_ac_map_tbl.COUNT > 0 THEN
2746           FOR l_t_ind IN l_tmp_ac_map_tbl.FIRST .. l_tmp_ac_map_tbl.LAST
2747           LOOP
2748             l_ac_ind := l_ac_ind + 1;
2749             l_ac_map_tbl(l_ac_ind) := l_tmp_ac_map_tbl(l_t_ind);
2750           END LOOP;
2751         END IF;
2752 
2753       END LOOP;
2754     END IF;
2755 
2756     debug('  TOTAL Assy Comp Map Tbl Count :'||l_ac_map_tbl.COUNT);
2757 
2758     x_assy_comp_map_tbl := l_ac_map_tbl;
2759 
2760   EXCEPTION
2761     WHEN fnd_api.g_exc_error THEN
2762       x_return_status := fnd_api.g_ret_sts_error;
2763   END apportion_non_serialized;
2764 
2765   PROCEDURE build_discrete_rltn_at_wipac(
2766     p_txn_ref             IN txn_ref,
2767     p_assembly_instances  IN csi_datastructures_pub.instance_tbl,
2768     px_csi_txn_rec        IN OUT NOCOPY csi_datastructures_pub.transaction_rec,
2769     x_return_status       OUT NOCOPY varchar2)
2770   IS
2771     l_auto_allocate       varchar2(1);
2772 
2773     l_requirements_tbl    requirements_tbl;
2774     l_issued_instances    csi_datastructures_pub.instance_tbl;
2775     l_assembly_instances  csi_datastructures_pub.instance_tbl;
2776 
2777     l_splitted_instances  csi_datastructures_pub.instance_tbl;
2778     l_assy_comp_map_tbl   assy_comp_map_tbl;
2779     l_comp_serial_code    number;
2780 
2781     end_process           exception;
2782 
2783     l_return_status       varchar2(1) := fnd_api.g_ret_sts_success;
2784 
2785     l_requirements_flag   varchar2(1);
2786 
2787   BEGIN
2788 
2789     x_return_status := fnd_api.g_ret_sts_success;
2790 
2791     api_log('build_discrete_rltn_at_wipac');
2792 
2793     l_auto_allocate := csi_datastructures_pub.g_install_param_rec.auto_allocate_comp_at_wip;
2794 
2795     l_assembly_instances := p_assembly_instances;
2796 
2797     debug('Assembly Instances Count: '||l_assembly_instances.COUNT);
2798 
2799     IF l_assembly_instances.COUNT = 0 THEN
2800       debug('Could not find the assembly instances. Process terminates here.');
2801       RAISE end_process;
2802     END IF;
2803 
2804     get_issued_requirements(
2805       p_wip_entity_id       => p_txn_ref.wip_entity_id,
2806       p_organization_id     => p_txn_ref.organization_id,
2807       p_assembly_item_id    => p_txn_ref.wip_assembly_item_id,
2808       p_auto_allocate       => l_auto_allocate,
2809       x_requirements_tbl    => l_requirements_tbl,
2810       x_return_status       => l_return_status);
2811 
2812     IF x_return_status <> fnd_api.g_ret_sts_success THEN
2813       RAISE fnd_api.g_exc_error;
2814     END IF;
2815 
2816     debug('Issued Requirements Count: '||l_requirements_tbl.COUNT);
2817 
2818     IF l_requirements_tbl.COUNT > 0 THEN
2819 
2820       FOR l_ind IN l_requirements_tbl.FIRST ..l_requirements_tbl.LAST
2821       LOOP
2822 
2823         get_issued_instances(
2824           p_wip_entity_id     => p_txn_ref.wip_entity_id,
2825           p_organization_id   => p_txn_ref.organization_id,
2826           p_inventory_item_id => l_requirements_tbl(l_ind).inventory_item_id,
2827           p_serial_number     => fnd_api.g_miss_char,
2828           x_instance_tbl      => l_issued_instances,
2829           x_return_status     => l_return_status);
2830 
2831         IF x_return_status <> fnd_api.g_ret_sts_success THEN
2832           RAISE fnd_api.g_exc_error;
2833         END IF;
2834 
2835         debug('Issued Instances Count: '||l_issued_instances.COUNT);
2836 
2837         IF l_issued_instances.COUNT > 0 THEN
2838 
2839           SELECT serial_number_control_code
2840           INTO   l_comp_serial_code
2841           FROM   mtl_system_items
2842           WHERE  inventory_item_id = l_requirements_tbl(l_ind).inventory_item_id
2843           AND    organization_id   = p_txn_ref.organization_id;
2844 
2845           -- only for non serial
2846           IF l_comp_serial_code in (1, 6) THEN
2847 
2848             IF l_requirements_tbl(l_ind).quantity_per_assy > 0 THEN
2849 
2850               split_instances_using_ratio(
2851                 p_qty_ratio           => l_requirements_tbl(l_ind).quantity_per_assy,
2852                 p_qty_completed       => p_txn_ref.wip_completed_quantity,
2853                 p_organization_id     => p_txn_ref.organization_id,
2854                 p_issued_instances    => l_issued_instances,
2855                 px_csi_txn_rec        => px_csi_txn_rec,
2856                 x_splitted_instances  => l_splitted_instances,
2857                 x_return_status       => l_return_status);
2858 
2859               IF l_return_status <> fnd_api.g_ret_sts_success THEN
2860                 RAISE fnd_api.g_exc_error;
2861               END IF;
2862 
2863             ELSE
2864 
2865               IF l_auto_allocate = 'Y' OR p_txn_ref.wip_start_quantity = 1 THEN
2866 
2867                 IF p_txn_ref.wip_start_quantity > 1 THEN
2868                   split_issued_instances(
2869                     p_organization_id     => p_txn_ref.organization_id,
2870                     p_job_quantity        => p_txn_ref.wip_start_quantity,
2871                     p_completion_quantity => p_txn_ref.wip_completed_quantity,
2872                     px_issued_instances   => l_issued_instances,
2873                     px_csi_txn_rec        => px_csi_txn_rec,
2874                     x_splitted_instances  => l_splitted_instances,
2875                     x_return_status       => l_return_status);
2876 
2877                   IF l_return_status <> fnd_api.g_ret_sts_success THEN
2878                     RAISE fnd_api.g_exc_error;
2879                   END IF;
2880                 ELSE
2881                   l_splitted_instances := l_issued_instances;
2882                 END IF;
2883               END IF;
2884 
2885             END IF;
2886 
2887             debug('Splitted Instance Count: '||l_splitted_instances.COUNT);
2888 
2889             apportion_always(
2890               p_assembly_instances  => l_assembly_instances,
2891               p_splitted_instances  => l_splitted_instances,
2892               p_job_quantity        => p_txn_ref.wip_start_quantity,
2893               p_comp_serial_code    => l_comp_serial_code,
2894               x_assy_comp_map_tbl   => l_assy_comp_map_tbl,
2895               x_return_status       => l_return_status);
2896 
2897             IF l_return_status <> fnd_api.g_ret_sts_success THEN
2898               RAISE fnd_api.g_exc_error;
2899             END IF;
2900 
2901           ELSE
2902 
2903             get_genealogy_children(
2904               px_assembly_instances  => l_assembly_instances,
2905               x_assy_comp_map_tbl    => l_assy_comp_map_tbl,
2906               x_return_status        => l_return_status);
2907 
2908             IF l_return_status <> fnd_api.g_ret_sts_success THEN
2909               RAISE fnd_api.g_exc_error;
2910             END IF;
2911 
2912             IF l_auto_allocate = 'Y' OR p_txn_ref.wip_start_quantity = 1 THEN
2913 
2914               IF l_requirements_tbl(l_ind).quantity_per_assy = 0 THEN
2915                 l_requirements_flag := 'N';
2916               ELSE
2917                 l_requirements_flag := 'Y';
2918               END IF;
2919 
2920               apportion_serialized(
2921                 p_context              => 'COMPLETION',
2922                 p_requirements_flag    => l_requirements_flag,
2923                 p_qty_per_assy         => l_requirements_tbl(l_ind).quantity_per_assy,
2924                 p_total_qty_issued     => l_requirements_tbl(l_ind).issued_quantity,
2925                 p_job_qty              => p_txn_ref.wip_start_quantity,
2926                 p_component_item_id    => l_requirements_tbl(l_ind).inventory_item_id,
2927                 p_assembly_instances   => l_assembly_instances,
2928                 p_component_instances  => l_issued_instances,
2929                 px_assy_comp_map_tbl   => l_assy_comp_map_tbl,
2930                 x_return_status        => l_return_status);
2931 
2932               IF l_return_status <> fnd_api.g_ret_sts_success THEN
2933                 RAISE fnd_api.g_exc_error;
2934               END IF;
2935 
2936             END IF;
2937 
2938           END IF;
2939 
2940           IF l_assy_comp_map_tbl.COUNT > 0 THEN
2941 
2942             dump_assy_comp_relation(
2943               p_assy_comp_map_tbl => l_assy_comp_map_tbl);
2944 
2945             create_assy_comp_relation(
2946               p_assy_comp_map_tbl   => l_assy_comp_map_tbl,
2947               px_csi_txn_rec        => px_csi_txn_rec,
2948               x_return_status       => l_return_status);
2949 
2950             IF l_return_status <> fnd_api.g_ret_sts_success THEN
2951               RAISE fnd_api.g_exc_error;
2952             END IF;
2953 
2954           END IF;
2955 
2956         ELSE
2957           debug('Could not find issued instances. Process continues without building relation.');
2958         END IF;
2959 
2960       END LOOP;
2961     END IF;
2962 
2963   EXCEPTION
2964     WHEN end_process THEN
2965       x_return_status := fnd_api.g_ret_sts_success;
2966 
2967     WHEN fnd_api.g_exc_error THEN
2968       x_return_status := fnd_api.g_ret_sts_error;
2969   END build_discrete_rltn_at_wipac;
2970 
2971   PROCEDURE filter_assembly_instances(
2972     p_wip_entity_id            IN number,
2973     p_assembly_instances       IN csi_datastructures_pub.instance_tbl,
2974     p_component_item_id        IN number,
2975     p_quantity_ratio           IN number,
2976     x_filtered_assy_instances  OUT NOCOPY csi_datastructures_pub.instance_tbl,
2977     x_return_status            OUT NOCOPY varchar2)
2978   IS
2979 
2980     CURSOR rltns_cur(p_parent_instance_id IN number) IS
2981       SELECT  cir.subject_id, cii.quantity
2982       FROM    csi_ii_relationships cir,
2983               csi_item_instances   cii
2984       WHERE   cir.object_id              = p_parent_instance_id
2985       AND     cir.relationship_type_code = 'COMPONENT-OF'
2986       AND     cii.instance_id            = cir.subject_id
2987       AND     cii.inventory_item_id      = p_component_item_id
2988       AND     cii.last_wip_job_id        = p_wip_entity_id;
2989 
2990     /*
2991       AND     cii.quantity               < p_quantity_ratio;
2992       AND     sysdate between nvl(cii.active_start_date, sysdate-1)
2993                       and     nvl(cii.active_end_date,   sysdate+1);
2994     */
2995 
2996     l_filtered_assy_instances  csi_datastructures_pub.instance_tbl;
2997     l_relation_found           boolean        := FALSE;
2998     l_return_status            varchar2(1)    := fnd_api.g_ret_sts_success;
2999     l_f_ind                    binary_integer := 0;
3000 
3001     l_comp_quantity            number;
3002 
3003   BEGIN
3004 
3005     x_return_status := fnd_api.g_ret_sts_success;
3006 
3007     api_log('filter_assembly_instances');
3008 
3009     IF p_assembly_instances.COUNT > 0 THEN
3010 
3011       FOR l_ind IN p_assembly_instances.FIRST .. p_assembly_instances.LAST
3012       LOOP
3013 
3014         l_comp_quantity  := 0;
3015         l_relation_found := FALSE;
3016 
3017         FOR rltns_rec IN rltns_cur(p_assembly_instances(l_ind).instance_id)
3018         LOOP
3019           l_comp_quantity := l_comp_quantity + rltns_rec.quantity;
3020         END LOOP;
3021 
3022         IF l_comp_quantity >= p_quantity_ratio THEN
3023           l_relation_found := TRUE;
3024         ELSE
3025           l_relation_found := FALSE;
3026         END IF;
3027 
3028         IF l_relation_found = FALSE THEN
3029           l_f_ind := l_f_ind + 1;
3030           l_filtered_assy_instances(l_f_ind) := p_assembly_instances(l_ind);
3031         END IF;
3032 
3033       END LOOP;
3034     END IF;
3035 
3036     debug('  Filtered instances count :'||l_filtered_assy_instances.COUNT);
3037 
3038     x_filtered_assy_instances := l_filtered_assy_instances;
3039 
3040   EXCEPTION
3041     WHEN fnd_api.g_exc_error THEN
3042       x_return_status := fnd_api.g_ret_sts_error;
3043   END filter_assembly_instances;
3044 
3045   PROCEDURE get_genealogy_parent(
3046     px_component_instances IN OUT NOCOPY csi_datastructures_pub.instance_tbl,
3047     x_assy_comp_map_tbl       OUT NOCOPY assy_comp_map_tbl,
3048     x_return_status           OUT NOCOPY varchar2)
3049   IS
3050     l_parent_item_id       number;
3051     l_parent_serial_number varchar2(80)   := null;
3052 
3053     l_parent_instance_id   number;
3054 
3055     l_return_status        varchar2(1)    := fnd_api.g_ret_sts_success;
3056     l_a_ind                binary_integer := 0;
3057   BEGIN
3058 
3059     x_return_status := fnd_api.g_ret_sts_success;
3060 
3061     api_log('get_genealogy_parent');
3062 
3063     IF px_component_instances.COUNT > 0 THEN
3064       FOR l_ind IN px_component_instances.FIRST .. px_component_instances.LAST
3065       LOOP
3066 
3067         -- get genealogy parent
3068         get_parent_serial_number(
3069           p_child_item_id        => px_component_instances(l_ind).inventory_item_id,
3070           p_child_serial_number  => px_component_instances(l_ind).serial_number,
3071           x_parent_item_id       => l_parent_item_id,
3072           x_parent_serial_number => l_parent_serial_number,
3073           x_return_status        => l_return_status );
3074 
3075         IF l_parent_serial_number is not null THEN
3076 
3077           -- mark the comp instance as processed
3078           px_component_instances(l_ind).processed_flag := 'Y';
3079 
3080           BEGIN
3081             SELECT instance_id
3082             INTO   l_parent_instance_id
3083             FROM   csi_item_instances
3084             WHERE  inventory_item_id = l_parent_item_id
3085             AND    serial_number     = l_parent_serial_number
3086             AND    nvl(active_end_date,sysdate+1) > sysdate; --fix for bug 5393515
3087 
3088             debug('  Parent Instance ID :'||l_parent_instance_id);
3089 
3090             l_a_ind := l_a_ind + 1;
3091             x_assy_comp_map_tbl(l_a_ind).assy_instance_id := l_parent_instance_id;
3092             x_assy_comp_map_tbl(l_a_ind).comp_instance_id := px_component_instances(l_ind).instance_id;
3093             x_assy_comp_map_tbl(l_a_ind).comp_quantity    := 1;
3094 
3095           EXCEPTION
3096             WHEN no_data_found THEN
3097               null;
3098           END;
3099         ELSE
3100           px_component_instances(l_ind).processed_flag := 'N';
3101         END IF;
3102 
3103       END LOOP;
3104     END IF;
3105 
3106   EXCEPTION
3107     WHEN fnd_api.g_exc_error THEN
3108       x_return_status := fnd_api.g_ret_sts_error;
3109   END get_genealogy_parent;
3110 
3111   PROCEDURE get_unprocessed_instances(
3112     px_component_instances IN OUT NOCOPY csi_datastructures_pub.instance_tbl,
3113     x_return_status           OUT NOCOPY varchar2)
3114   IS
3115     l_upc_instances        csi_datastructures_pub.instance_tbl;
3116     l_upc_ind              binary_integer := 0;
3117 
3118   BEGIN
3119     x_return_status := fnd_api.g_ret_sts_success;
3120     api_log('get_unprocessed_instances');
3121 
3122     IF px_component_instances.COUNT > 0 THEN
3123 
3124       FOR l_ind IN px_component_instances.FIRST .. px_component_instances.LAST
3125       LOOP
3126         IF px_component_instances(l_ind).processed_flag <> 'Y' THEN
3127           l_upc_ind := l_upc_ind + 1;
3128           l_upc_instances(l_upc_ind) := px_component_instances(l_ind);
3129         END IF;
3130       END LOOP;
3131 
3132     END IF;
3133 
3134     debug('  unprocessed component instances :'||l_upc_instances.count);
3135 
3136     px_component_instances := l_upc_instances;
3137 
3138   EXCEPTION
3139     WHEN fnd_api.g_exc_error THEN
3140       x_return_status := fnd_api.g_ret_sts_error;
3141   END get_unprocessed_instances;
3142 
3143   PROCEDURE build_discrete_rltn_at_wipci(
3144     p_txn_ref           IN            txn_ref,
3145     px_csi_txn_rec      IN OUT NOCOPY csi_datastructures_pub.transaction_rec,
3146     x_return_status        OUT NOCOPY varchar2)
3147   IS
3148 
3149     l_auto_allocate       varchar2(1);
3150 
3151     l_issued_instances    csi_datastructures_pub.instance_tbl;
3152     l_assembly_instances  csi_datastructures_pub.instance_tbl;
3153     l_splitted_instances  csi_datastructures_pub.instance_tbl;
3154     l_f_assy_instances    csi_datastructures_pub.instance_tbl;
3155     l_assy_comp_map_tbl   assy_comp_map_tbl;
3156 
3157     l_f_assy_count        number;
3158     l_qty_per_assy        number;
3159     l_total_qty_issued    number;
3160 
3161     process_no_relation   exception;
3162     l_return_status       varchar2(1) := fnd_api.g_ret_sts_success;
3163 
3164   BEGIN
3165 
3166     x_return_status := fnd_api.g_ret_sts_success;
3167 
3168     api_log('build_discrete_rltn_at_wipci');
3169 
3170     l_auto_allocate := csi_datastructures_pub.g_install_param_rec.auto_allocate_comp_at_wip;
3171 
3172     get_issued_instances(
3173       p_wip_entity_id     => p_txn_ref.wip_entity_id,
3174       p_organization_id   => p_txn_ref.organization_id,
3175       p_inventory_item_id => p_txn_ref.inventory_item_id,
3176       p_serial_number     => fnd_api.g_miss_char,
3177       x_instance_tbl      => l_issued_instances,
3178       x_return_status     => l_return_status);
3179 
3180     IF l_return_status <> fnd_api.g_ret_sts_success THEN
3181       RAISE fnd_api.g_exc_error;
3182     END IF;
3183 
3184     IF l_issued_instances.COUNT > 0 THEN
3185 
3186       -- get all the completed assy instances no matter where they are.
3187       -- we will not be able to handle a case where the assembly instance has
3188       -- been issued to another wip job and completed we will loose the
3189       -- last_wip_job_id
3190 
3191       get_assembly_instances(
3192         p_wip_entity_id       => p_txn_ref.wip_entity_id,
3193         p_organization_id     => p_txn_ref.organization_id,
3194         p_assembly_item_id    => p_txn_ref.wip_assembly_item_id,
3195         p_completion_quantity => p_txn_ref.wip_completed_quantity,
3196         p_location_code       => 'ALL',
3197         x_instance_tbl        => l_assembly_instances,
3198         x_return_status       => l_return_status);
3199 
3200       IF l_return_status <> fnd_api.g_ret_sts_success THEN
3201         RAISE fnd_api.g_exc_error;
3202       END IF;
3203 
3204       IF l_assembly_instances.COUNT > 0 THEN
3205         -- get the ratio of the issued inventory instance
3206 
3207         get_qty_per_assembly(
3208           p_organization_id      => p_txn_ref.organization_id,
3209           p_wip_entity_id        => p_txn_ref.wip_entity_id,
3210           p_component_item_id    => p_txn_ref.inventory_item_id,
3211           x_qty_per_assembly     => l_qty_per_assy,
3212           x_return_status        => l_return_status);
3213 
3214         IF l_return_status <> fnd_api.g_ret_sts_success THEN
3215           RAISE fnd_api.g_exc_error;
3216         END IF;
3217 
3218         IF nvl(l_qty_per_assy,0) > 0 THEN
3219 
3220           IF p_txn_ref.srl_control_code in (1,6) THEN
3221 
3222             -- filter assembly instances and figure out instances that can be used as
3223             -- candidates to build relations, means elliminate the ones for which relation
3224             -- has been build already by one of the partially issued component for completed
3225             -- assembly
3226 
3227             filter_assembly_instances(
3228               p_wip_entity_id            => p_txn_ref.wip_entity_id,
3229               p_assembly_instances       => l_assembly_instances,
3230               p_component_item_id        => p_txn_ref.inventory_item_id,
3231               p_quantity_ratio           => l_qty_per_assy,
3232               x_filtered_assy_instances  => l_f_assy_instances,
3233               x_return_status            => l_return_status);
3234 
3235             IF l_return_status <> fnd_api.g_ret_sts_success THEN
3236               RAISE fnd_api.g_exc_error;
3237             END IF;
3238 
3239             l_f_assy_count := l_f_assy_instances.COUNT;
3240 
3241             IF l_f_assy_instances.COUNT > 0 THEN
3242 
3243               apportion_non_serialized(
3244                 p_context              => 'ISSUE',
3245                 p_requirements_flag    => 'Y',
3246                 p_qty_per_assy         => l_qty_per_assy,
3247                 p_qty_issued           => p_txn_ref.primary_quantity,
3248                 p_total_qty_issued     => null,
3249                 p_job_qty              => null,
3250                 p_organization_id      => p_txn_ref.organization_id,
3251                 p_assembly_instances   => l_f_assy_instances,
3252                 p_component_instances  => l_issued_instances,
3253                 px_csi_txn_rec         => px_csi_txn_rec,
3254                 x_assy_comp_map_tbl    => l_assy_comp_map_tbl,
3255                 x_return_status        => l_return_status);
3256 
3257               IF l_return_status <> fnd_api.g_ret_sts_success THEN
3258                 RAISE fnd_api.g_exc_error;
3259               END IF;
3260 
3261             END IF;
3262 
3263           ELSE -- serialized case
3264 
3265             -- we have to do these components in two parses
3266             -- parse I
3267             --   read genealogy parent and populate assy_comp_map table
3268             --
3269             -- parse II -- do this phase only if the auto_allocate = 'Y'
3270             --   for all the queried asssy instances check if they are
3271             --   allocated quantities for the ratio.
3272 
3273             get_genealogy_parent(
3274               px_component_instances => l_issued_instances,
3275               x_assy_comp_map_tbl    => l_assy_comp_map_tbl,
3276               x_return_status        => l_return_status);
3277 
3278             IF l_return_status <> fnd_api.g_ret_sts_success THEN
3279               RAISE fnd_api.g_exc_error;
3280             END IF;
3281 
3282             -- II
3283             IF l_auto_allocate = 'Y' OR p_txn_ref.wip_start_quantity = 1 THEN
3284 
3285               -- work with the remaining component instances as to allocate them in
3286               -- the ratio.
3287               get_unprocessed_instances(
3288                 px_component_instances => l_issued_instances,
3289                 x_return_status        => l_return_status);
3290 
3291               IF l_return_status <> fnd_api.g_ret_sts_success THEN
3292                 RAISE fnd_api.g_exc_error;
3293               END IF;
3294 
3295               apportion_serialized(
3296                 p_context              => 'ISSUE',
3297                 p_requirements_flag    => 'Y',
3298                 p_qty_per_assy         => l_qty_per_assy,
3299                 p_total_qty_issued     => null,
3300                 p_job_qty              => null,
3301                 p_component_item_id    => p_txn_ref.inventory_item_id,
3302                 p_assembly_instances   => l_assembly_instances,
3303                 p_component_instances  => l_issued_instances,
3304                 px_assy_comp_map_tbl   => l_assy_comp_map_tbl,
3305                 x_return_status        => l_return_status);
3306 
3307               IF l_return_status <> fnd_api.g_ret_sts_success THEN
3308                 RAISE fnd_api.g_exc_error;
3309               END IF;
3310 
3311             END IF;
3312           END IF;
3313 
3314         ELSE
3315 
3316           debug('No Requirements case...!');
3317 
3318           -- the question is do you want to apportion the total issued quantity
3319           -- with the total completed assembly. who knows there may be more
3320           -- component issues comming on the way. allocation here is way difficult
3321 
3322           IF l_auto_allocate = 'Y' OR p_txn_ref.wip_start_quantity = 1 THEN
3323 
3324             -- get the total quantity issued from the requirements
3325             SELECT sum(nvl(quantity_issued,0))
3326             INTO   l_total_qty_issued
3327             FROM   wip_requirement_operations
3328             WHERE  wip_entity_id     = p_txn_ref.wip_entity_id
3329             AND    organization_id   = p_txn_ref.organization_id
3330             AND    inventory_item_id = p_txn_ref.inventory_item_id;
3331 
3332             IF p_txn_ref.srl_control_code in (1,6) THEN
3333 
3334               apportion_non_serialized(
3335                 p_context              => 'ISSUE',
3336                 p_requirements_flag    => 'N',
3337                 p_qty_per_assy         => l_qty_per_assy,
3338                 p_qty_issued           => p_txn_ref.primary_quantity,
3339                 p_total_qty_issued     => l_total_qty_issued,
3340                 p_job_qty              => p_txn_ref.wip_start_quantity,
3341                 p_organization_id      => p_txn_ref.organization_id,
3342                 p_assembly_instances   => l_assembly_instances,
3343                 p_component_instances  => l_issued_instances,
3344                 px_csi_txn_rec         => px_csi_txn_rec,
3345                 x_assy_comp_map_tbl    => l_assy_comp_map_tbl,
3346                 x_return_status        => l_return_status);
3347 
3348               IF l_return_status <> fnd_api.g_ret_sts_success THEN
3349                 RAISE fnd_api.g_exc_error;
3350               END IF;
3351 
3352             ELSE
3353 
3354               get_genealogy_parent(
3355                 px_component_instances => l_issued_instances,
3356                 x_assy_comp_map_tbl    => l_assy_comp_map_tbl,
3357                 x_return_status        => l_return_status);
3358 
3359               IF l_return_status <> fnd_api.g_ret_sts_success THEN
3360                 RAISE fnd_api.g_exc_error;
3361               END IF;
3362 
3363               get_unprocessed_instances(
3364                 px_component_instances => l_issued_instances,
3365                 x_return_status        => l_return_status);
3366 
3367               IF l_return_status <> fnd_api.g_ret_sts_success THEN
3368                 RAISE fnd_api.g_exc_error;
3369               END IF;
3370 
3371               apportion_serialized(
3372                 p_context              => 'ISSUE',
3373                 p_requirements_flag    => 'N',
3374                 p_qty_per_assy         => l_qty_per_assy,
3375                 p_total_qty_issued     => l_total_qty_issued,
3376                 p_job_qty              => p_txn_ref.wip_start_quantity,
3377                 p_component_item_id    => p_txn_ref.inventory_item_id,
3378                 p_assembly_instances   => l_assembly_instances,
3379                 p_component_instances  => l_issued_instances,
3380                 px_assy_comp_map_tbl   => l_assy_comp_map_tbl,
3381                 x_return_status        => l_return_status);
3382 
3383               IF l_return_status <> fnd_api.g_ret_sts_success THEN
3384                 RAISE fnd_api.g_exc_error;
3385               END IF;
3386 
3387             END IF;
3388 
3389           ELSE
3390             debug('Process cannot continue. Cannot derive the quantity per assembly.');
3391             RAISE process_no_relation;
3392           END IF;
3393 
3394         END IF;
3395 
3396         IF l_assy_comp_map_tbl.COUNT > 0 THEN
3397 
3398           dump_assy_comp_relation(
3399             p_assy_comp_map_tbl => l_assy_comp_map_tbl);
3400 
3401           create_assy_comp_relation(
3402             p_assy_comp_map_tbl   => l_assy_comp_map_tbl,
3403             px_csi_txn_rec        => px_csi_txn_rec,
3404             x_return_status       => l_return_status);
3405 
3406           IF l_return_status <> fnd_api.g_ret_sts_success THEN
3407             RAISE fnd_api.g_exc_error;
3408           END IF;
3409 
3410         END IF;
3411 
3412       END IF; -- assembly_instances.count > 0
3413 
3414     END IF; -- issued_instances.count > 0
3415 
3416   EXCEPTION
3417     WHEN process_no_relation THEN
3418       null;
3419     WHEN fnd_api.g_exc_error THEN
3420       x_return_status := fnd_api.g_ret_sts_error;
3421   END build_discrete_rltn_at_wipci;
3422 
3423 
3424   PROCEDURE build_wo_less_rltn_at_wipac(
3425     p_mtl_txn_id         IN  number,
3426     p_wip_entity_id      IN  number,
3427     p_organization_id    IN  number,
3428     p_qty_completed      IN  number,
3429     p_assembly_instances IN  csi_datastructures_pub.instance_tbl,
3430     px_csi_txn_rec       IN OUT NOCOPY csi_datastructures_pub.transaction_rec,
3431     x_return_status         OUT NOCOPY varchar2)
3432   IS
3433 
3434     l_assembly_instances    csi_datastructures_pub.instance_tbl;
3435     l_issued_instances      csi_datastructures_pub.instance_tbl;
3436     l_splitted_instances    csi_datastructures_pub.instance_tbl;
3437     l_assy_comp_map_tbl     assy_comp_map_tbl;
3438 
3439     l_return_status         varchar2(1) := fnd_api.g_ret_sts_success;
3440     l_comp_serial_code      number;
3441     l_qty_ratio             number;
3442     l_comp_item             varchar2(80);
3443 
3444     CURSOR issue_cur IS
3445       SELECT inventory_item_id,
3446              sum(abs(primary_quantity)) qty_issued
3447       FROM   mtl_material_transactions
3448       WHERE  transaction_action_id      = 1
3449       AND    transaction_source_type_id = 5
3450       AND    transaction_source_id      = p_wip_entity_id
3451       GROUP BY inventory_item_id;
3452 
3453   BEGIN
3454 
3455     api_log('build_wo_less_rltn_at_wipac');
3456 
3457     x_return_status := fnd_api.g_ret_sts_success;
3458 
3459     l_assembly_instances := p_assembly_instances;
3460 
3461     FOR issue_rec IN issue_cur
3462     LOOP
3463 
3464 
3465       SELECT serial_number_control_code ,
3466              segment1
3467       INTO   l_comp_serial_code,
3468              l_comp_item
3469       FROM   mtl_system_items
3470       WHERE  inventory_item_id = issue_rec.inventory_item_id
3471       AND    organization_id   = p_organization_id;
3472 
3473       debug('  Component Item :'||l_comp_item||' - '||issue_rec.inventory_item_id);
3474 
3475       -- get ratio
3476       debug('Derive Assembly Component Ratio :');
3477       debug('  Quantity Issued    :'||issue_rec.qty_issued);
3478       debug('  Quantity Completed :'||p_qty_completed);
3479 
3480       BEGIN
3481         l_qty_ratio := issue_rec.qty_issued / p_qty_completed;
3482       EXCEPTION
3483         WHEN zero_divide THEN
3484           l_qty_ratio := 0;
3485           --seed message appropriately
3486       END;
3487 
3488       debug('  Quantity Ratio     :'||l_qty_ratio);
3489 
3490       -- get issued instances
3491       get_issued_instances(
3492         p_wip_entity_id     => p_wip_entity_id,
3493         p_organization_id   => p_organization_id,
3494         p_inventory_item_id => issue_rec.inventory_item_id,
3495         p_serial_number     => fnd_api.g_miss_char,
3496         x_instance_tbl      => l_issued_instances,
3497         x_return_status     => l_return_status);
3498 
3499       IF l_return_status <> fnd_api.g_ret_sts_success THEN
3500         RAISE fnd_api.g_exc_error;
3501       END IF;
3502       --fix for bug 4941800:IF condition added to ensure relationship
3503       --not build if issued instance count = 0
3504       IF l_issued_instances.COUNT > 0 THEN
3505 
3506       IF l_comp_serial_code in (1, 6) THEN
3507 
3508         IF p_qty_completed > 1 THEN
3509           IF l_issued_instances.COUNT > 0 THEN
3510 
3511             split_issued_instances(
3512               p_organization_id     => p_organization_id,
3513               p_job_quantity        => p_qty_completed,
3514               p_completion_quantity => p_qty_completed,
3515               px_issued_instances   => l_issued_instances,
3516               px_csi_txn_rec        => px_csi_txn_rec,
3517               x_splitted_instances  => l_splitted_instances,
3518               x_return_status       => l_return_status);
3519 
3520             IF l_return_status <> fnd_api.g_ret_sts_success THEN
3521               RAISE fnd_api.g_exc_error;
3522             END IF;
3523 
3524           END IF;
3525         ELSE
3526           l_splitted_instances := l_issued_instances;
3527         END IF;
3528 
3529       ELSE
3530         l_splitted_instances := l_issued_instances;
3531       END IF;
3532 
3533       -- apportion
3534       apportion_always(
3535         p_assembly_instances  => l_assembly_instances,
3536         p_splitted_instances  => l_splitted_instances,
3537         p_job_quantity        => p_qty_completed,
3538         p_comp_serial_code    => l_comp_serial_code,
3539         x_assy_comp_map_tbl   => l_assy_comp_map_tbl,
3540         x_return_status       => l_return_status);
3541 
3542       IF l_return_status <> fnd_api.g_ret_sts_success THEN
3543         RAISE fnd_api.g_exc_error;
3544       END IF;
3545 
3546       dump_assy_comp_relation(
3547         p_assy_comp_map_tbl => l_assy_comp_map_tbl);
3548 
3549       create_assy_comp_relation(
3550         p_assy_comp_map_tbl   => l_assy_comp_map_tbl,
3551         px_csi_txn_rec        => px_csi_txn_rec,
3552         x_return_status       => l_return_status);
3553 
3554       IF l_return_status <> fnd_api.g_ret_sts_success THEN
3555         RAISE fnd_api.g_exc_error;
3556       END IF;
3557       ELSE	--Fix for bug 4941800
3558 	debug('Could not find issued instances. Process continues without building relation.');
3559       END IF;
3560 
3561     END LOOP;
3562 
3563   EXCEPTION
3564     WHEN fnd_api.g_exc_error THEN
3565       x_return_status := fnd_api.g_ret_sts_error;
3566   END build_wo_less_rltn_at_wipac;
3567 
3568 
3569   PROCEDURE build_wo_less_rltn_at_wipci(
3570     p_txn_ref           IN  txn_ref,
3571     p_qty_completed     IN  number,
3572     p_issued_instances  IN  csi_datastructures_pub.instance_tbl,
3573     px_csi_txn_rec      IN OUT NOCOPY csi_datastructures_pub.transaction_rec,
3574     x_return_status        OUT NOCOPY varchar2)
3575   IS
3576 
3577     l_assembly_instances    csi_datastructures_pub.instance_tbl;
3578     l_f_assy_instances      csi_datastructures_pub.instance_tbl; --included for bug 5395829
3579     l_issued_instances      csi_datastructures_pub.instance_tbl;
3580     l_splitted_instances    csi_datastructures_pub.instance_tbl;
3581     l_assy_comp_map_tbl     assy_comp_map_tbl;
3582 
3583     l_return_status         varchar2(1) := fnd_api.g_ret_sts_success;
3584     l_comp_serial_code      number;
3585     l_qty_ratio             number;
3586 
3587     CURSOR issue_cur IS
3588       SELECT inventory_item_id,
3589              sum(abs(primary_quantity)) qty_issued
3590       FROM   mtl_material_transactions
3591       WHERE  transaction_action_id      = 1
3592       AND    transaction_source_type_id = 5
3593       AND    transaction_source_id      = p_txn_ref.wip_entity_id
3594       GROUP BY inventory_item_id;
3595 
3596   BEGIN
3597 
3598     api_log('build_wo_less_rltn_at_wipci');
3599 
3600     x_return_status := fnd_api.g_ret_sts_success;
3601 
3602     -- get assy instances
3603     get_assembly_instances(
3604       p_wip_entity_id       => p_txn_ref.wip_entity_id,
3605       p_organization_id     => p_txn_ref.organization_id,
3606       p_assembly_item_id    => p_txn_ref.wip_assembly_item_id,
3607       p_completion_quantity => p_qty_completed,
3608       p_location_code       => 'INVENTORY',
3609       x_instance_tbl        => l_assembly_instances,
3610       x_return_status       => l_return_status);
3611 
3612     IF l_return_status <> fnd_api.g_ret_sts_success THEN
3613       RAISE fnd_api.g_exc_error;
3614     END IF;
3615 
3616     IF l_assembly_instances.COUNT > 0 THEN
3617 
3618       -- get ratio
3619       debug('Derive Assembly Component Ratio :');
3620       debug('  Quantity Issued    :'||p_txn_ref.primary_quantity);
3621       debug('  Quantity Completed :'||p_qty_completed);
3622 
3623       BEGIN
3624         l_qty_ratio := p_txn_ref.primary_quantity / p_qty_completed;
3625       EXCEPTION
3626         WHEN zero_divide THEN
3627           l_qty_ratio := 0;
3628       END;
3629 
3630       debug('  Quantity Ratio     :'||l_qty_ratio);
3631 
3632       --fix for bug 5395829:Included to filter out assemblies which are already
3633       --in relationship with child instances as per bom ratio
3634       filter_assembly_instances(
3635               p_wip_entity_id            => p_txn_ref.wip_entity_id,
3636               p_assembly_instances       => l_assembly_instances,
3637               p_component_item_id        => p_txn_ref.inventory_item_id,
3638               p_quantity_ratio           => l_qty_ratio,
3639               x_filtered_assy_instances  => l_f_assy_instances,
3640               x_return_status            => l_return_status);
3641       IF l_return_status <> fnd_api.g_ret_sts_success THEN
3642         RAISE fnd_api.g_exc_error;
3643       END IF;
3644       --end of fix 5395829
3645 
3646       l_issued_instances := p_issued_instances;
3647 
3648       IF l_issued_instances.COUNT > 0 THEN
3649         IF p_qty_completed > 1 THEN
3650           IF p_txn_ref.srl_control_code in (1, 6) THEN
3651             split_issued_instances(
3652               p_organization_id     => p_txn_ref.organization_id,
3653               p_job_quantity        => p_qty_completed,
3654               p_completion_quantity => p_qty_completed,
3655               px_issued_instances   => l_issued_instances,
3656               px_csi_txn_rec        => px_csi_txn_rec,
3657               x_splitted_instances  => l_splitted_instances,
3658               x_return_status       => l_return_status);
3659             IF l_return_status <> fnd_api.g_ret_sts_success THEN
3660               RAISE fnd_api.g_exc_error;
3661             END IF;
3662           ELSE
3663             l_splitted_instances := l_issued_instances;
3664           END IF;
3665         ELSE
3666           l_splitted_instances := l_issued_instances;
3667         END IF;
3668 
3669         -- apportion splitted instances
3670         apportion_always(
3671           p_assembly_instances  => l_f_assy_instances,
3672           p_splitted_instances  => l_splitted_instances,
3673           p_job_quantity        => p_qty_completed,
3674           p_comp_serial_code    => l_comp_serial_code,
3675           x_assy_comp_map_tbl   => l_assy_comp_map_tbl,
3676           x_return_status       => l_return_status);
3677 
3678         IF l_return_status <> fnd_api.g_ret_sts_success THEN
3679           RAISE fnd_api.g_exc_error;
3680         END IF;
3681 
3682         dump_assy_comp_relation(
3683           p_assy_comp_map_tbl => l_assy_comp_map_tbl);
3684 
3685         create_assy_comp_relation(
3686           p_assy_comp_map_tbl   => l_assy_comp_map_tbl,
3687           px_csi_txn_rec        => px_csi_txn_rec,
3688           x_return_status       => l_return_status);
3689 
3690         IF l_return_status <> fnd_api.g_ret_sts_success THEN
3691           RAISE fnd_api.g_exc_error;
3692         END IF;
3693 
3694       END IF; -- issued_instances.count > 0
3695 
3696     END IF; -- assy_instances.count > 0
3697 
3698   EXCEPTION
3699     WHEN fnd_api.g_exc_error THEN
3700       x_return_status := fnd_api.g_ret_sts_error;
3701   END build_wo_less_rltn_at_wipci;
3702 
3703 
3704   PROCEDURE check_mtl_txn_in_csi(
3705     p_transaction_id   IN  number,
3706     x_txn_found        OUT NOCOPY boolean,
3707     x_return_status    OUT NOCOPY varchar2)
3708   IS
3709 
3710     CURSOR csi_txn_cur IS
3711       SELECT transaction_id
3712       FROM   csi_transactions
3713       WHERE  inv_material_transaction_id = p_transaction_id;
3714 
3715   BEGIN
3716     x_return_status := fnd_api.g_ret_sts_success;
3717 
3718     x_txn_found := FALSE;
3719 
3720     FOR csi_txn_rec IN csi_txn_cur
3721     LOOP
3722       x_txn_found := TRUE;
3723     END LOOP;
3724 
3725   EXCEPTION
3726     WHEN fnd_api.g_exc_error THEN
3727       x_return_status := fnd_api.g_ret_sts_error;
3728   END check_mtl_txn_in_csi;
3729 
3730   PROCEDURE check_prior_wip_txns_in_csi(
3731     p_mtl_creation_date IN date,
3732     p_transaction_id    IN  number,
3733     p_wip_entity_id     IN  number,
3734     x_return_status     OUT NOCOPY varchar2)
3735   IS
3736 
3737     CURSOR mtl_txn_cur(p_migration_date IN date) IS
3738       SELECT transaction_id
3739       FROM   mtl_system_items  msi,
3740              mtl_material_transactions mmt
3741       WHERE  mmt.transaction_source_type_id = 5  -- job/schedule transactions
3742       AND    mmt.transaction_source_id   = p_wip_entity_id
3743       AND    mmt.transaction_action_id  in (1, 27, 31, 32, 33, 34) -- ib handled wip actions
3744       AND    mmt.creation_date           < p_mtl_creation_date
3745       AND    mmt.transaction_date        > p_migration_date
3746       AND    msi.organization_id         = mmt.organization_id
3747       AND    msi.inventory_item_id       = mmt.inventory_item_id
3748       AND    nvl(msi.comms_nl_trackable_flag, 'N') = 'Y';
3749 
3750     l_return_status   varchar2(1) := fnd_api.g_ret_sts_success;
3751     l_processed_flag  boolean     := TRUE;
3752     l_migration_date  date;
3753 
3754   BEGIN
3755     api_log('check_prior_wip_txns_in_csi');
3756 
3757     x_return_status := fnd_api.g_ret_sts_success;
3758 
3759     l_migration_date := csi_datastructures_pub.g_install_param_rec.freeze_date;
3760 
3761     debug('  migration_date :'||l_migration_date);
3762 
3763     FOR mtl_txn_rec IN mtl_txn_cur(l_migration_date)
3764     LOOP
3765 
3766       check_mtl_txn_in_csi(
3767         p_transaction_id  => mtl_txn_rec.transaction_id,
3768         x_txn_found       => l_processed_flag,
3769         x_return_status   => l_return_status);
3770 
3771       IF l_return_status <> fnd_api.g_ret_sts_success THEN
3772         RAISE fnd_api.g_exc_error;
3773       END IF;
3774 
3775       IF NOT( l_processed_flag ) THEN
3776 
3777         fnd_message.set_name('CSI', 'CSI_WIP_PRIOR_TXN_FAILED');
3778         fnd_message.set_token('WIP_ENTITY_ID', p_wip_entity_id);
3779         fnd_message.set_token('MTL_TXN_ID', mtl_txn_rec.transaction_id);
3780 
3781         fnd_msg_pub.add;
3782         RAISE fnd_api.g_exc_error;
3783       END IF;
3784 
3785     END LOOP;
3786 
3787   EXCEPTION
3788     WHEN fnd_api.g_exc_error THEN
3789       x_return_status := fnd_api.g_ret_sts_error;
3790   END check_prior_wip_txns_in_csi;
3791 
3792 
3793   PROCEDURE get_order_of_processing(
3794     p_context           IN  varchar2,
3795     p_mtl_txn_id        IN  number,
3796     p_wip_entity_id     IN  number,
3797     x_order_of_process  OUT NOCOPY varchar2,
3798     x_return_status     OUT NOCOPY varchar2)
3799   IS
3800 
3801     l_qty_completed    number;
3802 
3803     l_issues_found     boolean := FALSE;
3804     l_completion_found boolean := FALSE;
3805     l_csi_txn_found    varchar2(1) := 'N';
3806 
3807     CURSOR issue_cur(pc_wip_entity_id in number) IS
3808       SELECT transaction_id
3809       FROM   mtl_material_transactions
3810       WHERE  transaction_source_type_id = 5
3811       AND    transaction_action_id    in (1, 34)
3812       AND    transaction_source_id      = pc_wip_entity_id;
3813 
3814     CURSOR compl_cur(pc_wip_entity_id in number) IS
3815       SELECT transaction_id
3816       FROM   mtl_material_transactions
3817       WHERE  transaction_action_id      = 31
3818       AND    transaction_source_type_id = 5
3819       AND    transaction_source_id      = pc_wip_entity_id;
3820 
3821   BEGIN
3822 
3823     api_log('get_order_of_processing');
3824     x_return_status := fnd_api.g_ret_sts_success;
3825     debug('  Context          :'||p_context);
3826     IF p_context = 'ISSUE' THEN
3827       l_completion_found := FALSE;
3828       l_csi_txn_found    := 'N';
3829       FOR compl_rec in compl_cur(p_wip_entity_id)
3830       LOOP
3831         -- also check if the txn is in csi_transaction
3832         BEGIN
3833           SELECT 'Y'
3834           INTO   l_csi_txn_found
3835           FROM   sys.dual
3836           WHERE  exists (
3837             SELECT 'X' FROM csi_transactions
3838             WHERE inv_material_transaction_id = compl_rec.transaction_id);
3839           l_completion_found := TRUE;
3840         EXCEPTION
3841           WHEN no_data_found THEN
3842             null;
3843         END;
3844       END LOOP;
3845 
3846       IF l_completion_found THEN
3847         x_order_of_process := 'ISSUE_AFTER_COMPLETION';
3848       ELSE
3849         x_order_of_process := 'ISSUE_FIRST';
3850       END IF;
3851 
3852     ELSIF p_context = 'COMPLETION' THEN
3853       l_issues_found := FALSE;
3854 
3855       FOR issue_rec in issue_cur(p_wip_entity_id)
3856       LOOP
3857         -- also check if the txn is in csi_transaction
3858         BEGIN
3859           SELECT 'Y'
3860           INTO   l_csi_txn_found
3861           FROM   sys.dual
3862           WHERE  exists (
3863             SELECT 'X' FROM csi_transactions
3864             WHERE inv_material_transaction_id = issue_rec.transaction_id);
3865           l_issues_found := TRUE;
3866         EXCEPTION
3867           WHEN no_data_found THEN
3868             null;
3869         END;
3870       END LOOP;
3871 
3872       IF l_issues_found THEN
3873         x_order_of_process := 'COMPLETION_AFTER_ISSUE';
3874       ELSE
3875         x_order_of_process := 'COMPLETION_FIRST';
3876       END IF;
3877     END IF;
3878 
3879     debug('  Processing Order :'||x_order_of_process);
3880   EXCEPTION
3881     when fnd_api.g_exc_error THEN
3882       x_return_status := fnd_api.g_ret_sts_error;
3883   END get_order_of_processing;
3884 
3885 
3886   /* process relationships at the time of WIP assembly completion */
3887   PROCEDURE process_relation_at_wipac(
3888     p_txn_ref            IN            txn_ref,
3889     p_assembly_instances IN            csi_datastructures_pub.instance_tbl,
3890     px_csi_txn_rec       IN OUT NOCOPY csi_datastructures_pub.transaction_rec,
3891     x_return_status         OUT NOCOPY varchar2)
3892   IS
3893 
3894     l_context            CONSTANT char(10)  := 'COMPLETION';
3895 
3896     l_organization_id    number;
3897     l_qty_completed      number;
3898     l_job_qty            number;
3899     l_wip_entity_id      number;
3900 
3901     l_assy_item_id       number;
3902     l_assy_serial_code   number;
3903 
3904     l_order_of_process   varchar2(30);
3905 
3906     l_auto_allocate      varchar2(1);
3907     l_return_status      varchar2(1) := fnd_api.g_ret_sts_success;
3908     process_no_relation  exception;
3909 
3910   BEGIN
3911 
3912     x_return_status := l_return_status;
3913 
3914     api_log('process_relation_at_wipac');
3915 
3916     l_auto_allocate :=  csi_datastructures_pub.g_install_param_rec.auto_allocate_comp_at_wip;
3917 
3918     IF p_txn_ref.srl_control_code  in (1, 6) THEN
3919       debug('no relationship processing for non serial assemblies.');
3920       RAISE process_no_relation;
3921     ELSE
3922 
3923       get_order_of_processing(
3924         p_context           => l_context,
3925         p_mtl_txn_id        => p_txn_ref.transaction_id,
3926         p_wip_entity_id     => p_txn_ref.wip_entity_id,
3927         x_order_of_process  => l_order_of_process,
3928         x_return_status     => l_return_status);
3929 
3930       IF l_return_status <> fnd_api.g_ret_sts_success THEN
3931         raise fnd_api.g_exc_error;
3932       END IF;
3933 
3934       IF l_order_of_process = 'COMPLETION_FIRST' THEN
3935         -- completion is the very first txn for this job. issues are not made yet.
3936         RAISE process_no_relation;
3937       ELSIF l_order_of_process = 'COMPLETION_AFTER_ISSUE' THEN
3938         --we have to work with building relations here
3939 
3940         check_prior_wip_txns_in_csi(
3941           p_mtl_creation_date => p_txn_ref.creation_date,
3942           p_transaction_id    => p_txn_ref.transaction_id,
3943           p_wip_entity_id     => p_txn_ref.wip_entity_id,
3944           x_return_status     => l_return_status);
3945 
3946         IF l_return_status <> fnd_api.g_ret_sts_success THEN
3947           RAISE fnd_api.g_exc_error;
3948         END IF;
3949 
3950         -- work order less completion -- entity type = 4 (flow schedules)
3951         IF p_txn_ref.wip_entity_type = 4 THEN
3952 
3953           build_wo_less_rltn_at_wipac(
3954             p_mtl_txn_id         => p_txn_ref.transaction_id,
3955             p_wip_entity_id      => p_txn_ref.wip_entity_id,
3956             p_organization_id    => p_txn_ref.organization_id,
3957             p_qty_completed      => p_txn_ref.wip_completed_quantity,
3958             p_assembly_instances => p_assembly_instances,
3959             px_csi_txn_rec       => px_csi_txn_rec,
3960             x_return_status      => l_return_status);
3961 
3962           IF l_return_status <> fnd_api.g_ret_sts_success THEN
3963             RAISE fnd_api.g_exc_error;
3964           END IF;
3965 
3966         ELSE -- wip_entity_type <> 4
3967 
3968           IF p_txn_ref.wip_entity_type in (1, 3) THEN
3969 
3970             build_discrete_rltn_at_wipac(
3971               p_txn_ref             => p_txn_ref,
3972               p_assembly_instances  => p_assembly_instances,
3973               px_csi_txn_rec        => px_csi_txn_rec,
3974               x_return_status       => l_return_status);
3975 
3976             IF l_return_status <> fnd_api.g_ret_sts_success THEN
3977               RAISE fnd_api.g_exc_error;
3978             END IF;
3979 
3980           ELSE
3981             debug('no relationship processing for wip_entity_type : '||p_txn_ref.wip_entity_type);
3982             RAISE process_no_relation;
3983           END IF;
3984 
3985         END IF; -- wip entity check
3986 
3987       END IF; -- order of processing
3988 
3989     END IF; -- serial non serial check
3990 
3991     debug('assembly component configuration process successful');
3992 
3993   EXCEPTION
3994     WHEN process_no_relation THEN
3995       null;
3996     WHEN fnd_api.g_exc_error THEN
3997       x_return_status := fnd_api.g_ret_sts_error;
3998   END process_relation_at_wipac;
3999 
4000   PROCEDURE process_relation_at_wipci(
4001     p_txn_ref             IN            txn_ref,
4002     p_component_instances IN            csi_datastructures_pub.instance_tbl,
4003     px_csi_txn_rec        IN OUT NOCOPY csi_datastructures_pub.transaction_rec,
4004     x_return_status          OUT NOCOPY varchar2)
4005   IS
4006 
4007     l_context              CONSTANT char(5) := 'ISSUE';
4008     l_order_of_process     varchar2(30);
4009 
4010     l_assy_serial_code     number;
4011     l_qty_completed        number;
4012 
4013     l_return_status        varchar2(1) := fnd_api.g_ret_sts_success;
4014 
4015     process_no_relation    exception;
4016 
4017   BEGIN
4018 
4019     x_return_status := fnd_api.g_ret_sts_success;
4020 
4021     api_log('process_relation_at_wipci');
4022 
4023     IF nvl(p_txn_ref.wip_assembly_item_id, fnd_api.g_miss_num) = fnd_api.g_miss_num THEN
4024       debug('no relationship processing for repair jobs without assembly.');
4025       RAISE process_no_relation;
4026     END IF;
4027 
4028     IF p_txn_ref.inventory_item_id = p_txn_ref.wip_assembly_item_id THEN
4029       debug('no relationship processing when assembly is issued as a component.');
4030       RAISE process_no_relation;
4031     END IF;
4032 
4033     SELECT serial_number_control_code
4034     INTO   l_assy_serial_code
4035     FROM   mtl_system_items
4036     WHERE  inventory_item_id = p_txn_ref.wip_assembly_item_id
4037     AND    organization_id   = p_txn_ref.organization_id;
4038 
4039     IF l_assy_serial_code in (1, 6) THEN -- non serial assembly
4040       debug('no relationship processing for non serial assemblies.');
4041       RAISE process_no_relation;
4042     ELSE -- serialized assemblies
4043 
4044       get_order_of_processing(
4045         p_context           => l_context,
4046         p_mtl_txn_id        => p_txn_ref.transaction_id,
4047         p_wip_entity_id     => p_txn_ref.wip_entity_id,
4048         x_order_of_process  => l_order_of_process,
4049         x_return_status     => l_return_status);
4050 
4051       IF l_return_status <> fnd_api.g_ret_sts_success THEN
4052         RAISE fnd_api.g_exc_error;
4053       END IF;
4054 
4055 
4056       IF l_order_of_process = 'ISSUE_FIRST' THEN
4057         -- issue transaction is happening before completion  so, do nothing
4058         RAISE process_no_relation;
4059       ELSIF l_order_of_process = 'ISSUE_AFTER_COMPLETION' THEN
4060 
4061         IF p_txn_ref.wip_entity_type = 4 THEN  -- wo less completions
4062 
4063           SELECT nvl(mmt_assem.primary_quantity,0)
4064           INTO   l_qty_completed
4065           FROM   mtl_material_transactions mmt_assem,
4066 	         mtl_material_transactions mmt_comp
4067           WHERE  mmt_assem.transaction_action_id      = 31
4068           AND    mmt_assem.transaction_source_type_id = 5
4069           AND    mmt_comp.transaction_source_id      = p_txn_ref.wip_entity_id
4070 	  AND    mmt_comp.transaction_id             = p_txn_ref.transaction_id
4071 	  AND    mmt_comp.completion_transaction_id  = mmt_assem.completion_transaction_id; --5225921
4072 
4073           debug('  quantity_completed: '||l_qty_completed);
4074 
4075           build_wo_less_rltn_at_wipci(
4076             p_txn_ref           => p_txn_ref,
4077             p_qty_completed     => l_qty_completed,
4078             p_issued_instances  => p_component_instances,
4079             px_csi_txn_rec      => px_csi_txn_rec,
4080             x_return_status     => l_return_status);
4081 
4082           IF l_return_status <> fnd_api.g_ret_sts_success THEN
4083             RAISE fnd_api.g_exc_error;
4084           END IF;
4085 
4086         ELSE  -- wip_entity_type <> 4
4087 
4088           IF p_txn_ref.wip_entity_type in (1, 3) THEN -- discrete jobs
4089 
4090             build_discrete_rltn_at_wipci(
4091               p_txn_ref        => p_txn_ref,
4092               px_csi_txn_rec   => px_csi_txn_rec,
4093               x_return_status  => l_return_status);
4094 
4095             IF l_return_status <> fnd_api.g_ret_sts_success THEN
4096               RAISE fnd_api.g_exc_error;
4097             END IF;
4098 
4099           ELSE
4100             debug('not handling relationship for wip_entity_type : '||p_txn_ref.wip_entity_type);
4101             RAISE process_no_relation;
4102           END IF;
4103 
4104         END IF; -- seperate WO less completions
4105 
4106       END IF; -- check if ISSUE after completion
4107 
4108     END IF; -- check for serialized assembly
4109 
4110     debug('assembly component configuration process successful.');
4111 
4112   EXCEPTION
4113     WHEN process_no_relation THEN
4114       null;
4115     WHEN fnd_api.g_exc_error THEN
4116       x_return_status := fnd_api.g_ret_sts_error;
4117      WHEN OTHERS THEN
4118      null;
4119   END process_relation_at_wipci;
4120 
4121   PROCEDURE bld_inst_tables_for_issue(
4122     p_txn_ref             IN            txn_ref,
4123     p_mmt_rec             IN            mmt_rec,
4124     x_dest_loc_rec           OUT nocopy csi_process_txn_grp.dest_location_rec,
4125     x_instances_tbl          OUT nocopy csi_process_txn_grp.txn_instances_tbl,
4126     x_parties_tbl            OUT nocopy csi_process_txn_grp.txn_i_parties_tbl,
4127     x_org_units_tbl          OUT nocopy csi_process_txn_grp.txn_org_units_tbl,
4128     x_return_status          OUT nocopy varchar2)
4129   IS
4130     l_int_party_id  number;
4131     l_wip_loc_id    number;
4132   BEGIN
4133 
4134     x_return_status := fnd_api.g_ret_sts_success;
4135 
4136     api_log('bld_inst_tables_for_issue');
4137 
4138     l_int_party_id := csi_datastructures_pub.g_install_param_rec.internal_party_id;
4139    -- l_wip_loc_id   := csi_datastructures_pub.g_install_param_rec.wip_location_id;
4140 
4141     -- build destination location attribs
4142     x_dest_loc_rec.location_type_code             := 'WIP';
4143     x_dest_loc_rec.location_id                    := nvl(p_mmt_rec.subinv_location_id,p_mmt_rec.hr_location_id); --5277935
4144     x_dest_loc_rec.wip_job_id                     := p_txn_ref.wip_entity_id;
4145     x_dest_loc_rec.instance_usage_code            := 'IN_WIP';
4146     x_dest_loc_rec.last_wip_job_id                := null; --bug 5376024
4147 
4148     x_dest_loc_rec.inv_organization_id            := fnd_api.g_miss_num;
4149     x_dest_loc_rec.inv_subinventory_name          := fnd_api.g_miss_char;
4150     x_dest_loc_rec.inv_locator_id                 := fnd_api.g_miss_num;
4151     x_dest_loc_rec.pa_project_id                  := fnd_api.g_miss_num;
4152     x_dest_loc_rec.pa_project_task_id             := fnd_api.g_miss_num;
4153     x_dest_loc_rec.in_transit_order_line_id       := fnd_api.g_miss_num;
4154     x_dest_loc_rec.po_order_line_id               := fnd_api.g_miss_num;
4155 
4156     -- build instances
4157     x_instances_tbl(1).ib_txn_segment_flag        := 'S';
4158     x_instances_tbl(1).inventory_item_id          := p_mmt_rec.inventory_item_id;
4159     x_instances_tbl(1).inventory_revision         := p_mmt_rec.revision;
4160     x_instances_tbl(1).vld_organization_id        := p_mmt_rec.organization_id;
4161     x_instances_tbl(1).inv_master_organization_id := p_txn_ref.master_organization_id;
4162     x_instances_tbl(1).serial_number              := p_mmt_rec.serial_number;
4163 
4164     IF nvl(x_instances_tbl(1).serial_number,fnd_api.g_miss_char) <> fnd_api.g_miss_char THEN
4165       x_instances_tbl(1).mfg_serial_number_flag   := 'Y';
4166     ELSE
4167       x_instances_tbl(1).mfg_serial_number_flag   := 'N';
4168     END IF;
4169 
4170     x_instances_tbl(1).lot_number                 := p_mmt_rec.lot_number;
4171     x_instances_tbl(1).quantity                   := abs(p_mmt_rec.instance_quantity);
4172 
4173     x_instances_tbl(1).unit_of_measure            := p_txn_ref.primary_uom_code;
4174 
4175     x_instances_tbl(1).location_type_code         := 'INVENTORY';
4176     x_instances_tbl(1).location_id                := p_mmt_rec.subinv_location_id;
4177 
4178     IF nvl(x_instances_tbl(1).location_id, fnd_api.g_miss_num) = fnd_api.g_miss_num THEN
4179       x_instances_tbl(1).location_id              := p_mmt_rec.hr_location_id;
4180     END IF;
4181 
4182     x_instances_tbl(1).inv_organization_id        := p_mmt_rec.organization_id;
4183     x_instances_tbl(1).inv_subinventory_name      := p_mmt_rec.subinventory_code;
4184     x_instances_tbl(1).inv_locator_id             := p_mmt_rec.locator_id;
4185     x_instances_tbl(1).instance_usage_code        := 'IN_INVENTORY';
4186 
4187     x_instances_tbl(1).active_start_date          := p_txn_ref.transaction_date;
4188     x_instances_tbl(1).customer_view_flag         := 'N';
4189     x_instances_tbl(1).merchant_view_flag         := 'Y';
4190     x_instances_tbl(1).object_version_number      := 1.0;
4191 
4192     -- build parties
4193     IF p_txn_ref.srl_control_code in (1, 6) THEN
4194       x_parties_tbl(1).parent_tbl_index           := 1;
4195       x_parties_tbl(1).party_source_table         := 'HZ_PARTIES';
4196       x_parties_tbl(1).party_id                   := l_int_party_id;
4197       x_parties_tbl(1).relationship_type_code     := 'OWNER';
4198       x_parties_tbl(1).contact_flag               := 'N';
4199       x_parties_tbl(1).object_version_number      := 1.0;
4200     END IF;
4201 
4202   END bld_inst_tables_for_issue;
4203 
4204   PROCEDURE Delink_ReplaceRebuilds(
4205     p_wip_entity_id      IN     number,
4206     p_organization_id    IN     number,
4207     px_csi_txn_rec       IN OUT nocopy csi_datastructures_pub.transaction_rec,
4208     x_replace_rebuilds      OUT nocopy eam_utility_grp.replace_rebuild_tbl_type,
4209     x_return_status         OUT nocopy varchar2)
4210   IS
4211     l_return_status          varchar2(1) := fnd_api.g_ret_sts_success;
4212     l_msg_count              number;
4213     l_msg_data               varchar2(2000);
4214 
4215     l_replace_rebuild_tbl    EAM_Utility_GRP.Replace_Rebuild_TBL_Type;
4216     l_entity_type            NUMBER := 0; --Added for bug 7363267
4217   BEGIN
4218 
4219     x_return_status := fnd_api.g_ret_sts_success;
4220 
4221     api_log('delink_replacerebuilds');
4222 
4223     SELECT  entity_type
4224     INTO    l_entity_type
4225     FROM    wip_entities
4226     WHERE   wip_entity_id = p_wip_entity_id
4227     AND     organization_id = p_organization_id;
4228 
4229    --Added if condition for bug 7363267,  EAM_Utility_Grp.Get_ReplacedRebuilds
4230    --is only suppose to be invoked for EAM work order
4231    IF (l_entity_type IN (6,7)) THEN
4232     debug('Inside API : eam_utility_grp.get_replacedrebuilds');
4233 
4234     EAM_Utility_Grp.Get_ReplacedRebuilds (
4235       p_api_version          => 1.0,
4236       p_commit               => fnd_api.g_false,
4237       p_validation_level     => fnd_api.g_valid_level_full,
4238       p_init_msg_list        => fnd_api.g_true,
4239       p_wip_entity_id        => p_wip_entity_id,
4240       p_organization_id      => p_organization_id,
4241       x_replaced_rebuild_tbl => l_replace_rebuild_tbl,
4242       x_return_status        => l_return_status,
4243       x_msg_count            => l_msg_count,
4244       x_msg_data             => l_msg_data);
4245 
4246     IF l_return_status <> fnd_api.g_ret_sts_success THEN
4247       RAISE fnd_api.g_exc_error;
4248     END IF;
4249 
4250     debug('  replace_rebuild_tbl.count : '||l_replace_rebuild_tbl.COUNT);
4251 
4252     IF l_replace_rebuild_tbl.COUNT > 0 THEN
4253       FOR l_ind IN l_replace_rebuild_tbl.FIRST .. l_replace_rebuild_tbl.LAST
4254       LOOP
4255 
4256         csi_process_txn_pvt.check_and_break_relation(
4257           p_instance_id   => l_replace_rebuild_tbl(l_ind).instance_id,
4258           p_csi_txn_rec   => px_csi_txn_rec,
4259           x_return_status => l_return_status);
4260 
4261         IF l_return_status <> fnd_api.g_ret_sts_success THEN
4262           RAISE fnd_api.g_exc_error;
4263         END IF;
4264 
4265       END LOOP;
4266     END IF;
4267    END IF;
4268   EXCEPTION
4269     WHEN fnd_api.g_exc_error THEN
4270       x_return_status := fnd_api.g_ret_sts_error;
4271   END Delink_ReplaceRebuilds;
4272 
4273   PROCEDURE wip_issue(
4274     p_mmt_rec          IN     mtl_material_transactions%rowtype,
4275     px_csi_txn_rec     IN OUT NOCOPY csi_datastructures_pub.transaction_rec,
4276     px_trx_error_rec   IN OUT NOCOPY csi_datastructures_pub.transaction_error_rec,
4277     x_return_status       OUT NOCOPY varchar2)
4278   IS
4279 
4280     l_api_name               varchar2(100):= 'csi_wip_trxs_pkg.wip_component_issue';
4281     l_txn_ref                txn_ref;
4282     l_mmt_tbl                mmt_tbl;
4283 
4284     l_in_out_flag            varchar2(30) := 'INT';
4285     l_dest_location_rec      csi_process_txn_grp.dest_location_rec;
4286     l_instances_tbl          csi_process_txn_grp.txn_instances_tbl;
4287     l_i_parties_tbl          csi_process_txn_grp.txn_i_parties_tbl;
4288     l_ip_accounts_tbl        csi_process_txn_grp.txn_ip_accounts_tbl;
4289     l_org_units_tbl          csi_process_txn_grp.txn_org_units_tbl;
4290     l_ext_attrib_values_tbl  csi_process_txn_grp.txn_ext_attrib_values_tbl;
4291     l_pricing_attribs_tbl    csi_process_txn_grp.txn_pricing_attribs_tbl;
4292     l_instance_asset_tbl     csi_process_txn_grp.txn_instance_asset_tbl;
4293     l_ii_relationships_tbl   csi_process_txn_grp.txn_ii_relationships_tbl;
4294 
4295     l_csi_txn_rec            csi_datastructures_pub.transaction_rec;
4296 
4297     l_c_dest_loc_rec         csi_process_txn_grp.dest_location_rec;
4298     l_c_instances_tbl        csi_process_txn_grp.txn_instances_tbl;
4299     l_c_parties_tbl          csi_process_txn_grp.txn_i_parties_tbl;
4300     l_c_org_units_tbl        csi_process_txn_grp.txn_org_units_tbl;
4301 
4302     l_api_success            varchar2(1) := fnd_api.g_ret_sts_success;
4303     l_error_message          varchar2(2000);
4304     l_return_status          varchar2(1) := fnd_api.g_ret_sts_success;
4305     l_msg_count              number;
4306     l_msg_data               varchar2(2000);
4307 
4308     l_issued_instances       csi_datastructures_pub.instance_tbl;
4309     l_i_ind                  binary_integer := 0;
4310 
4311     l_error_rec              csi_datastructures_pub.transaction_error_rec;
4312 
4313   BEGIN
4314 
4315     x_return_status := fnd_api.g_ret_sts_success;
4316 
4317     api_log('wip_issue');
4318 
4319     l_error_rec    := px_trx_error_rec;
4320     l_csi_txn_rec  := px_csi_txn_rec;
4321 
4322     csi_wip_trxs_pkg.get_mmt_info(
4323       p_transaction_id => p_mmt_rec.transaction_id,
4324       x_txn_ref        => l_txn_ref,
4325       x_mmt_tbl        => l_mmt_tbl,
4326       x_return_status  => l_return_status);
4327 
4328     IF l_return_status <> l_api_success THEN
4329       RAISE fnd_api.g_exc_error;
4330     END IF;
4331 
4332     l_error_rec.source_header_ref        := l_txn_ref.wip_entity_name;
4333     l_error_rec.source_header_ref_id     := l_txn_ref.wip_entity_id;
4334     l_error_rec.inventory_item_id        := l_txn_ref.inventory_item_id;
4335     l_error_rec.src_serial_num_ctrl_code := l_txn_ref.srl_control_code;
4336     l_error_rec.src_lot_ctrl_code        := l_txn_ref.lot_control_code;
4337     l_error_rec.src_rev_qty_ctrl_code    := l_txn_ref.rev_control_code;
4338     l_error_rec.src_location_ctrl_code   := l_txn_ref.loc_control_code;
4339     l_error_rec.comms_nl_trackable_flag  := l_txn_ref.ib_trackable_flag;
4340 
4341     IF l_mmt_tbl.COUNT > 0 THEN
4342 
4343       l_csi_txn_rec.source_header_ref       := l_txn_ref.wip_entity_name;
4344       l_csi_txn_rec.source_header_ref_id    := l_txn_ref.wip_entity_id;
4345       l_csi_txn_rec.source_transaction_date := l_txn_ref.transaction_date;
4346       l_csi_txn_rec.transaction_quantity    := l_txn_ref.primary_quantity;
4347       l_csi_txn_rec.transaction_uom_code    := l_txn_ref.primary_uom_code;
4348       l_csi_txn_rec.transaction_status_code := 'PENDING';
4349 
4350       FOR l_ind in l_mmt_tbl.FIRST .. l_mmt_tbl.LAST
4351       LOOP
4352 
4353         l_error_rec.serial_number := l_mmt_tbl(l_ind).serial_number;
4354         l_error_rec.lot_number    := l_mmt_tbl(l_ind).lot_number;
4355 
4356         bld_inst_tables_for_issue(
4357           p_txn_ref         => l_txn_ref,
4358           p_mmt_rec         => l_mmt_tbl(l_ind),
4359           x_dest_loc_rec    => l_c_dest_loc_rec,
4360           x_instances_tbl   => l_c_instances_tbl,
4361           x_parties_tbl     => l_c_parties_tbl,
4362           x_org_units_tbl   => l_c_org_units_tbl,
4363           x_return_status   => l_return_status);
4364 
4365         IF l_return_status <> l_api_success THEN
4366           RAISE fnd_api.g_exc_error;
4367         END IF;
4368 
4369         csi_process_txn_grp.process_transaction(
4370           p_api_version             => 1.0,
4371           p_commit                  => fnd_api.g_false,
4372           p_init_msg_list           => fnd_api.g_false,
4373           p_validation_level        => fnd_api.g_valid_level_full,
4374           p_validate_only_flag      => fnd_api.g_false,
4375           p_in_out_flag             => l_in_out_flag, -- valid values are 'IN','OUT'
4376           p_dest_location_rec       => l_c_dest_loc_rec,
4377           p_txn_rec                 => l_csi_txn_rec,
4378           p_instances_tbl           => l_c_instances_tbl,
4379           p_i_parties_tbl           => l_c_parties_tbl,
4380           p_ip_accounts_tbl         => l_ip_accounts_tbl,
4381           p_org_units_tbl           => l_org_units_tbl,
4382           p_ext_attrib_vlaues_tbl   => l_ext_attrib_values_tbl,
4383           p_pricing_attribs_tbl     => l_pricing_attribs_tbl,
4384           p_instance_asset_tbl      => l_instance_asset_tbl,
4385           p_ii_relationships_tbl    => l_ii_relationships_tbl,
4386           px_txn_error_rec          => l_error_rec,
4387           x_return_status           => l_return_status,
4388           x_msg_count               => l_msg_count,
4389           x_msg_data                => l_msg_data );
4390 
4391         IF l_return_status <> l_api_success THEN
4392           RAISE fnd_api.g_exc_error;
4393         END IF;
4394 
4395         IF l_c_instances_tbl.COUNT > 0 THEN
4396           FOR l_c_ind IN l_c_instances_tbl.FIRST .. l_c_instances_tbl.LAST
4397           LOOP
4398 
4399             l_i_ind := l_i_ind + 1;
4400             l_issued_instances(l_i_ind).instance_id   := l_c_instances_tbl(l_c_ind).new_instance_id;
4401             l_issued_instances(l_i_ind).serial_number := l_c_instances_tbl(l_c_ind).serial_number;
4402             l_issued_instances(l_i_ind).quantity      := l_c_instances_tbl(l_c_ind).quantity;
4403 
4404           END LOOP;
4405         END IF;
4406 
4407       END LOOP;
4408 
4409       /* 1 - EAM, 2 - AHL 0 - NULL */
4410 	 --R12 Changes for OPM
4411       IF l_txn_ref.wip_maint_source_code <> 2 OR l_txn_ref.wip_entity_type <> 10 THEN
4412        process_relation_at_wipci(
4413           p_txn_ref             => l_txn_ref,
4414           p_component_instances => l_issued_instances,
4415           px_csi_txn_rec        => l_csi_txn_rec,
4416           x_return_status       => l_return_status);
4417 
4418         IF l_return_status <> fnd_api.g_ret_sts_success THEN
4419           RAISE fnd_api.g_exc_error;
4420         END IF;
4421       END IF;
4422 
4423     END IF;
4424 
4425   EXCEPTION
4426     WHEN fnd_api.g_exc_error THEN
4427       px_trx_error_rec       := l_error_rec;
4428       x_return_status        := fnd_api.g_ret_sts_error;
4429   END wip_issue;
4430 
4431   PROCEDURE wip_comp_issue(
4432     p_transaction_id     IN            number,
4433     p_message_id         IN            number,
4434     px_trx_error_rec     IN OUT nocopy csi_datastructures_pub.transaction_error_rec,
4435     x_return_status         OUT nocopy varchar2)
4436   IS
4437 
4438     l_mmt_rec            mtl_material_transactions%rowtype;
4439     l_csi_txn_rec        csi_datastructures_pub.transaction_rec;
4440     l_error_rec          csi_datastructures_pub.transaction_error_rec;
4441     l_return_status      varchar2(1) := fnd_api.g_ret_sts_success;
4442 
4443   BEGIN
4444     x_return_status := fnd_api.g_ret_sts_success;
4445 
4446     csi_t_gen_utility_pvt.build_file_name(
4447       p_file_segment1 => 'csiwipci',
4448       p_file_segment2 => p_transaction_id);
4449 
4450     api_log('wip_comp_issue');
4451 
4452     debug('  Transaction Time  : '||to_char(sysdate, 'MM/DD/YY HH24:MI:SS'));
4453     debug('  Transaction Type  : WIP Component Issue');
4454     debug('  Transaction ID    : '||p_transaction_id);
4455 
4456     csi_utility_grp.check_ib_active;
4457 
4458     savepoint wip_comp_issue;
4459 
4460     fnd_msg_pub.initialize;
4461 
4462     --
4463     IF csi_datastructures_pub.g_install_param_rec.fetch_flag IS NULL THEN
4464       csi_gen_utility_pvt.populate_install_param_rec;
4465     END IF;
4466 
4467     l_error_rec := px_trx_error_rec;
4468 
4469     l_error_rec.source_type                   := 'CSIWIPCI';
4470     l_error_rec.source_id                     := p_transaction_id;
4471     l_error_rec.transaction_type_id           := 71;
4472     l_error_rec.message_id                    := p_message_id;
4473 
4474     l_csi_txn_rec.transaction_id              := fnd_api.g_miss_num;
4475     l_csi_txn_rec.transaction_date            := sysdate;
4476     l_csi_txn_rec.transaction_type_id         := 71;
4477     l_csi_txn_rec.txn_sub_type_id             := 3;
4478     l_csi_txn_rec.message_id                  := p_message_id;
4479     l_csi_txn_rec.inv_material_transaction_id := p_transaction_id;
4480     l_csi_txn_rec.object_version_number       := 1.0;
4481 
4482 
4483     SELECT * INTO l_mmt_rec
4484     FROM   mtl_material_transactions
4485     WHERE  transaction_id = p_transaction_id;
4486 
4487     wip_issue(
4488       p_mmt_rec          => l_mmt_rec,
4489       px_csi_txn_rec     => l_csi_txn_rec,
4490       px_trx_error_rec   => l_error_rec,
4491       x_return_status    => l_return_status);
4492 
4493     IF l_return_status <> fnd_api.g_ret_sts_success THEN
4494       RAISE fnd_api.g_exc_error;
4495     END IF;
4496 
4497     debug('wip component issue transaction successful : '||p_transaction_id);
4498     debug('end timestamp       : '||to_char(sysdate, 'MM/DD/YY HH24:MI:SS'));
4499 
4500   EXCEPTION
4501     WHEN fnd_api.g_exc_error THEN
4502       rollback to wip_comp_issue;
4503       l_error_rec.error_text := csi_t_gen_utility_pvt.dump_error_stack;
4504       px_trx_error_rec       := l_error_rec;
4505       x_return_status        := fnd_api.g_ret_sts_error;
4506       debug('Error(E) :'||l_error_rec.error_text);
4507 
4508     WHEN others then
4509       rollback to wip_comp_issue;
4510       fnd_message.set_name('CSI','CSI_UNEXP_SQL_ERROR');
4511       fnd_message.set_token('API_NAME',g_api_name);
4512       fnd_message.set_token('SQL_ERROR',substr(sqlerrm, 1, 540));
4513       fnd_msg_pub.add;
4514 
4515       l_error_rec.error_text := csi_t_gen_utility_pvt.dump_error_stack;
4516       px_trx_error_rec       := l_error_rec;
4517       x_return_status        := fnd_api.g_ret_sts_unexp_error;
4518       debug('Error(O) :'||l_error_rec.error_text);
4519   END wip_comp_issue;
4520 
4521   PROCEDURE wip_assy_return(
4522     p_transaction_id     IN            number,
4523     p_message_id         IN            number,
4524     px_trx_error_rec     IN OUT nocopy csi_datastructures_pub.transaction_error_rec,
4525     x_return_status         OUT nocopy varchar2)
4526   IS
4527 
4528     l_mmt_rec            mtl_material_transactions%rowtype;
4529     l_csi_txn_rec        csi_datastructures_pub.transaction_rec;
4530     l_error_rec          csi_datastructures_pub.transaction_error_rec;
4531     l_return_status      varchar2(1) := fnd_api.g_ret_sts_success;
4532 
4533   BEGIN
4534     x_return_status := fnd_api.g_ret_sts_success;
4535 
4536     csi_t_gen_utility_pvt.build_file_name(
4537       p_file_segment1 => 'csiwipar',
4538       p_file_segment2 => p_transaction_id);
4539 
4540     api_log('wip_assy_return');
4541 
4542     debug('  Transaction Time  : '||to_char(sysdate, 'MM/DD/YY HH24:MI:SS'));
4543     debug('  Transaction Type  : WIP Assembly Return');
4544     debug('  Transaction ID    : '||p_transaction_id);
4545 
4546     csi_utility_grp.check_ib_active;
4547 
4548     savepoint wip_assy_return;
4549 
4550     fnd_msg_pub.initialize;
4551 
4552     --
4553     IF csi_datastructures_pub.g_install_param_rec.fetch_flag IS NULL THEN
4554       csi_gen_utility_pvt.populate_install_param_rec;
4555     END IF;
4556 
4557     l_error_rec := px_trx_error_rec;
4558 
4559     l_error_rec.source_type                   := 'CSIWIPAR';
4560     l_error_rec.source_id                     := p_transaction_id;
4561     l_error_rec.transaction_type_id           := 74;
4562     l_error_rec.message_id                    := p_message_id;
4563 
4564     l_csi_txn_rec.transaction_id              := fnd_api.g_miss_num;
4565     l_csi_txn_rec.transaction_date            := sysdate;
4566     l_csi_txn_rec.transaction_type_id         := 74;
4567     l_csi_txn_rec.txn_sub_type_id             := 3;
4568     l_csi_txn_rec.message_id                  := p_message_id;
4569     l_csi_txn_rec.inv_material_transaction_id := p_transaction_id;
4570     l_csi_txn_rec.object_version_number       := 1.0;
4571 
4572 
4573     SELECT * INTO l_mmt_rec
4574     FROM   mtl_material_transactions
4575     WHERE  transaction_id = p_transaction_id;
4576 
4577     wip_issue(
4578       p_mmt_rec          => l_mmt_rec,
4579       px_csi_txn_rec     => l_csi_txn_rec,
4580       px_trx_error_rec   => l_error_rec,
4581       x_return_status    => l_return_status);
4582 
4583     IF l_return_status <> fnd_api.g_ret_sts_success THEN
4584       RAISE fnd_api.g_exc_error;
4585     END IF;
4586 
4587     debug('wip assembly return transaction successful : '||p_transaction_id);
4588     debug('end timestamp       : '||to_char(sysdate, 'MM/DD/YY HH24:MI:SS'));
4589 
4590   EXCEPTION
4591     WHEN fnd_api.g_exc_error THEN
4592       rollback to wip_assy_return;
4593       l_error_rec.error_text := csi_t_gen_utility_pvt.dump_error_stack;
4594       px_trx_error_rec       := l_error_rec;
4595       x_return_status        := fnd_api.g_ret_sts_error;
4596       debug('Error(E) :'||l_error_rec.error_text);
4597 
4598     WHEN others then
4599       rollback to wip_assy_return;
4600       fnd_message.set_name('CSI','CSI_UNEXP_SQL_ERROR');
4601       fnd_message.set_token('API_NAME',g_api_name);
4602       fnd_message.set_token('SQL_ERROR',substr(sqlerrm, 1, 540));
4603       fnd_msg_pub.add;
4604 
4605       l_error_rec.error_text := csi_t_gen_utility_pvt.dump_error_stack;
4606       px_trx_error_rec       := l_error_rec;
4607       x_return_status        := fnd_api.g_ret_sts_unexp_error;
4608       debug('Error(O) :'||l_error_rec.error_text);
4609   END wip_assy_return;
4610 
4611 
4612 /* R12 Change for OPM*/
4613 
4614  PROCEDURE wip_byproduct_return(
4615     p_transaction_id     IN            number,
4616     p_message_id         IN            number,
4617     px_trx_error_rec     IN OUT nocopy csi_datastructures_pub.transaction_error_rec,
4618     x_return_status         OUT nocopy varchar2)
4619   IS
4620 
4621     l_mmt_rec            mtl_material_transactions%rowtype;
4622     l_csi_txn_rec        csi_datastructures_pub.transaction_rec;
4623     l_error_rec          csi_datastructures_pub.transaction_error_rec;
4624     l_return_status      varchar2(1) := fnd_api.g_ret_sts_success;
4625 
4626   BEGIN
4627     x_return_status := fnd_api.g_ret_sts_success;
4628 
4629     csi_t_gen_utility_pvt.build_file_name(
4630       p_file_segment1 => 'csiwipbr',
4631       p_file_segment2 => p_transaction_id);
4632 
4633     api_log('wip_byproduct_return');
4634 
4635     debug('  Transaction Time  : '||to_char(sysdate, 'MM/DD/YY HH24:MI:SS'));
4636     debug('  Transaction Type  : WIP ByProduct Return');
4637     debug('  Transaction ID    : '||p_transaction_id);
4638 
4639     csi_utility_grp.check_ib_active;
4640 
4641     savepoint wip_byproduct_return;
4642 
4643     fnd_msg_pub.initialize;
4644 
4645     --
4646     IF csi_datastructures_pub.g_install_param_rec.fetch_flag IS NULL THEN
4647       csi_gen_utility_pvt.populate_install_param_rec;
4648     END IF;
4649 
4650     l_error_rec := px_trx_error_rec;
4651 
4652     l_error_rec.source_type                   := 'CSIWIPBR';
4653     l_error_rec.source_id                     := p_transaction_id;
4654     l_error_rec.transaction_type_id           := 76;
4655     l_error_rec.message_id                    := p_message_id;
4656 
4657     l_csi_txn_rec.transaction_id              := fnd_api.g_miss_num;
4658     l_csi_txn_rec.transaction_date            := sysdate;
4659     l_csi_txn_rec.transaction_type_id         := 76;
4660     l_csi_txn_rec.txn_sub_type_id             := 3;
4661     l_csi_txn_rec.message_id                  := p_message_id;
4662     l_csi_txn_rec.inv_material_transaction_id := p_transaction_id;
4663     l_csi_txn_rec.object_version_number       := 1.0;
4664 
4665 
4666     SELECT * INTO l_mmt_rec
4667     FROM   mtl_material_transactions
4668     WHERE  transaction_id = p_transaction_id;
4669 
4670     wip_issue(
4671       p_mmt_rec          => l_mmt_rec,
4672       px_csi_txn_rec     => l_csi_txn_rec,
4673       px_trx_error_rec   => l_error_rec,
4674       x_return_status    => l_return_status);
4675 
4676     IF l_return_status <> fnd_api.g_ret_sts_success THEN
4677       RAISE fnd_api.g_exc_error;
4678     END IF;
4679 
4680     debug('wip by product return transaction successful : '||p_transaction_id);
4681     debug('end timestamp       : '||to_char(sysdate, 'MM/DD/YY HH24:MI:SS'));
4682 
4683   EXCEPTION
4684     WHEN fnd_api.g_exc_error THEN
4685       rollback to wip_byproduct_return;
4686       l_error_rec.error_text := csi_t_gen_utility_pvt.dump_error_stack;
4687       px_trx_error_rec       := l_error_rec;
4688       x_return_status        := fnd_api.g_ret_sts_error;
4689       debug('Error(E) :'||l_error_rec.error_text);
4690 
4691     WHEN others then
4692       rollback to wip_byproduct_return;
4693       fnd_message.set_name('CSI','CSI_UNEXP_SQL_ERROR');
4694       fnd_message.set_token('API_NAME',g_api_name);
4695       fnd_message.set_token('SQL_ERROR',substr(sqlerrm, 1, 540));
4696       fnd_msg_pub.add;
4697 
4698       l_error_rec.error_text := csi_t_gen_utility_pvt.dump_error_stack;
4699       px_trx_error_rec       := l_error_rec;
4700       x_return_status        := fnd_api.g_ret_sts_unexp_error;
4701       debug('Error(O) :'||l_error_rec.error_text);
4702   END wip_byproduct_return;
4703 
4704 
4705   PROCEDURE wip_neg_comp_return(
4706     p_transaction_id     IN            number,
4707     p_message_id         IN            number,
4708     px_trx_error_rec     IN OUT nocopy csi_datastructures_pub.transaction_error_rec,
4709     x_return_status         OUT nocopy varchar2)
4710   IS
4711 
4712     l_mmt_rec            mtl_material_transactions%rowtype;
4713     l_csi_txn_rec        csi_datastructures_pub.transaction_rec;
4714     l_error_rec          csi_datastructures_pub.transaction_error_rec;
4715     l_return_status      varchar2(1) := fnd_api.g_ret_sts_success;
4716 
4717   BEGIN
4718     x_return_status := fnd_api.g_ret_sts_success;
4719 
4720     csi_t_gen_utility_pvt.build_file_name(
4721       p_file_segment1 => 'csiwipnr',
4722       p_file_segment2 => p_transaction_id);
4723 
4724     api_log('wip_neg_comp_return');
4725 
4726     debug('  Transaction Time  : '||to_char(sysdate, 'MM/DD/YY HH24:MI:SS'));
4727     debug('  Transaction Type  : WIP Negative Component  Return');
4728     debug('  Transaction ID    : '||p_transaction_id);
4729 
4730     csi_utility_grp.check_ib_active;
4731 
4732     savepoint wip_neg_comp_return;
4733 
4734     fnd_msg_pub.initialize;
4735 
4736     --
4737     IF csi_datastructures_pub.g_install_param_rec.fetch_flag IS NULL THEN
4738       csi_gen_utility_pvt.populate_install_param_rec;
4739     END IF;
4740 
4741     l_error_rec := px_trx_error_rec;
4742 
4743     l_error_rec.source_type                   := 'CSIWIPNR';
4744     l_error_rec.source_id                     := p_transaction_id;
4745     l_error_rec.transaction_type_id           := 71;
4746     l_error_rec.message_id                    := p_message_id;
4747 
4748     l_csi_txn_rec.transaction_id              := fnd_api.g_miss_num;
4749     l_csi_txn_rec.transaction_date            := sysdate;
4750     l_csi_txn_rec.transaction_type_id         := 71;
4751     l_csi_txn_rec.txn_sub_type_id             := 3;
4752     l_csi_txn_rec.message_id                  := p_message_id;
4753     l_csi_txn_rec.inv_material_transaction_id := p_transaction_id;
4754     l_csi_txn_rec.object_version_number       := 1.0;
4755 
4756 
4757     SELECT * INTO l_mmt_rec
4758     FROM   mtl_material_transactions
4759     WHERE  transaction_id = p_transaction_id;
4760 
4761     wip_issue(
4762       p_mmt_rec          => l_mmt_rec,
4763       px_csi_txn_rec     => l_csi_txn_rec,
4764       px_trx_error_rec   => l_error_rec,
4765       x_return_status    => l_return_status);
4766 
4767     IF l_return_status <> fnd_api.g_ret_sts_success THEN
4768       RAISE fnd_api.g_exc_error;
4769     END IF;
4770 
4771     debug('wip negative component return transaction successful : '||p_transaction_id);
4772     debug('end timestamp       : '||to_char(sysdate, 'MM/DD/YY HH24:MI:SS'));
4773 
4774   EXCEPTION
4775     WHEN fnd_api.g_exc_error THEN
4776       rollback to wip_neg_comp_return;
4777       l_error_rec.error_text := csi_t_gen_utility_pvt.dump_error_stack;
4778       px_trx_error_rec       := l_error_rec;
4779       x_return_status        := fnd_api.g_ret_sts_error;
4780       debug('Error(E) :'||l_error_rec.error_text);
4781 
4782     WHEN others then
4783       rollback to wip_neg_comp_return;
4784       fnd_message.set_name('CSI','CSI_UNEXP_SQL_ERROR');
4785       fnd_message.set_token('API_NAME',g_api_name);
4786       fnd_message.set_token('SQL_ERROR',substr(sqlerrm, 1, 540));
4787       fnd_msg_pub.add;
4788 
4789       l_error_rec.error_text := csi_t_gen_utility_pvt.dump_error_stack;
4790       px_trx_error_rec       := l_error_rec;
4791       x_return_status        := fnd_api.g_ret_sts_unexp_error;
4792       debug('Error(O) :'||l_error_rec.error_text);
4793   END wip_neg_comp_return;
4794 
4795   PROCEDURE get_issued_serial_instance(
4796     px_instance_rec        IN OUT NOCOPY csi_process_txn_grp.txn_instance_rec,
4797     x_return_status           OUT NOCOPY varchar2)
4798   IS
4799     l_inst_query_rec       csi_datastructures_pub.instance_query_rec;
4800     l_party_query_rec      csi_datastructures_pub.party_query_rec;
4801     l_pty_acct_query_rec   csi_datastructures_pub.party_account_query_rec;
4802 
4803     l_instance_hdr_tbl     csi_datastructures_pub.instance_header_tbl;
4804     l_return_status        varchar2(1) := fnd_api.g_ret_sts_success;
4805     l_msg_count            number;
4806     l_msg_data             varchar2(2000);
4807 
4808   BEGIN
4809 
4810     x_return_status := fnd_api.g_ret_sts_success;
4811     api_log('get_issued_serial_instance');
4812 
4813     -- look for a serialized instance in csi_item_instances
4814     -- if it is in customer location then
4815 
4816     l_inst_query_rec.inventory_item_id := px_instance_rec.inventory_item_id;
4817     l_inst_query_rec.serial_number     := px_instance_rec.serial_number;
4818 
4819     csi_item_instance_pub.get_item_instances(
4820       p_api_version          => 1.0,
4821       p_commit               => fnd_api.g_false,
4822       p_init_msg_list        => fnd_api.g_true,
4823       p_validation_level     => fnd_api.g_valid_level_full,
4824       p_instance_query_rec   => l_inst_query_rec,
4825       p_party_query_rec      => l_party_query_rec,
4826       p_account_query_rec    => l_pty_acct_query_rec,
4827       p_transaction_id       => NULL,
4828       p_resolve_id_columns   => fnd_api.g_false,
4829       p_active_instance_only => fnd_api.g_false,
4830       x_instance_header_tbl  => l_instance_hdr_tbl,
4831       x_return_status        => l_return_status,
4832       x_msg_count            => l_msg_count,
4833       x_msg_data             => l_msg_data );
4834 
4835     IF l_return_status <> fnd_api.g_ret_sts_success THEN
4836       RAISE fnd_api.g_exc_error;
4837     END IF;
4838 
4839     IF l_instance_hdr_tbl.count = 0 THEN
4840       px_instance_rec.instance_id := fnd_api.g_miss_num;
4841     ELSE
4842       IF l_instance_hdr_tbl.count = 1 THEN
4843         px_instance_rec.instance_id := l_instance_hdr_tbl(1).instance_id;
4844       ELSE
4845         debug('Too many serialized source instances found. '||l_instance_hdr_tbl.count);
4846       END IF;
4847     END IF;
4848 
4849   EXCEPTION
4850     WHEN fnd_api.g_exc_error THEN
4851       x_return_status := fnd_api.g_ret_sts_error;
4852   END get_issued_serial_instance;
4853 
4854   -- handle only the return of WIP instances
4855   -- after the relations are build you could have multiple
4856   -- instances if it is allocated to a multiple quantity job
4857   /* the correct way to do this code here is to look for a WIP instance
4858      first that is issued out excessly
4859      then go and knock the ones in order for the components that are
4860      already tied up in relations.
4861   */
4862 
4863   PROCEDURE get_instances(
4864     p_instance_query_rec   IN csi_datastructures_pub.instance_query_rec,
4865     x_instance_tbl         OUT NOCOPY csi_datastructures_pub.instance_tbl,
4866     x_return_status        OUT NOCOPY varchar2)
4867   IS
4868 
4869     l_party_query_rec      csi_datastructures_pub.party_query_rec;
4870     l_pty_acct_query_rec   csi_datastructures_pub.party_account_query_rec;
4871 
4872     l_instance_hdr_tbl     csi_datastructures_pub.instance_header_tbl;
4873     l_instance_tbl         csi_datastructures_pub.instance_tbl;
4874 
4875 
4876     l_return_status        varchar2(1) := fnd_api.g_ret_sts_success;
4877     l_msg_count            number;
4878     l_msg_data             varchar2(2000);
4879 
4880   BEGIN
4881 
4882     csi_t_gen_utility_pvt.dump_instance_query_rec(p_instance_query_rec);
4883 
4884     api_log(
4885       p_pkg_name => 'csi_item_instance_pub',
4886       p_api_name => 'get_item_instances');
4887 
4888     csi_item_instance_pub.get_item_instances(
4889       p_api_version          => 1.0,
4890       p_commit               => fnd_api.g_false,
4891       p_init_msg_list        => fnd_api.g_true,
4892       p_validation_level     => fnd_api.g_valid_level_full,
4893       p_instance_query_rec   => p_instance_query_rec,
4894       p_party_query_rec      => l_party_query_rec,
4895       p_account_query_rec    => l_pty_acct_query_rec,
4896       p_transaction_id       => null,
4897       p_resolve_id_columns   => fnd_api.g_false,
4898       p_active_instance_only => fnd_api.g_true,
4899       x_instance_header_tbl  => l_instance_hdr_tbl,
4900       x_return_status        => l_return_status,
4901       x_msg_count            => l_msg_count,
4902       x_msg_data             => l_msg_data);
4903 
4904     IF l_return_status <> fnd_api.g_ret_sts_success THEN
4905       RAISE fnd_api.g_exc_error;
4906     END IF;
4907 
4908     IF l_instance_hdr_tbl.COUNT > 0 THEN
4909       csi_utl_pkg.make_non_header_tbl(
4910         p_instance_header_tbl => l_instance_hdr_tbl,
4911         x_instance_tbl        => l_instance_tbl,
4912         x_return_status       => l_return_status);
4913 
4914       IF l_return_status <> fnd_api.g_ret_sts_success THEN
4915         RAISE fnd_api.g_exc_error;
4916       END IF;
4917     END IF;
4918 
4919     x_instance_tbl := l_instance_tbl;
4920 
4921   EXCEPTION
4922     WHEN fnd_api.g_exc_error THEN
4923       x_return_status := fnd_api.g_ret_sts_error;
4924   END get_instances;
4925 
4926 
4927   PROCEDURE get_issued_in_wip_instance(
4928     p_wip_entity_id        IN number,
4929     p_component_item_id    IN number,
4930     p_organization_id      IN number,
4931     p_lot_number           IN varchar2,
4932     x_instance_tbl            OUT NOCOPY csi_datastructures_pub.instance_tbl,
4933     x_return_status           OUT NOCOPY varchar2)
4934   IS
4935 
4936     l_inst_query_rec       csi_datastructures_pub.instance_query_rec;
4937     l_inst_tbl             csi_datastructures_pub.instance_tbl;
4938     l_return_status        varchar2(1) := fnd_api.g_ret_sts_success;
4939 
4940   BEGIN
4941 
4942     x_return_status := fnd_api.g_ret_sts_success;
4943     api_log('get_issued_in_wip_instance');
4944 
4945     -- first get the excess WIP instance that needs to be knocked off
4946     l_inst_query_rec.inventory_item_id  := p_component_item_id;
4947     l_inst_query_rec.wip_job_id         := p_wip_entity_id;
4948     l_inst_query_rec.lot_number         := p_lot_number;
4949     l_inst_query_rec.location_type_code := 'WIP';
4950     l_inst_query_rec.instance_usage_code:= 'IN_WIP';
4951 
4952     -- for a non serial item at WIP we should only hit one WIP instance
4953     get_instances(
4954       p_instance_query_rec   => l_inst_query_rec,
4955       x_instance_tbl         => l_inst_tbl,
4956       x_return_status        => l_return_status);
4957 
4958     IF l_return_status <> fnd_api.g_ret_sts_success THEN
4959       RAISE fnd_api.g_exc_error;
4960     END IF;
4961 
4962     debug('IN_WIP Instances COUNT :'||l_inst_tbl.COUNT);
4963     x_instance_tbl := l_inst_tbl;
4964   EXCEPTION
4965     WHEN fnd_api.g_exc_error THEN
4966       x_return_status := fnd_api.g_ret_sts_error;
4967   END get_issued_in_wip_instance;
4968 
4969 
4970   PROCEDURE get_issued_in_inv_instances(
4971     p_wip_entity_id        IN number,
4972     p_component_item_id    IN number,
4973     p_organization_id      IN number,
4974     p_lot_number           IN varchar2,
4975     x_instance_tbl            OUT NOCOPY csi_datastructures_pub.instance_tbl,
4976     x_return_status           OUT NOCOPY varchar2)
4977   IS
4978 
4979     l_inst_query_rec       csi_datastructures_pub.instance_query_rec;
4980     l_inst_tbl             csi_datastructures_pub.instance_tbl;
4981     l_return_status        varchar2(1) := fnd_api.g_ret_sts_success;
4982 
4983   BEGIN
4984 
4985     x_return_status := fnd_api.g_ret_sts_success;
4986     api_log('get_issued_in_inv_instances');
4987 
4988     l_inst_query_rec.inventory_item_id   := p_component_item_id;
4989     l_inst_query_rec.last_wip_job_id     := p_wip_entity_id;
4990     l_inst_query_rec.lot_number          := p_lot_number;
4991     l_inst_query_rec.instance_usage_code := 'IN_RELATIONSHIP';
4992 
4993     get_instances(
4994       p_instance_query_rec   => l_inst_query_rec,
4995       x_instance_tbl         => l_inst_tbl,
4996       x_return_status        => l_return_status);
4997 
4998     IF l_return_status <> fnd_api.g_ret_sts_success THEN
4999       RAISE fnd_api.g_exc_error;
5000     END IF;
5001 
5002     debug('wip in_relation instance count: '||l_inst_tbl.COUNT);
5003 
5004     IF l_inst_tbl.COUNT > 0 THEN
5005       FOR l_ind IN l_inst_tbl.FIRST .. l_inst_tbl.LAST
5006       LOOP
5007         BEGIN
5008           SELECT object_id
5009           INTO   l_inst_tbl(l_ind).attribute1
5010           FROM   csi_ii_relationships
5011           WHERE  subject_id = l_inst_tbl(l_ind).instance_id
5012           AND    relationship_type_code = 'COMPONENT-OF';
5013         EXCEPTION
5014           WHEN no_data_found THEN
5015             l_inst_tbl(l_ind).attribute1 := null;
5016         END;
5017       END LOOP;
5018     END IF;
5019 
5020     x_instance_tbl := l_inst_tbl;
5021 
5022   EXCEPTION
5023     WHEN fnd_api.g_exc_error THEN
5024       x_return_status := fnd_api.g_ret_sts_error;
5025   END get_issued_in_inv_instances;
5026 
5027 
5028   PROCEDURE get_issued_in_rel_instances(
5029     p_wip_entity_id        IN number,
5030     p_component_item_id    IN number,
5031     p_organization_id      IN number,
5032     p_lot_number           IN varchar2,
5033     x_instance_tbl            OUT NOCOPY csi_datastructures_pub.instance_tbl,
5034     x_return_status           OUT NOCOPY varchar2)
5035   IS
5036 
5037     l_inst_query_rec       csi_datastructures_pub.instance_query_rec;
5038     l_inst_tbl             csi_datastructures_pub.instance_tbl;
5039     l_return_status        varchar2(1) := fnd_api.g_ret_sts_success;
5040 
5041   BEGIN
5042 
5043     x_return_status := fnd_api.g_ret_sts_success;
5044     api_log('get_issued_in_rel_instances');
5045 
5046     l_inst_query_rec.inventory_item_id   := p_component_item_id;
5047     l_inst_query_rec.wip_job_id          := p_wip_entity_id;
5048     l_inst_query_rec.lot_number          := p_lot_number;
5049     l_inst_query_rec.instance_usage_code := 'IN_RELATIONSHIP';
5050 
5051     get_instances(
5052       p_instance_query_rec   => l_inst_query_rec,
5053       x_instance_tbl         => l_inst_tbl,
5054       x_return_status        => l_return_status);
5055 
5056     IF l_return_status <> fnd_api.g_ret_sts_success THEN
5057       RAISE fnd_api.g_exc_error;
5058     END IF;
5059 
5060     debug('repair in_relation instance count: '||l_inst_tbl.COUNT);
5061     x_instance_tbl := l_inst_tbl;
5062 
5063   EXCEPTION
5064     WHEN fnd_api.g_exc_error THEN
5065       x_return_status := fnd_api.g_ret_sts_error;
5066   END get_issued_in_rel_instances;
5067 
5068   PROCEDURE deallocate_using_qty_per_assy(
5069     p_qty_returned         IN number,
5070     p_qty_per_assy         IN number,
5071     p_instances_tbl        IN csi_datastructures_pub.instance_tbl,
5072     px_csi_txn_rec         IN OUT NOCOPY csi_datastructures_pub.transaction_rec,
5073     x_qty_remaining        IN OUT NOCOPY number,
5074     x_return_status        OUT NOCOPY varchar2)
5075   IS
5076 
5077     TYPE da_rec IS RECORD(
5078       instance_id   number,
5079       quantity      number,
5080       new_quantity  number);
5081 
5082     TYPE da_tbl IS TABLE OF da_rec index by binary_integer;
5083 
5084     l_qty_remaining        number;
5085     l_qty_available        number;
5086     l_qty_dealloc          number;
5087 
5088     l_inst_tbl             csi_datastructures_pub.instance_tbl;
5089     l_ind                  binary_integer := 0;
5090     l_f_ind                binary_integer := 0;
5091     l_da_ind               binary_integer := 0;
5092     l_da_tbl               da_tbl;
5093 
5094     l_parent_instance_id   number;
5095     l_return_status        varchar2(1) := fnd_api.g_ret_sts_success;
5096 
5097   BEGIN
5098     x_return_status := fnd_api.g_ret_sts_success;
5099     api_log('deallocate_using_qty_per_assy');
5100 
5101     l_inst_tbl := p_instances_tbl;
5102 
5103     l_qty_remaining := p_qty_returned;
5104 
5105     -- put logic
5106     IF l_inst_tbl.COUNT > 0 THEN
5107       l_ind := 0;
5108       LOOP
5109 
5110         l_ind := l_inst_tbl.NEXT(l_ind);
5111         EXIT when l_ind is null;
5112 
5113         l_parent_instance_id := l_inst_tbl(l_ind).attribute1;
5114 
5115         l_da_ind := l_da_ind + 1;
5116         l_da_tbl(l_da_ind).instance_id := l_inst_tbl(l_ind).instance_id;
5117         l_da_tbl(l_da_ind).quantity    := l_inst_tbl(l_ind).quantity;
5118 
5119         --filter_group
5120         l_f_ind := l_ind;
5121         LOOP
5122           l_f_ind := l_inst_tbl.NEXT(l_f_ind);
5123           EXIT when l_f_ind is null;
5124 
5125           IF l_inst_tbl(l_f_ind).attribute1 = l_parent_instance_id THEN
5126             l_da_ind := l_da_ind + 1;
5127             l_da_tbl(l_da_ind).instance_id := l_inst_tbl(l_f_ind).instance_id;
5128             l_da_tbl(l_da_ind).quantity    := l_inst_tbl(l_f_ind).quantity;
5129             l_inst_tbl.delete(l_f_ind);
5130           END IF;
5131         END LOOP;
5132 
5133         l_da_ind := 0;
5134 
5135         IF l_qty_remaining > 0 THEN
5136 
5137           IF l_qty_remaining < p_qty_per_assy THEN
5138             l_qty_available := l_qty_remaining;
5139           ELSE
5140             l_qty_available := p_qty_per_assy;
5141           END IF;
5142 
5143           IF l_da_tbl.COUNT > 0 THEN
5144             FOR l_t_ind IN l_da_tbl.FIRST .. l_da_tbl.LAST
5145             LOOP
5146 
5147               IF l_qty_available > 0 THEN
5148 
5149                 IF l_da_tbl(l_t_ind).quantity >= l_qty_available THEN
5150                   l_qty_dealloc := l_qty_available;
5151                 ELSE
5152                   l_qty_dealloc := l_da_tbl(l_t_ind).quantity;
5153                 END IF;
5154 
5155                 -- call decrement wip instance;
5156                 decrement_wip_instance(
5157                   p_instance_id         => l_da_tbl(l_t_ind).instance_id,
5158                   p_quantity            => l_qty_dealloc,
5159                   px_csi_txn_rec        => px_csi_txn_rec,
5160                   x_return_status       => l_return_status);
5161 
5162                 IF l_return_status <> fnd_api.g_ret_sts_success THEN
5163                   RAISE fnd_api.g_exc_error;
5164                 END IF;
5165 
5166                 l_qty_available := l_qty_available - l_qty_dealloc;
5167                 l_qty_remaining := l_qty_remaining - l_qty_dealloc;
5168 
5169               END IF;
5170 
5171             END LOOP;
5172           END IF;
5173         END IF;
5174 
5175       END LOOP;
5176     END IF;
5177 
5178     x_qty_remaining := l_qty_remaining;
5179 
5180   EXCEPTION
5181     WHEN fnd_api.g_exc_error THEN
5182       x_return_status := fnd_api.g_ret_sts_error;
5183   END deallocate_using_qty_per_assy;
5184 
5185 
5186   PROCEDURE deallocate_wip_instances(
5187     p_wip_entity_id        IN number,
5188     p_component_item_id    IN number,
5189     p_organization_id      IN number,
5190     p_lot_number           IN varchar2,
5191     p_returned_quantity    IN number,
5192     p_auto_allocate        IN varchar2,
5193     px_csi_txn_rec         IN OUT NOCOPY csi_datastructures_pub.transaction_rec,
5194     x_return_status           OUT NOCOPY varchar2)
5195   IS
5196 
5197     l_qty_remaining        number;
5198     l_qty_to_dealloc       number;
5199 
5200     l_qty_per_assy         number;
5201     l_total_qty_issued     number;
5202 
5203     l_instance_tbl         csi_datastructures_pub.instance_tbl;
5204     l_return_status        varchar2(1) := fnd_api.g_ret_sts_success;
5205 
5206   BEGIN
5207 
5208     x_return_status := fnd_api.g_ret_sts_success;
5209     api_log('deallocate_wip_instances');
5210 
5211     l_qty_remaining := p_returned_quantity;
5212 
5213     get_issued_in_wip_instance(
5214       p_wip_entity_id      => p_wip_entity_id,
5215       p_component_item_id  => p_component_item_id,
5216       p_organization_id    => p_organization_id,
5217       p_lot_number         => p_lot_number,
5218       x_instance_tbl       => l_instance_tbl,
5219       x_return_status      => l_return_status);
5220 
5221     IF l_return_status <> fnd_api.g_ret_sts_success THEN
5222       RAISE fnd_api.g_exc_error;
5223     END IF;
5224 
5225     IF l_instance_tbl.COUNT > 0 THEN
5226       IF l_instance_tbl.COUNT = 1 THEN
5227 
5228         IF l_instance_tbl(1).quantity > l_qty_remaining THEN
5229           l_qty_to_dealloc := l_qty_remaining;
5230         ELSE
5231           l_qty_to_dealloc := l_instance_tbl(1).quantity;
5232         END IF;
5233 
5234         decrement_wip_instance(
5235           p_instance_id          => l_instance_tbl(1).instance_id,
5236           p_quantity             => l_qty_to_dealloc,
5237           px_csi_txn_rec         => px_csi_txn_rec,
5238           x_return_status        => l_return_status);
5239 
5240         IF l_return_status <> fnd_api.g_ret_sts_success THEN
5241           RAISE fnd_api.g_exc_error;
5242         END IF;
5243 
5244         l_qty_remaining := l_qty_remaining - l_qty_to_dealloc;
5245 
5246       ELSE
5247         -- this case should not arise. There cannot be multiple IN_WIP instances
5248         -- for a non serial instance given a lot number in the transaction.
5249         null;
5250       END IF;
5251     END IF;
5252 
5253     IF l_qty_remaining > 0 THEN
5254 
5255       get_qty_per_assembly(
5256         p_organization_id      => p_organization_id,
5257         p_wip_entity_id        => p_wip_entity_id,
5258         p_component_item_id    => p_component_item_id,
5259         x_qty_per_assembly     => l_qty_per_assy,
5260         x_return_status        => l_return_status);
5261 
5262       IF l_return_status <> fnd_api.g_ret_sts_success THEN
5263         RAISE fnd_api.g_exc_error;
5264       END IF;
5265 
5266       get_issued_in_inv_instances(
5267         p_wip_entity_id      => p_wip_entity_id,
5268         p_component_item_id  => p_component_item_id,
5269         p_organization_id    => p_organization_id,
5270         p_lot_number         => p_lot_number,
5271         x_instance_tbl       => l_instance_tbl,
5272         x_return_status      => l_return_status);
5273 
5274       IF l_return_status <> fnd_api.g_ret_sts_success THEN
5275         RAISE fnd_api.g_exc_error;
5276       END IF;
5277 
5278       IF l_qty_per_assy = 0 AND p_auto_allocate = 'Y' THEN
5279 
5280         l_qty_per_assy := l_qty_remaining;
5281 
5282       END IF;
5283 
5284       IF l_qty_per_assy > 0 THEN
5285 
5286         deallocate_using_qty_per_assy(
5287           p_qty_returned     => l_qty_remaining,
5288           p_qty_per_assy     => l_qty_per_assy,
5289           p_instances_tbl    => l_instance_tbl,
5290           px_csi_txn_rec     => px_csi_txn_rec,
5291           x_qty_remaining    => l_qty_remaining,
5292           x_return_status    => l_return_status);
5293 
5294         IF l_return_status <> fnd_api.g_ret_sts_success THEN
5295           RAISE fnd_api.g_exc_error;
5296         END IF;
5297 
5298         IF l_qty_remaining > 0 THEN
5299 
5300           get_issued_in_rel_instances(
5301             p_wip_entity_id      => p_wip_entity_id,
5302             p_component_item_id  => p_component_item_id,
5303             p_organization_id    => p_organization_id,
5304             p_lot_number         => p_lot_number,
5305             x_instance_tbl       => l_instance_tbl,
5306             x_return_status      => l_return_status);
5307 
5308           IF l_return_status <> fnd_api.g_ret_sts_success THEN
5309             RAISE fnd_api.g_exc_error;
5310           END IF;
5311 
5312           deallocate_using_qty_per_assy(
5313             p_qty_returned     => l_qty_remaining,
5314             p_qty_per_assy     => l_qty_per_assy,
5315             p_instances_tbl    => l_instance_tbl,
5316             px_csi_txn_rec     => px_csi_txn_rec,
5317             x_qty_remaining    => l_qty_remaining,
5318             x_return_status    => l_return_status);
5319 
5320           IF l_return_status <> fnd_api.g_ret_sts_success THEN
5321             RAISE fnd_api.g_exc_error;
5322           END IF;
5323         END IF;
5324 
5325       END IF;
5326     END IF;
5327   EXCEPTION
5328     WHEN fnd_api.g_exc_error THEN
5329       x_return_status := fnd_api.g_ret_sts_error;
5330   END deallocate_wip_instances;
5331 
5332 
5333   PROCEDURE bld_inst_tables_for_return(
5334     p_txn_ref           IN  txn_ref,
5335     p_mmt_rec           IN  mmt_rec,
5336     p_csi_txn_rec       IN OUT nocopy csi_datastructures_pub.transaction_rec,
5337     x_dest_loc_rec      OUT NOCOPY csi_process_txn_grp.dest_location_rec,
5338     x_instances_tbl     OUT NOCOPY csi_process_txn_grp.txn_instances_tbl,
5339     x_parties_tbl       OUT NOCOPY csi_process_txn_grp.txn_i_parties_tbl,
5340     x_org_units_tbl     OUT NOCOPY csi_process_txn_grp.txn_org_units_tbl,
5341     x_return_status     OUT NOCOPY varchar2)
5342   IS
5343 
5344     l_in_out_flag       varchar2(3) := 'INT';
5345 
5346     l_int_party_id      number;
5347     l_auto_allocate     varchar2(1);
5348     l_wip_loc_id        number;
5349     l_return_status     varchar2(1) := fnd_api.g_ret_sts_success;
5350     l_instance_id       number;
5351 
5352     --Added for bug 5376024--
5353     l_inv_item_id       number;
5354     l_serial_number     varchar2(30);
5355     l_quantity          number;
5356     --Added for bug 5376024--
5357 
5358     l_dest_loc_rec      csi_process_txn_grp.dest_location_rec;
5359     l_instances_tbl     csi_process_txn_grp.txn_instances_tbl;
5360     l_parties_tbl       csi_process_txn_grp.txn_i_parties_tbl;
5361 
5362     l_csi_instance_tbl  csi_datastructures_pub.instance_tbl;
5363 
5364     l_maintenance_source  number := 0;
5365     l_relation_found      varchar2(1) := 'N';
5366     l_parent_instance_id  number;
5367 
5368   BEGIN
5369 
5370     x_return_status := fnd_api.g_ret_sts_success;
5371 
5372     api_log('bld_inst_tables_for_return');
5373 
5374     l_int_party_id  := csi_datastructures_pub.g_install_param_rec.internal_party_id;
5375     l_auto_allocate := nvl(csi_datastructures_pub.g_install_param_rec.auto_allocate_comp_at_wip, 'N');
5376    -- l_wip_loc_id    := csi_datastructures_pub.g_install_param_rec.wip_location_id;
5377 
5378     -- build destination location attribs
5379     l_dest_loc_rec.location_type_code       := 'INVENTORY';
5380     l_dest_loc_rec.location_id              := p_mmt_rec.subinv_location_id;
5381 
5382     IF nvl(x_dest_loc_rec.location_id,fnd_api.g_miss_num) = fnd_api.g_miss_num THEN
5383       l_dest_loc_rec.location_id            := p_mmt_rec.hr_location_id;
5384     END IF;
5385 
5386     l_dest_loc_rec.inv_organization_id      := p_mmt_rec.organization_id;
5387     l_dest_loc_rec.inv_subinventory_name    := p_mmt_rec.subinventory_code;
5388     l_dest_loc_rec.inv_locator_id           := p_mmt_rec.locator_id;
5389     l_dest_loc_rec.pa_project_id            := fnd_api.g_miss_num;
5390     l_dest_loc_rec.pa_project_task_id       := fnd_api.g_miss_num;
5391     l_dest_loc_rec.in_transit_order_line_id := fnd_api.g_miss_num;
5392     l_dest_loc_rec.wip_job_id               := fnd_api.g_miss_num;
5393     l_dest_loc_rec.po_order_line_id         := fnd_api.g_miss_num;
5394     l_dest_loc_rec.instance_usage_code      := 'IN_INVENTORY';
5395 
5396     -- build instances
5397     l_instances_tbl(1).ib_txn_segment_flag        := 'S';
5398     l_instances_tbl(1).inventory_item_id          := p_mmt_rec.inventory_item_id;
5399     l_instances_tbl(1).inventory_revision         := p_mmt_rec.revision;
5400     l_instances_tbl(1).vld_organization_id        := p_mmt_rec.organization_id;
5401     l_instances_tbl(1).inv_master_organization_id := p_txn_ref.master_organization_id;
5402     l_instances_tbl(1).serial_number              := p_mmt_rec.serial_number;
5403 
5404     IF nvl(l_instances_tbl(1).serial_number,fnd_api.g_miss_char) <> fnd_api.g_miss_char THEN
5405       l_instances_tbl(1).mfg_serial_number_flag   := 'Y';
5406     ELSE
5407       l_instances_tbl(1).mfg_serial_number_flag   := 'N';
5408     END IF;
5409 
5410     l_instances_tbl(1).lot_number                 := p_mmt_rec.lot_number;
5411     l_instances_tbl(1).quantity                   := abs(p_mmt_rec.instance_quantity);
5412     l_instances_tbl(1).unit_of_measure            := p_txn_ref.primary_uom_code;
5413 
5414     l_instances_tbl(1).location_type_code         := 'WIP';
5415     l_instances_tbl(1).location_id                := nvl(p_mmt_rec.organization_id,fnd_api.g_miss_num); --5224875
5416     l_instances_tbl(1).last_wip_job_id            := p_mmt_rec.transaction_source_id;
5417 
5418     l_instances_tbl(1).inv_organization_id        := fnd_api.g_miss_num;
5419     l_instances_tbl(1).inv_subinventory_name      := fnd_api.g_miss_char;
5420     l_instances_tbl(1).inv_locator_id             := fnd_api.g_miss_num;
5421 
5422     l_instances_tbl(1).active_start_date          := p_txn_ref.transaction_date;
5423     l_instances_tbl(1).customer_view_flag         := 'N';
5424     l_instances_tbl(1).merchant_view_flag         := 'Y';
5425     l_instances_tbl(1).instance_usage_code        := 'IN_INVENTORY';
5426 
5427     -- build parties
5428     l_parties_tbl(1).parent_tbl_index             := 1;
5429     l_parties_tbl(1).party_source_table           := 'HZ_PARTIES';
5430     l_parties_tbl(1).party_id                     := l_int_party_id;
5431     l_parties_tbl(1).relationship_type_code       := 'OWNER';
5432     l_parties_tbl(1).contact_flag                 := 'N';
5433 
5434     -- build org. assignments
5435 
5436     -- for serialized instances
5437     IF p_txn_ref.srl_control_code not in (1, 6) then
5438 
5439       get_issued_serial_instance(
5440         px_instance_rec        => l_instances_tbl(1),
5441         x_return_status        => l_return_status);
5442 
5443       IF l_return_status <> fnd_api.g_ret_sts_success THEN
5444         RAISE fnd_api.g_exc_error;
5445       END IF;
5446 
5447       -- check the location of the instance here before further process.
5448 
5449       -- any serialized component being returned back to Inv .
5450       IF nvl(l_instances_tbl(1).instance_id,fnd_api.g_miss_num) <> fnd_api.g_miss_num
5451       THEN
5452 
5453         /* 1 - EAM, 2 - AHL 0 - NULL */
5454         IF p_txn_ref.wip_maint_source_code = 2 THEN
5455           l_relation_found := 'N';
5456           -- check if it is in a relation
5457           BEGIN
5458             SELECT 'Y', object_id
5459             INTO   l_relation_found , l_parent_instance_id
5460             FROM   csi_ii_relationships
5461             WHERE  subject_id = l_instances_tbl(1).instance_id
5462             AND    relationship_type_code = 'COMPONENT-OF'
5463             AND    sysdate BETWEEN nvl(active_start_date, sysdate-1)
5464                            AND     nvl(active_end_date, sysdate+1);
5465           EXCEPTION
5466             WHEN no_data_found THEN
5467               l_relation_found := 'N';
5468           END;
5469           IF l_relation_found = 'Y' THEN
5470             fnd_message.set_name('CSI', 'CSI_MAINT_JOB_RTN_DISALLOWED');
5471             fnd_message.set_token('PARENT_INSTANCE_ID', l_parent_instance_id);
5472             fnd_msg_pub.add;
5473             RAISE fnd_api.g_exc_error;
5474           END IF;
5475         END IF;
5476 
5477         csi_process_txn_pvt.check_and_break_relation(
5478           p_instance_id   => l_instances_tbl(1).instance_id,
5479           p_csi_txn_rec   => p_csi_txn_rec ,
5480           x_return_status => l_return_status);
5481 
5482         IF l_return_status <> fnd_api.g_ret_sts_success THEN
5483           RAISE fnd_api.g_exc_error;
5484         END IF;
5485 
5486         l_parties_tbl.delete;
5487 
5488       END IF;
5489 
5490     ELSE -- non serialized case
5491     --Added for bug 5376024--
5492       BEGIN
5493         select mmt.inventory_item_id, mut.serial_number
5494         into  l_inv_item_id, l_serial_number
5495         from mtl_material_transactions mmt, mtl_unit_transactions mut
5496         where mmt.transaction_id = mut.transaction_id
5497         and mmt.transaction_set_id = p_mmt_rec.transaction_set_id
5498         and mmt.transaction_type_id = 17;
5499 
5500         BEGIN
5501            select cir.subject_id,ci2.quantity
5502            into l_instance_id, l_quantity
5503            from csi_item_instances ci1, csi_item_instances ci2, csi_ii_relationships cir
5504            where ci1.instance_id = cir.object_id
5505            and ci1.inventory_item_id = l_inv_item_id
5506            and ci1.serial_number = l_serial_number
5507            and ci2.inventory_item_id = p_mmt_rec.inventory_item_id
5508            and ci2.instance_id = cir.subject_id
5509            and cir.relationship_type_code = 'COMPONENT-OF'
5510            and sysdate between nvl(cir.active_start_date, sysdate-1)
5511                         and     nvl(cir.active_end_date, sysdate+1)
5512            and sysdate between nvl(ci2.active_start_date, sysdate-1)
5513                         and     nvl(ci2.active_end_date, sysdate+1);
5514         EXCEPTION
5515            WHEN no_data_found THEN
5516              debug('First no data');
5517              null;
5518         END;
5519 
5520       EXCEPTION
5521          WHEN no_data_found THEN
5522            debug('Second no data');
5523            null;
5524       END;
5525 
5526       IF nvl(l_instance_id,fnd_api.g_miss_num) <> fnd_api.g_miss_num THEN
5527               --decrement the wip instance
5528               debug('l_instance_id '||l_instance_id);
5529               decrement_wip_instance(
5530                 p_instance_id         => l_instance_id,
5531                 p_quantity            => l_quantity,
5532                 px_csi_txn_rec        => p_csi_txn_rec,
5533                 x_return_status       => l_return_status);
5534       ELSE
5535     --Added for bug 5376024--
5536 
5537       -- get all the WIP instances and allocated component of inv instances
5538       -- decrement the instances in the appropriate
5539       deallocate_wip_instances(
5540         p_wip_entity_id        => p_mmt_rec.transaction_source_id,
5541         p_component_item_id    => p_mmt_rec.inventory_item_id,
5542         p_organization_id      => p_mmt_rec.organization_id,
5543         p_lot_number           => p_mmt_rec.lot_number,
5544         p_returned_quantity    => abs(p_mmt_rec.instance_quantity),
5545         p_auto_allocate        => l_auto_allocate,
5546         px_csi_txn_rec         => p_csi_txn_rec,
5547         x_return_status        => l_return_status);
5548 
5549       END IF;
5550 
5551       IF l_return_status <> fnd_api.g_ret_sts_success THEN
5552         RAISE fnd_api.g_exc_error;
5553       END IF;
5554 
5555       l_instances_tbl(1).instance_id := fnd_api.g_miss_num;
5556 
5557     END IF;
5558 
5559     x_dest_loc_rec  := l_dest_loc_rec;
5560     x_instances_tbl := l_instances_tbl;
5561     x_parties_tbl   := l_parties_tbl;
5562 
5563 
5564   EXCEPTION
5565     WHEN fnd_api.g_exc_error THEN
5566       x_return_status := fnd_api.g_ret_sts_error;
5567 
5568   END bld_inst_tables_for_return;
5569 
5570   /* main routine for the wip component return transaction. */
5571   PROCEDURE wip_comp_receipt(
5572     p_transaction_id     IN            number,
5573     p_message_id         IN            number,
5574     px_trx_error_rec     IN OUT nocopy csi_datastructures_pub.transaction_error_rec,
5575     x_return_status         OUT nocopy VARCHAR2)
5576   IS
5577 
5578     l_api_name               varchar2(100):= 'csi_wip_trxs_pkg.wip_component_return';
5579     l_txn_ref                txn_ref;
5580     l_mmt_tbl                mmt_tbl;
5581 
5582     l_in_out_flag            varchar2(30) := 'INT';
5583     l_dest_location_rec      csi_process_txn_grp.dest_location_rec;
5584     l_instances_tbl          csi_process_txn_grp.txn_instances_tbl;
5585     l_i_parties_tbl          csi_process_txn_grp.txn_i_parties_tbl;
5586     l_ip_accounts_tbl        csi_process_txn_grp.txn_ip_accounts_tbl;
5587     l_org_units_tbl          csi_process_txn_grp.txn_org_units_tbl;
5588     l_ext_attrib_values_tbl  csi_process_txn_grp.txn_ext_attrib_values_tbl;
5589     l_pricing_attribs_tbl    csi_process_txn_grp.txn_pricing_attribs_tbl;
5590     l_instance_asset_tbl     csi_process_txn_grp.txn_instance_asset_tbl;
5591     l_ii_relationships_tbl   csi_process_txn_grp.txn_ii_relationships_tbl;
5592 
5593     l_csi_txn_rec        csi_datastructures_pub.transaction_rec;
5594 
5595     l_c_dest_loc_rec         csi_process_txn_grp.dest_location_rec;
5596     l_c_instances_tbl        csi_process_txn_grp.txn_instances_tbl;
5597     l_c_parties_tbl          csi_process_txn_grp.txn_i_parties_tbl;
5598     l_c_org_units_tbl        csi_process_txn_grp.txn_org_units_tbl;
5599 
5600     l_api_success            varchar2(1) := fnd_api.g_ret_sts_success;
5601     l_error_message          varchar2(2000);
5602     l_return_status          varchar2(1) := fnd_api.g_ret_sts_success;
5603     l_msg_count              number;
5604     l_msg_data               varchar2(2000);
5605     l_error_rec              csi_datastructures_pub.transaction_error_rec;
5606 
5607   BEGIN
5608 
5609     savepoint wip_component_receipt;
5610 
5611     x_return_status := fnd_api.g_ret_sts_success;
5612 
5613     fnd_msg_pub.initialize;
5614 
5615 
5616     csi_t_gen_utility_pvt.build_file_name(
5617       p_file_segment1 => 'csiwipcr',
5618       p_file_segment2 => p_transaction_id);
5619 
5620     api_log('wip_comp_receipt');
5621 
5622     debug('  Transaction Time  : '||to_char(sysdate, 'MM/DD/YY HH24:MI:SS'));
5623     debug('  Transaction Type  : WIP Component Return');
5624     debug('  Transaction ID    : '||p_transaction_id);
5625 
5626     -- This procedure check if the installed base is active
5627     csi_utility_grp.check_ib_active;
5628 
5629     IF csi_datastructures_pub.g_install_param_rec.fetch_flag IS NULL THEN
5630       csi_gen_utility_pvt.populate_install_param_rec;
5631     END IF;
5632 
5633     l_error_rec                          := px_trx_error_rec;
5634     l_error_rec.transaction_type_id      := 72;
5635     l_error_rec.source_id                := p_transaction_id;
5636 
5637     csi_wip_trxs_pkg.get_mmt_info(
5638       p_transaction_id => p_transaction_id,
5639       x_txn_ref        => l_txn_ref,
5640       x_mmt_tbl        => l_mmt_tbl,
5641       x_return_status  => l_return_status);
5642 
5643     IF l_return_status <> l_api_success THEN
5644       RAISE fnd_api.g_exc_error;
5645     END IF;
5646 
5647     l_error_rec.source_header_ref        := l_txn_ref.wip_entity_name;
5648     l_error_rec.source_header_ref_id     := l_txn_ref.wip_entity_id;
5649     l_error_rec.inventory_item_id        := l_txn_ref.inventory_item_id;
5650     l_error_rec.src_serial_num_ctrl_code := l_txn_ref.srl_control_code;
5651     l_error_rec.src_lot_ctrl_code        := l_txn_ref.lot_control_code;
5652     l_error_rec.src_rev_qty_ctrl_code    := l_txn_ref.rev_control_code;
5653     l_error_rec.src_location_ctrl_code   := l_txn_ref.loc_control_code;
5654     l_error_rec.comms_nl_trackable_flag  := l_txn_ref.ib_trackable_flag;
5655 
5656     IF l_mmt_tbl.COUNT > 0 THEN
5657 
5658       l_csi_txn_rec.transaction_id              := fnd_api.g_miss_num;
5659       l_csi_txn_rec.source_header_ref           := l_txn_ref.wip_entity_name;
5660       l_csi_txn_rec.source_header_ref_id        := l_txn_ref.wip_entity_id;
5661       l_csi_txn_rec.source_transaction_date     := l_txn_ref.transaction_date;
5662 
5663       l_csi_txn_rec.transaction_date            := sysdate;
5664       l_csi_txn_rec.transaction_quantity        := l_txn_ref.primary_quantity;
5665       l_csi_txn_rec.transaction_uom_code        := l_txn_ref.primary_uom_code;
5666       l_csi_txn_rec.message_id                  := p_message_id;
5667       l_csi_txn_rec.inv_material_transaction_id := l_txn_ref.transaction_id;
5668       l_csi_txn_rec.object_version_number       := 1.0;
5669       l_csi_txn_rec.transaction_type_id         := 72;
5670       l_csi_txn_rec.txn_sub_type_id             := 3;
5671       l_csi_txn_rec.transaction_status_code     := 'PENDING';
5672 
5673       FOR l_ind in l_mmt_tbl.FIRST .. l_mmt_tbl.LAST
5674       LOOP
5675 
5676         l_error_rec.serial_number := l_mmt_tbl(l_ind).serial_number;
5677         l_error_rec.lot_number    := l_mmt_tbl(l_ind).lot_number;
5678 
5679         bld_inst_tables_for_return(
5680           p_txn_ref               => l_txn_ref,
5681           p_mmt_rec               => l_mmt_tbl(l_ind),
5682           p_csi_txn_rec           => l_csi_txn_rec,
5683           x_dest_loc_rec          => l_c_dest_loc_rec,
5684           x_instances_tbl         => l_c_instances_tbl,
5685           x_parties_tbl           => l_c_parties_tbl,
5686           x_org_units_tbl         => l_c_org_units_tbl,
5687           x_return_status         => l_return_status);
5688 
5689         IF l_return_status <> l_api_success THEN
5690           RAISE fnd_api.g_exc_error;
5691         END IF;
5692 
5693         csi_process_txn_grp.process_transaction(
5694           p_api_version           => 1.0,
5695           p_commit                => fnd_api.g_false,
5696           p_init_msg_list         => fnd_api.g_false,
5697           p_validation_level      => fnd_api.g_valid_level_full,
5698           p_validate_only_flag    => fnd_api.g_false,
5699           p_in_out_flag           => l_in_out_flag, -- valid values are 'IN','OUT'
5700           p_dest_location_rec     => l_c_dest_loc_rec,
5701           p_txn_rec               => l_csi_txn_rec,
5702           p_instances_tbl         => l_c_instances_tbl,
5703           p_i_parties_tbl         => l_c_parties_tbl,
5704           p_ip_accounts_tbl       => l_ip_accounts_tbl,
5705           p_org_units_tbl         => l_org_units_tbl,
5706           p_ext_attrib_vlaues_tbl => l_ext_attrib_values_tbl,
5707           p_pricing_attribs_tbl   => l_pricing_attribs_tbl,
5708           p_instance_asset_tbl    => l_instance_asset_tbl,
5709           p_ii_relationships_tbl  => l_ii_relationships_tbl,
5710           px_txn_error_rec        => l_error_rec,
5711           x_return_status         => l_return_status,
5712           x_msg_count             => l_msg_count,
5713           x_msg_data              => l_msg_data );
5714 
5715         IF l_return_status <> l_api_success THEN
5716           RAISE fnd_api.g_exc_error;
5717         END IF;
5718 
5719       END LOOP;
5720     END IF;
5721 
5722     debug('wip component return transaction successful : '||p_transaction_id);
5723     debug('end timestamp       : '||to_char(sysdate, 'MM/DD/YY HH24:MI:SS'));
5724 
5725   EXCEPTION
5726     WHEN fnd_api.g_exc_error THEN
5727       rollback to wip_component_receipt;
5728       l_error_rec.error_text := csi_t_gen_utility_pvt.dump_error_stack;
5729       px_trx_error_rec       := l_error_rec;
5730       x_return_status        := fnd_api.g_ret_sts_error;
5731 
5732       debug('Error(E) :'||l_error_rec.error_text);
5733 
5734     WHEN others then
5735       rollback to wip_component_receipt;
5736 
5737       fnd_message.set_name('CSI','CSI_UNEXP_SQL_ERROR');
5738       fnd_message.set_token('API_NAME',g_api_name);
5739       fnd_message.set_token('SQL_ERROR',substr(sqlerrm, 1, 255));
5740       fnd_msg_pub.add;
5741 
5742       l_error_rec.error_text := csi_t_gen_utility_pvt.dump_error_stack;
5743       px_trx_error_rec       := l_error_rec;
5744       x_return_status        := fnd_api.g_ret_sts_unexp_error;
5745 
5746       debug('Error(O) :'||l_error_rec.error_text);
5747 
5748   END wip_comp_receipt;
5749 
5750   PROCEDURE bld_inst_tables_for_compl(
5751     p_txn_ref             IN  txn_ref,
5752     p_mmt_rec             IN  mmt_rec,
5753     px_csi_txn_rec        IN OUT nocopy csi_datastructures_pub.transaction_rec,
5754     x_dest_loc_rec        OUT NOCOPY csi_process_txn_grp.dest_location_rec,
5755     x_instances_tbl       OUT NOCOPY csi_process_txn_grp.txn_instances_tbl,
5756     x_parties_tbl         OUT NOCOPY csi_process_txn_grp.txn_i_parties_tbl,
5757     x_org_units_tbl       OUT NOCOPY csi_process_txn_grp.txn_org_units_tbl,
5758     x_return_status       OUT NOCOPY varchar2)
5759   IS
5760     l_int_party_id      number;
5761     l_comp_is_assy      varchar2(1) := 'N';
5762     l_issued_instances  csi_datastructures_pub.instance_tbl;
5763     l_return_status     varchar2(1) := fnd_api.g_ret_sts_success;
5764     l_instance_found    boolean := FALSE;
5765   BEGIN
5766 
5767     x_return_status := fnd_api.g_ret_sts_success;
5768     api_log('bld_inst_tables_for_compl');
5769 
5770     l_int_party_id  := csi_datastructures_pub.g_install_param_rec.internal_party_id;
5771 
5772     -- destination location attributes
5773     x_dest_loc_rec.location_type_code       := 'INVENTORY';
5774     x_dest_loc_rec.location_id              := p_mmt_rec.subinv_location_id;
5775     x_dest_loc_rec.instance_usage_code      := 'IN_INVENTORY';
5776 
5777     IF nvl(x_dest_loc_rec.location_id,fnd_api.g_miss_num) = fnd_api.g_miss_num THEN
5778       x_dest_loc_rec.location_id            := p_mmt_rec.hr_location_id;
5779     END IF;
5780 
5781     x_dest_loc_rec.inv_organization_id      := p_mmt_rec.organization_id;
5782     x_dest_loc_rec.inv_subinventory_name    := p_mmt_rec.subinventory_code;
5783     x_dest_loc_rec.inv_locator_id           := p_mmt_rec.locator_id;
5784 
5785     x_dest_loc_rec.pa_project_id            := fnd_api.g_miss_num;
5786     x_dest_loc_rec.pa_project_task_id       := fnd_api.g_miss_num;
5787     x_dest_loc_rec.in_transit_order_line_id := fnd_api.g_miss_num;
5788     x_dest_loc_rec.wip_job_id               := fnd_api.g_miss_num;
5789     x_dest_loc_rec.po_order_line_id         := fnd_api.g_miss_num;
5790 
5791     -- instances
5792     x_instances_tbl(1).ib_txn_segment_flag        := 'S';
5793     x_instances_tbl(1).inventory_item_id          := p_mmt_rec.inventory_item_id;
5794     x_instances_tbl(1).inventory_revision         := p_mmt_rec.revision;
5795     x_instances_tbl(1).vld_organization_id        := p_mmt_rec.organization_id;
5796     x_instances_tbl(1).unit_of_measure            := p_txn_ref.primary_uom_code;
5797     x_instances_tbl(1).inv_master_organization_id := p_txn_ref.master_organization_id;
5798     x_instances_tbl(1).quantity                   := abs(p_mmt_rec.instance_quantity);
5799     x_instances_tbl(1).serial_number              := p_mmt_rec.serial_number;
5800     x_instances_tbl(1).lot_number                 := p_mmt_rec.lot_number;
5801 
5802     IF nvl(x_instances_tbl(1).serial_number, fnd_api.g_miss_char) <> fnd_api.g_miss_char THEN
5803       x_instances_tbl(1).mfg_serial_number_flag := 'Y';
5804     END IF;
5805 
5806     x_instances_tbl(1).location_type_code         := fnd_api.g_miss_char;
5807     x_instances_tbl(1).location_id                := fnd_api.g_miss_num;
5808     x_instances_tbl(1).inv_subinventory_name      := fnd_api.g_miss_char;
5809     x_instances_tbl(1).inv_organization_id        := fnd_api.g_miss_num;
5810     x_instances_tbl(1).inv_locator_id             := fnd_api.g_miss_num;
5811 
5812     x_instances_tbl(1).last_wip_job_id            := p_mmt_rec.transaction_source_id;
5813     x_instances_tbl(1).active_start_date          := p_txn_ref.transaction_date;
5814     x_instances_tbl(1).customer_view_flag         := 'N';
5815     x_instances_tbl(1).merchant_view_flag         := 'Y';
5816     x_instances_tbl(1).instance_usage_code        := 'IN_INVENTORY';
5817 
5818     IF p_txn_ref.eam_item_type IN (1, 3) THEN
5819       IF p_txn_ref.wip_maint_obj_type = 3 THEN
5820         l_instance_found := TRUE;
5821         x_instances_tbl(1).instance_id := p_txn_ref.wip_maint_obj_id;
5822       ELSE
5823         l_instance_found := FALSE;
5824       END IF;
5825     END IF;
5826 
5827     IF x_instances_tbl(1).mfg_serial_number_flag = 'Y' AND NOT(l_instance_found) THEN
5828 
5829       l_comp_is_assy := 'N';
5830 
5831       BEGIN
5832         SELECT 'Y'
5833         INTO   l_comp_is_assy
5834         FROM   sys.dual
5835         WHERE  exists (
5836           SELECT 'X'
5837           FROM   csi_item_instances
5838           WHERE  last_vld_organization_id = p_mmt_rec.organization_id
5839           AND    location_type_code       = 'WIP'
5840           AND    wip_job_id               = p_mmt_rec.transaction_source_id
5841           AND    serial_number            = p_mmt_rec.serial_number
5842           AND    inventory_item_id        = p_mmt_rec.inventory_item_id);
5843       EXCEPTION
5844         WHEN no_data_found THEN
5845           l_comp_is_assy := 'N';
5846       END;
5847 
5848       IF l_comp_is_assy = 'Y' THEN
5849         -- call get_item_instances for the WIP
5850 
5851         get_issued_instances(
5852           p_wip_entity_id     => p_mmt_rec.transaction_source_id,
5853           p_organization_id   => p_mmt_rec.organization_id,
5854           p_inventory_item_id => p_mmt_rec.inventory_item_id,
5855           p_serial_number     => p_mmt_rec.serial_number,
5856           x_instance_tbl      => l_issued_instances,
5857           x_return_status     => l_return_status);
5858 
5859         IF x_return_status <> fnd_api.g_ret_sts_success THEN
5860           RAISE fnd_api.g_exc_error;
5861         END IF;
5862 
5863         IF l_issued_instances.count = 1 THEN
5864           debug('Unique wip issued serial instance found. ID :'||l_issued_instances(1).instance_id);
5865           x_instances_tbl(1).instance_id := l_issued_instances(1).instance_id;
5866           l_instance_found := TRUE;
5867         END IF;
5868       END IF;
5869 
5870       IF NOT(l_instance_found) THEN
5871         -- relaxing the check here because ERP allows some transactions
5872         -- misc issue and complete
5873         debug('Check if there is a serialized instance in the system.');
5874         get_serial_instance(
5875           p_inventory_item_id => p_mmt_rec.inventory_item_id,
5876           p_serial_number     => p_mmt_rec.serial_number,
5877           x_instance_tbl      => l_issued_instances,
5878           x_return_status     => l_return_status);
5879         IF l_return_status <> fnd_api.g_ret_sts_success THEN
5880           RAISE fnd_api.g_exc_error;
5881         END IF;
5882         IF l_issued_instances.count = 1 THEN
5883           x_instances_tbl(1).instance_id := l_issued_instances(1).instance_id;
5884           l_instance_found := TRUE;
5885         END IF;
5886       END IF;
5887 
5888       IF l_instance_found THEN
5889         -- check and break relation
5890         csi_process_txn_pvt.check_and_break_relation(
5891           p_instance_id   => l_issued_instances(1).instance_id,
5892           p_csi_txn_rec   => px_csi_txn_rec ,
5893           x_return_status => l_return_status);
5894 
5895         IF l_return_status <> fnd_api.g_ret_sts_success THEN
5896           RAISE fnd_api.g_exc_error;
5897         END IF;
5898       END IF;
5899     END IF;
5900 
5901     IF NOT(l_instance_found) THEN
5902       x_parties_tbl(1).parent_tbl_index         := 1;
5903       x_parties_tbl(1).party_source_table       := 'HZ_PARTIES';
5904       x_parties_tbl(1).party_id                 := l_int_party_id;
5905       x_parties_tbl(1).relationship_type_code   := 'OWNER';
5906       x_parties_tbl(1).contact_flag             := 'N';
5907     END IF;
5908 
5909   END bld_inst_tables_for_compl;
5910 
5911 
5912 
5913    PROCEDURE wip_byproduct_completion(
5914     p_transaction_id       IN            number,
5915     p_message_id           IN            number,
5916     px_trx_error_rec       IN OUT nocopy csi_datastructures_pub.transaction_error_rec,
5917     x_return_status           OUT nocopy varchar2)
5918   IS
5919 
5920     l_api_name               varchar2(100):= 'csi_wip_trxs_pkg.wip_Byproduct_completion';
5921     l_txn_ref                txn_ref;
5922     l_mmt_tbl                mmt_tbl;
5923 
5924     l_in_out_flag            varchar2(30) := 'IN';
5925     l_dest_location_rec      csi_process_txn_grp.dest_location_rec;
5926     l_instances_tbl          csi_process_txn_grp.txn_instances_tbl;
5927     l_i_parties_tbl          csi_process_txn_grp.txn_i_parties_tbl;
5928     l_ip_accounts_tbl        csi_process_txn_grp.txn_ip_accounts_tbl;
5929     l_org_units_tbl          csi_process_txn_grp.txn_org_units_tbl;
5930     l_ext_attrib_values_tbl  csi_process_txn_grp.txn_ext_attrib_values_tbl;
5931     l_pricing_attribs_tbl    csi_process_txn_grp.txn_pricing_attribs_tbl;
5932     l_instance_asset_tbl     csi_process_txn_grp.txn_instance_asset_tbl;
5933     l_ii_relationships_tbl   csi_process_txn_grp.txn_ii_relationships_tbl;
5934     l_return_status          varchar2(1) := fnd_api.g_ret_sts_success;
5935     l_msg_count              number;
5936     l_msg_data               varchar2(240);
5937 
5938     l_csi_txn_rec            csi_datastructures_pub.transaction_rec;
5939 
5940     l_c_dest_loc_rec         csi_process_txn_grp.dest_location_rec;
5941     l_c_instances_tbl        csi_process_txn_grp.txn_instances_tbl;
5942     l_c_parties_tbl          csi_process_txn_grp.txn_i_parties_tbl;
5943     l_c_org_units_tbl        csi_process_txn_grp.txn_org_units_tbl;
5944 
5945     l_api_success            varchar2(1) := fnd_api.g_ret_sts_success;
5946     l_error_message          varchar2(2000);
5947 
5948     l_completed_instances    csi_datastructures_pub.instance_tbl;
5949     l_c_ind                  binary_integer := 0;
5950 
5951     l_error_rec              csi_datastructures_pub.transaction_error_rec;
5952     l_replace_rebuilds       EAM_Utility_GRP.Replace_Rebuild_TBL_Type;
5953 
5954   BEGIN
5955 
5956     savepoint wip_byproduct_completion;
5957 
5958     x_return_status := fnd_api.g_ret_sts_success;
5959 
5960     fnd_msg_pub.initialize;
5961 
5962     csi_t_gen_utility_pvt.build_file_name(
5963       p_file_segment1 => 'csiwipbc',
5964       p_file_segment2 => p_transaction_id);
5965 
5966     api_log('wip_byproduct_completion');
5967 
5968     debug('  Transaction Time  : '||to_char(sysdate, 'MM/DD/YY HH24:MI:SS'));
5969     debug('  Transaction Type  : WIP Byproduct Completion');
5970     debug('  Transaction ID    : '||p_transaction_id);
5971 
5972     csi_utility_grp.check_ib_active;
5973 
5974     IF csi_datastructures_pub.g_install_param_rec.fetch_flag IS NULL THEN
5975       csi_gen_utility_pvt.populate_install_param_rec;
5976     END IF;
5977 
5978     l_error_rec                          := px_trx_error_rec;
5979     l_error_rec.transaction_type_id      := 75;
5980     l_error_rec.source_id                := p_transaction_id;
5981 
5982     csi_wip_trxs_pkg.get_mmt_info(
5983       p_transaction_id => p_transaction_id,
5984       x_txn_ref        => l_txn_ref,
5985       x_mmt_tbl        => l_mmt_tbl,
5986       x_return_status  => l_return_status);
5987 
5988     IF l_return_status <> l_api_success THEN
5989       RAISE fnd_api.g_exc_error;
5990     END IF;
5991 
5992     l_error_rec.source_header_ref        := l_txn_ref.wip_entity_name;
5993     l_error_rec.source_header_ref_id     := l_txn_ref.wip_entity_id;
5994     l_error_rec.inventory_item_id        := l_txn_ref.inventory_item_id;
5995     l_error_rec.src_serial_num_ctrl_code := l_txn_ref.srl_control_code;
5996     l_error_rec.src_lot_ctrl_code        := l_txn_ref.lot_control_code;
5997     l_error_rec.src_rev_qty_ctrl_code    := l_txn_ref.rev_control_code;
5998     l_error_rec.src_location_ctrl_code   := l_txn_ref.loc_control_code;
5999     l_error_rec.comms_nl_trackable_flag  := l_txn_ref.ib_trackable_flag;
6000 
6001     IF l_mmt_tbl.COUNT > 0 THEN
6002 
6003       l_csi_txn_rec.transaction_id              := fnd_api.g_miss_num;
6004       l_csi_txn_rec.source_transaction_date     := l_txn_ref.transaction_date;
6005       l_csi_txn_rec.source_header_ref           := l_txn_ref.wip_entity_name;
6006       l_csi_txn_rec.source_header_ref_id        := l_txn_ref.wip_entity_id;
6007 
6008       l_csi_txn_rec.transaction_date            := sysdate;
6009       l_csi_txn_rec.transaction_quantity        := l_txn_ref.primary_quantity;
6010       l_csi_txn_rec.transaction_uom_code        := l_txn_ref.primary_uom_code;
6011       l_csi_txn_rec.transaction_type_id         := 75;
6012       l_csi_txn_rec.message_id                  := p_message_id;
6013       l_csi_txn_rec.inv_material_transaction_id := l_txn_ref.transaction_id;
6014       l_csi_txn_rec.object_version_number       := 1.0;
6015       l_csi_txn_rec.txn_sub_type_id             := 3;
6016       l_csi_txn_rec.transaction_status_code     := 'PENDING';
6017 
6018 
6019       IF l_txn_ref.eam_item_type in (1, 3) THEN
6020 
6021         Delink_ReplaceRebuilds(
6022           p_wip_entity_id    => l_txn_ref.wip_entity_id,
6023           p_organization_id  => l_txn_ref.organization_id,
6024           px_csi_txn_rec     => l_csi_txn_rec,
6025           x_replace_rebuilds => l_replace_rebuilds,
6026           x_return_status    => l_return_status);
6027 
6028         IF l_return_status <> fnd_api.g_ret_sts_success THEN
6029           RAISE fnd_api.g_exc_error;
6030         END IF;
6031 
6032       END IF;
6033 
6034       FOR l_ind in l_mmt_tbl.FIRST .. l_mmt_tbl.LAST
6035       LOOP
6036 
6037         l_error_rec.serial_number := l_mmt_tbl(l_ind).serial_number;
6038         l_error_rec.lot_number    := l_mmt_tbl(l_ind).lot_number;
6039 
6040         bld_inst_tables_for_compl(
6041           p_txn_ref        => l_txn_ref,
6042           p_mmt_rec        => l_mmt_tbl(l_ind),
6043           px_csi_txn_rec   => l_csi_txn_rec,
6044           x_dest_loc_rec   => l_c_dest_loc_rec,
6045           x_instances_tbl  => l_c_instances_tbl,
6046           x_parties_tbl    => l_c_parties_tbl,
6047           x_org_units_tbl  => l_c_org_units_tbl,
6048           x_return_status  => l_return_status);
6049 
6050         IF l_return_status <> l_api_success THEN
6051           RAISE fnd_api.g_exc_error;
6052         END IF;
6053 
6054         csi_process_txn_grp.process_transaction(
6055           p_api_version           => 1.0,
6056           p_commit                => fnd_api.g_false,
6057           p_init_msg_list         => fnd_api.g_false,
6058           p_validation_level      => fnd_api.g_valid_level_full,
6059           p_validate_only_flag    => fnd_api.g_false,
6060           p_in_out_flag           => l_in_out_flag,
6061           p_dest_location_rec     => l_c_dest_loc_rec,
6062           p_txn_rec               => l_csi_txn_rec,
6063           p_instances_tbl         => l_c_instances_tbl,
6064           p_i_parties_tbl         => l_c_parties_tbl,
6065           p_ip_accounts_tbl       => l_ip_accounts_tbl,
6066           p_org_units_tbl         => l_org_units_tbl,
6067           p_ext_attrib_vlaues_tbl => l_ext_attrib_values_tbl,
6068           p_pricing_attribs_tbl   => l_pricing_attribs_tbl,
6069           p_instance_asset_tbl    => l_instance_asset_tbl,
6070           p_ii_relationships_tbl  => l_ii_relationships_tbl,
6071           px_txn_error_rec        => l_error_rec,
6072           x_return_status         => l_return_status,
6073           x_msg_count             => l_msg_count,
6074           x_msg_data              => l_msg_data );
6075 
6076         IF l_return_status <> l_api_success THEN
6077           RAISE fnd_api.g_exc_error;
6078         END IF;
6079 
6080         IF l_c_instances_tbl.COUNT > 0 THEN
6081           FOR l_a_ind IN l_c_instances_tbl.FIRST .. l_c_instances_tbl.LAST
6082           LOOP
6083             l_c_ind := l_c_ind + 1;
6084             l_completed_instances(l_c_ind).instance_id       :=
6085                                            l_c_instances_tbl(l_a_ind).new_instance_id;
6086             l_completed_instances(l_c_ind).serial_number     :=
6087                                            l_c_instances_tbl(l_a_ind).serial_number;
6088             l_completed_instances(l_c_ind).inventory_item_id :=
6089                                            l_c_instances_tbl(l_a_ind).inventory_item_id;
6090             l_completed_instances(l_c_ind).quantity          :=
6091                                            l_c_instances_tbl(l_a_ind).quantity;
6092           END LOOP;
6093         END IF;
6094 
6095       END LOOP;
6096 
6097       /* 1 - EAM, 2 - AHL 0 - NULL */
6098       --R12 Changes for OPM
6099       IF l_txn_ref.wip_maint_source_code <> 2 OR l_txn_ref.wip_entity_type <> 10 THEN
6100         process_relation_at_wipac(
6101           p_txn_ref            => l_txn_ref,
6102           p_assembly_instances => l_completed_instances,
6103           px_csi_txn_rec       => l_csi_txn_rec,
6104           x_return_status      => l_return_status);
6105 
6106         IF l_return_status <> fnd_api.g_ret_sts_success THEN
6107           RAISE fnd_api.g_exc_error;
6108         END IF;
6109       END IF;
6110 
6111     END IF;
6112     debug('wip Byproduct completion transaction successful : '||p_transaction_id);
6113     debug('end timestamp       : '||to_char(sysdate, 'MM/DD/YY HH24:MI:SS'));
6114 
6115   EXCEPTION
6116     WHEN fnd_api.g_exc_error THEN
6117       rollback to wip_byproduct_completion;
6118       l_error_rec.error_text := csi_t_gen_utility_pvt.dump_error_stack;
6119       px_trx_error_rec       := l_error_rec;
6120       x_return_status        := fnd_api.g_ret_sts_error;
6121       debug('Error(E) :'||l_error_rec.error_text);
6122 
6123     WHEN others then
6124       rollback to wip_byproduct_completion;
6125 
6126       fnd_message.set_name('CSI','CSI_UNEXP_SQL_ERROR');
6127       fnd_message.set_token('API_NAME',g_api_name);
6128       fnd_message.set_token('SQL_ERROR',substr(sqlerrm, 1, 255));
6129       fnd_msg_pub.add;
6130 
6131       l_error_rec.error_text := csi_t_gen_utility_pvt.dump_error_stack;
6132       px_trx_error_rec       := l_error_rec;
6133       x_return_status        := fnd_api.g_ret_sts_unexp_error;
6134       debug('Error(E) :'||l_error_rec.error_text);
6135 
6136   END wip_byproduct_completion;
6137 
6138 
6139 
6140 
6141 
6142 
6143   PROCEDURE wip_assy_completion(
6144     p_transaction_id       IN            number,
6145     p_message_id           IN            number,
6146     px_trx_error_rec       IN OUT nocopy csi_datastructures_pub.transaction_error_rec,
6147     x_return_status           OUT nocopy varchar2)
6148   IS
6149 
6150     l_api_name               varchar2(100):= 'csi_wip_trxs_pkg.wip_Assembly_completion';
6151     l_txn_ref                txn_ref;
6152     l_mmt_tbl                mmt_tbl;
6153 
6154     l_in_out_flag            varchar2(30) := 'IN';
6155     l_dest_location_rec      csi_process_txn_grp.dest_location_rec;
6156     l_instances_tbl          csi_process_txn_grp.txn_instances_tbl;
6157     l_i_parties_tbl          csi_process_txn_grp.txn_i_parties_tbl;
6158     l_ip_accounts_tbl        csi_process_txn_grp.txn_ip_accounts_tbl;
6159     l_org_units_tbl          csi_process_txn_grp.txn_org_units_tbl;
6160     l_ext_attrib_values_tbl  csi_process_txn_grp.txn_ext_attrib_values_tbl;
6161     l_pricing_attribs_tbl    csi_process_txn_grp.txn_pricing_attribs_tbl;
6162     l_instance_asset_tbl     csi_process_txn_grp.txn_instance_asset_tbl;
6163     l_ii_relationships_tbl   csi_process_txn_grp.txn_ii_relationships_tbl;
6164     l_return_status          varchar2(1) := fnd_api.g_ret_sts_success;
6165     l_msg_count              number;
6166     l_msg_data               varchar2(240);
6167 
6168     l_csi_txn_rec            csi_datastructures_pub.transaction_rec;
6169 
6170     l_c_dest_loc_rec         csi_process_txn_grp.dest_location_rec;
6171     l_c_instances_tbl        csi_process_txn_grp.txn_instances_tbl;
6172     l_c_parties_tbl          csi_process_txn_grp.txn_i_parties_tbl;
6173     l_c_org_units_tbl        csi_process_txn_grp.txn_org_units_tbl;
6174 
6175     l_api_success            varchar2(1) := fnd_api.g_ret_sts_success;
6176     l_error_message          varchar2(2000);
6177 
6178     l_completed_instances    csi_datastructures_pub.instance_tbl;
6179     l_c_ind                  binary_integer := 0;
6180 
6181     l_error_rec              csi_datastructures_pub.transaction_error_rec;
6182     l_replace_rebuilds       EAM_Utility_GRP.Replace_Rebuild_TBL_Type;
6183 
6184   BEGIN
6185 
6186     savepoint wip_assy_completion;
6187 
6188     x_return_status := fnd_api.g_ret_sts_success;
6189 
6190     fnd_msg_pub.initialize;
6191 
6192     csi_t_gen_utility_pvt.build_file_name(
6193       p_file_segment1 => 'csiwipac',
6194       p_file_segment2 => p_transaction_id);
6195 
6196     api_log('wip_assy_completion');
6197 
6198     debug('  Transaction Time  : '||to_char(sysdate, 'MM/DD/YY HH24:MI:SS'));
6199     debug('  Transaction Type  : WIP Assembly Completion');
6200     debug('  Transaction ID    : '||p_transaction_id);
6201 
6202     csi_utility_grp.check_ib_active;
6203 
6204     IF csi_datastructures_pub.g_install_param_rec.fetch_flag IS NULL THEN
6205       csi_gen_utility_pvt.populate_install_param_rec;
6206     END IF;
6207 
6208     l_error_rec                          := px_trx_error_rec;
6209     l_error_rec.transaction_type_id      := 73;
6210     l_error_rec.source_id                := p_transaction_id;
6211 
6212     csi_wip_trxs_pkg.get_mmt_info(
6213       p_transaction_id => p_transaction_id,
6214       x_txn_ref        => l_txn_ref,
6215       x_mmt_tbl        => l_mmt_tbl,
6216       x_return_status  => l_return_status);
6217 
6218     IF l_return_status <> l_api_success THEN
6219       RAISE fnd_api.g_exc_error;
6220     END IF;
6221 
6222     l_error_rec.source_header_ref        := l_txn_ref.wip_entity_name;
6223     l_error_rec.source_header_ref_id     := l_txn_ref.wip_entity_id;
6224     l_error_rec.inventory_item_id        := l_txn_ref.inventory_item_id;
6225     l_error_rec.src_serial_num_ctrl_code := l_txn_ref.srl_control_code;
6226     l_error_rec.src_lot_ctrl_code        := l_txn_ref.lot_control_code;
6227     l_error_rec.src_rev_qty_ctrl_code    := l_txn_ref.rev_control_code;
6228     l_error_rec.src_location_ctrl_code   := l_txn_ref.loc_control_code;
6229     l_error_rec.comms_nl_trackable_flag  := l_txn_ref.ib_trackable_flag;
6230 
6231     IF l_mmt_tbl.COUNT > 0 THEN
6232 
6233       l_csi_txn_rec.transaction_id              := fnd_api.g_miss_num;
6234       l_csi_txn_rec.source_transaction_date     := l_txn_ref.transaction_date;
6235       l_csi_txn_rec.source_header_ref           := l_txn_ref.wip_entity_name;
6236       l_csi_txn_rec.source_header_ref_id        := l_txn_ref.wip_entity_id;
6237 
6238       l_csi_txn_rec.transaction_date            := sysdate;
6239       l_csi_txn_rec.transaction_quantity        := l_txn_ref.primary_quantity;
6240       l_csi_txn_rec.transaction_uom_code        := l_txn_ref.primary_uom_code;
6241       l_csi_txn_rec.transaction_type_id         := 73;
6242       l_csi_txn_rec.message_id                  := p_message_id;
6243       l_csi_txn_rec.inv_material_transaction_id := l_txn_ref.transaction_id;
6244       l_csi_txn_rec.object_version_number       := 1.0;
6245       l_csi_txn_rec.txn_sub_type_id             := 3;
6246       l_csi_txn_rec.transaction_status_code     := 'PENDING';
6247 
6248 
6249       IF l_txn_ref.eam_item_type in (1, 3) THEN
6250 
6251         Delink_ReplaceRebuilds(
6252           p_wip_entity_id    => l_txn_ref.wip_entity_id,
6253           p_organization_id  => l_txn_ref.organization_id,
6254           px_csi_txn_rec     => l_csi_txn_rec,
6255           x_replace_rebuilds => l_replace_rebuilds,
6256           x_return_status    => l_return_status);
6257 
6258         IF l_return_status <> fnd_api.g_ret_sts_success THEN
6259           RAISE fnd_api.g_exc_error;
6260         END IF;
6261 
6262       END IF;
6263 
6264       FOR l_ind in l_mmt_tbl.FIRST .. l_mmt_tbl.LAST
6265       LOOP
6266 
6267         l_error_rec.serial_number := l_mmt_tbl(l_ind).serial_number;
6268         l_error_rec.lot_number    := l_mmt_tbl(l_ind).lot_number;
6269 
6270         bld_inst_tables_for_compl(
6271           p_txn_ref        => l_txn_ref,
6272           p_mmt_rec        => l_mmt_tbl(l_ind),
6273           px_csi_txn_rec   => l_csi_txn_rec,
6274           x_dest_loc_rec   => l_c_dest_loc_rec,
6275           x_instances_tbl  => l_c_instances_tbl,
6276           x_parties_tbl    => l_c_parties_tbl,
6277           x_org_units_tbl  => l_c_org_units_tbl,
6278           x_return_status  => l_return_status);
6279 
6280         IF l_return_status <> l_api_success THEN
6281           RAISE fnd_api.g_exc_error;
6282         END IF;
6283 
6284         csi_process_txn_grp.process_transaction(
6285           p_api_version           => 1.0,
6286           p_commit                => fnd_api.g_false,
6287           p_init_msg_list         => fnd_api.g_false,
6288           p_validation_level      => fnd_api.g_valid_level_full,
6289           p_validate_only_flag    => fnd_api.g_false,
6290           p_in_out_flag           => l_in_out_flag,
6291           p_dest_location_rec     => l_c_dest_loc_rec,
6292           p_txn_rec               => l_csi_txn_rec,
6293           p_instances_tbl         => l_c_instances_tbl,
6294           p_i_parties_tbl         => l_c_parties_tbl,
6295           p_ip_accounts_tbl       => l_ip_accounts_tbl,
6296           p_org_units_tbl         => l_org_units_tbl,
6297           p_ext_attrib_vlaues_tbl => l_ext_attrib_values_tbl,
6298           p_pricing_attribs_tbl   => l_pricing_attribs_tbl,
6299           p_instance_asset_tbl    => l_instance_asset_tbl,
6300           p_ii_relationships_tbl  => l_ii_relationships_tbl,
6301           px_txn_error_rec        => l_error_rec,
6302           x_return_status         => l_return_status,
6303           x_msg_count             => l_msg_count,
6304           x_msg_data              => l_msg_data );
6305 
6306         IF l_return_status <> l_api_success THEN
6307           RAISE fnd_api.g_exc_error;
6308         END IF;
6309 
6310         IF l_c_instances_tbl.COUNT > 0 THEN
6311           FOR l_a_ind IN l_c_instances_tbl.FIRST .. l_c_instances_tbl.LAST
6312           LOOP
6313             l_c_ind := l_c_ind + 1;
6314             l_completed_instances(l_c_ind).instance_id       :=
6315                                            l_c_instances_tbl(l_a_ind).new_instance_id;
6316             l_completed_instances(l_c_ind).serial_number     :=
6317                                            l_c_instances_tbl(l_a_ind).serial_number;
6318             l_completed_instances(l_c_ind).inventory_item_id :=
6319                                            l_c_instances_tbl(l_a_ind).inventory_item_id;
6320             l_completed_instances(l_c_ind).quantity          :=
6321                                            l_c_instances_tbl(l_a_ind).quantity;
6322           END LOOP;
6323         END IF;
6324 
6325       END LOOP;
6326 
6327       /* 1 - EAM, 2 - AHL 0 - NULL */
6328       --R12 Changes for OPM
6329       IF l_txn_ref.wip_maint_source_code <> 2 OR l_txn_ref.wip_entity_type <> 10 THEN
6330         process_relation_at_wipac(
6331           p_txn_ref            => l_txn_ref,
6332           p_assembly_instances => l_completed_instances,
6333           px_csi_txn_rec       => l_csi_txn_rec,
6334           x_return_status      => l_return_status);
6335 
6336         IF l_return_status <> fnd_api.g_ret_sts_success THEN
6337           RAISE fnd_api.g_exc_error;
6338         END IF;
6339       END IF;
6340 
6341     END IF;
6342     debug('wip assembly completion transaction successful : '||p_transaction_id);
6343     debug('end timestamp       : '||to_char(sysdate, 'MM/DD/YY HH24:MI:SS'));
6344 
6345   EXCEPTION
6346     WHEN fnd_api.g_exc_error THEN
6347       rollback to wip_assy_completion;
6348       l_error_rec.error_text := csi_t_gen_utility_pvt.dump_error_stack;
6349       px_trx_error_rec       := l_error_rec;
6350       x_return_status        := fnd_api.g_ret_sts_error;
6351       debug('Error(E) :'||l_error_rec.error_text);
6352 
6353     WHEN others then
6354       rollback to wip_assy_completion;
6355 
6356       fnd_message.set_name('CSI','CSI_UNEXP_SQL_ERROR');
6357       fnd_message.set_token('API_NAME',g_api_name);
6358       fnd_message.set_token('SQL_ERROR',substr(sqlerrm, 1, 255));
6359       fnd_msg_pub.add;
6360 
6361       l_error_rec.error_text := csi_t_gen_utility_pvt.dump_error_stack;
6362       px_trx_error_rec       := l_error_rec;
6363       x_return_status        := fnd_api.g_ret_sts_unexp_error;
6364       debug('Error(E) :'||l_error_rec.error_text);
6365 
6366   END wip_assy_completion;
6367 
6368 
6369   PROCEDURE build_ii_relation_rec(
6370     p_tiir_rec       IN         csi_t_datastructures_grp.txn_ii_rltns_rec,
6371     p_tld_tbl        IN         csi_t_datastructures_grp.txn_line_detail_tbl,
6372     px_txn_rec       IN OUT NOCOPY csi_datastructures_pub.transaction_rec,
6373     x_iir_rec        OUT NOCOPY csi_datastructures_pub.ii_relationship_rec,
6374     x_return_status  OUT NOCOPY varchar2)
6375   IS
6376 
6377     l_obj_instance_id      number;
6378     l_sub_instance_id      number;
6379     l_sub_tld_qty          number;
6380     l_sub_instance_qty     number;
6381     l_sub_tld_id           number := -999999;
6382     l_vld_organization_id  number;
6383 
6384     l_source_instance_rec  csi_datastructures_pub.instance_rec;
6385     l_new_instance_rec     csi_datastructures_pub.instance_rec;
6386     l_source_instance_qty  number;
6387     l_new_instance_qty     number;
6388 
6389     l_iir_rec              csi_datastructures_pub.ii_relationship_rec;
6390 
6391     l_return_status        varchar2(1) := fnd_api.g_ret_sts_success;
6392     l_msg_count            number;
6393     l_msg_data             varchar2(2000);
6394 
6395   BEGIN
6396 
6397     api_log('build_ii_relation_rec');
6398 
6399     x_return_status := fnd_api.g_ret_sts_success;
6400 
6401     IF p_tld_tbl.COUNT > 0 THEN
6402       FOR l_ind IN p_tld_tbl.FIRST .. p_tld_tbl.LAST
6403       LOOP
6404         IF p_tiir_rec.object_id = p_tld_tbl(l_ind).txn_line_detail_id THEN
6405           l_obj_instance_id := p_tld_tbl(l_ind).instance_id;
6406         END IF;
6407         IF p_tiir_rec.subject_id = p_tld_tbl(l_ind).txn_line_detail_id THEN
6408           l_sub_tld_id      := p_tld_tbl(l_ind).txn_line_detail_id;
6409           l_sub_instance_id := p_tld_tbl(l_ind).instance_id;
6410           l_sub_tld_qty     := p_tld_tbl(l_ind).quantity;
6411         END IF;
6412       END LOOP;
6413     END IF;
6414     IF l_sub_instance_id is not null then
6415 
6416       SELECT quantity,
6417              last_vld_organization_id
6418       INTO   l_sub_instance_qty,
6419              l_vld_organization_id
6420       FROM   csi_item_instances
6421       WHERE  instance_id = l_sub_instance_id;
6422 
6423       IF l_sub_instance_qty > l_sub_tld_qty THEN
6424 
6425         l_source_instance_rec.instance_id         := l_sub_instance_id;
6426         l_source_instance_rec.vld_organization_id := l_vld_organization_id;
6427 
6428         l_source_instance_qty := l_sub_instance_qty - l_sub_tld_qty;
6429         l_new_instance_qty    := l_sub_tld_qty;
6430 
6431         csi_item_instance_pvt.split_item_instance (
6432           p_api_version            => 1.0,
6433           p_commit                 => fnd_api.g_false,
6434           p_init_msg_list          => fnd_api.g_true,
6435           p_validation_level       => fnd_api.g_valid_level_full,
6436           p_source_instance_rec    => l_source_instance_rec,
6437           p_quantity1              => l_source_instance_qty,
6438           p_quantity2              => l_new_instance_qty,
6439           p_copy_ext_attribs       => fnd_api.g_true,
6440           p_copy_org_assignments   => fnd_api.g_true,
6441           p_copy_parties           => fnd_api.g_true,
6442           p_copy_accounts          => fnd_api.g_true,
6443           p_copy_asset_assignments => fnd_api.g_true,
6444           p_copy_pricing_attribs   => fnd_api.g_true,
6445           p_txn_rec                => px_txn_rec,
6446           x_new_instance_rec       => l_new_instance_rec,
6447           x_return_status          => l_return_status,
6448           x_msg_count              => l_msg_count,
6449           x_msg_data               => l_msg_data);
6450 
6451         IF l_return_status <> fnd_api.g_ret_sts_success THEN
6452           RAISE fnd_api.g_exc_error;
6453         END IF;
6454         l_sub_instance_id := l_new_instance_rec.instance_id;
6455 
6456         UPDATE csi_t_txn_line_details
6457         SET    instance_id        = l_sub_instance_id
6458         WHERE  txn_line_detail_id = l_sub_tld_id;
6459 
6460       END IF;
6461 
6462       l_iir_rec.object_id              := l_obj_instance_id;
6463       l_iir_rec.subject_id             := l_sub_instance_id;
6464       l_iir_rec.relationship_type_code := 'COMPONENT-OF';
6465       l_iir_rec.active_end_date        := null;
6466       l_iir_rec.cascade_ownership_flag := 'Y';
6467 
6468       BEGIN
6469         SELECT relationship_id,
6470                object_version_number
6471         INTO   l_iir_rec.relationship_id,
6472                l_iir_rec.object_version_number
6473         FROM   csi_ii_relationships
6474         WHERE  object_id  = l_obj_instance_id
6475         AND    subject_id = l_sub_instance_id;
6476       EXCEPTION
6477         WHEN no_data_found THEN
6478           l_iir_rec.relationship_id       := fnd_api.g_miss_num;
6479           l_iir_rec.object_version_number := 1.0;
6480       END;
6481 
6482     END IF;
6483 
6484     debug('  object instance id  :'||l_iir_rec.object_id);
6485     debug('  subject instance id :'||l_iir_rec.subject_id);
6486     debug('  relationship type   :'||l_iir_rec.relationship_type_code);
6487     debug('  relationship id     :'||l_iir_rec.relationship_id);
6488     debug('  object version num  :'||l_iir_rec.object_version_number);
6489 
6490     x_iir_rec := l_iir_rec;
6491 
6492   EXCEPTION
6493     WHEN fnd_api.g_exc_error THEN
6494       x_return_status := fnd_api.g_ret_sts_error;
6495   END build_ii_relation_rec;
6496 
6497   PROCEDURE update_tld_status(
6498     p_tld_tbl         IN csi_t_datastructures_grp.txn_line_detail_tbl,
6499     x_return_status   OUT NOCOPY varchar2)
6500   IS
6501   BEGIN
6502 
6503     IF p_tld_tbl.COUNT > 0 THEN
6504       FOR l_ind IN p_tld_tbl.FIRST .. p_tld_tbl.LAST
6505       LOOP
6506         UPDATE csi_t_txn_line_details
6507         SET    processing_status  = 'PROCESSED'
6508         WHERE  txn_line_detail_id = p_tld_tbl(l_ind).txn_line_detail_id;
6509       END LOOP;
6510     END IF;
6511 
6512   END update_tld_status;
6513 
6514   PROCEDURE process_manual_rltns(
6515     p_wip_entity_id   IN         number,
6516     x_return_status   OUT NOCOPY varchar2,
6517     x_error_message   OUT NOCOPY varchar2)
6518   IS
6519 
6520     l_wip_entity_name varchar2(80);
6521 
6522     l_tl_query_rec    csi_t_datastructures_grp.txn_line_query_rec;
6523     l_tld_query_rec   csi_t_datastructures_grp.txn_line_detail_query_rec;
6524 
6525     l_tld_tbl         csi_t_datastructures_grp.txn_line_detail_tbl;
6526     l_tpty_tbl        csi_t_datastructures_grp.txn_party_detail_tbl;
6527     l_tpacct_tbl      csi_t_datastructures_grp.txn_pty_acct_detail_tbl;
6528     l_tiir_tbl        csi_t_datastructures_grp.txn_ii_rltns_tbl;
6529     l_teav_tbl        csi_t_datastructures_grp.txn_ext_attrib_vals_tbl;
6530     l_cea_tbl         csi_t_datastructures_grp.csi_ext_attribs_tbl;
6531     l_ceav_tbl        csi_t_datastructures_grp.csi_ext_attrib_vals_tbl;
6532     l_toa_tbl         csi_t_datastructures_grp.txn_org_assgn_tbl  ;
6533     l_tsys_tbl        csi_t_datastructures_grp.txn_systems_tbl;
6534 
6535     l_txn_rec         csi_datastructures_pub.transaction_rec;
6536     l_iir_rec         csi_datastructures_pub.ii_relationship_rec;
6537     l_c_iir_tbl       csi_datastructures_pub.ii_relationship_tbl;
6538     l_u_iir_tbl       csi_datastructures_pub.ii_relationship_tbl;
6539     l_c_ind           binary_integer := 0;
6540     l_u_ind           binary_integer := 0;
6541 
6542     l_return_status   varchar2(1) := fnd_api.g_ret_sts_success;
6543     l_msg_count       number;
6544     l_msg_data        varchar2(2000);
6545     l_error_message   varchar2(2000);
6546 
6547   BEGIN
6548 
6549     csi_t_gen_utility_pvt.build_file_name(
6550       p_file_segment1 => 'csiwiprel',
6551       p_file_segment2 => p_wip_entity_id);
6552 
6553     api_log('process_manual_rltns');
6554 
6555     savepoint process_manual_rltns;
6556 
6557     debug('  wip_entity_id   :'||p_wip_entity_id);
6558 
6559     SELECT wip_entity_name
6560     INTO   l_wip_entity_name
6561     FROM   wip_entities
6562     WHERE  wip_entity_id = p_wip_entity_id;
6563 
6564     debug('  wip_entity_name :'||l_wip_entity_name);
6565 
6566     x_return_status := fnd_api.g_ret_sts_success;
6567 
6568     l_tl_query_rec.source_transaction_table := 'WIP_ENTITIES';
6569     l_tl_query_rec.source_transaction_id    := p_wip_entity_id;
6570     l_tld_query_rec.processing_status       := 'UNPROCESSED';
6571 
6572     --get_transaction_details
6573     csi_t_txn_details_grp.get_transaction_details (
6574       p_api_version               => 1.0,
6575       p_commit                    => fnd_api.g_false,
6576       p_init_msg_list             => fnd_api.g_true,
6577       p_validation_level          => fnd_api.g_valid_level_full,
6578       p_txn_line_query_rec        => l_tl_query_rec,
6579       p_txn_line_detail_query_rec => l_tld_query_rec,
6580       x_txn_line_detail_tbl       => l_tld_tbl,
6581       p_get_parties_flag          => fnd_api.g_false,
6582       x_txn_party_detail_tbl      => l_tpty_tbl,
6583       p_get_pty_accts_flag        => fnd_api.g_false,
6584       x_txn_pty_acct_detail_tbl   => l_tpacct_tbl,
6585       p_get_ii_rltns_flag         => fnd_api.g_true,
6586       x_txn_ii_rltns_tbl          => l_tiir_tbl,
6587       p_get_org_assgns_flag       => fnd_api.g_false,
6588       x_txn_org_assgn_tbl         => l_toa_tbl,
6589       p_get_ext_attrib_vals_flag  => fnd_api.g_false,
6590       x_txn_ext_attrib_vals_tbl   => l_teav_tbl,
6591       p_get_csi_attribs_flag      => fnd_api.g_false,
6592       x_csi_ext_attribs_tbl       => l_cea_tbl,
6593       p_get_csi_iea_values_flag   => fnd_api.g_false,
6594       x_csi_iea_values_tbl        => l_ceav_tbl,
6595       p_get_txn_systems_flag      => fnd_api.g_false,
6596       x_txn_systems_tbl           => l_tsys_tbl,
6597       x_return_status             => l_return_status,
6598       x_msg_count                 => l_msg_count,
6599       x_msg_data                  => l_msg_data);
6600 
6601     IF l_return_status <> fnd_api.g_ret_sts_success THEN
6602       RAISE fnd_api.g_exc_error;
6603     END IF;
6604 
6605     debug('  txn_detail.count :'||l_tld_tbl.COUNT);
6606     debug('  txn_rltns.count  :'||l_tiir_tbl.COUNT);
6607 
6608     IF l_tiir_tbl.count > 0 THEN
6609 
6610       -- build transaction rec
6611       l_txn_rec.source_transaction_date := sysdate;
6612       l_txn_rec.transaction_date        := sysdate;
6613       l_txn_rec.transaction_type_id     := 9;
6614       l_txn_rec.txn_sub_type_id         := 6;
6615       l_txn_rec.source_header_ref_id    := p_wip_entity_id;
6616       l_txn_rec.source_header_ref       := l_wip_entity_name;
6617 
6618       FOR l_ind IN l_tiir_tbl.FIRST .. l_tiir_tbl.LAST
6619       LOOP
6620 
6621         build_ii_relation_rec(
6622           p_tiir_rec      => l_tiir_tbl(l_ind),
6623           p_tld_tbl       => l_tld_tbl,
6624           px_txn_rec      => l_txn_rec,
6625           x_iir_rec       => l_iir_rec,
6626           x_return_status => l_return_status);
6627 
6628         IF l_return_status <> fnd_api.g_ret_sts_success THEN
6629           RAISE fnd_api.g_exc_error;
6630         END IF;
6631 
6632         IF nvl(l_iir_rec.relationship_id, fnd_api.g_miss_num) = fnd_api.g_miss_num THEN
6633           l_c_ind := l_c_ind + 1;
6634           l_c_iir_tbl(l_c_ind) := l_iir_rec;
6635         ELSE
6636           l_u_ind := l_u_ind + 1;
6637           l_u_iir_tbl(l_u_ind) := l_iir_rec;
6638         END IF;
6639       END LOOP;
6640 
6641       debug('create_relationship.COUNT :'||l_c_iir_tbl.COUNT);
6642 
6643       IF l_c_iir_tbl.COUNT > 0 THEN
6644         api_log(
6645           p_pkg_name => 'csi_ii_relationships_pub',
6646           p_api_name => 'create_relationship');
6647 
6648         csi_ii_relationships_pub.create_relationship(
6649           p_api_version      => 1.0,
6650           p_commit           => fnd_api.g_false,
6651           p_init_msg_list    => fnd_api.g_true,
6652           p_validation_level => fnd_api.g_valid_level_full,
6653           p_relationship_tbl => l_c_iir_tbl,
6654           p_txn_rec          => l_txn_rec,
6655           x_return_status    => l_return_status,
6656           x_msg_count        => l_msg_count,
6657           x_msg_data         => l_msg_data);
6658 
6659         IF l_return_status <> fnd_api.g_ret_sts_success THEN
6660           RAISE fnd_api.g_exc_error;
6661         END IF;
6662       END IF;
6663 
6664       debug('update_relationship.COUNT :'||l_u_iir_tbl.COUNT);
6665 
6666       IF l_u_iir_tbl.COUNT > 0 THEN
6667         api_log(
6668           p_pkg_name => 'csi_ii_relationships_pub',
6669           p_api_name => 'update_relationship');
6670 
6671         debug('No code here yet for update relationship...');
6672 
6673         IF l_return_status <> fnd_api.g_ret_sts_success THEN
6674           RAISE fnd_api.g_exc_error;
6675         END IF;
6676       END IF;
6677 
6678       update_tld_status(
6679         p_tld_tbl       => l_tld_tbl,
6680         x_return_status => l_return_status);
6681 
6682       IF l_return_status <> fnd_api.g_ret_sts_success THEN
6683         RAISE fnd_api.g_exc_error;
6684       END IF;
6685 
6686     END IF;
6687 
6688   EXCEPTION
6689     WHEN fnd_api.g_exc_error THEN
6690 
6691       rollback to process_manual_rltns;
6692       l_error_message := csi_t_gen_utility_pvt.dump_error_stack;
6693       debug('Error :'||l_error_message);
6694 
6695       x_error_message := l_error_message;
6696       x_return_status := fnd_api.g_ret_sts_error;
6697   END process_manual_rltns;
6698 
6699   PROCEDURE eam_wip_completion(
6700     p_wip_entity_id    IN number,
6701     p_organization_id  IN number,
6702     px_trx_error_rec   OUT nocopy csi_datastructures_pub.transaction_error_rec,
6703     x_return_status    OUT nocopy varchar2)
6704   IS
6705     CURSOR mtl_txn_cur(p_wip_entity_id IN number, p_migration_date IN date) IS
6706       SELECT transaction_id
6707       FROM   mtl_system_items  msi,
6708              mtl_material_transactions mmt
6709       WHERE  mmt.transaction_source_type_id = 5  -- job/schedule transactions
6710       AND    mmt.transaction_source_id   = p_wip_entity_id
6711       AND    mmt.transaction_action_id  in (1, 27, 31, 32, 33, 34) -- ib handled wip actions
6712       AND    mmt.transaction_date        > p_migration_date
6713       AND    msi.organization_id         = mmt.organization_id
6714       AND    msi.inventory_item_id       = mmt.inventory_item_id
6715       AND    nvl(msi.comms_nl_trackable_flag, 'N') = 'Y';
6716 
6717     l_return_status       varchar2(1) := fnd_api.g_ret_sts_success;
6718     l_processed_flag      boolean := FALSE;
6719 
6720     CURSOR wip_inst_cur(p_wip_entity_id IN number, p_instance_id IN number) IS
6721       SELECT instance_id,
6722              quantity,
6723              serial_number
6724       FROM   csi_item_instances
6725       WHERE  location_type_code = 'WIP'
6726       AND    wip_job_id         = p_wip_entity_id
6727       AND    instance_id       <> p_instance_id;
6728 
6729     l_instance_id         number;
6730     l_csi_txn_rec         csi_datastructures_pub.transaction_rec;
6731     l_iir_ind             binary_integer := 0;
6732     l_ii_rltns_tbl        csi_datastructures_pub.ii_relationship_tbl;
6733     l_msg_count           number;
6734     l_msg_data            varchar2(2000);
6735     l_replace_rebuilds    EAM_Utility_GRP.Replace_Rebuild_TBL_Type;
6736 
6737     FUNCTION replace_rebuild(
6738       p_instance_id       IN number,
6739       p_replace_rebuilds  IN EAM_Utility_GRP.Replace_Rebuild_TBL_Type)
6740     RETURN boolean
6741     IS
6742       l_return            boolean := FALSE;
6743     BEGIN
6744       IF p_replace_rebuilds.COUNT > 0 THEN
6745         FOR l_ind IN p_replace_rebuilds.FIRST .. l_replace_rebuilds.LAST
6746         LOOP
6747           IF p_replace_rebuilds(l_ind).instance_id = p_instance_id THEN
6748             l_return := TRUE;
6749             exit;
6750           END IF;
6751         END LOOP;
6752       END IF;
6753       RETURN l_return;
6754     END replace_rebuild;
6755 
6756   BEGIN
6757 
6758     x_return_status := fnd_api.g_ret_sts_success;
6759 
6760     csi_t_gen_utility_pvt.build_file_name(
6761       p_file_segment1 => 'csieamwc',
6762       p_file_segment2 => p_wip_entity_id);
6763 
6764     api_log('eam_wip_completion');
6765 
6766     debug('  Transaction Time  : '||to_char(sysdate, 'MM/DD/YY HH24:MI:SS'));
6767     debug('  Transaction Type  : EAM Work Order Completion');
6768     debug('  Transaction ID    : '||p_wip_entity_id);
6769 
6770     IF csi_datastructures_pub.g_install_param_rec.fetch_flag IS NULL THEN
6771       csi_gen_utility_pvt.populate_install_param_rec;
6772     END IF;
6773 
6774     l_csi_txn_rec.transaction_type_id     := 92;
6775     l_csi_txn_rec.source_transaction_date := sysdate;
6776     l_csi_txn_rec.transaction_date        := sysdate;
6777     l_csi_txn_rec.source_header_ref_id    := p_wip_entity_id;
6778 
6779     SELECT wip_entity_name
6780     INTO   l_csi_txn_rec.source_header_ref
6781     FROM   wip_entities
6782     WHERE  wip_entity_id   = p_wip_entity_id
6783     AND    organization_id = p_organization_id;
6784 
6785     l_csi_txn_rec.transaction_status_code := 'PENDING';
6786 
6787     debug('  wip_entity_name   : '||l_csi_txn_rec.source_header_ref);
6788 
6789     delink_replacerebuilds(
6790       p_wip_entity_id    => p_wip_entity_id,
6791       p_organization_id  => p_organization_id,
6792       px_csi_txn_rec     => l_csi_txn_rec,
6793       x_replace_rebuilds => l_replace_rebuilds,
6794       x_return_status    => l_return_status);
6795 
6796     IF l_return_status <> fnd_api.g_ret_sts_success THEN
6797       RAISE fnd_api.g_exc_error;
6798     END IF;
6799 
6800     FOR mtl_txn_rec IN mtl_txn_cur(
6801       p_wip_entity_id  => p_wip_entity_id,
6802       p_migration_date => csi_datastructures_pub.g_install_param_rec.freeze_date)
6803     LOOP
6804 
6805       debug('  prior transaction_id : '||mtl_txn_rec.transaction_id);
6806 
6807       check_mtl_txn_in_csi(
6808         p_transaction_id  => mtl_txn_rec.transaction_id,
6809         x_txn_found       => l_processed_flag,
6810         x_return_status   => l_return_status);
6811 
6812       IF l_return_status <> fnd_api.g_ret_sts_success THEN
6813         RAISE fnd_api.g_exc_error;
6814       END IF;
6815 
6816       IF NOT( l_processed_flag ) THEN
6817 
6818         fnd_message.set_name('CSI', 'CSI_WIP_PRIOR_TXN_FAILED');
6819         fnd_message.set_token('WIP_ENTITY_ID', p_wip_entity_id);
6820         fnd_message.set_token('MTL_TXN_ID', mtl_txn_rec.transaction_id);
6821 
6822         fnd_msg_pub.add;
6823         RAISE fnd_api.g_exc_error;
6824       END IF;
6825 
6826     END LOOP;
6827 
6828     SELECT maintenance_object_id
6829     INTO   l_instance_id
6830     FROM   wip_discrete_jobs
6831     WHERE  wip_entity_id   = p_wip_entity_id
6832     AND    organization_id = p_organization_id;
6833 
6834     debug('  parent_instance_id   : '||l_instance_id);
6835 
6836     debug('component instances :-');
6837 
6838     FOR wip_inst_rec in wip_inst_cur(p_wip_entity_id, l_instance_id)
6839     LOOP
6840 
6841       debug('  instance_id    : '||wip_inst_rec.instance_id);
6842       debug('  serial_number  : '||wip_inst_rec.serial_number);
6843       debug('  instance_qty   : '||wip_inst_rec.quantity);
6844 
6845       -- eliminate replace rebuilds that are in the wip location
6846       IF NOT(replace_rebuild(wip_inst_rec.instance_id, l_replace_rebuilds)) THEN
6847 
6848         l_iir_ind := l_iir_ind + 1;
6849         l_ii_rltns_tbl(l_iir_ind).relationship_id        := fnd_api.g_miss_num;
6850         l_ii_rltns_tbl(l_iir_ind).object_id              := l_instance_id;
6851         l_ii_rltns_tbl(l_iir_ind).subject_id             := wip_inst_rec.instance_id;
6852         l_ii_rltns_tbl(l_iir_ind).relationship_type_code := 'COMPONENT-OF';
6853 
6854       ELSE
6855         debug('  this is a replace rebuild. ');
6856       END IF;
6857 
6858     END LOOP;
6859 
6860     debug('total components : '||l_ii_rltns_tbl.COUNT);
6861 
6862     IF l_ii_rltns_tbl.COUNT > 0 THEN
6863 
6864       api_log(p_pkg_name => 'csi_ii_relationships_pub',p_api_name => 'create_relationship');
6865 
6866       csi_ii_relationships_pub.create_relationship(
6867         p_api_version      => 1.0,
6868         p_commit           => fnd_api.g_false,
6869         p_init_msg_list    => fnd_api.g_true,
6870         p_validation_level => fnd_api.g_valid_level_full,
6871         p_relationship_tbl => l_ii_rltns_tbl,
6872         p_txn_rec          => l_csi_txn_rec,
6873         x_return_status    => l_return_status,
6874         x_msg_count        => l_msg_count,
6875         x_msg_data         => l_msg_data);
6876 
6877       IF l_return_status <> fnd_api.g_ret_sts_success THEN
6878         RAISE fnd_api.g_exc_error;
6879       END IF;
6880 
6881     END IF;
6882 
6883     debug('eam_wip_completion successful');
6884 
6885   EXCEPTION
6886     WHEN fnd_api.g_exc_error THEN
6887       x_return_status := fnd_api.g_ret_sts_error;
6888   END eam_wip_completion;
6889 
6890   PROCEDURE eam_rebuildable_return(
6891     p_wip_entity_id    IN number,
6892     p_organization_id  IN number,
6893     p_instance_id      IN number,
6894     px_trx_error_rec   OUT nocopy csi_datastructures_pub.transaction_error_rec,
6895     x_return_status    OUT nocopy varchar2)
6896   IS
6897     l_csi_txn_rec      csi_datastructures_pub.transaction_rec;
6898     l_return_status    varchar2(1) := fnd_api.g_ret_sts_success;
6899   BEGIN
6900 
6901     x_return_status := fnd_api.g_ret_sts_success;
6902 
6903     csi_t_gen_utility_pvt.build_file_name(
6904       p_file_segment1 => 'csieamrr',
6905       p_file_segment2 => p_wip_entity_id);
6906 
6907     api_log('eam_rebuildable_return');
6908 
6909     debug('  Transaction Time  : '||to_char(sysdate, 'MM/DD/YY HH24:MI:SS'));
6910     debug('  Transaction Type  : EAM Rebuildable Return');
6911     debug('  Transaction ID    : '||p_wip_entity_id);
6912 
6913     IF csi_datastructures_pub.g_install_param_rec.fetch_flag IS NULL THEN
6914       csi_gen_utility_pvt.populate_install_param_rec;
6915     END IF;
6916 
6917     l_csi_txn_rec.transaction_type_id     := 93;
6918     l_csi_txn_rec.source_transaction_date := sysdate;
6919     l_csi_txn_rec.transaction_date        := sysdate;
6920     l_csi_txn_rec.source_header_ref_id    := p_wip_entity_id;
6921 
6922     SELECT wip_entity_name
6923     INTO   l_csi_txn_rec.source_header_ref
6924     FROM   wip_entities
6925     WHERE  wip_entity_id   = p_wip_entity_id
6926     AND    organization_id = p_organization_id;
6927 
6928     l_csi_txn_rec.transaction_status_code := 'PENDING';
6929 
6930     debug('  instance_id     : '||p_instance_id);
6931     debug('  wip_entity_name : '||l_csi_txn_rec.source_header_ref);
6932 
6933     csi_process_txn_pvt.check_and_break_relation(
6934       p_instance_id   => p_instance_id,
6935       p_csi_txn_rec   => l_csi_txn_rec ,
6936       x_return_status => l_return_status);
6937 
6938     IF l_return_status <> fnd_api.g_ret_sts_success THEN
6939       RAISE fnd_api.g_exc_error;
6940     END IF;
6941 
6942     debug('eam_rebuildable_return successful');
6943 
6944   EXCEPTION
6945     WHEN fnd_api.g_exc_error THEN
6946       x_return_status := fnd_api.g_ret_sts_error;
6947   END eam_rebuildable_return;
6948 
6949 END csi_wip_trxs_pkg;