[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;