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