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