[Home] [Help]
PACKAGE BODY: APPS.CSI_ORDER_FULFILL_PUB
Source
1 PACKAGE BODY csi_order_fulfill_pub AS
2 /* $Header: csipiofb.pls 120.25 2006/11/13 15:38:14 srsarava noship $*/
3
4 PROCEDURE debug(
5 p_message IN varchar2)
6 IS
7 BEGIN
8 csi_t_gen_utility_pvt.add(p_message);
9 END debug;
10
11 PROCEDURE api_log(
12 p_api_name IN varchar2)
13 IS
14 BEGIN
15 csi_t_gen_utility_pvt.dump_api_info(
16 p_api_name => p_api_name,
17 p_pkg_name => 'csi_order_fulfill_pub');
18 END api_log;
19
20 PROCEDURE create_csi_transaction(
21 px_csi_txn_rec IN OUT nocopy csi_datastructures_pub.transaction_rec,
22 x_return_status OUT nocopy varchar2)
23 IS
24 l_return_status varchar2(1) := fnd_api.g_ret_sts_success;
25 l_msg_count number;
26 l_msg_data varchar2(2000);
27
28 BEGIN
29
30 x_return_status := fnd_api.g_ret_sts_success;
31
32 csi_t_gen_utility_pvt.dump_api_info(
33 p_api_name => 'create_transaction',
34 p_pkg_name => 'csi_transactions_pvt');
35
36 csi_transactions_pvt.create_transaction(
37 p_api_version => 1.0,
38 p_commit => fnd_api.g_false,
39 p_init_msg_list => fnd_api.g_true,
40 p_validation_level => fnd_api.g_valid_level_full,
41 p_success_if_exists_flag => 'Y',
42 p_transaction_rec => px_csi_txn_rec,
43 x_return_status => l_return_status,
44 x_msg_count => l_msg_count,
45 x_msg_data => l_msg_data);
46
47 IF l_return_status <> fnd_api.g_ret_sts_success THEN
48 RAISE fnd_api.g_exc_error;
49 END IF;
50
51 debug(' csi_transaction_id : '||px_csi_txn_rec.transaction_id);
52
53 EXCEPTION
54 WHEN fnd_api.g_exc_error THEN
55 x_return_status := fnd_api.g_ret_sts_error;
56 END create_csi_transaction;
57
58 PROCEDURE get_sub_type_rec(
59 p_transaction_type_id IN number,
60 p_sub_type_id IN number,
61 x_sub_type_rec OUT NOCOPY sub_type_rec,
62 x_return_status OUT NOCOPY varchar2)
63 IS
64 l_sub_type_rec sub_type_rec;
65 BEGIN
66 api_log('get_sub_type_rec');
67 x_return_status := fnd_api.g_ret_sts_success;
68
69 l_sub_type_rec.transaction_type_id := p_transaction_type_id;
70 l_sub_type_rec.sub_type_id := p_sub_type_id;
71
72 BEGIN
73 SELECT nvl(src_change_owner, 'N'),
74 src_change_owner_to_code,
75 src_status_id,
76 nvl(src_reference_reqd, 'N'),
77 nvl(src_return_reqd,'N'),
78 nvl(non_src_change_owner, 'N'),
79 non_src_change_owner_to_code,
80 non_src_status_id,
81 nvl(non_src_reference_reqd,'N'),
82 nvl(non_src_return_reqd,'N')
83 INTO l_sub_type_rec.src_change_owner,
84 l_sub_type_rec.src_change_owner_code,
85 l_sub_type_rec.src_status_id,
86 l_sub_type_rec.src_reference_reqd,
87 l_sub_type_rec.src_return_reqd,
88 l_sub_type_rec.nsrc_change_owner,
89 l_sub_type_rec.nsrc_change_owner_code,
90 l_sub_type_rec.nsrc_status_id,
91 l_sub_type_rec.nsrc_reference_reqd,
92 l_sub_type_rec.nsrc_return_reqd
93 FROM csi_ib_txn_types
94 WHERE sub_type_id = p_sub_type_id;
95 EXCEPTION
96 WHEN no_data_found THEN
97 fnd_message.set_name('CSI','CSI_INT_SUB_TYPE_REC_MISSING');
98 fnd_message.set_token('SUB_TYPE_ID', p_sub_type_id);
99 fnd_message.set_token('TRANSACTION_TYPE_ID', p_transaction_type_id);
100 fnd_msg_pub.add;
101 RAISE fnd_api.g_exc_error;
102 END;
103 x_sub_type_rec := l_sub_type_rec;
104 EXCEPTION
105 WHEN fnd_api.g_exc_error THEN
106 x_return_status := fnd_api.g_ret_sts_error;
107 END get_sub_type_rec;
108
109
110 -- added for the bug 5464761
111 PROCEDURE auto_split_instances(
112 p_instance_rec IN csi_datastructures_pub.instance_rec,
113 px_txn_rec IN OUT nocopy csi_datastructures_pub.transaction_rec,
114 x_instance_tbl OUT nocopy csi_datastructures_pub.instance_tbl,
115 x_return_status OUT nocopy varchar2)
116 IS
117 l_src_instance_rec csi_datastructures_pub.instance_rec;
118 l_instance_tbl csi_datastructures_pub.instance_tbl;
119 l_return_status varchar2(1) := fnd_api.g_ret_sts_success;
120 l_msg_count number;
121 l_msg_data varchar2(2000);
122 BEGIN
123
124 x_return_status := fnd_api.g_ret_sts_success;
125
126 api_log('auto_split_instances');
127
128 l_src_instance_rec.instance_id := p_instance_rec.instance_id ;
129 l_src_instance_rec.vld_organization_id := p_instance_rec.vld_organization_id;
130 l_src_instance_rec.location_type_code := p_instance_rec.location_type_code;
131 l_src_instance_rec.location_id := p_instance_rec.location_id;
132 l_src_instance_rec.install_location_type_code := p_instance_rec.install_location_type_code;
133 l_src_instance_rec.install_location_id := p_instance_rec.install_location_id;
134 l_src_instance_rec.instance_usage_code := p_instance_rec.instance_usage_code;
135 -- START changes for bug 4050897
136 l_src_instance_rec.version_label := p_instance_rec.version_label;
137 l_src_instance_rec.instance_type_code := p_instance_rec.instance_type_code;
138 l_src_instance_rec.instance_condition_id := p_instance_rec.instance_condition_id;
139 l_src_instance_rec.return_by_date := p_instance_rec.return_by_date;
140 -- END changes for bug 4050897
141 l_src_instance_rec.inv_organization_id := null;
142 l_src_instance_rec.inv_subinventory_name := null;
143 l_src_instance_rec.inv_locator_id := null;
144 l_src_instance_rec.pa_project_id := null;
145 l_src_instance_rec.pa_project_task_id := null;
146 l_src_instance_rec.wip_job_id := null;
147 l_src_instance_rec.po_order_line_id := null;
148
149 csi_t_gen_utility_pvt.dump_api_info(
150 p_pkg_name => 'csi_item_instance_pvt',
151 p_api_name => 'split_item_instance_lines');
152
153 csi_item_instance_pvt.split_item_instance_lines(
154 p_api_version => 1.0,
155 p_commit => fnd_api.g_false,
156 p_init_msg_list => fnd_api.g_true,
157 p_validation_level => fnd_api.g_valid_level_full,
158 p_source_instance_rec => l_src_instance_rec,
159 p_copy_ext_attribs => fnd_api.g_true,
160 p_copy_org_assignments => fnd_api.g_true,
161 p_copy_parties => fnd_api.g_true,
162 p_copy_accounts => fnd_api.g_true,
163 p_copy_asset_assignments => fnd_api.g_true,
164 p_copy_pricing_attribs => fnd_api.g_true,
165 p_txn_rec => px_txn_rec,
166 x_new_instance_tbl => l_instance_tbl,
167 x_return_status => l_return_status,
168 x_msg_count => l_msg_count,
169 x_msg_data => l_msg_data);
170
171 IF l_return_status not in (fnd_api.g_ret_sts_success, 'W') THEN
172 RAISE fnd_api.g_exc_error;
173 END IF;
174
175 x_instance_tbl := l_instance_tbl;
176
177 EXCEPTION
178 WHEN fnd_api.g_exc_error THEN
179 x_return_status := fnd_api.g_ret_sts_error;
180 END auto_split_instances;
181
182
183 -- added for the bug 5464761
184 PROCEDURE check_and_explode_bom
185 ( p_order_line_rec IN oe_order_lines_all%rowtype,
186 l_u_instance_rec IN OUT NOCOPY csi_datastructures_pub.instance_rec,
187 px_csi_txn_rec IN OUT NOCOPY csi_datastructures_pub.transaction_rec,
188 x_return_status OUT NOCOPY varchar2)
189
190 IS
191
192 l_cps_tbl csi_order_ship_pub.customer_products_tbl;
193 l_cp_ind binary_integer := 0;
194 l_ind binary_integer := 0;
195 l_all_cps_tbl csi_order_ship_pub.customer_products_tbl;
196 l_single_cps_tbl csi_order_ship_pub.customer_products_tbl;
197 l_acp_ind binary_integer := 0;
198 l_return_status varchar2(1) := fnd_api.g_ret_sts_success;
199 l_msg_count number;
200 l_msg_data varchar2(2000);
201
202
203
204 -- explode_bom variables
205 l_bom_ind binary_integer := 0;
206 l_bom_std_item_rec csi_datastructures_pub.instance_rec;
207 l_bom_std_item_tbl csi_datastructures_pub.instance_tbl;
208 l_bom_explode_flag BOOLEAN := FALSE;
209 l_split_flag varchar2(10);
210 l_auto_split_instances csi_datastructures_pub.instance_tbl;
211 l_ship_order_line_rec csi_order_ship_pub.order_line_rec;
212 l_order_line_rec oe_order_lines_all%rowtype;
213
214
215 begin
216
217 debug('Instance id' ||l_u_instance_rec.instance_id);
218 debug('Order Line Id ' ||p_order_line_rec.line_id);
219
220
221 /* This is done to get the quantity and inventory item id for explosion and auto split */
222 SELECT quantity,
223 inventory_item_id
224 INTO l_u_instance_rec.quantity,
225 l_u_instance_rec.inventory_item_id
226 FROM csi_item_instances
227 WHERE instance_id = l_u_instance_rec.instance_id;
228
229
230
231 l_split_flag := nvl(fnd_profile.value('CSI_AUTO_SPLIT_INSTANCE' ),'N');
232 debug(' profile_auto_split : '||l_split_flag);
233
234 l_order_line_rec := p_order_line_rec;
235 l_cp_ind := 0;
236 l_cps_tbl.delete;
237
238 debug(' l_cps_tbl(l_cp_ind).quantity : '||l_u_instance_rec.quantity);
239 l_cp_ind := l_cp_ind + 1;
240 l_cps_tbl(l_cp_ind).instance_id := l_u_instance_rec.instance_id;
241 l_cps_tbl(l_cp_ind).quantity := l_u_instance_rec.quantity;
242 l_cps_tbl(l_cp_ind).txn_line_detail_id := l_u_instance_rec.last_txn_line_detail_id;
243 l_cps_tbl(l_cp_ind).line_id := l_u_instance_rec.last_oe_order_line_id;
244 l_cps_tbl(l_cp_ind).transaction_id := px_csi_txn_rec.transaction_id;
245 l_cps_tbl(l_cp_ind).serial_number := l_u_instance_rec.serial_number;
246
247
248
249 BEGIN
250
251 DEBUG('Ship From Org ID '||l_order_line_rec.ship_from_org_id);
252
253 SELECT serial_number_control_code,
254 Inventory_item_id,
255 organization_id,
256 bom_item_type
257 INTO l_ship_order_line_rec.serial_code,
258 l_ship_order_line_rec.inv_item_id ,
259 l_ship_order_line_rec.inv_org_id,
260 l_ship_order_line_rec.bom_item_type
261 FROM mtl_system_items
262 WHERE inventory_item_id = l_u_instance_rec.inventory_item_id
263 AND organization_id = l_order_line_rec.ship_from_org_id;
264
265 EXCEPTION
266 WHEN OTHERS THEN
267 null;
268 END;
269
270
271 IF l_u_instance_rec.quantity > 1
272 AND
273 l_split_flag = 'Y'
274 AND
275 l_ship_order_line_rec.serial_code = 1
276 THEN
277
278 l_auto_split_instances.delete;
279
280 auto_split_instances(
281 p_instance_rec => l_u_instance_rec,
282 px_txn_rec => px_csi_txn_rec,
283 x_instance_tbl => l_auto_split_instances,
284 x_return_status => l_return_status);
285
286 IF l_return_status <> fnd_api.g_ret_sts_success THEN
287 RAISE fnd_api.g_exc_error;
288 END IF;
289 END IF;
290
291
292
293 IF l_auto_split_instances.count > 0 THEN
294 l_cp_ind := 0;
295 l_cps_tbl.delete;
296
297 FOR nis_ind in l_auto_split_instances.FIRST .. l_auto_split_instances.LAST
298 LOOP
299
300 l_cp_ind := l_cp_ind + 1;
301 l_cps_tbl(l_cp_ind).instance_id := l_auto_split_instances(nis_ind).instance_id;
302 l_cps_tbl(l_cp_ind).quantity := 1;
303 l_cps_tbl(l_cp_ind).txn_line_detail_id :=
304 l_u_instance_rec.last_txn_line_detail_id;
305 l_cps_tbl(l_cp_ind).line_id :=
306 l_u_instance_rec.last_oe_order_line_id;
307 l_cps_tbl(l_cp_ind).transaction_id := px_csi_txn_rec.transaction_id;
308
309 END LOOP;
310 END IF;
311
312 IF l_cps_tbl.COUNT > 0 THEN
313 FOR r_cp_ind IN l_cps_tbl.FIRST .. l_cps_tbl.LAST
314 LOOP
315
316 l_acp_ind := l_acp_ind + 1;
317 l_all_cps_tbl(l_acp_ind) := l_cps_tbl(r_cp_ind);
318 END LOOP;
319 END IF;
320
321 DEBUG('customer products :'||l_all_cps_tbl.COUNT);
322
323
324
325 --getting single quantity instances
326 IF l_all_cps_tbl.COUNT > 0 THEN
327 l_ind :=0;
328
329 FOR p_ind IN l_all_cps_tbl.FIRST .. l_all_cps_tbl.LAST
330 LOOP
331
332 IF l_all_cps_tbl(p_ind).quantity = 1 THEN
333 l_ind := l_ind + 1;
334 l_single_cps_tbl(l_ind) := l_all_cps_tbl(p_ind);
335 END IF;
336 END LOOP;
337 END IF; --end of getting single quantity instances
338
339
340 DEBUG('Single Quantity Instances Table Count'|| l_single_cps_tbl.count);
341
342 IF l_single_cps_tbl.count > 0 THEN
343
344 l_bom_explode_flag := csi_utl_pkg.check_standard_bom(
345 p_order_line_rec => l_ship_order_line_rec);
346
347 IF l_bom_explode_flag THEN
348
349 FOR l_scp_ind IN l_single_cps_tbl.FIRST .. l_single_cps_tbl.LAST
350 LOOP
351
352 IF NOT(csi_utl_pkg.wip_config_exists(l_single_cps_tbl(l_scp_ind).instance_id)) THEN
353
354 l_bom_std_item_rec.instance_id := l_single_cps_tbl(l_scp_ind).instance_id ;
355 l_bom_std_item_rec.inventory_item_id := l_ship_order_line_rec.inv_item_id ;
356 l_bom_std_item_rec.vld_organization_id := l_ship_order_line_rec.inv_org_id ;
357 l_bom_std_item_rec.quantity := 1;
358 l_bom_ind := l_bom_ind + 1;
359 l_bom_std_item_tbl(l_bom_ind) := l_bom_std_item_rec;
360 END IF;
361 END LOOP;
362
363
364
365 IF l_bom_std_item_tbl.COUNT > 0 THEN
366 debug('explode bom start time :'||to_char(sysdate, 'hh24:mi:ss'));
367
368 csi_t_gen_utility_pvt.dump_api_info(
369 p_pkg_name => 'csi_item_instance_grp',
370 p_api_name => 'explode_bom');
371
372 csi_item_instance_grp.explode_bom( -- changes done to call the Group API for performance issues, bug3722382
373 p_api_version => 1.0,
374 p_commit => fnd_api.g_false,
375 p_init_msg_list => fnd_api.g_true,
376 p_validation_level => fnd_api.g_valid_level_full,
377 p_source_instance_tbl => l_bom_std_item_tbl,
378 p_explosion_level => fnd_api.g_miss_num,
379 p_txn_rec => px_csi_txn_rec,
380 x_return_status => l_return_status,
381 x_msg_count => l_msg_count,
382 x_msg_data => l_msg_data);
383
384 IF l_return_status <> fnd_api.g_ret_sts_success THEN
385 RAISE fnd_api.g_exc_error;
386 END IF;
387
388 debug('explode bom end time :'||to_char(sysdate, 'hh24:mi:ss'));
389 END IF;
390 END IF; --bom explode flag
391 END IF; --l_single_cps_tbl.count
392
393
394 END check_and_explode_bom;
395
396
397 PROCEDURE create_dflt_txn_dtls(
398 p_order_line_rec IN oe_order_lines_all%rowtype,
399 px_default_info_rec IN OUT nocopy default_info_rec,
400 x_txn_line_rec OUT nocopy csi_t_datastructures_grp.txn_line_rec,
401 x_tld_tbl OUT nocopy csi_t_datastructures_grp.txn_line_detail_tbl,
402 x_tiir_tbl OUT nocopy csi_t_datastructures_grp.txn_ii_rltns_tbl,
403 x_return_status OUT nocopy varchar2)
404 IS
405
406 c_tl_rec csi_t_datastructures_grp.txn_line_rec;
407 c_tld_tbl csi_t_datastructures_grp.txn_line_detail_tbl;
408 c_tpd_tbl csi_t_datastructures_grp.txn_party_detail_tbl;
409 c_tpa_tbl csi_t_datastructures_grp.txn_pty_acct_detail_tbl;
410 c_iir_tbl csi_t_datastructures_grp.txn_ii_rltns_tbl;
411 c_oa_tbl csi_t_datastructures_grp.txn_org_assgn_tbl;
412 c_ea_tbl csi_t_datastructures_grp.txn_ext_attrib_vals_tbl;
413 c_ts_tbl csi_t_datastructures_grp.txn_systems_tbl;
414
415 l_loop_count number := 1;
416 l_quantity number;
417
418 l_return_status varchar2(1) := fnd_api.g_ret_sts_success;
419 l_msg_count number;
420 l_msg_data varchar2(4000);
421
422 BEGIN
423
424 x_return_status := fnd_api.g_ret_sts_success;
425 api_log('create_dflt_txn_dtls');
426
427 c_tl_rec.source_transaction_type_id := 51;
428 c_tl_rec.source_transaction_table := 'OE_ORDER_LINES_ALL';
429 c_tl_rec.source_transaction_id := p_order_line_rec.line_id;
430
431 l_loop_count := 1;
432 l_quantity := p_order_line_rec.ordered_quantity;
433
434 IF px_default_info_rec.split_flag = 'Y' THEN
435 IF px_default_info_rec.ratio_split_flag = 'Y' THEN
436 l_loop_count := p_order_line_rec.ordered_quantity/px_default_info_rec.split_ratio;
437 l_quantity := px_default_info_rec.split_ratio;
438 ELSE
439 l_loop_count := p_order_line_rec.ordered_quantity;
440 l_quantity := 1;
441 END IF;
442 ELSE
443 l_loop_count := 1;
444 l_quantity := p_order_line_rec.ordered_quantity;
445 END IF;
446
447 FOR l_ind IN 1..l_loop_count
448 LOOP
449
450 c_tld_tbl(l_ind).sub_type_id := px_default_info_rec.sub_type_id;
451 c_tld_tbl(l_ind).instance_exists_flag := 'N';
452 c_tld_tbl(l_ind).source_transaction_flag := 'Y';
453 c_tld_tbl(l_ind).inventory_item_id := p_order_line_rec.inventory_item_id;
454 c_tld_tbl(l_ind).inventory_revision := p_order_line_rec.item_revision;
455 c_tld_tbl(l_ind).inv_organization_id := px_default_info_rec.om_vld_org_id;
456 c_tld_tbl(l_ind).quantity := l_quantity;
457 c_tld_tbl(l_ind).unit_of_measure := p_order_line_rec.order_quantity_uom;
458 c_tld_tbl(l_ind).processing_status := 'IN_PROCESS';
459
460 IF nvl(px_default_info_rec.current_party_site_id, fnd_api.g_miss_num) <> fnd_api.g_miss_num THEN
461 c_tld_tbl(l_ind).location_type_code := 'HZ_PARTY_SITES';
462 c_tld_tbl(l_ind).location_id := px_default_info_rec.current_party_site_id;
463 END IF;
464
465 IF nvl(px_default_info_rec.install_party_site_id, fnd_api.g_miss_num) <> fnd_api.g_miss_num THEN
466 c_tld_tbl(l_ind).install_location_type_code := 'HZ_PARTY_SITES';
467 c_tld_tbl(l_ind).install_location_id := px_default_info_rec.install_party_site_id;
468 END IF;
469
470 -- party details
471 c_tpd_tbl(l_ind).party_source_table := 'HZ_PARTIES';
472 c_tpd_tbl(l_ind).relationship_type_code := 'OWNER';
473 c_tpd_tbl(l_ind).preserve_detail_flag := 'Y';
474 c_tpd_tbl(l_ind).txn_line_details_index := l_ind;
475 c_tpd_tbl(l_ind).contact_flag := 'N';
476
477 IF px_default_info_rec.src_change_owner = 'Y' THEN
478 c_tpd_tbl(l_ind).party_source_id := px_default_info_rec.owner_party_id;
479 -- party account details
480 c_tpa_tbl(l_ind).account_id := px_default_info_rec.owner_party_acct_id;
481 c_tpa_tbl(l_ind).bill_to_address_id := p_order_line_rec.invoice_to_org_id;
482 c_tpa_tbl(l_ind).ship_to_address_id := p_order_line_rec.ship_to_org_id;
483 c_tpa_tbl(l_ind).relationship_type_code := 'OWNER';
484 c_tpa_tbl(l_ind).preserve_detail_flag := 'Y';
485 c_tpa_tbl(l_ind).txn_party_details_index := l_ind;
486 ELSE
487 c_tpd_tbl(l_ind).party_source_id := px_default_info_rec.internal_party_id;
488 END IF;
489
490 IF nvl(p_order_line_rec.sold_from_org_id, fnd_api.g_miss_num) <> fnd_api.g_miss_num THEN
491 c_oa_tbl(l_ind).operating_unit_id := p_order_line_rec.sold_from_org_id;
492 c_oa_tbl(l_ind).relationship_type_code := 'SOLD_FROM';
493 c_oa_tbl(l_ind).preserve_detail_flag := 'Y';
494 c_oa_tbl(l_ind).txn_line_details_index := l_ind;
495 END IF;
496
497 END LOOP;
498
499 csi_t_txn_details_grp.create_transaction_dtls(
500 p_api_version => 1.0,
501 p_commit => fnd_api.g_false,
502 p_init_msg_list => fnd_api.g_true,
503 p_validation_level => fnd_api.g_valid_level_full,
504 px_txn_line_rec => c_tl_rec,
505 px_txn_line_detail_tbl => c_tld_tbl,
506 px_txn_party_detail_tbl => c_tpd_tbl,
507 px_txn_pty_acct_detail_tbl => c_tpa_tbl,
508 px_txn_ii_rltns_tbl => c_iir_tbl,
509 px_txn_org_assgn_tbl => c_oa_tbl,
510 px_txn_ext_attrib_vals_tbl => c_ea_tbl,
511 px_txn_systems_tbl => c_ts_tbl,
512 x_return_status => l_return_status,
513 x_msg_count => l_msg_count,
514 x_msg_data => l_msg_data);
515
516 IF l_return_status <> fnd_api.g_ret_sts_success THEN
517 RAISE fnd_api.g_exc_error;
518 END IF;
519
520 x_txn_line_rec := c_tl_rec;
521 x_tld_tbl := c_tld_tbl;
522 x_tiir_tbl := c_iir_tbl;
523
524 EXCEPTION
525 WHEN fnd_api.g_exc_error THEN
526 x_return_status := fnd_api.g_ret_sts_error;
527 END create_dflt_txn_dtls;
528
529 PROCEDURE get_parent_txn_line_status (
530 p_parent_line_id IN number,
531 x_processing_status OUT NOCOPY varchar2)
532 IS
533 l_processing_status varchar2(30) := 'SUBMIT';
534 BEGIN
535
536 BEGIN
537
538 SELECT processing_status
539 INTO l_processing_status
540 FROM csi_t_transaction_lines
541 WHERE source_transaction_table = 'OE_ORDER_LINES_ALL'
542 AND source_transaction_id = p_parent_line_id;
543
544 EXCEPTION
545 WHEN no_data_found THEN
546 l_processing_status := 'SUBMIT';
547 END;
548
549 x_processing_status := l_processing_status;
550 EXCEPTION
551 WHEN others THEN
552 x_processing_status := l_processing_status;
553 END get_parent_txn_line_status;
554
555 /* -------------------------------------------------------------------- */
556 /* This routine converts the instance header table to instance table . */
557 /* We need to do this because the get_item_instances returns the header */
558 /* table and we operate on the instance table. */
559 /* -------------------------------------------------------------------- */
560 PROCEDURE make_non_header_rec(
561 p_instance_header_rec IN csi_datastructures_pub.instance_header_rec,
562 x_instance_rec OUT NOCOPY csi_datastructures_pub.instance_rec,
563 x_return_status OUT NOCOPY varchar2)
564 IS
565 BEGIN
566
567 x_return_status := fnd_api.g_ret_sts_success;
568
569 x_instance_rec.instance_id := p_instance_header_rec.instance_id;
570 x_instance_rec.instance_number := p_instance_header_rec.instance_number;
571 x_instance_rec.external_reference := p_instance_header_rec.external_reference;
572 x_instance_rec.inventory_item_id := p_instance_header_rec.inventory_item_id;
573 x_instance_rec.inventory_revision := p_instance_header_rec.inventory_revision;
574 x_instance_rec.inv_master_organization_id := p_instance_header_rec.inv_master_organization_id;
575 x_instance_rec.serial_number := p_instance_header_rec.serial_number;
576 x_instance_rec.mfg_serial_number_flag := p_instance_header_rec.mfg_serial_number_flag;
577 x_instance_rec.lot_number := p_instance_header_rec.lot_number;
578 x_instance_rec.quantity := p_instance_header_rec.quantity;
579 x_instance_rec.unit_of_measure := p_instance_header_rec.unit_of_measure;
580 x_instance_rec.accounting_class_code := p_instance_header_rec.accounting_class_code;
581 x_instance_rec.instance_condition_id := p_instance_header_rec.instance_condition_id;
582 x_instance_rec.instance_usage_code := p_instance_header_rec.instance_usage_code;
583 x_instance_rec.instance_status_id := p_instance_header_rec.instance_status_id;
584 x_instance_rec.customer_view_flag := p_instance_header_rec.customer_view_flag;
585 x_instance_rec.merchant_view_flag := p_instance_header_rec.merchant_view_flag;
586 x_instance_rec.sellable_flag := p_instance_header_rec.sellable_flag;
587 x_instance_rec.system_id := p_instance_header_rec.system_id;
588 x_instance_rec.instance_type_code := p_instance_header_rec.instance_type_code;
589 x_instance_rec.active_start_date := p_instance_header_rec.active_start_date;
590 x_instance_rec.active_end_date := p_instance_header_rec.active_end_date;
591 x_instance_rec.location_type_code := p_instance_header_rec.location_type_code;
592 x_instance_rec.location_id := p_instance_header_rec.location_id;
593 -- Added for partner ordering
594 x_instance_rec.install_location_type_code := p_instance_header_rec.install_location_type_code;
595 x_instance_rec.install_location_id := p_instance_header_rec.install_location_id;
596 -- Added for partner ordering
597 x_instance_rec.inv_organization_id := p_instance_header_rec.inv_organization_id;
598 x_instance_rec.inv_subinventory_name := p_instance_header_rec.inv_subinventory_name;
599 x_instance_rec.inv_locator_id := p_instance_header_rec.inv_locator_id;
600 x_instance_rec.pa_project_id := p_instance_header_rec.pa_project_id;
601 x_instance_rec.pa_project_task_id := p_instance_header_rec.pa_project_task_id;
602 x_instance_rec.in_transit_order_line_id := p_instance_header_rec.in_transit_order_line_id;
603 x_instance_rec.wip_job_id := p_instance_header_rec.wip_job_id;
604 x_instance_rec.po_order_line_id := p_instance_header_rec.po_order_line_id;
605 x_instance_rec.last_oe_order_line_id := p_instance_header_rec.last_oe_order_line_id;
606 x_instance_rec.last_oe_rma_line_id := p_instance_header_rec.last_oe_rma_line_id;
607 x_instance_rec.last_po_po_line_id := p_instance_header_rec.last_po_po_line_id;
608 x_instance_rec.last_oe_po_number := p_instance_header_rec.last_oe_po_number;
609 x_instance_rec.last_wip_job_id := p_instance_header_rec.last_wip_job_id;
610 x_instance_rec.last_pa_project_id := p_instance_header_rec.last_pa_project_id;
611 x_instance_rec.last_pa_task_id := p_instance_header_rec.last_pa_task_id;
612 x_instance_rec.last_oe_agreement_id := p_instance_header_rec.last_oe_agreement_id;
613 x_instance_rec.install_date := p_instance_header_rec.install_date;
614 x_instance_rec.manually_created_flag := p_instance_header_rec.manually_created_flag;
615 x_instance_rec.return_by_date := p_instance_header_rec.return_by_date;
616 x_instance_rec.actual_return_date := p_instance_header_rec.actual_return_date;
617 x_instance_rec.creation_complete_flag := p_instance_header_rec.creation_complete_flag;
618 x_instance_rec.completeness_flag := p_instance_header_rec.completeness_flag;
619 x_instance_rec.context := p_instance_header_rec.context;
620 x_instance_rec.attribute1 := p_instance_header_rec.attribute1;
621 x_instance_rec.attribute2 := p_instance_header_rec.attribute2;
622 x_instance_rec.attribute3 := p_instance_header_rec.attribute3;
623 x_instance_rec.attribute4 := p_instance_header_rec.attribute4;
624 x_instance_rec.attribute5 := p_instance_header_rec.attribute5;
625 x_instance_rec.attribute6 := p_instance_header_rec.attribute6;
626 x_instance_rec.attribute7 := p_instance_header_rec.attribute7;
627 x_instance_rec.attribute8 := p_instance_header_rec.attribute8;
628 x_instance_rec.attribute9 := p_instance_header_rec.attribute9;
629 x_instance_rec.attribute10 := p_instance_header_rec.attribute10;
630 x_instance_rec.attribute11 := p_instance_header_rec.attribute11;
631 x_instance_rec.attribute12 := p_instance_header_rec.attribute12;
632 x_instance_rec.attribute13 := p_instance_header_rec.attribute13;
633 x_instance_rec.attribute14 := p_instance_header_rec.attribute14;
634 x_instance_rec.attribute15 := p_instance_header_rec.attribute15;
635 x_instance_rec.object_version_number := p_instance_header_rec.object_version_number;
636 END make_non_header_rec;
637
638 PROCEDURE make_non_header_tbl(
639 p_instance_header_tbl IN csi_datastructures_pub.instance_header_tbl,
640 x_instance_tbl OUT NOCOPY csi_datastructures_pub.instance_tbl,
641 x_return_status OUT NOCOPY varchar2)
642 IS
643 l_return_status varchar2(1) := fnd_api.g_ret_sts_success;
644 BEGIN
645
646 x_return_status := fnd_api.g_ret_sts_success;
647
648 IF p_instance_header_tbl.COUNT > 0 THEN
649 FOR l_ind IN p_instance_header_tbl.FIRST .. p_instance_header_tbl.LAST
650 LOOP
651
652 make_non_header_rec(
653 p_instance_header_rec => p_instance_header_tbl(l_ind),
654 x_instance_rec => x_instance_tbl(l_ind),
655 x_return_status => l_return_status);
656
657 END LOOP;
658 END IF;
659
660 END make_non_header_tbl;
661
662
663 PROCEDURE split_instances_using_copy(
664 p_instance_rec IN csi_datastructures_pub.instance_rec,
665 px_csi_txn_rec IN OUT nocopy csi_datastructures_pub.transaction_rec,
666 x_instance_tbl OUT nocopy csi_datastructures_pub.instance_tbl,
667 x_return_status OUT nocopy varchar2)
668 IS
669
670 l_instance_usage_code varchar2(80);
671 l_location_type_code varchar2(80);
672 l_quantity number;
673 l_parent_instance_id number;
674
675 l_u_instance_rec csi_datastructures_pub.instance_rec;
676 l_u_parties_tbl csi_datastructures_pub.party_tbl;
677 l_u_pty_accts_tbl csi_datastructures_pub.party_account_tbl;
678 l_u_org_units_tbl csi_datastructures_pub.organization_units_tbl;
679 l_u_ea_values_tbl csi_datastructures_pub.extend_attrib_values_tbl;
680 l_u_pricing_tbl csi_datastructures_pub.pricing_attribs_tbl;
681 l_u_assets_tbl csi_datastructures_pub.instance_asset_tbl;
682 l_u_instance_ids_list csi_datastructures_pub.id_tbl;
683
684 l_instance_rec csi_datastructures_pub.instance_rec;
685 l_copy_instance_tbl csi_datastructures_pub.instance_tbl;
686
687 l_ii_rltns_tbl csi_datastructures_pub.ii_relationship_tbl;
688
689 l_instance_tbl csi_datastructures_pub.instance_tbl;
690 x_ind binary_integer := 0;
691
692 l_return_status varchar2(1) := fnd_api.g_ret_sts_success;
693 l_msg_data varchar2(2000);
694 l_msg_count number;
695
696 BEGIN
697 x_return_status := fnd_api.g_ret_sts_success;
698 api_log('split_instances_using_copy');
699
700 IF nvl(p_instance_rec.instance_id, fnd_api.g_miss_num) <> fnd_api.g_miss_num THEN
701
702 l_instance_rec := p_instance_rec;
703
704 IF p_instance_rec.quantity > 1 THEN
705
706 l_u_instance_rec.instance_id := l_instance_rec.instance_id;
707 l_u_instance_rec.quantity := 1;
708
709 SELECT object_version_number,
710 instance_usage_code,
711 location_type_code,
712 quantity
713 INTO l_u_instance_rec.object_version_number,
714 l_instance_usage_code ,
715 l_location_type_code,
716 l_quantity
717 FROM csi_item_instances
718 WHERE instance_id = l_u_instance_rec.instance_id;
719
720 IF l_instance_usage_code = 'IN_RELATIONSHIP' THEN
721 SELECT object_id
722 INTO l_parent_instance_id
723 FROM csi_ii_relationships
724 WHERE subject_id = p_instance_rec.instance_id
725 AND relationship_type_code = 'COMPONENT-OF'
726 AND sysdate BETWEEN nvl(active_start_date, sysdate-1)
727 AND nvl(active_end_date, sysdate+1);
728 END IF;
729
730 debug(' Inside API :csi_item_instance_pub.update_item_instance');
731 debug(' instance_id : '||l_u_instance_rec.instance_id);
732 debug(' instance_ovn : '||l_u_instance_rec.object_version_number);
733 debug(' quantity : '||l_u_instance_rec.quantity);
734
735 csi_item_instance_pub.update_item_instance(
736 p_api_version => 1.0,
737 p_commit => fnd_api.g_false,
738 p_init_msg_list => fnd_api.g_true,
739 p_validation_level => fnd_api.g_valid_level_full,
740 p_instance_rec => l_u_instance_rec,
741 p_party_tbl => l_u_parties_tbl,
742 p_account_tbl => l_u_pty_accts_tbl,
743 p_org_assignments_tbl => l_u_org_units_tbl,
744 p_ext_attrib_values_tbl => l_u_ea_values_tbl,
745 p_pricing_attrib_tbl => l_u_pricing_tbl,
746 p_asset_assignment_tbl => l_u_assets_tbl,
747 p_txn_rec => px_csi_txn_rec,
748 x_instance_id_lst => l_u_instance_ids_list,
749 x_return_status => l_return_status,
750 x_msg_count => l_msg_count,
751 x_msg_data => l_msg_data);
752
753 IF l_return_status not in (fnd_api.g_ret_sts_success, 'W') THEN
754 RAISE fnd_api.g_exc_error;
755 END IF;
756
757 x_ind := x_ind + 1;
758 l_instance_tbl(x_ind) := p_instance_rec;
759 l_instance_tbl(x_ind).quantity := 1;
760
761 FOR l_ind IN 1..(p_instance_rec.quantity - 1)
762 LOOP
763
764 l_instance_rec.quantity := 1;
765 l_instance_rec.instance_usage_code := 'RETURNED';
766
767 debug(' Inside API :csi_item_instance_pub.copy_item_instance');
768
769 csi_item_instance_pub.copy_item_instance(
770 p_api_version => 1.0,
771 p_commit => fnd_api.g_false,
772 p_init_msg_list => fnd_api.g_true,
773 p_validation_level => fnd_api.g_valid_level_full,
774 p_source_instance_rec => l_instance_rec,
775 p_copy_ext_attribs => fnd_api.g_true,
776 p_copy_org_assignments => fnd_api.g_true,
777 p_copy_parties => fnd_api.g_true,
778 p_copy_party_contacts => fnd_api.g_true,
779 p_copy_accounts => fnd_api.g_true,
780 p_copy_asset_assignments => fnd_api.g_true,
781 p_copy_pricing_attribs => fnd_api.g_true,
782 p_copy_inst_children => fnd_api.g_false,
783 p_txn_rec => px_csi_txn_rec,
784 x_new_instance_tbl => l_copy_instance_tbl,
785 x_return_status => l_return_status,
786 x_msg_count => l_msg_count,
787 x_msg_data => l_msg_data);
788
789 IF l_return_status <> fnd_api.g_ret_sts_success THEN
790 RAISE fnd_api.g_exc_error;
791 END IF;
792
793 IF l_copy_instance_tbl.COUNT > 0 THEN
794 FOR c_ind IN l_copy_instance_tbl.FIRST .. l_copy_instance_tbl.LAST
795 LOOP
796 x_ind := x_ind + 1;
797 l_instance_tbl(x_ind) := l_copy_instance_tbl(c_ind);
798
799 debug(' instance_id : '||l_copy_instance_tbl(c_ind).instance_id);
800 debug(' quantity : '||l_copy_instance_tbl(c_ind).quantity);
801
802 IF l_parent_instance_id is not null THEN
803
804 l_ii_rltns_tbl(1).relationship_id := fnd_api.g_miss_num;
805 l_ii_rltns_tbl(1).relationship_type_code := 'COMPONENT-OF';
806 l_ii_rltns_tbl(1).object_id := l_parent_instance_id;
807 l_ii_rltns_tbl(1).subject_id := l_copy_instance_tbl(c_ind).instance_id;
808
809 debug(' Inside API :csi_ii_relationships_pub.create_relationship');
810
811 csi_ii_relationships_pub.create_relationship(
812 p_api_version => 1.0,
813 p_commit => fnd_api.g_false,
814 p_init_msg_list => fnd_api.g_true,
815 p_validation_level => fnd_api.g_valid_level_full,
816 p_relationship_tbl => l_ii_rltns_tbl,
817 p_txn_rec => px_csi_txn_rec,
818 x_return_status => l_return_status,
819 x_msg_count => l_msg_count,
820 x_msg_data => l_msg_data);
821
822 IF l_return_status <> fnd_api.g_ret_sts_success THEN
823 RAISE fnd_api.g_exc_error;
824 END IF;
825
826 END IF;
827 END LOOP;
828 END IF;
829
830 END LOOP;
831 ELSE
832 x_ind := x_ind + 1;
833 l_instance_tbl(x_ind) := p_instance_rec;
834 END IF;
835
836 IF l_instance_tbl.COUNT > 0 THEN
837 FOR inst_ind IN l_instance_tbl.FIRST .. l_instance_tbl.LAST
838 LOOP
839 SELECT location_type_code,
840 instance_usage_code
841 INTO l_instance_tbl(inst_ind).location_type_code,
842 l_instance_tbl(inst_ind).instance_usage_code
843 FROM csi_item_instances
844 WHERE instance_id = l_instance_tbl(inst_ind).instance_id;
845 END LOOP;
846 END IF;
847
848 x_instance_tbl := l_instance_tbl;
849 END IF;
850 EXCEPTION
851 WHEN fnd_api.g_exc_error THEN
852 x_return_status := fnd_api.g_ret_sts_error;
853 END split_instances_using_copy;
854
855 PROCEDURE split_instance(
856 p_instance_id IN number,
857 p_quantity IN number,
858 px_csi_txn_rec IN OUT nocopy csi_datastructures_pub.transaction_rec,
859 x_instance_rec OUT nocopy csi_datastructures_pub.instance_rec,
860 x_return_status OUT nocopy varchar2)
861 IS
862 l_instance_quantity number;
863 l_instance_ovn number;
864
865 l_src_instance_rec csi_datastructures_pub.instance_rec;
866 l_new_instance_rec csi_datastructures_pub.instance_rec;
867
868 l_quantity1 number;
869 l_quantity2 number;
870
871 l_return_status varchar2(1) := fnd_api.g_ret_sts_success;
872 l_msg_data varchar2(2000);
873 l_msg_count number;
874 BEGIN
875
876 x_return_status := fnd_api.g_ret_sts_success;
877 api_log('split_instance');
878
879 SELECT quantity,
880 object_version_number
881 INTO l_instance_quantity,
882 l_instance_ovn
883 FROM csi_item_instances
884 WHERE instance_id = p_instance_id;
885
886 l_src_instance_rec.instance_id := p_instance_id;
887
888 l_quantity1 := l_instance_quantity - p_quantity;
889 l_quantity2 := p_quantity;
890
891 csi_t_gen_utility_pvt.dump_api_info(
892 p_pkg_name => 'csi_item_instance_pvt',
893 p_api_name => 'split_item_instance');
894
895 csi_item_instance_pvt.split_item_instance (
896 p_api_version => 1.0,
897 p_commit => fnd_api.g_false,
898 p_init_msg_list => fnd_api.g_true,
899 p_validation_level => fnd_api.g_valid_level_full,
900 p_source_instance_rec => l_src_instance_rec,
901 p_quantity1 => l_quantity1,
902 p_quantity2 => l_quantity2,
903 p_copy_ext_attribs => fnd_api.g_true,
904 p_copy_org_assignments => fnd_api.g_true,
905 p_copy_parties => fnd_api.g_true,
906 p_copy_accounts => fnd_api.g_true,
907 p_copy_asset_assignments => fnd_api.g_true,
908 p_copy_pricing_attribs => fnd_api.g_true,
909 p_txn_rec => px_csi_txn_rec,
910 x_new_instance_rec => l_new_instance_rec,
911 x_return_status => l_return_status,
912 x_msg_count => l_msg_count,
913 x_msg_data => l_msg_data);
914
915 IF l_return_status <> fnd_api.g_ret_sts_success THEN
916 RAISE fnd_api.g_exc_error;
917 END IF;
918
919 x_instance_rec := l_new_instance_rec;
920
921
922 EXCEPTION
923 WHEN fnd_api.g_exc_error THEN
924 x_return_status := fnd_api.g_ret_sts_error;
925 END split_instance;
926
927 PROCEDURE split_instance_using_ratio(
928 p_instance_id IN number,
929 p_qty_ratio IN number,
930 p_parent_qty IN number,
931 p_organization_id IN number,
932 px_csi_txn_rec IN OUT NOCOPY csi_datastructures_pub.transaction_rec,
933 x_splitted_instances OUT NOCOPY csi_datastructures_pub.instance_tbl,
934 x_return_status OUT NOCOPY varchar2)
935 IS
936
937 l_qty_remaining number;
938
939 l_init_instance_rec csi_datastructures_pub.instance_rec;
940 l_parent_instance_id number;
941 l_ii_rltns_tbl csi_datastructures_pub.ii_relationship_tbl;
942
943 l_return_status varchar2(1) := fnd_api.g_ret_sts_success;
944 l_msg_data varchar2(2000);
945 l_msg_count number;
946
947 l_split_flag boolean := FALSE;
948
949 l_splitted_instances csi_datastructures_pub.instance_tbl;
950 l_s_ind binary_integer;
951
952 -- get_item_instance_details variables
953 l_g_instance_rec csi_datastructures_pub.instance_header_rec;
954 l_g_ph_tbl csi_datastructures_pub.party_header_tbl;
955 l_g_pah_tbl csi_datastructures_pub.party_account_header_tbl;
956 l_g_ouh_tbl csi_datastructures_pub.org_units_header_tbl;
957 l_g_pa_tbl csi_datastructures_pub.pricing_attribs_tbl;
958 l_g_eav_tbl csi_datastructures_pub.extend_attrib_values_tbl;
959 l_g_ea_tbl csi_datastructures_pub.extend_attrib_tbl;
960 l_g_iah_tbl csi_datastructures_pub.instance_asset_header_tbl;
961 l_g_time_stamp date;
962
963 -- make_non_hdr variables
964 l_instance_rec csi_datastructures_pub.instance_rec;
965
966 -- update_item_instance variables
967 l_u_instance_rec csi_datastructures_pub.instance_rec;
968 l_u_parties_tbl csi_datastructures_pub.party_tbl;
969 l_u_pty_accts_tbl csi_datastructures_pub.party_account_tbl;
970 l_u_org_units_tbl csi_datastructures_pub.organization_units_tbl;
971 l_u_ea_values_tbl csi_datastructures_pub.extend_attrib_values_tbl;
972 l_u_pricing_tbl csi_datastructures_pub.pricing_attribs_tbl;
973 l_u_assets_tbl csi_datastructures_pub.instance_asset_tbl;
974 l_u_instance_ids_list csi_datastructures_pub.id_tbl;
975
976 -- create_item_instance varaibles
977 l_c_instance_rec csi_datastructures_pub.instance_rec;
978 l_c_parties_tbl csi_datastructures_pub.party_tbl;
979 l_c_pty_accts_tbl csi_datastructures_pub.party_account_tbl;
980 l_c_org_units_tbl csi_datastructures_pub.organization_units_tbl;
981 l_c_ea_values_tbl csi_datastructures_pub.extend_attrib_values_tbl;
982 l_c_pricing_tbl csi_datastructures_pub.pricing_attribs_tbl;
983 l_c_assets_tbl csi_datastructures_pub.instance_asset_tbl;
984 c_pa_ind binary_integer;
985
986 BEGIN
987
988 x_return_status := fnd_api.g_ret_sts_success;
989
990 api_log('split_instance_using_ratio');
991
992 l_s_ind := 0;
993
994 l_g_instance_rec.instance_id := p_instance_id;
995
996 debug(' Inside API :csi_item_instance_pub.get_item_instance_details');
997
998 -- get the instance party and party account info
999 csi_item_instance_pub.get_item_instance_details(
1000 p_api_version => 1.0,
1001 p_commit => fnd_api.g_false,
1002 p_init_msg_list => fnd_api.g_true,
1003 p_validation_level => fnd_api.g_valid_level_full,
1004 p_instance_rec => l_g_instance_rec,
1005 p_get_parties => fnd_api.g_true,
1006 p_party_header_tbl => l_g_ph_tbl,
1007 p_get_accounts => fnd_api.g_true,
1008 p_account_header_tbl => l_g_pah_tbl,
1009 p_get_org_assignments => fnd_api.g_false,
1010 p_org_header_tbl => l_g_ouh_tbl,
1011 p_get_pricing_attribs => fnd_api.g_false,
1012 p_pricing_attrib_tbl => l_g_pa_tbl,
1013 p_get_ext_attribs => fnd_api.g_false,
1014 p_ext_attrib_tbl => l_g_eav_tbl,
1015 p_ext_attrib_def_tbl => l_g_ea_tbl,
1016 p_get_asset_assignments => fnd_api.g_false,
1017 p_asset_header_tbl => l_g_iah_tbl,
1018 p_time_stamp => l_g_time_stamp,
1019 x_return_status => l_return_status,
1020 x_msg_count => l_msg_count,
1021 x_msg_data => l_msg_data);
1022
1023 IF l_return_status <> fnd_api.g_ret_sts_success THEN
1024 RAISE fnd_api.g_exc_error;
1025 END IF;
1026
1027 make_non_header_rec(
1028 p_instance_header_rec => l_g_instance_rec,
1029 x_instance_rec => l_instance_rec,
1030 x_return_status => l_return_status);
1031
1032 debug(' comp_instance_id : '||l_instance_rec.instance_id);
1033 debug(' comp_quantity : '||l_instance_rec.quantity);
1034 debug(' comp_usage_code : '||l_instance_rec.instance_usage_code);
1035
1036 IF l_instance_rec.instance_usage_code = 'IN_RELATIONSHIP' THEN
1037 BEGIN
1038 SELECT object_id
1039 INTO l_parent_instance_id
1040 FROM csi_ii_relationships
1041 WHERE subject_id = l_instance_rec.instance_id
1042 AND relationship_type_code = 'COMPONENT-OF';
1043 EXCEPTION
1044 WHEN no_data_found THEN
1045 null;
1046 END;
1047 END IF;
1048
1049 debug(' loop thru to split. allocate and update');
1050
1051 l_qty_remaining := l_g_instance_rec.quantity;
1052
1053 FOR ind IN 1 .. p_parent_qty
1054 LOOP
1055
1056 IF l_qty_remaining > p_qty_ratio THEN
1057
1058 l_split_flag := TRUE;
1059
1060 -- initialize the record structure
1061 l_c_instance_rec := l_init_instance_rec;
1062 l_u_instance_rec := l_init_instance_rec;
1063
1064 l_qty_remaining := l_qty_remaining - p_qty_ratio;
1065
1066
1067 l_c_instance_rec := l_instance_rec;
1068
1069 -- substitute create specific attributes
1070 l_c_instance_rec.instance_id := fnd_api.g_miss_num;
1071 l_c_instance_rec.instance_number := fnd_api.g_miss_char;
1072 l_c_instance_rec.object_version_number := 1.0;
1073 l_c_instance_rec.vld_organization_id := p_organization_id;
1074 l_c_instance_rec.quantity := p_qty_ratio;
1075
1076 -- build party
1077 l_c_parties_tbl.DELETE;
1078 l_c_pty_accts_tbl.DELETE;
1079 c_pa_ind := 0;
1080
1081 IF l_g_ph_tbl.COUNT > 0 THEN
1082
1083 FOR l_pt_ind IN l_g_ph_tbl.FIRST ..l_g_ph_tbl.LAST
1084 LOOP
1085 l_c_parties_tbl(l_pt_ind).instance_party_id := fnd_api.g_miss_num;
1086 l_c_parties_tbl(l_pt_ind).instance_id := fnd_api.g_miss_num;
1087 l_c_parties_tbl(l_pt_ind).party_id :=
1088 l_g_ph_tbl(l_pt_ind).party_id;
1089 l_c_parties_tbl(l_pt_ind).party_source_table :=
1090 l_g_ph_tbl(l_pt_ind).party_source_table;
1091 l_c_parties_tbl(l_pt_ind).relationship_type_code :=
1092 l_g_ph_tbl(l_pt_ind).relationship_type_code;
1093 l_c_parties_tbl(l_pt_ind).contact_flag := 'N';
1094
1095 -- build party account
1096 IF l_g_pah_tbl.COUNT > 0 THEN
1097 FOR l_pa_ind IN l_g_pah_tbl.FIRST..l_g_pah_tbl.LAST
1098 LOOP
1099 IF l_g_pah_tbl(l_pa_ind).instance_party_id = l_g_ph_tbl(l_pt_ind).instance_party_id
1100 THEN
1101 c_pa_ind := c_pa_ind + 1;
1102 l_c_pty_accts_tbl(c_pa_ind).parent_tbl_index := l_pt_ind;
1103 l_c_pty_accts_tbl(c_pa_ind).ip_account_id := fnd_api.g_miss_num;
1104 l_c_pty_accts_tbl(c_pa_ind).instance_party_id := fnd_api.g_miss_num;
1105 l_c_pty_accts_tbl(c_pa_ind).party_account_id :=
1106 l_g_pah_tbl(l_pa_ind).party_account_id;
1107 l_c_pty_accts_tbl(c_pa_ind).relationship_type_code :=
1108 l_g_pah_tbl(l_pa_ind).relationship_type_code;
1109 END IF;
1110 END LOOP;
1111 END IF;
1112
1113 END LOOP;
1114 END IF;
1115
1116 debug(' alloc_qty(new) : '||l_c_instance_rec.quantity);
1117
1118 -- create a new instance for the decremented qty
1119 debug(' Inside API :csi_item_instance_pub.create_item_instance');
1120
1121 csi_item_instance_pub.create_item_instance(
1122 p_api_version => 1.0,
1123 p_commit => fnd_api.g_false,
1124 p_init_msg_list => fnd_api.g_true,
1125 p_validation_level => fnd_api.g_valid_level_full,
1126 p_instance_rec => l_c_instance_rec,
1127 p_party_tbl => l_c_parties_tbl,
1128 p_account_tbl => l_c_pty_accts_tbl,
1129 p_org_assignments_tbl => l_c_org_units_tbl,
1130 p_ext_attrib_values_tbl => l_c_ea_values_tbl,
1131 p_pricing_attrib_tbl => l_c_pricing_tbl,
1132 p_asset_assignment_tbl => l_c_assets_tbl,
1133 p_txn_rec => px_csi_txn_rec,
1134 x_return_status => l_return_status,
1135 x_msg_count => l_msg_count,
1136 x_msg_data => l_msg_data );
1137
1138 IF l_return_status <> fnd_api.g_ret_sts_success THEN
1139 RAISE fnd_api.g_exc_error;
1140 END IF;
1141
1142 debug(' new_instance_id : '||l_c_instance_rec.instance_id);
1143
1144 l_s_ind := l_s_ind + 1;
1145 l_splitted_instances(l_s_ind) := l_c_instance_rec;
1146
1147 l_ii_rltns_tbl.delete;
1148
1149 IF l_parent_instance_id is not null THEN
1150
1151 l_ii_rltns_tbl(1).relationship_id := fnd_api.g_miss_num;
1152 l_ii_rltns_tbl(1).relationship_type_code := 'COMPONENT-OF';
1153 l_ii_rltns_tbl(1).object_id := l_parent_instance_id;
1154 l_ii_rltns_tbl(1).subject_id := l_c_instance_rec.instance_id;
1155
1156 debug(' Inside API :csi_ii_relationships_pub.create_relationship');
1157
1158 csi_ii_relationships_pub.create_relationship(
1159 p_api_version => 1.0,
1160 p_commit => fnd_api.g_false,
1161 p_init_msg_list => fnd_api.g_true,
1162 p_validation_level => fnd_api.g_valid_level_full,
1163 p_relationship_tbl => l_ii_rltns_tbl,
1164 p_txn_rec => px_csi_txn_rec,
1165 x_return_status => l_return_status,
1166 x_msg_count => l_msg_count,
1167 x_msg_data => l_msg_data);
1168
1169 IF l_return_status <> fnd_api.g_ret_sts_success THEN
1170 RAISE fnd_api.g_exc_error;
1171 END IF;
1172
1173 END IF;
1174
1175 -- decrementing the existing wip instance with the remaining quantity
1176 l_u_instance_rec.instance_id := p_instance_id;
1177 l_u_instance_rec.quantity := l_qty_remaining;
1178 l_u_instance_rec.vld_organization_id := p_organization_id;
1179
1180 SELECT object_version_number
1181 INTO l_u_instance_rec.object_version_number
1182 FROM csi_item_instances
1183 WHERE instance_id = l_u_instance_rec.instance_id;
1184
1185 debug(' remain_qty(upd) : '||l_u_instance_rec.quantity);
1186 debug(' Inside API :csi_item_instance_pub.update_item_instance');
1187 debug(' old_instance_id : '||l_u_instance_rec.instance_id);
1188
1189 csi_item_instance_pub.update_item_instance(
1190 p_api_version => 1.0,
1191 p_commit => fnd_api.g_false,
1192 p_init_msg_list => fnd_api.g_true,
1193 p_validation_level => fnd_api.g_valid_level_full,
1194 p_instance_rec => l_u_instance_rec,
1195 p_party_tbl => l_u_parties_tbl,
1196 p_account_tbl => l_u_pty_accts_tbl,
1197 p_org_assignments_tbl => l_u_org_units_tbl,
1198 p_ext_attrib_values_tbl => l_u_ea_values_tbl,
1199 p_pricing_attrib_tbl => l_u_pricing_tbl,
1200 p_asset_assignment_tbl => l_u_assets_tbl,
1201 p_txn_rec => px_csi_txn_rec,
1202 x_instance_id_lst => l_u_instance_ids_list,
1203 x_return_status => l_return_status,
1204 x_msg_count => l_msg_count,
1205 x_msg_data => l_msg_data);
1206
1207 IF l_return_status not in (fnd_api.g_ret_sts_success, 'W') THEN
1208 RAISE fnd_api.g_exc_error;
1209 END IF;
1210
1211 ELSE
1212
1213 -- we get two cases here < and =
1214 -- when the remaining qty is < ratio do not allocate it to an assy instance
1215 -- making sure that assy instances are always getting the full ratio. this
1216 -- simplifies the process of elliminating assy instances when further partial
1217 -- issues are done. otherwise it is difficult to get the partially allocated
1218 -- component instance and update it with the remaining ratio qty blah blah blah
1219 --(just simplifying my coding)
1220
1221 IF l_qty_remaining < p_qty_ratio THEN
1222 NULL;
1223 ELSE
1224
1225 l_s_ind := l_s_ind + 1;
1226
1227 IF l_split_flag THEN
1228 l_splitted_instances(l_s_ind) := l_u_instance_rec;
1229 ELSE
1230 l_splitted_instances(l_s_ind) := l_instance_rec;
1231 END IF;
1232
1233 END IF;
1234
1235 EXIT;
1236
1237 END IF;
1238
1239 END LOOP;
1240
1241
1242 IF l_splitted_instances.COUNT > 0 THEN
1243 FOR x_ind IN l_splitted_instances.FIRST .. l_splitted_instances.LAST
1244 LOOP
1245 SELECT location_type_code,
1246 instance_usage_code
1247 INTO l_splitted_instances(x_ind).location_type_code,
1248 l_splitted_instances(x_ind).instance_usage_code
1249 FROM csi_item_instances
1250 WHERE instance_id = l_splitted_instances(x_ind).instance_id;
1251 END LOOP;
1252 END IF;
1253
1254 debug('splitted instances count :'||l_splitted_instances.COUNT);
1255
1256 x_splitted_instances := l_splitted_instances;
1257
1258 EXCEPTION
1259 WHEN fnd_api.g_exc_error THEN
1260 x_return_status := fnd_api.g_ret_sts_error;
1261 END split_instance_using_ratio;
1262
1263
1264 PROCEDURE query_immediate_children (
1265 p_parent_line_id IN number,
1266 x_line_tbl OUT NOCOPY oe_order_pub.line_tbl_type)
1267 IS
1268
1269 l_line_rec oe_order_pub.line_rec_type := oe_order_pub.g_miss_line_rec;
1270
1271 CURSOR op_cur is
1272 SELECT line_id
1273 FROM oe_order_lines_all
1274 WHERE link_to_line_id = p_parent_line_id
1275 and nvl(cancelled_flag, 'N') <> 'Y' -- added for Bug 2946778. shegde
1276 ORDER BY line_number, shipment_number, option_number;
1277
1278 BEGIN
1279
1280 debug('Getting next level children for Line ID :'||p_parent_line_id);
1281
1282 FOR op_rec IN op_cur
1283 LOOP
1284
1285 IF op_rec.line_id <> p_parent_line_id THEN
1286
1287 oe_line_util.query_row(
1288 p_line_id => op_rec.line_id,
1289 x_line_rec => l_line_rec );
1290
1291 x_line_tbl(x_line_tbl.COUNT + 1) := l_line_rec;
1292
1293 END IF;
1294
1295 END LOOP;
1296
1297 debug('Children count :'||x_line_tbl.COUNT);
1298
1299 END query_immediate_children;
1300
1301 /* --------------------------------------------------------------------- */
1302 /* This routine gets the next level trackable order line details for the */
1303 /* currently processed order line id(MODEL, CLASS, KIT) */
1304 /* */
1305 /* Here is an example: */
1306 /* A (MODEL) */
1307 /* / \ */
1308 /* Non Trk (OC) B C (OC) Trk */
1309 /* / \ \ */
1310 /* D E F */
1311 /* Both D and E are trackable option items. In this example while */
1312 /* processing the Model (A) the relationship will be build between */
1313 /* A => C, A => D, A = E. Option class B will be ignored */
1314 /* --------------------------------------------------------------------- */
1315
1316 PROCEDURE get_ib_trackable_children(
1317 p_current_line_id IN number,
1318 p_om_vld_org_id IN number,
1319 x_trackable_line_tbl OUT NOCOPY oe_order_pub.line_tbl_type,
1320 x_return_status OUT NOCOPY varchar2)
1321 IS
1322
1323 l_line_tbl oe_order_pub.line_tbl_type;
1324 l_line_tbl_nxt_lvl oe_order_pub.line_tbl_type;
1325 l_line_tbl_temp oe_order_pub.line_tbl_type;
1326 l_line_tbl_final oe_order_pub.line_tbl_type;
1327
1328 l_config_line_rec oe_order_pub.line_rec_type := oe_order_pub.g_miss_line_rec;
1329
1330 l_nxt_ind binary_integer;
1331 l_final_ind binary_integer;
1332
1333 l_ib_trackable_flag varchar2(1);
1334 l_config_found boolean := FALSE;
1335 l_lvl number := 0;
1336 l_lpad_string varchar2(80);
1337
1338 BEGIN
1339
1340 x_return_status := fnd_api.g_ret_sts_success;
1341 api_log('get_ib_trackable_children');
1342
1343 debug('lvl_0_line_id : '||p_current_line_id);
1344 l_final_ind := 0;
1345
1346 query_immediate_children (
1347 p_parent_line_id => p_current_line_id,
1348 x_line_tbl => l_line_tbl);
1349
1350 l_lvl := 1;
1351
1352 <<Next_Level>>
1353
1354 l_line_tbl_nxt_lvl.delete;
1355 l_nxt_ind := 0;
1356
1357 IF l_line_tbl.count > 0 THEN
1358
1359 FOR l_ind IN l_line_tbl.FIRST .. l_line_tbl.LAST
1360 LOOP
1361 l_lpad_string := lpad(' ',l_lvl*2, ' ');
1362
1363 debug(l_lpad_string||'lvl_'||l_lvl||'_line_id : '||l_line_tbl(l_ind).line_id);
1364
1365 SELECT nvl(msi.comms_nl_trackable_flag,'N')
1366 INTO l_ib_trackable_flag
1367 FROM mtl_system_items msi
1368 WHERE msi.inventory_item_id = l_line_tbl(l_ind).inventory_item_id
1369 AND msi.organization_id = p_om_vld_org_id;
1370
1371 debug(l_lpad_string||'item_type_code : '||l_line_tbl(l_ind).item_type_code);
1372 debug(l_lpad_string||'ib_trackable_flag : '||l_ib_trackable_flag);
1373
1374 /* if trackable populate it for the final out table */
1375 IF l_ib_trackable_flag = 'Y' THEN
1376
1377 l_final_ind := l_final_ind + 1;
1378 l_line_tbl_final(l_final_ind) := l_line_tbl(l_ind);
1379
1380 ELSE --[NOT Trackable]
1381
1382 /* get the next level using this line ID as the parent */
1383
1384 query_immediate_children (
1385 p_parent_line_id => l_line_tbl(l_ind).line_id,
1386 x_line_tbl => l_line_tbl_temp);
1387
1388 IF l_line_tbl_temp.count > 0 THEN
1389 FOR l_temp_ind IN l_line_tbl_temp.FIRST .. l_line_tbl_temp.LAST
1390 LOOP
1391
1392 l_nxt_ind := l_nxt_ind + 1;
1393 l_line_tbl_nxt_lvl (l_nxt_ind) := l_line_tbl_temp(l_temp_ind);
1394
1395 END LOOP;
1396 END IF;
1397
1398 END IF;
1399
1400 END LOOP;
1401
1402 IF l_line_tbl_nxt_lvl.COUNT > 0 THEN
1403 l_line_tbl.DELETE;
1404 l_line_tbl := l_line_tbl_nxt_lvl;
1405
1406 l_lvl := l_lvl + 1;
1407 goto Next_Level;
1408
1409 END IF;
1410
1411 END IF;
1412
1413 l_config_found := FALSE;
1414
1415 IF l_line_tbl_final.count > 0 THEN
1416 FOR l_ind IN l_line_tbl_final.FIRST .. l_line_tbl_final.LAST
1417 LOOP
1418 IF l_line_tbl_final(l_ind).item_type_code = 'CONFIG' THEN
1419 l_config_found := TRUE;
1420 l_config_line_rec := l_line_tbl_final(l_ind);
1421 exit;
1422 END IF;
1423 END LOOP;
1424 END IF;
1425
1426 IF l_config_found THEN
1427 x_trackable_line_tbl(1) := l_config_line_rec;
1428 ELSE
1429 x_trackable_line_tbl := l_line_tbl_final;
1430 END IF;
1431
1432 debug('ib trackable children count :'||x_trackable_line_tbl.COUNT);
1433
1434 END get_ib_trackable_children;
1435
1436 PROCEDURE get_all_ib_trackable_children(
1437 p_model_line_id IN number,
1438 p_om_vld_org_id IN number,
1439 x_trackable_line_tbl OUT NOCOPY oe_order_pub.line_tbl_type,
1440 x_return_status OUT NOCOPY varchar2)
1441 IS
1442
1443 l_line_tbl oe_order_pub.line_tbl_type;
1444 l_line_tbl_nxt_lvl oe_order_pub.line_tbl_type;
1445 l_line_tbl_temp oe_order_pub.line_tbl_type;
1446 l_line_tbl_final oe_order_pub.line_tbl_type;
1447
1448 l_nxt_ind binary_integer;
1449 l_final_ind binary_integer;
1450
1451 l_return_status varchar2(1) := fnd_api.g_ret_sts_success;
1452
1453 BEGIN
1454
1455 x_return_status := fnd_api.g_ret_sts_success;
1456
1457 l_final_ind := 0;
1458
1459 get_ib_trackable_children(
1460 p_current_line_id => p_model_line_id,
1461 p_om_vld_org_id => p_om_vld_org_id,
1462 x_trackable_line_tbl => l_line_tbl,
1463 x_return_status => l_return_status);
1464
1465 <<Next_Level>>
1466
1467 l_line_tbl_nxt_lvl.delete;
1468 l_nxt_ind := 0;
1469
1470 IF l_line_tbl.count > 0 THEN
1471
1472 FOR l_ind IN l_line_tbl.FIRST .. l_line_tbl.LAST
1473 LOOP
1474
1475 l_final_ind := l_final_ind + 1;
1476 l_line_tbl_final(l_final_ind) := l_line_tbl(l_ind);
1477
1478 /* get the next level using this line ID as the parent */
1479
1480 get_ib_trackable_children(
1481 p_current_line_id => l_line_tbl(l_ind).line_id,
1482 p_om_vld_org_id => p_om_vld_org_id,
1483 x_trackable_line_tbl => l_line_tbl_temp,
1484 x_return_status => l_return_status);
1485
1486 IF l_line_tbl_temp.count > 0 THEN
1487 FOR l_temp_ind IN l_line_tbl_temp.FIRST .. l_line_tbl_temp.LAST
1488 LOOP
1489
1490 l_nxt_ind := l_nxt_ind + 1;
1491 l_line_tbl_nxt_lvl (l_nxt_ind) := l_line_tbl_temp(l_temp_ind);
1492
1493 END LOOP;
1494 END IF;
1495
1496 END LOOP;
1497
1498 IF l_line_tbl_nxt_lvl.COUNT > 0 THEN
1499 l_line_tbl.DELETE;
1500 l_line_tbl := l_line_tbl_nxt_lvl;
1501
1502 goto Next_Level;
1503
1504 END IF;
1505
1506 END IF;
1507
1508 x_trackable_line_tbl := l_line_tbl_final;
1509
1510 END get_all_ib_trackable_children;
1511
1512
1513 /* --------------------------------------------------------------- */
1514 /* this routine gets the default transaction sub type id for the */
1515 /* given transaction type id. For order management the transaction */
1516 /* type id is hard coded as 51 */
1517 /* --------------------------------------------------------------- */
1518
1519 PROCEDURE get_txn_sub_type_id(
1520 p_txn_type_id IN number,
1521 x_txn_sub_type_id OUT NOCOPY number,
1522 x_return_status OUT NOCOPY varchar2)
1523 IS
1524 BEGIN
1525
1526 SELECT sub_type_id
1527 INTO x_txn_sub_type_id
1528 FROM csi_txn_sub_types
1529 WHERE transaction_type_id = p_txn_type_id
1530 AND default_flag = 'Y';
1531
1532 EXCEPTION
1533 WHEN no_data_found THEN
1534 x_return_status := fnd_api.g_ret_sts_error;
1535 FND_MESSAGE.set_name('CSI','CSI_INVALID_TXN_TYPE_ID');
1536 FND_MSG_PUB.add;
1537 WHEN too_many_rows THEN
1538 x_return_status := fnd_api.g_ret_sts_error;
1539 FND_MESSAGE.set_name('CSI','CSI_INVALID_TXN_TYPE_ID');
1540 FND_MSG_PUB.add;
1541 END get_txn_sub_type_id;
1542
1543 /* This routine splits the transaction details in to quantity one each */
1544 PROCEDURE split_txn_dtls(
1545 p_line_dtl_tbl IN csi_t_datastructures_grp.txn_line_detail_tbl,
1546 p_ii_rltns_tbl IN csi_t_datastructures_grp.txn_ii_rltns_tbl,
1547 x_return_status OUT NOCOPY varchar2)
1548 IS
1549 l_txn_line_query_rec csi_t_datastructures_grp.txn_line_query_rec;
1550 l_txn_line_detail_query_rec csi_t_datastructures_grp.txn_line_detail_query_rec;
1551
1552 l_line_dtl_rec csi_t_datastructures_grp.txn_line_detail_rec;
1553 l_line_dtl_tbl csi_t_datastructures_grp.txn_line_detail_tbl;
1554 l_pty_dtl_tbl csi_t_datastructures_grp.txn_party_detail_tbl;
1555 l_pty_acct_tbl csi_t_datastructures_grp.txn_pty_acct_detail_tbl;
1556 l_ii_rltns_tbl csi_t_datastructures_grp.txn_ii_rltns_tbl;
1557 l_org_assgn_tbl csi_t_datastructures_grp.txn_org_assgn_tbl;
1558 l_ext_attrib_tbl csi_t_datastructures_grp.txn_ext_attrib_vals_tbl;
1559 l_csi_ea_tbl csi_t_datastructures_grp.csi_ext_attribs_tbl;
1560 l_csi_eav_tbl csi_t_datastructures_grp.csi_ext_attrib_vals_tbl;
1561 l_txn_systems_tbl csi_t_datastructures_grp.txn_systems_tbl;
1562
1563 l_p_ii_rltns_tbl csi_t_datastructures_grp.txn_ii_rltns_tbl;
1564 l_split_count number;
1565
1566 l_c_pty_ind binary_integer;
1567 l_c_pa_ind binary_integer;
1568
1569 l_return_status varchar2(1) := fnd_api.g_ret_sts_success;
1570 l_msg_count number;
1571 l_msg_data varchar2(2000);
1572
1573 BEGIN
1574
1575 x_return_status := fnd_api.g_ret_sts_success;
1576
1577 api_log('split_txn_dtls');
1578
1579 l_split_count := 0;
1580
1581 IF p_line_dtl_tbl.COUNT > 0 THEN
1582 FOR l_td_ind in p_line_dtl_tbl.FIRST .. p_line_dtl_tbl.LAST
1583 LOOP
1584 IF p_line_dtl_tbl(l_td_ind).quantity > 1 THEN
1585
1586 l_split_count := l_split_count + 1;
1587
1588 update csi_t_txn_line_details
1589 set quantity = 1,
1590 processing_status = 'IN_PROCESS' ,
1591 source_txn_line_detail_id = p_line_dtl_tbl(l_td_ind).txn_line_detail_id
1592 where txn_line_detail_id = p_line_dtl_tbl(l_td_ind).txn_line_detail_id;
1593
1594 l_txn_line_detail_query_rec.txn_line_detail_id := p_line_dtl_tbl(l_td_ind).txn_line_detail_id;
1595
1596 -- get_txn_line_details
1597 csi_t_txn_details_grp.get_transaction_details(
1598 p_api_version => 1,
1599 p_commit => fnd_api.g_false,
1600 p_init_msg_list => fnd_api.g_true,
1601 p_validation_level => fnd_api.g_valid_level_full,
1602 p_txn_line_query_rec => l_txn_line_query_rec,
1603 p_txn_line_detail_query_rec => l_txn_line_detail_query_rec,
1604 x_txn_line_detail_tbl => l_line_dtl_tbl,
1605 p_get_parties_flag => fnd_api.g_true,
1606 x_txn_party_detail_tbl => l_pty_dtl_tbl,
1607 p_get_pty_accts_flag => fnd_api.g_true,
1608 x_txn_pty_acct_detail_tbl => l_pty_acct_tbl,
1609 p_get_ii_rltns_flag => fnd_api.g_false,
1610 x_txn_ii_rltns_tbl => l_ii_rltns_tbl,
1611 p_get_org_assgns_flag => fnd_api.g_true,
1612 x_txn_org_assgn_tbl => l_org_assgn_tbl,
1613 p_get_ext_attrib_vals_flag => fnd_api.g_true,
1614 x_txn_ext_attrib_vals_tbl => l_ext_attrib_tbl,
1615 p_get_csi_attribs_flag => fnd_api.g_false,
1616 x_csi_ext_attribs_tbl => l_csi_ea_tbl,
1617 p_get_csi_iea_values_flag => fnd_api.g_false,
1618 x_csi_iea_values_tbl => l_csi_eav_tbl,
1619 p_get_txn_systems_flag => fnd_api.g_false,
1620 x_txn_systems_tbl => l_txn_systems_tbl,
1621 x_return_status => l_return_status,
1622 x_msg_count => l_msg_count,
1623 x_msg_data => l_msg_data);
1624
1625 IF l_return_status <> fnd_api.g_ret_sts_success THEN
1626 debug('Error getting txn details for splitting the source for model.');
1627 RAISE fnd_api.g_exc_error;
1628 END IF;
1629
1630 FOR l_ind in 1..(p_line_dtl_tbl(l_td_ind).quantity - 1)
1631 LOOP
1632
1633 -- convert ids to indexes
1634 csi_t_utilities_pvt.convert_ids_to_index(
1635 px_line_dtl_tbl => l_line_dtl_tbl,
1636 px_pty_dtl_tbl => l_pty_dtl_tbl,
1637 px_pty_acct_tbl => l_pty_acct_tbl,
1638 px_ii_rltns_tbl => l_ii_rltns_tbl,
1639 px_org_assgn_tbl => l_org_assgn_tbl,
1640 px_ext_attrib_tbl => l_ext_attrib_tbl,
1641 px_txn_systems_tbl => l_txn_systems_tbl);
1642
1643 --create txn_line_details for quantity 1;
1644 l_line_dtl_rec := l_line_dtl_tbl(1);
1645 l_line_dtl_rec.transaction_line_id := p_line_dtl_tbl(l_td_ind).transaction_line_id;
1646 l_line_dtl_rec.quantity := 1;
1647 l_line_dtl_rec.processing_status := 'IN_PROCESS';
1648
1649 ---Added (Start) for m-to-m enhancements
1650 l_line_dtl_rec.source_txn_line_detail_id :=
1651 p_line_dtl_tbl(l_td_ind).txn_line_detail_id ;
1652 ---Added (End) for m-to-m enhancements
1653
1654 csi_t_txn_line_dtls_pvt.create_txn_line_dtls(
1655 p_api_version => 1.0,
1656 p_commit => fnd_api.g_false,
1657 p_init_msg_list => fnd_api.g_true,
1658 p_validation_level => fnd_api.g_valid_level_full,
1659 p_txn_line_dtl_index => 1,
1660 p_txn_line_dtl_rec => l_line_dtl_rec,
1661 px_txn_party_dtl_tbl => l_pty_dtl_tbl,
1662 px_txn_pty_acct_detail_tbl => l_pty_acct_tbl,
1663 px_txn_ii_rltns_tbl => l_ii_rltns_tbl,
1664 px_txn_org_assgn_tbl => l_org_assgn_tbl,
1665 px_txn_ext_attrib_vals_tbl => l_ext_attrib_tbl,
1666 x_return_status => l_return_status,
1667 x_msg_count => l_msg_count,
1668 x_msg_data => l_msg_data);
1669
1670 IF l_return_status <> fnd_api.g_ret_sts_success THEN
1671 debug('Error creating txn details for splitting the source for model.');
1672 raise fnd_api.g_exc_error;
1673 END IF;
1674
1675 l_line_dtl_tbl(1) := l_line_dtl_rec;
1676
1677 END LOOP; -- (qauantity -1) loop
1678
1679 ELSE
1680
1681 update csi_t_txn_line_details
1682 set processing_status = 'IN_PROCESS'
1683 where txn_line_detail_id = p_line_dtl_tbl(l_td_ind).txn_line_detail_id;
1684
1685 END IF; -- qty > 1
1686
1687 END LOOP;
1688 END IF;
1689
1690 debug('Splitted Transaction Details :'||l_split_count );
1691
1692 EXCEPTION
1693 WHEN fnd_api.g_exc_error THEN
1694 l_return_status := FND_API.g_ret_sts_error;
1695 END split_txn_dtls;
1696
1697 PROCEDURE split_txn_dtls_with_ratio(
1698 p_quantity_ratio IN number,
1699 px_line_dtl_tbl IN OUT NOCOPY csi_t_datastructures_grp.txn_line_detail_tbl,
1700 x_return_status OUT NOCOPY varchar2)
1701 IS
1702
1703 l_txn_line_query_rec csi_t_datastructures_grp.txn_line_query_rec;
1704 l_txn_line_detail_query_rec csi_t_datastructures_grp.txn_line_detail_query_rec;
1705
1706 l_line_dtl_rec csi_t_datastructures_grp.txn_line_detail_rec;
1707 l_line_dtl_tbl csi_t_datastructures_grp.txn_line_detail_tbl;
1708 l_pty_dtl_tbl csi_t_datastructures_grp.txn_party_detail_tbl;
1709 l_pty_acct_tbl csi_t_datastructures_grp.txn_pty_acct_detail_tbl;
1710 l_ii_rltns_tbl csi_t_datastructures_grp.txn_ii_rltns_tbl;
1711 l_org_assgn_tbl csi_t_datastructures_grp.txn_org_assgn_tbl;
1712 l_ext_attrib_tbl csi_t_datastructures_grp.txn_ext_attrib_vals_tbl;
1713 l_csi_ea_tbl csi_t_datastructures_grp.csi_ext_attribs_tbl;
1714 l_csi_eav_tbl csi_t_datastructures_grp.csi_ext_attrib_vals_tbl;
1715 l_txn_systems_tbl csi_t_datastructures_grp.txn_systems_tbl;
1716
1717 l_td_quantity number;
1718
1719 l_o_line_dtl_tbl csi_t_datastructures_grp.txn_line_detail_tbl;
1720 l_o_ind binary_integer := 0;
1721
1722 l_return_status varchar2(1) := fnd_api.g_ret_sts_success;
1723 l_msg_count number;
1724 l_msg_data varchar2(2000);
1725
1726 BEGIN
1727
1728 x_return_status := fnd_api.g_ret_sts_success;
1729 api_log('split_txn_dtls_with_ratio');
1730
1731 IF px_line_dtl_tbl.COUNT > 0 THEN
1732 FOR l_td_ind in px_line_dtl_tbl.FIRST .. px_line_dtl_tbl.LAST
1733 LOOP
1734 IF px_line_dtl_tbl(l_td_ind).quantity > p_quantity_ratio THEN
1735
1736 update csi_t_txn_line_details
1737 set quantity = p_quantity_ratio,
1738 processing_status = 'IN_PROCESS'
1739 where txn_line_detail_id = px_line_dtl_tbl(l_td_ind).txn_line_detail_id;
1740
1741 l_o_ind := l_o_ind + 1;
1742 l_o_line_dtl_tbl(l_o_ind) := px_line_dtl_tbl(l_td_ind);
1743 l_o_line_dtl_tbl(l_o_ind).quantity := p_quantity_ratio;
1744
1745 l_txn_line_detail_query_rec.txn_line_detail_id := px_line_dtl_tbl(l_td_ind).txn_line_detail_id;
1746
1747 -- get_txn_line_details
1748 csi_t_txn_details_grp.get_transaction_details(
1749 p_api_version => 1,
1750 p_commit => fnd_api.g_false,
1751 p_init_msg_list => fnd_api.g_true,
1752 p_validation_level => fnd_api.g_valid_level_full,
1753 p_txn_line_query_rec => l_txn_line_query_rec,
1754 p_txn_line_detail_query_rec => l_txn_line_detail_query_rec,
1755 x_txn_line_detail_tbl => l_line_dtl_tbl,
1756 p_get_parties_flag => fnd_api.g_true,
1757 x_txn_party_detail_tbl => l_pty_dtl_tbl,
1758 p_get_pty_accts_flag => fnd_api.g_true,
1759 x_txn_pty_acct_detail_tbl => l_pty_acct_tbl,
1760 p_get_ii_rltns_flag => fnd_api.g_false,
1761 x_txn_ii_rltns_tbl => l_ii_rltns_tbl,
1762 p_get_org_assgns_flag => fnd_api.g_true,
1763 x_txn_org_assgn_tbl => l_org_assgn_tbl,
1764 p_get_ext_attrib_vals_flag => fnd_api.g_true,
1765 x_txn_ext_attrib_vals_tbl => l_ext_attrib_tbl,
1766 p_get_csi_attribs_flag => fnd_api.g_false,
1767 x_csi_ext_attribs_tbl => l_csi_ea_tbl,
1768 p_get_csi_iea_values_flag => fnd_api.g_false,
1769 x_csi_iea_values_tbl => l_csi_eav_tbl,
1770 p_get_txn_systems_flag => fnd_api.g_false,
1771 x_txn_systems_tbl => l_txn_systems_tbl,
1772 x_return_status => l_return_status,
1773 x_msg_count => l_msg_count,
1774 x_msg_data => l_msg_data);
1775
1776 IF l_return_status <> fnd_api.g_ret_sts_success THEN
1777 RAISE fnd_api.g_exc_error;
1778 END IF;
1779
1780 IF l_line_dtl_tbl.COUNT > 0 THEN
1781
1782 l_td_quantity := px_line_dtl_tbl(l_td_ind).quantity - p_quantity_ratio;
1783
1784 WHILE l_td_quantity > 0
1785 LOOP
1786
1787 -- convert ids to indexes
1788 csi_t_utilities_pvt.convert_ids_to_index(
1789 px_line_dtl_tbl => l_line_dtl_tbl,
1790 px_pty_dtl_tbl => l_pty_dtl_tbl,
1791 px_pty_acct_tbl => l_pty_acct_tbl,
1792 px_ii_rltns_tbl => l_ii_rltns_tbl,
1793 px_org_assgn_tbl => l_org_assgn_tbl,
1794 px_ext_attrib_tbl => l_ext_attrib_tbl,
1795 px_txn_systems_tbl => l_txn_systems_tbl);
1796
1797 --create txn_line_details for quantity 1;
1798 l_line_dtl_rec := l_line_dtl_tbl(1);
1799 l_line_dtl_rec.transaction_line_id := px_line_dtl_tbl(l_td_ind).transaction_line_id;
1800 l_line_dtl_rec.quantity := p_quantity_ratio;
1801 l_line_dtl_rec.processing_status := 'IN_PROCESS';
1802
1803 -- create transaction detail
1804
1805 csi_t_txn_line_dtls_pvt.create_txn_line_dtls(
1806 p_api_version => 1.0,
1807 p_commit => fnd_api.g_false,
1808 p_init_msg_list => fnd_api.g_true,
1809 p_validation_level => fnd_api.g_valid_level_full,
1810 p_txn_line_dtl_index => 1,
1811 p_txn_line_dtl_rec => l_line_dtl_rec,
1812 px_txn_party_dtl_tbl => l_pty_dtl_tbl,
1813 px_txn_pty_acct_detail_tbl => l_pty_acct_tbl,
1814 px_txn_ii_rltns_tbl => l_ii_rltns_tbl,
1815 px_txn_org_assgn_tbl => l_org_assgn_tbl,
1816 px_txn_ext_attrib_vals_tbl => l_ext_attrib_tbl,
1817 x_return_status => l_return_status,
1818 x_msg_count => l_msg_count,
1819 x_msg_data => l_msg_data);
1820
1821 IF l_return_status <> fnd_api.g_ret_sts_success THEN
1822 raise fnd_api.g_exc_error;
1823 END IF;
1824
1825 l_o_ind := l_o_ind + 1;
1826 l_o_line_dtl_tbl(l_o_ind) := l_line_dtl_rec;
1827
1828 l_line_dtl_tbl(1) := l_line_dtl_rec;
1829 l_td_quantity := l_td_quantity - p_quantity_ratio;
1830
1831 END LOOP;
1832 END IF;
1833 ELSE
1834 UPDATE csi_t_txn_line_details
1835 SET processing_status = 'IN_PROCESS'
1836 WHERE txn_line_detail_id = px_line_dtl_tbl(l_td_ind).txn_line_detail_id;
1837
1838 l_o_ind := l_o_ind + 1;
1839 l_o_line_dtl_tbl(l_o_ind) := px_line_dtl_tbl(l_td_ind);
1840 l_o_line_dtl_tbl(l_o_ind).processing_status := 'IN_PROCESS';
1841
1842 END IF;
1843 END LOOP;
1844 END IF;
1845 px_line_dtl_tbl := l_o_line_dtl_tbl;
1846
1847 EXCEPTION
1848 WHEN fnd_api.g_exc_error THEN
1849 l_return_status := FND_API.g_ret_sts_error;
1850 END split_txn_dtls_with_ratio;
1851
1852 /* private routine to determine the item type of the order line */
1853 PROCEDURE get_item_type(
1854 p_item_type_code IN varchar2,
1855 p_line_id IN number,
1856 p_ato_line_id IN number,
1857 p_top_model_line_id IN number,
1858 x_item_type OUT nocopy varchar2)
1859 IS
1860 l_sub_model_flag varchar2(1);
1861 l_ato_line_id NUMBER;
1862 BEGIN
1863
1864 IF p_item_type_code = 'MODEL' THEN
1865 IF p_ato_line_id = p_line_id THEN
1866 x_item_type := 'ATO_MODEL';
1867 ELSIF p_ato_line_id is null THEN
1868 x_item_type := 'PTO_MODEL';
1869 END IF;
1870 ELSIF p_item_type_code = 'KIT' THEN
1871 x_item_type := 'KIT';
1872 ELSIF p_item_type_code = 'OPTION' THEN
1873 IF p_ato_line_id is not null THEN
1874 x_item_type := 'ATO_OPTION';
1875 ELSIF p_ato_line_id is null THEN
1876 x_item_type := 'PTO_OPTION';
1877 END IF;
1878 ELSIF p_item_type_code = 'CLASS' THEN
1879 IF p_ato_line_id is not null THEN
1880 BEGIN
1881 SELECT 'Y'
1882 INTO l_sub_model_flag
1883 FROM sys.dual
1884 WHERE exists (
1885 SELECT 'X'
1886 FROM bom_cto_order_lines
1887 WHERE ato_line_id = p_ato_line_id
1888 AND parent_ato_line_id = p_line_id);
1889
1890 --5076453
1891 IF l_sub_model_flag ='Y' THEN
1892 IF p_ato_line_id = p_line_id THEN
1893
1894 SELECT ato_line_id
1895 INTO l_ato_line_id
1896 FROM oe_order_lines_all
1897 WHERE line_id=p_top_model_line_id;
1898
1899 IF l_ato_line_id IS NULL THEN
1900 x_item_type := 'ATO_MODEL';
1901 END IF;
1902 ELSE -- p_ato_line_id
1903 x_item_type := 'ATO_SUB_MODEL';
1904
1905 END IF;
1906 END IF;
1907
1908 EXCEPTION
1909 WHEN no_data_found THEN
1910 x_item_type := 'ATO_CLASS';
1911 END;
1912 ELSIF p_ato_line_id is null THEN
1913 x_item_type := 'PTO_CLASS';
1914 END IF;
1915 ELSIF p_item_type_code = 'INCLUDED' THEN
1916 x_item_type := 'INCLUDED_ITEM';
1917 ELSIF p_item_type_code = 'CONFIG' THEN
1918 x_item_type := 'CONFIG_ITEM';
1919 ELSIF p_item_type_code = 'STANDARD' THEN
1920 x_item_type := 'STANDARD';
1921 END IF;
1922 debug(' identified_type : '||x_item_type);
1923 END get_item_type;
1924
1925 PROCEDURE get_ib_trackable_parent(
1926 p_current_line_id IN number,
1927 p_om_vld_org_id IN number,
1928 x_parent_line_rec OUT NOCOPY oe_order_pub.line_rec_type,
1929 x_return_status OUT NOCOPY varchar2)
1930 IS
1931 l_org_id number;
1932 l_parent_line_id number;
1933 l_next_parent_line_id number;
1934 l_inventory_item_id number;
1935 l_ib_trackable_flag varchar2(1) := 'N';
1936
1937 l_parent_line_rec oe_order_pub.line_rec_type;
1938
1939 BEGIN
1940
1941 x_return_status := fnd_api.g_ret_sts_success;
1942
1943 api_log('get_ib_trackable_parent');
1944
1945 BEGIN
1946
1947 SELECT link_to_line_id ,
1948 org_id
1949 INTO l_parent_line_id,
1950 l_org_id
1951 FROM oe_order_lines_all
1952 WHERE line_id = p_current_line_id;
1953
1954 <<next_level>>
1955
1956 IF l_parent_line_id is not null THEN
1957
1958 SELECT inventory_item_id ,
1959 link_to_line_id
1960 INTO l_inventory_item_id ,
1961 l_next_parent_line_id
1962 FROM oe_order_lines_all
1963 WHERE line_id = l_parent_line_id;
1964
1965 SELECT nvl(msi.comms_nl_trackable_flag, 'N')
1966 INTO l_ib_trackable_flag
1967 FROM mtl_system_items msi
1968 WHERE msi.inventory_item_id = l_inventory_item_id
1969 AND msi.organization_id = p_om_vld_org_id;
1970
1971 IF l_ib_trackable_flag = 'Y' THEN
1972 oe_line_util.query_row(
1973 p_line_id => l_parent_line_id,
1974 x_line_rec => l_parent_line_rec );
1975 ELSE
1976 l_parent_line_id := l_next_parent_line_id;
1977 goto next_level;
1978 END IF;
1979 END IF;
1980
1981 END;
1982
1983 debug(' parent_line_id : '||l_parent_line_rec.line_id);
1984 debug(' parent_item_type : '||l_parent_line_rec.item_type_code);
1985 debug(' parent_item : '||l_parent_line_rec.ordered_item);
1986 debug(' parent_quantity : '||l_parent_line_rec.ordered_quantity);
1987
1988 x_parent_line_rec := l_parent_line_rec;
1989
1990 END get_ib_trackable_parent;
1991
1992 -- create non source record for relationship processing
1993 PROCEDURE build_non_source_rec(
1994 p_transaction_line_id IN number,
1995 p_instance_id IN number,
1996 px_default_info_rec IN OUT nocopy default_info_rec,
1997 x_txn_line_dtl_id OUT nocopy number,
1998 x_return_status OUT nocopy varchar2)
1999 IS
2000
2001 l_instance_rec csi_datastructures_pub.instance_rec;
2002 l_g_instance_rec csi_datastructures_pub.instance_header_rec;
2003 l_g_ph_tbl csi_datastructures_pub.party_header_tbl;
2004 l_g_pah_tbl csi_datastructures_pub.party_account_header_tbl;
2005 l_g_ouh_tbl csi_datastructures_pub.org_units_header_tbl;
2006 l_g_pa_tbl csi_datastructures_pub.pricing_attribs_tbl;
2007 l_g_eav_tbl csi_datastructures_pub.extend_attrib_values_tbl;
2008 l_g_ea_tbl csi_datastructures_pub.extend_attrib_tbl;
2009 l_g_iah_tbl csi_datastructures_pub.instance_asset_header_tbl;
2010 l_g_time_stamp date;
2011
2012 -- create_txn_line_dtls variables
2013 l_n_line_dtl_rec csi_t_datastructures_grp.txn_line_detail_rec;
2014 l_n_pty_dtl_tbl csi_t_datastructures_grp.txn_party_detail_tbl;
2015 l_n_pty_acct_tbl csi_t_datastructures_grp.txn_pty_acct_detail_tbl;
2016 l_n_org_assgn_tbl csi_t_datastructures_grp.txn_org_assgn_tbl;
2017 l_n_ext_attrib_tbl csi_t_datastructures_grp.txn_ext_attrib_vals_tbl;
2018 l_n_ii_rltns_tbl csi_t_datastructures_grp.txn_ii_rltns_tbl;
2019
2020 l_return_status varchar2(1) := fnd_api.g_ret_sts_success;
2021 l_msg_count number;
2022 l_msg_data varchar2(4000);
2023
2024 BEGIN
2025
2026 x_return_status := fnd_api.g_ret_sts_success;
2027
2028 api_log('build_non_source_rec');
2029
2030 l_g_instance_rec.instance_id := p_instance_id;
2031
2032 debug(' instance_id : '||p_instance_id);
2033
2034 IF nvl(p_instance_id, fnd_api.g_miss_num) <> fnd_api.g_miss_num THEN
2035
2036 csi_t_gen_utility_pvt.dump_api_info(
2037 p_pkg_name => 'csi_item_instance_pub',
2038 p_api_name => 'get_item_instance_details');
2039
2040 -- get the instance party and party account info
2041 csi_item_instance_pub.get_item_instance_details(
2042 p_api_version => 1.0,
2043 p_commit => fnd_api.g_false,
2044 p_init_msg_list => fnd_api.g_true,
2045 p_validation_level => fnd_api.g_valid_level_full,
2046 p_instance_rec => l_g_instance_rec,
2047 p_get_parties => fnd_api.g_false,
2048 p_party_header_tbl => l_g_ph_tbl,
2049 p_get_accounts => fnd_api.g_false,
2050 p_account_header_tbl => l_g_pah_tbl,
2051 p_get_org_assignments => fnd_api.g_false,
2052 p_org_header_tbl => l_g_ouh_tbl,
2053 p_get_pricing_attribs => fnd_api.g_false,
2054 p_pricing_attrib_tbl => l_g_pa_tbl,
2055 p_get_ext_attribs => fnd_api.g_false,
2056 p_ext_attrib_tbl => l_g_eav_tbl,
2057 p_ext_attrib_def_tbl => l_g_ea_tbl,
2058 p_get_asset_assignments => fnd_api.g_false,
2059 p_asset_header_tbl => l_g_iah_tbl,
2060 p_time_stamp => l_g_time_stamp,
2061 x_return_status => l_return_status,
2062 x_msg_count => l_msg_count,
2063 x_msg_data => l_msg_data);
2064
2065 IF l_return_status <> fnd_api.g_ret_sts_success THEN
2066 RAISE fnd_api.g_exc_error;
2067 END IF;
2068
2069 l_n_line_dtl_rec.txn_line_detail_id := fnd_api.g_miss_num;
2070 l_n_line_dtl_rec.transaction_line_id := p_transaction_line_id;
2071 l_n_line_dtl_rec.sub_type_id := px_default_info_rec.sub_type_id;
2072 l_n_line_dtl_rec.processing_status := 'IN_PROCESS';
2073 l_n_line_dtl_rec.source_transaction_flag := 'N';
2074 l_n_line_dtl_rec.inventory_item_id := l_g_instance_rec.inventory_item_id;
2075 l_n_line_dtl_rec.inventory_revision := l_g_instance_rec.inventory_revision;
2076 /* fix for bug 4941832 */
2077 l_n_line_dtl_rec.inv_organization_id := l_g_instance_rec.vld_organization_id;
2078 l_n_line_dtl_rec.quantity := l_g_instance_rec.quantity;
2079 l_n_line_dtl_rec.unit_of_measure := l_g_instance_rec.unit_of_measure;
2080 l_n_line_dtl_rec.installation_date := sysdate;
2081 l_n_line_dtl_rec.external_reference := 'INTERFACE';
2082 l_n_line_dtl_rec.preserve_detail_flag := 'Y';
2083 l_n_line_dtl_rec.instance_exists_flag := 'Y';
2084 l_n_line_dtl_rec.instance_id := l_g_instance_rec.instance_id;
2085 l_n_line_dtl_rec.serial_number := l_g_instance_rec.serial_number;
2086 l_n_line_dtl_rec.mfg_serial_number_flag := l_g_instance_rec.mfg_serial_number_flag;
2087 l_n_line_dtl_rec.lot_number := l_g_instance_rec.lot_number;
2088 l_n_line_dtl_rec.object_version_number := 1.0;
2089
2090 csi_t_txn_line_dtls_pvt.create_txn_line_dtls(
2091 p_api_version => 1.0,
2092 p_commit => fnd_api.g_false,
2093 p_init_msg_list => fnd_api.g_true,
2094 p_validation_level => fnd_api.g_valid_level_full,
2095 p_txn_line_dtl_index => 1,
2096 p_txn_line_dtl_rec => l_n_line_dtl_rec,
2097 px_txn_party_dtl_tbl => l_n_pty_dtl_tbl,
2098 px_txn_pty_acct_detail_tbl => l_n_pty_acct_tbl,
2099 px_txn_ii_rltns_tbl => l_n_ii_rltns_tbl,
2100 px_txn_org_assgn_tbl => l_n_org_assgn_tbl,
2101 px_txn_ext_attrib_vals_tbl => l_n_ext_attrib_tbl,
2102 x_return_status => l_return_status,
2103 x_msg_count => l_msg_count,
2104 x_msg_data => l_msg_data);
2105
2106 IF l_return_status <> fnd_api.g_ret_sts_success THEN
2107 RAISE fnd_api.g_exc_error;
2108 END IF;
2109 debug('non_source_tld_id : '||l_n_line_dtl_rec.txn_line_detail_id);
2110 END IF;
2111 x_txn_line_dtl_id := l_n_line_dtl_rec.txn_line_detail_id;
2112 EXCEPTION
2113 WHEN fnd_api.g_exc_error THEN
2114 x_return_status := fnd_api.g_ret_sts_error;
2115 END build_non_source_rec;
2116
2117 PROCEDURE get_tld(
2118 p_source_table IN varchar2,
2119 p_source_id IN number,
2120 p_source_flag IN varchar2,
2121 p_processing_status IN varchar2,
2122 x_line_dtl_tbl OUT NOCOPY csi_t_datastructures_grp.txn_line_detail_tbl,
2123 x_return_status OUT NOCOPY varchar2)
2124 IS
2125
2126 l_txn_line_query_rec csi_t_datastructures_grp.txn_line_query_rec;
2127 l_txn_line_detail_query_rec csi_t_datastructures_grp.txn_line_detail_query_rec;
2128
2129 l_line_dtl_tbl csi_t_datastructures_grp.txn_line_detail_tbl;
2130 l_pty_dtl_tbl csi_t_datastructures_grp.txn_party_detail_tbl;
2131 l_pty_acct_tbl csi_t_datastructures_grp.txn_pty_acct_detail_tbl;
2132 l_ii_rltns_tbl csi_t_datastructures_grp.txn_ii_rltns_tbl;
2133 l_org_assgn_tbl csi_t_datastructures_grp.txn_org_assgn_tbl;
2134 l_ext_attrib_tbl csi_t_datastructures_grp.txn_ext_attrib_vals_tbl;
2135 l_csi_ea_tbl csi_t_datastructures_grp.csi_ext_attribs_tbl;
2136 l_csi_eav_tbl csi_t_datastructures_grp.csi_ext_attrib_vals_tbl;
2137 l_txn_systems_tbl csi_t_datastructures_grp.txn_systems_tbl;
2138
2139 l_return_status varchar2(1) := fnd_api.g_ret_sts_success;
2140 l_msg_data varchar2(2000);
2141 l_msg_count number;
2142
2143 BEGIN
2144
2145 x_return_status := fnd_api.g_ret_sts_success;
2146
2147 api_log('get_tld');
2148
2149 l_txn_line_query_rec.source_transaction_table := p_source_table;
2150 l_txn_line_query_rec.source_transaction_id := p_source_id;
2151 l_txn_line_detail_query_rec.source_transaction_flag := p_source_flag;
2152 l_txn_line_detail_query_rec.processing_status := p_processing_status;
2153
2154 csi_t_txn_details_grp.get_transaction_details(
2155 p_api_version => 1,
2156 p_commit => fnd_api.g_false,
2157 p_init_msg_list => fnd_api.g_true,
2158 p_validation_level => fnd_api.g_valid_level_full,
2159 p_txn_line_query_rec => l_txn_line_query_rec,
2160 p_txn_line_detail_query_rec => l_txn_line_detail_query_rec,
2161 x_txn_line_detail_tbl => l_line_dtl_tbl,
2162 p_get_parties_flag => fnd_api.g_false,
2163 x_txn_party_detail_tbl => l_pty_dtl_tbl,
2164 p_get_pty_accts_flag => fnd_api.g_false,
2165 x_txn_pty_acct_detail_tbl => l_pty_acct_tbl,
2166 p_get_ii_rltns_flag => fnd_api.g_false,
2167 x_txn_ii_rltns_tbl => l_ii_rltns_tbl,
2168 p_get_org_assgns_flag => fnd_api.g_false,
2169 x_txn_org_assgn_tbl => l_org_assgn_tbl,
2170 p_get_ext_attrib_vals_flag => fnd_api.g_false,
2171 x_txn_ext_attrib_vals_tbl => l_ext_attrib_tbl,
2172 p_get_csi_attribs_flag => fnd_api.g_false,
2173 x_csi_ext_attribs_tbl => l_csi_ea_tbl,
2174 p_get_csi_iea_values_flag => fnd_api.g_false,
2175 x_csi_iea_values_tbl => l_csi_eav_tbl,
2176 p_get_txn_systems_flag => fnd_api.g_false,
2177 x_txn_systems_tbl => l_txn_systems_tbl,
2178 x_return_status => l_return_status,
2179 x_msg_count => l_msg_count,
2180 x_msg_data => l_msg_data);
2181
2182 IF l_return_status <> fnd_api.g_ret_sts_success THEN
2183 raise fnd_api.g_exc_error;
2184 END IF;
2185
2186 x_line_dtl_tbl := l_line_dtl_tbl;
2187
2188 EXCEPTION
2189 WHEN fnd_api.g_exc_error THEN
2190 x_return_status := fnd_api.g_ret_sts_error;
2191 END get_tld;
2192
2193 PROCEDURE get_ato_options_only(
2194 px_line_tbl IN OUT nocopy oe_order_pub.line_tbl_type,
2195 x_return_status OUT nocopy varchar2)
2196 IS
2197 o_line_tbl oe_order_pub.line_tbl_type;
2198 o_ind binary_integer := 0;
2199 BEGIN
2200 x_return_status := fnd_api.g_ret_sts_success;
2201 api_log('get_ato_options_only');
2202
2203 IF px_line_tbl.COUNT > 0 THEN
2204 FOR l_ind IN px_line_tbl.FIRST .. px_line_tbl.LAST
2205 LOOP
2206 IF px_line_tbl(l_ind).item_type_code = 'OPTION' THEN
2207 o_ind := o_ind + 1;
2208 o_line_tbl(o_ind) := px_line_tbl(l_ind);
2209 END IF;
2210 END LOOP;
2211 END IF;
2212
2213 px_line_tbl := o_line_tbl;
2214
2215 EXCEPTION
2216 WHEN fnd_api.g_exc_error THEN
2217 x_return_status := fnd_api.g_ret_sts_error;
2218 END get_ato_options_only;
2219
2220 PROCEDURE get_parent_instances(
2221 p_parent_line_id IN number,
2222 p_parent_item_id IN number,
2223 x_parent_instances OUT NOCOPY parent_instances,
2224 x_return_status OUT NOCOPY varchar2)
2225 IS
2226
2227 CURSOR inst_cur IS
2228 SELECT inventory_item_id,
2229 instance_id,
2230 serial_number,
2231 location_type_code,
2232 quantity
2233 FROM csi_item_instances
2234 WHERE inventory_item_id = p_parent_item_id
2235 AND last_oe_order_line_id = p_parent_line_id;
2236
2237 l_parent_inst_found boolean := FALSE;
2238
2239 l_parent_instances parent_instances;
2240 l_ind binary_integer := 0;
2241
2242 BEGIN
2243
2244 x_return_status := fnd_api.g_ret_sts_success;
2245
2246 api_log('get_parent_instances');
2247
2248 FOR inst_rec IN inst_cur
2249 LOOP
2250
2251 l_ind := l_ind + 1;
2252
2253 l_parent_instances(l_ind).item_id := inst_rec.inventory_item_id;
2254 l_parent_instances(l_ind).instance_id := inst_rec.instance_id;
2255 l_parent_instances(l_ind).quantity := inst_rec.quantity;
2256 l_parent_instances(l_ind).serial_number := inst_rec.serial_number;
2257 l_parent_instances(l_ind).allocated_flag := 'N';
2258 l_parent_instances(l_ind).alloc_count := 0;
2259
2260 END LOOP;
2261
2262 -- just the debug
2263 IF l_parent_instances.COUNT > 0 THEN
2264 FOR d_ind IN l_parent_instances.FIRST .. l_parent_instances.LAST
2265 LOOP
2266 debug('parent instances record # '||d_ind);
2267 debug(' instance_id : '||l_parent_instances(d_ind).instance_id);
2268 debug(' quantity : '||l_parent_instances(d_ind).quantity);
2269 END LOOP;
2270 END IF;
2271 x_parent_instances := l_parent_instances;
2272
2273 END get_parent_instances;
2274
2275 PROCEDURE get_partner_order_info(
2276 p_order_line_rec IN oe_order_lines_all%rowtype,
2277 x_end_customer_id OUT nocopy number,
2278 x_current_site_use_id OUT nocopy number,
2279 x_install_site_use_id OUT nocopy number,
2280 x_return_status OUT nocopy varchar2)
2281 IS
2282
2283 l_partner_rec oe_install_base_util.partner_order_rec;
2284 l_end_customer_id number;
2285 l_current_site_use_id number;
2286 l_install_site_use_id number;
2287
2288 BEGIN
2289
2290 x_return_status := fnd_api.g_ret_sts_success;
2291
2292 api_log('get_partner_order_info');
2293
2294 -- for partner ordering
2295 oe_install_base_util.get_partner_ord_rec(
2296 p_order_line_id => p_order_line_rec.line_id,
2297 x_partner_order_rec => l_partner_rec);
2298
2299 -- customer
2300 IF nvl(l_partner_rec.ib_owner, fnd_api.g_miss_char) <> fnd_api.g_miss_char THEN
2301 IF l_partner_rec.ib_owner = 'INSTALL_BASE' THEN
2302 l_end_customer_id := fnd_api.g_miss_num;
2303 ELSE
2304
2305 IF l_partner_rec.ib_owner = 'END_CUSTOMER' THEN
2306 l_end_customer_id := l_partner_rec.end_customer_id;
2307 ELSIF l_partner_rec.ib_owner = 'SOLD_TO' THEN
2308 l_end_customer_id := p_order_line_rec.sold_to_org_id;
2309 END IF;
2310
2311 IF nvl(l_end_customer_id, fnd_api.g_miss_num) = fnd_api.g_miss_num THEN
2312 fnd_message.set_name('CSI','CSI_PARTNER_VAL_MISSING');
2313 fnd_msg_pub.add;
2314 RAISE fnd_api.g_exc_error;
2315 END IF;
2316
2317 END IF;
2318 ELSE
2319 l_partner_rec.ib_owner := 'DEFAULT';
2320 l_end_customer_id := p_order_line_rec.sold_to_org_id;
2321 END IF;
2322
2323 -- current location
2324 IF nvl(l_partner_rec.ib_current_location, fnd_api.g_miss_char) <> fnd_api.g_miss_char THEN
2325 IF l_partner_rec.ib_current_location = 'INSTALL_BASE' THEN
2326 l_current_site_use_id := fnd_api.g_miss_num;
2327 ELSE
2328
2329 IF l_partner_rec.ib_current_location = 'END_CUSTOMER' THEN
2330 l_current_site_use_id := l_partner_rec.end_customer_site_use_id;
2331 ELSIF l_partner_rec.ib_current_location = 'SHIP_TO' THEN
2332 l_current_site_use_id := p_order_line_rec.ship_to_org_id;
2333 ELSIF l_partner_rec.ib_current_location = 'SOLD_TO' THEN
2334 l_current_site_use_id := l_partner_rec.sold_to_site_use_id;
2335 ELSIF l_partner_rec.ib_current_location = 'DELIVER_TO' THEN
2336 l_current_site_use_id := p_order_line_rec.deliver_to_org_id;
2337 ELSIF l_partner_rec.ib_current_location = 'BILL_TO' THEN
2338 l_current_site_use_id := p_order_line_rec.invoice_to_org_id;
2339 END IF;
2340 IF nvl(l_current_site_use_id, fnd_api.g_miss_num) = fnd_api.g_miss_num THEN
2341 fnd_message.set_name('CSI','CSI_PARTNER_VAL_MISSING');
2342 fnd_msg_pub.add;
2343 RAISE fnd_api.g_exc_error;
2344 END IF;
2345
2346 END IF;
2347
2348 ELSE
2349 l_partner_rec.ib_current_location := 'DEFAULT';
2350 l_current_site_use_id := p_order_line_rec.ship_to_org_id;
2351 END IF;
2352
2353 -- installed at location
2354 IF nvl(l_partner_rec.ib_installed_at_location, fnd_api.g_miss_char) <> fnd_api.g_miss_char THEN
2355 IF l_partner_rec.ib_installed_at_location = 'INSTALL_BASE' THEN
2356 l_install_site_use_id := fnd_api.g_miss_num;
2357 ELSE
2358
2359 IF l_partner_rec.ib_installed_at_location = 'END_CUSTOMER' THEN
2360 l_install_site_use_id := l_partner_rec.end_customer_site_use_id;
2361 ELSIF l_partner_rec.ib_installed_at_location = 'SHIP_TO' THEN
2362 l_install_site_use_id := p_order_line_rec.ship_to_org_id;
2363 ELSIF l_partner_rec.ib_installed_at_location = 'SOLD_TO' THEN
2364 l_install_site_use_id := l_partner_rec.sold_to_site_use_id;
2365 ELSIF l_partner_rec.ib_installed_at_location = 'DELIVER_TO' THEN
2366 l_install_site_use_id := p_order_line_rec.deliver_to_org_id;
2367 ELSIF l_partner_rec.ib_installed_at_location = 'BILL_TO' THEN
2368 l_install_site_use_id := p_order_line_rec.invoice_to_org_id;
2369 END IF;
2370 IF nvl(l_install_site_use_id, fnd_api.g_miss_num) = fnd_api.g_miss_num THEN
2371 fnd_message.set_name('CSI','CSI_PARTNER_VAL_MISSING');
2372 fnd_msg_pub.add;
2373 RAISE fnd_api.g_exc_error;
2374 END IF;
2375
2376 END IF;
2377
2378 ELSE
2379 l_partner_rec.ib_installed_at_location := 'DEFAULT';
2380 l_install_site_use_id := p_order_line_rec.ship_to_org_id;
2381 END IF;
2382
2383 debug(' ib_owner : '||l_partner_rec.ib_owner);
2384 debug(' current_location : '||l_partner_rec.ib_current_location);
2385 debug(' install_location : '||l_partner_rec.ib_installed_at_location);
2386
2387 x_end_customer_id := l_end_customer_id;
2388 x_current_site_use_id := l_current_site_use_id;
2389 x_install_site_use_id := l_install_site_use_id;
2390
2391 EXCEPTION
2392 WHEN fnd_api.g_exc_error THEN
2393 x_return_status := fnd_api.g_ret_sts_error;
2394 END get_partner_order_info;
2395
2396
2397 PROCEDURE convert_wip_instance_to_cp(
2398 p_instance_id IN number,
2399 p_order_hdr_rec IN oe_order_headers_all%rowtype,
2400 p_order_line_rec IN oe_order_lines_all%rowtype,
2401 p_tld_tbl IN csi_t_datastructures_grp.txn_line_detail_tbl,
2402 px_default_info_rec IN OUT nocopy default_info_rec,
2403 px_csi_txn_rec IN OUT NOCOPY csi_datastructures_pub.transaction_rec,
2404 x_return_status OUT NOCOPY varchar2)
2405 IS
2406
2407 l_party_site_id number;
2408 l_owner_party_id number;
2409 l_owner_account_id number;
2410
2411 l_order_line_rec oe_order_lines_all%rowtype;
2412 l_order_header_rec oe_order_headers_all%rowtype;
2413
2414 l_location_type_code varchar2(80);
2415 l_inst_object_ver_num number;
2416
2417 l_u_instance_rec csi_datastructures_pub.instance_rec;
2418 l_u_party_tbl csi_datastructures_pub.party_tbl;
2419 l_u_party_acct_tbl csi_datastructures_pub.party_account_tbl;
2420 l_u_inst_asset_tbl csi_datastructures_pub.instance_asset_tbl;
2421 l_u_ext_attrib_val_tbl csi_datastructures_pub.extend_attrib_values_tbl;
2422 l_u_pricing_attribs_tbl csi_datastructures_pub.pricing_attribs_tbl;
2423 l_u_org_units_tbl csi_datastructures_pub.organization_units_tbl;
2424 l_u_inst_id_lst csi_datastructures_pub.id_tbl;
2425
2426 l_pty_dtl_tbl csi_t_datastructures_grp.txn_party_detail_tbl;
2427 l_pty_acct_tbl csi_t_datastructures_grp.txn_pty_acct_detail_tbl;
2428 l_org_assgn_tbl csi_t_datastructures_grp.txn_org_assgn_tbl;
2429 l_tld_tbl csi_t_datastructures_grp.txn_line_detail_tbl;
2430 l_upd_tld_rec csi_t_datastructures_grp.txn_line_detail_rec;
2431 l_upd_pty_dtl_tbl csi_t_datastructures_grp.txn_party_detail_tbl;
2432 l_upd_pty_acct_tbl csi_t_datastructures_grp.txn_pty_acct_detail_tbl;
2433 l_upd_order_line_rec csi_order_ship_pub.order_line_rec;
2434 l_tld_found VARCHAR2(1);
2435
2436 l_instance_party_id number;
2437 l_pty_object_ver_num number;
2438 l_ip_account_id number;
2439 l_acct_object_ver_num number;
2440
2441 l_sub_type_id number;
2442 l_cascade_owner_flag varchar2(1);
2443 l_src_change_owner varchar2(1);
2444 l_src_change_owner_to_code varchar2(1);
2445 l_src_status_id number;
2446
2447 l_return_status varchar2(1) := fnd_api.g_ret_sts_success;
2448 l_msg_count number;
2449 l_msg_data varchar2(2000);
2450
2451 l_ind binary_integer := 0;
2452 l_acct_ind binary_integer := 0;
2453 l_a_ind binary_integer := 0;
2454 l_eav_ind binary_integer := 0;
2455 l_ou_ind binary_integer := 0;
2456
2457 -- Modification for bug 4091371
2458 PROCEDURE get_info_from_tld(
2459 p_instance_id IN number,
2460 px_tld_tbl IN OUT NOCOPY csi_t_datastructures_grp.txn_line_detail_tbl,
2461 x_pty_dtl_tbl OUT NOCOPY csi_t_datastructures_grp.txn_party_detail_tbl,
2462 x_pty_acct_tbl OUT NOCOPY csi_t_datastructures_grp.txn_pty_acct_detail_tbl,
2463 x_org_assgn_tbl OUT NOCOPY csi_t_datastructures_grp.txn_org_assgn_tbl,
2464 x_sub_type_id OUT nocopy number,
2465 x_cascade_owner_flag OUT nocopy varchar2,
2466 x_tld_found OUT NOCOPY VARCHAR2 )
2467 IS
2468 l_tld_found VARCHAR2(1) := fnd_api.g_false;
2469 l_txn_line_detail_id NUMBER;
2470 l_tld_tbl csi_t_datastructures_grp.txn_line_detail_tbl;
2471 l_txn_line_query_rec csi_t_datastructures_grp.txn_line_query_rec;
2472 l_txn_line_detail_query_rec csi_t_datastructures_grp.txn_line_detail_query_rec;
2473 l_txn_systems_tbl csi_t_datastructures_grp.txn_systems_tbl;
2474 l_ext_attrib_tbl csi_t_datastructures_grp.txn_ext_attrib_vals_tbl;
2475 l_csi_ea_tbl csi_t_datastructures_grp.csi_ext_attribs_tbl;
2476 l_csi_iea_values_tbl csi_t_datastructures_grp.csi_ext_attrib_vals_tbl;
2477 l_ii_rltns_tbl csi_t_datastructures_grp.txn_ii_rltns_tbl;
2478 l_return_status varchar2(1) := fnd_api.g_ret_sts_success;
2479 l_msg_count number;
2480 l_msg_data varchar2(2000);
2481
2482 BEGIN
2483 IF p_tld_tbl.COUNT > 0 THEN
2484 FOR p_ind IN p_tld_tbl.FIRST .. p_tld_tbl.LAST
2485 LOOP
2486 IF p_tld_tbl(p_ind).instance_id = p_instance_id THEN
2487 x_sub_type_id := p_tld_tbl(p_ind).sub_type_id;
2488 x_cascade_owner_flag := p_tld_tbl(p_ind).cascade_owner_flag;
2489 l_txn_line_detail_id := p_tld_tbl(p_ind).txn_line_detail_id;
2490 l_tld_found := fnd_api.g_true;
2491 exit;
2492 END IF;
2493 END LOOP;
2494
2495 IF l_tld_found = fnd_api.g_false THEN
2496 x_sub_type_id := p_tld_tbl(1).sub_type_id;
2497 x_cascade_owner_flag := p_tld_tbl(1).cascade_owner_flag;
2498 l_txn_line_detail_id := p_tld_tbl(1).txn_line_detail_id;
2499 END IF;
2500 l_txn_line_detail_query_rec.txn_line_detail_id := l_txn_line_detail_id ;
2501
2502 -- get_txn_line_details
2503 csi_t_txn_details_grp.get_transaction_details(
2504 p_api_version => 1,
2505 p_commit => fnd_api.g_false,
2506 p_init_msg_list => fnd_api.g_true,
2507 p_validation_level => fnd_api.g_valid_level_full,
2508 p_txn_line_query_rec => l_txn_line_query_rec,
2509 p_txn_line_detail_query_rec => l_txn_line_detail_query_rec,
2510 x_txn_line_detail_tbl => l_tld_tbl,
2511 p_get_parties_flag => fnd_api.g_true,
2512 x_txn_party_detail_tbl => x_pty_dtl_tbl,
2513 p_get_pty_accts_flag => fnd_api.g_true,
2514 x_txn_pty_acct_detail_tbl => x_pty_acct_tbl,
2515 p_get_ii_rltns_flag => fnd_api.g_false,
2516 x_txn_ii_rltns_tbl => l_ii_rltns_tbl,
2517 p_get_org_assgns_flag => fnd_api.g_true,
2518 x_txn_org_assgn_tbl => x_org_assgn_tbl,
2519 p_get_ext_attrib_vals_flag => fnd_api.g_true,
2520 x_txn_ext_attrib_vals_tbl => l_ext_attrib_tbl,
2521 p_get_csi_attribs_flag => fnd_api.g_false,
2522 x_csi_ext_attribs_tbl => l_csi_ea_tbl,
2523 p_get_csi_iea_values_flag => fnd_api.g_false,
2524 x_csi_iea_values_tbl => l_csi_iea_values_tbl,
2525 p_get_txn_systems_flag => fnd_api.g_false,
2526 x_txn_systems_tbl => l_txn_systems_tbl,
2527 x_return_status => l_return_status,
2528 x_msg_count => l_msg_count,
2529 x_msg_data => l_msg_data);
2530 IF nvl(l_tld_tbl.count,0) > 0 THEN
2531 l_tld_found := fnd_api.g_true ;
2532 px_tld_tbl(1) := l_tld_tbl(1);
2533 ELSE
2534 l_tld_found := fnd_api.g_false;
2535 x_sub_type_id := px_default_info_rec.sub_type_id;
2536 x_cascade_owner_flag := px_default_info_rec.ownership_cascade_at_txn;
2537
2538 END IF;
2539 IF l_return_status <> fnd_api.g_ret_sts_success THEN
2540 debug('Error getting txn details before converting item instance to customer product.');
2541 RAISE fnd_api.g_exc_error;
2542 ELSE
2543 csi_t_utilities_pvt.convert_ids_to_index(
2544 px_line_dtl_tbl => px_tld_tbl,
2545 px_pty_dtl_tbl => x_pty_dtl_tbl,
2546 px_pty_acct_tbl => x_pty_acct_tbl,
2547 px_ii_rltns_tbl => l_ii_rltns_tbl,
2548 px_org_assgn_tbl => x_org_assgn_tbl,
2549 px_ext_attrib_tbl => l_ext_attrib_tbl,
2550 px_txn_systems_tbl => l_txn_systems_tbl);
2551 END IF;
2552 ELSE
2553 x_sub_type_id := px_default_info_rec.sub_type_id;
2554 x_cascade_owner_flag := px_default_info_rec.ownership_cascade_at_txn;
2555 END IF;
2556 x_tld_found := l_tld_found ;
2557 END get_info_from_tld;
2558
2559 BEGIN
2560
2561 x_return_status := fnd_api.g_ret_sts_success;
2562 api_log('convert_wip_instance_to_cp');
2563
2564 -- check if the instance is in WIP
2565 SELECT object_version_number,
2566 location_type_code
2567 INTO l_inst_object_ver_num,
2568 l_location_type_code
2569 FROM csi_item_instances
2570 WHERE instance_id = p_instance_id;
2571
2572 l_order_header_rec := p_order_hdr_rec;
2573 l_order_line_rec := p_order_line_rec;
2574
2575 -- derive location
2576
2577 IF l_order_line_rec.ship_to_org_id is null THEN
2578 l_order_line_rec.ship_to_org_id := l_order_header_rec.ship_to_org_id;
2579 END IF;
2580
2581 IF l_order_line_rec.sold_from_org_id is null THEN
2582 l_order_line_rec.sold_from_org_id := l_order_header_rec.sold_from_org_id;
2583 END IF;
2584
2585 IF l_order_line_rec.sold_to_org_id is null THEN
2586 l_order_line_rec.sold_to_org_id := l_order_header_rec.sold_to_org_id;
2587 END IF;
2588
2589 IF l_order_line_rec.agreement_id is null THEN
2590 l_order_line_rec.agreement_id := l_order_header_rec.agreement_id;
2591 END IF;
2592
2593 IF l_order_line_rec.invoice_to_org_id is null THEN
2594 l_order_line_rec.invoice_to_org_id := l_order_header_rec.invoice_to_org_id;
2595 END IF;
2596
2597 IF l_order_line_rec.deliver_to_org_id is null THEN
2598 l_order_line_rec.deliver_to_org_id := l_order_header_rec.deliver_to_org_id;
2599 END IF;
2600
2601 l_party_site_id := px_default_info_rec.current_party_site_id;
2602
2603 -- update the instance to make it a cp
2604 l_u_instance_rec.instance_id := p_instance_id ;
2605 l_u_instance_rec.vld_organization_id := l_order_line_rec.ship_from_org_id;
2606 l_u_instance_rec.location_type_code := 'HZ_PARTY_SITES';
2607 l_u_instance_rec.location_id := l_party_site_id;
2608
2609 IF px_default_info_rec.install_party_site_id is not null THEN
2610 l_u_instance_rec.install_location_type_code := 'HZ_PARTY_SITES';
2611 l_u_instance_rec.install_location_id := px_default_info_rec.install_party_site_id;
2612 END IF;
2613
2614 l_u_instance_rec.last_oe_order_line_id := p_order_line_rec.line_id;
2615 l_u_instance_rec.active_end_date := null;
2616 l_u_instance_rec.instance_usage_code := 'OUT_OF_ENTERPRISE';
2617 l_u_instance_rec.object_version_number := l_inst_object_ver_num;
2618
2619
2620 -- Modification for bug 4091371
2621 l_tld_tbl := p_tld_tbl ;
2622 get_info_from_tld(
2623 p_instance_id => p_instance_id,
2624 px_tld_tbl => l_tld_tbl,
2625 x_pty_dtl_tbl => l_pty_dtl_tbl,
2626 x_pty_acct_tbl => l_pty_acct_tbl,
2627 x_org_assgn_tbl => l_org_assgn_tbl,
2628 x_sub_type_id => l_sub_type_id,
2629 x_cascade_owner_flag => l_cascade_owner_flag,
2630 x_tld_found => l_tld_found );
2631
2632 IF l_tld_found = fnd_api.g_true THEN
2633 FOR l_index IN l_tld_tbl.FIRST..l_tld_tbl.FIRST
2634 LOOP
2635 l_u_instance_rec.instance_id := p_instance_id;
2636 l_u_instance_rec.instance_number := fnd_api.g_miss_char;
2637 l_u_instance_rec.external_reference := nvl(l_tld_tbl(l_index).external_reference,fnd_api.g_miss_char);
2638 l_u_instance_rec.unit_of_measure := l_tld_tbl(l_index).unit_of_measure;
2639 l_u_instance_rec.instance_condition_id := nvl(l_tld_tbl(l_index).item_condition_id,fnd_api.g_miss_num);
2640 l_u_instance_rec.sellable_flag := nvl(l_tld_tbl(l_index).sellable_flag,fnd_api.g_miss_char);
2641 l_u_instance_rec.system_id := nvl(l_tld_tbl(l_index).csi_system_id ,fnd_api.g_miss_num);
2642 l_u_instance_rec.instance_type_code := nvl(l_tld_tbl(l_index).instance_type_code,fnd_api.g_miss_char);
2643 l_u_instance_rec.install_date := nvl(l_tld_tbl(l_index).installation_date,fnd_api.g_miss_date);
2644 BEGIN
2645 IF NVL( p_instance_id , fnd_api.g_miss_num) <> fnd_api.g_miss_num THEN
2646 SELECT active_start_date
2647 INTO l_u_instance_rec.active_start_date
2648 FROM csi_item_instances
2649 WHERE instance_id = p_instance_id;
2650 ELSE
2651 l_u_instance_rec.active_start_date := nvl(l_tld_tbl(l_index).active_start_date,fnd_api.g_miss_date);
2652 END IF;
2653 EXCEPTION
2654 WHEN OTHERS THEN
2655 l_u_instance_rec.active_start_date := nvl(l_tld_tbl(l_index).active_start_date,fnd_api.g_miss_date);
2656 END;
2657
2658 l_u_instance_rec.active_end_date := nvl(l_tld_tbl(l_index).active_end_date,fnd_api.g_miss_date);
2659 l_u_instance_rec.location_type_code := 'HZ_PARTY_SITES';
2660 l_u_instance_rec.location_id := l_party_site_id;
2661 l_u_instance_rec.return_by_date := nvl(l_tld_tbl(l_index).return_by_date,fnd_api.g_miss_date);
2662
2663 IF l_pty_dtl_tbl.COUNT > 0 THEN
2664 FOR l_p_ind IN l_pty_dtl_tbl.FIRST .. l_pty_dtl_tbl.LAST
2665 LOOP
2666 IF l_pty_dtl_tbl(l_p_ind).txn_line_details_index = l_index THEN
2667 l_ind := l_ind + 1;
2668 FOR l_pc_ind IN l_pty_dtl_tbl.FIRST .. l_pty_dtl_tbl.LAST
2669 LOOP
2670 IF l_pty_dtl_tbl(l_pc_ind).contact_flag = 'Y'
2671 AND
2672 l_pty_dtl_tbl(l_pc_ind).contact_party_id = l_p_ind
2673 THEN
2674 IF nvl(l_u_instance_rec.instance_id,fnd_api.g_miss_num) <> fnd_api.g_miss_num Then
2675
2676 BEGIN
2677 IF l_pty_dtl_tbl(l_p_ind).relationship_type_code = 'OWNER' THEN
2678 SELECT instance_party_id
2679 INTO l_pty_dtl_tbl(l_pc_ind).contact_party_id
2680 FROM csi_i_parties
2681 WHERE instance_id = l_u_instance_rec.instance_id
2682 AND relationship_type_code = l_pty_dtl_tbl(l_p_ind).relationship_type_code
2683 AND ((active_end_date is null ) OR
2684 (active_end_date > sysdate));
2685 ELSE
2686 SELECT instance_party_id
2687 INTO l_pty_dtl_tbl(l_pc_ind).contact_party_id
2688 FROM csi_i_parties
2689 WHERE instance_id = l_u_instance_rec.instance_id
2690 AND party_id = l_pty_dtl_tbl(l_p_ind).party_source_id -- old party
2691 AND party_source_table = l_pty_dtl_tbl(l_p_ind).party_source_table
2692 AND nvl(contact_flag,'N') = nvl(l_pty_dtl_tbl(l_p_ind).contact_flag,'N')
2693 AND relationship_type_code = l_pty_dtl_tbl(l_p_ind).relationship_type_code
2694 AND ((active_end_date is null ) OR
2695 (active_end_date > sysdate));
2696 END IF;
2697 EXCEPTION
2698 WHEN no_data_found THEN
2699 fnd_message.set_name('CSI','CSI_INT_INV_INSTA_PTY_ID');
2700 fnd_message.set_token('INSTANCE_ID',l_u_instance_rec.instance_id);
2701 fnd_message.set_token('RELATIONSHIP_TYPE_CODE',l_pty_dtl_tbl(l_p_ind).relationship_type_code);
2702 fnd_msg_pub.add;
2703 IF l_pty_dtl_tbl(l_p_ind).relationship_type_code = 'OWNER' THEN
2704 x_return_status := fnd_api.g_ret_sts_error;
2705 raise fnd_api.g_exc_error;
2706 ELSE
2707 l_pty_dtl_tbl(l_pc_ind).contact_party_id := l_ind;
2708 END IF;
2709 WHEN too_many_rows THEN
2710 fnd_message.set_name('CSI','CSI_INT_MANY_INSTA_PTY_FOUND');
2711 fnd_message.set_token('INSTANCE_ID',l_u_instance_rec.instance_id);
2712 fnd_message.set_token('RELATIONSHIP_TYPE_CODE',l_pty_dtl_tbl(l_p_ind).relationship_type_code);
2713 fnd_msg_pub.add;
2714 x_return_status := fnd_api.g_ret_sts_error;
2715 raise fnd_api.g_exc_error;
2716 END;
2717 ELSE
2718 l_pty_dtl_tbl(l_pc_ind).contact_party_id := l_ind;
2719 END IF;
2720 END IF;
2721 END LOOP;
2722 END IF;
2723 END LOOP;
2724 END IF;
2725
2726 IF l_org_assgn_tbl.COUNT > 0 THEN
2727 FOR l_oa_ind IN l_org_assgn_tbl.FIRST .. l_org_assgn_tbl.LAST
2728 LOOP
2729 IF l_org_assgn_tbl(l_oa_ind).txn_line_details_index = l_index THEN
2730 l_ou_ind := l_ou_ind + 1;
2731 l_u_org_units_tbl(l_ou_ind).instance_ou_id := l_org_assgn_tbl(l_oa_ind).instance_ou_id;
2732 l_u_org_units_tbl(l_ou_ind).operating_unit_id := l_org_assgn_tbl(l_oa_ind).operating_unit_id;
2733 l_u_org_units_tbl(l_ou_ind).instance_id := l_u_instance_rec.instance_id;
2734 l_u_org_units_tbl(l_ou_ind).relationship_type_code := l_org_assgn_tbl(l_oa_ind).relationship_type_code;
2735 l_u_org_units_tbl(l_ou_ind).active_start_date := l_org_assgn_tbl(l_oa_ind).active_start_date;
2736 l_u_org_units_tbl(l_ou_ind).active_end_date := l_org_assgn_tbl(l_oa_ind).active_end_date;
2737 l_u_org_units_tbl(l_ou_ind).object_version_number := 1.0;
2738 END IF;
2739 END LOOP; -- org assignments loop
2740 END IF; -- org assignments count > 0
2741 END LOOP; -- l_Index
2742 END IF; -- l_tld_found = TRUE
2743 -- Modification end for 4091371
2744
2745 l_u_instance_rec.cascade_ownership_flag := l_cascade_owner_flag;
2746 px_default_info_rec.cascade_owner_flag := l_cascade_owner_flag;
2747
2748 SELECT nvl(src_change_owner, 'N'),
2749 src_change_owner_to_code,
2750 src_status_id
2751 INTO l_src_change_owner,
2752 l_src_change_owner_to_code,
2753 l_src_status_id
2754 FROM csi_ib_txn_types
2755 WHERE sub_type_id = l_sub_type_id;
2756
2757 l_u_instance_rec.instance_status_id := nvl(l_src_status_id, fnd_api.g_miss_num);
2758
2759 IF l_src_change_owner = 'Y' AND l_src_change_owner_to_code = 'E' THEN
2760
2761 l_owner_party_id := px_default_info_rec.owner_party_id;
2762
2763 SELECT instance_party_id,
2764 object_version_number
2765 INTO l_instance_party_id,
2766 l_pty_object_ver_num
2767 FROM csi_i_parties
2768 WHERE instance_id = p_instance_id
2769 AND relationship_type_code = 'OWNER';
2770
2771 l_u_party_tbl(1).instance_party_id := l_instance_party_id;
2772 l_u_party_tbl(1).instance_id := p_instance_id;
2773 l_u_party_tbl(1).party_id := l_owner_party_id;
2774 l_u_party_tbl(1).party_source_table := 'HZ_PARTIES';
2775 l_u_party_tbl(1).relationship_type_code := 'OWNER';
2776 l_u_party_tbl(1).contact_flag := 'N';
2777 l_u_party_tbl(1).object_version_number := l_pty_object_ver_num;
2778
2779 -- build owner account
2780 l_owner_account_id := px_default_info_rec.owner_party_acct_id;
2781
2782 BEGIN
2783 SELECT ip_account_id,
2784 object_version_number
2785 INTO l_ip_account_id,
2786 l_acct_object_ver_num
2787 FROM csi_ip_accounts
2788 WHERE instance_party_id = l_instance_party_id
2789 AND relationship_type_code = 'OWNER';
2790 EXCEPTION
2791 WHEN no_data_found THEN
2792 l_ip_account_id := fnd_api.g_miss_num;
2793 l_acct_object_ver_num := 1;
2794 END;
2795
2796 l_u_party_acct_tbl(1).ip_account_id := l_ip_account_id;
2797 l_u_party_acct_tbl(1).party_account_id := l_owner_account_id;
2798 l_u_party_acct_tbl(1).relationship_type_code := 'OWNER';
2799 l_u_party_acct_tbl(1).bill_to_address := l_order_line_rec.invoice_to_org_id;
2800 l_u_party_acct_tbl(1).ship_to_address := l_order_line_rec.ship_to_org_id;
2801 l_u_party_acct_tbl(1).active_end_date := null;
2802 l_u_party_acct_tbl(1).instance_party_id := l_instance_party_id;
2803 l_u_party_acct_tbl(1).parent_tbl_index := 1;
2804 l_u_party_acct_tbl(1).object_version_number := l_acct_object_ver_num;
2805
2806 END IF;
2807
2808 csi_t_gen_utility_pvt.dump_csi_instance_rec(
2809 p_csi_instance_rec => l_u_instance_rec);
2810
2811 csi_t_gen_utility_pvt.dump_api_info(
2812 p_api_name => 'update_item_instance',
2813 p_pkg_name => 'csi_item_instance_pub');
2814
2815 csi_item_instance_pub.update_item_instance(
2816 p_api_version => 1.0,
2817 p_commit => fnd_api.g_false,
2818 p_init_msg_list => fnd_api.g_true,
2819 p_validation_level => fnd_api.g_valid_level_full,
2820 p_instance_rec => l_u_instance_rec,
2821 p_ext_attrib_values_tbl => l_u_ext_attrib_val_tbl,
2822 p_party_tbl => l_u_party_tbl,
2823 p_account_tbl => l_u_party_acct_tbl,
2824 p_pricing_attrib_tbl => l_u_pricing_attribs_tbl,
2825 p_org_assignments_tbl => l_u_org_units_tbl,
2826 p_txn_rec => px_csi_txn_rec,
2827 p_asset_assignment_tbl => l_u_inst_asset_tbl,
2828 x_instance_id_lst => l_u_inst_id_lst,
2829 x_return_status => l_return_status,
2830 x_msg_count => l_msg_count,
2831 x_msg_data => l_msg_data);
2832
2833 IF l_return_status not in (fnd_api.g_ret_sts_success, 'W') THEN
2834 RAISE fnd_api.g_exc_error;
2835 END IF;
2836
2837 debug('wip issued instance converted to cp. instance_id : '||l_u_instance_rec.instance_id);
2838
2839
2840 --added for the bug 5464761
2841 /* this validation is done to make sure BOM Explosion happens only for the option items if any,
2842 also eliminating other regressions */
2843 IF l_order_line_rec.item_type_code = 'OPTION' THEN
2844
2845 check_and_explode_bom
2846 ( p_order_line_rec =>p_order_line_rec,
2847 l_u_instance_rec => l_u_instance_rec,
2848 px_csi_txn_rec =>px_csi_txn_rec,
2849 x_return_status =>l_return_status);
2850
2851 IF l_return_status <> fnd_api.g_ret_sts_success THEN
2852 RAISE fnd_api.g_exc_error;
2853 END IF;
2854 END IF;
2855
2856 EXCEPTION
2857 WHEN fnd_api.g_exc_error THEN
2858 x_return_status := fnd_api.g_ret_sts_error;
2859 END convert_wip_instance_to_cp;
2860
2861 PROCEDURE get_wip_instances(
2862 p_wip_entity_id IN number,
2863 p_inventory_item_id IN number,
2864 p_organization_id IN number,
2865 p_option_serial_code IN number,
2866 p_config_rec IN config_rec,
2867 px_csi_txn_rec IN OUT nocopy csi_datastructures_pub.transaction_rec,
2868 x_wip_instances OUT nocopy wip_instances,
2869 x_return_status OUT nocopy varchar2)
2870 IS
2871
2872 CURSOR wip_nsrl_inst_cur(
2873 p_wip_entity_id IN number,
2874 p_inventory_item_id IN number)
2875 IS
2876 SELECT instance_id,
2877 quantity,
2878 serial_number,
2879 location_type_code,
2880 instance_usage_code
2881 FROM csi_item_instances
2882 WHERE inventory_item_id = p_inventory_item_id
2883 AND ((location_type_code = 'WIP' AND wip_job_id = p_wip_entity_id)
2884 OR
2885 (instance_usage_code = 'IN_RELATIONSHIP' AND last_wip_job_id = p_wip_entity_id));
2886
2887 CURSOR wip_srl_inst_cur(
2888 p_wip_entity_id IN number,
2889 p_inventory_item_id IN number)
2890 IS
2891 SELECT instance_id,
2892 quantity,
2893 serial_number,
2894 location_type_code,
2895 instance_usage_code
2896 FROM csi_item_instances
2897 WHERE inventory_item_id = p_inventory_item_id
2898 AND ((location_type_code = 'WIP' AND wip_job_id = p_wip_entity_id)
2899 OR
2900 (instance_usage_code = 'IN_RELATIONSHIP' AND last_wip_job_id = p_wip_entity_id));
2901
2902 l_instances_found boolean := FALSE;
2903
2904 l_wip_instances wip_instances;
2905 l_ind binary_integer := 0;
2906
2907 n_wip_instances wip_instances;
2908 n_ind binary_integer := 0;
2909
2910 l_soi_instance_rec csi_datastructures_pub.instance_rec;
2911
2912 l_splitted_instances csi_datastructures_pub.instance_tbl;
2913 l_return_status varchar2(1) := fnd_api.g_ret_sts_success;
2914
2915 BEGIN
2916
2917 x_return_status := fnd_api.g_ret_sts_success;
2918 api_log('get_wip_instances');
2919
2920 IF p_option_serial_code in (1, 6) THEN
2921 FOR wip_inst_rec IN wip_nsrl_inst_cur(
2922 p_wip_entity_id => p_wip_entity_id,
2923 p_inventory_item_id => p_inventory_item_id)
2924 LOOP
2925
2926 l_instances_found := TRUE;
2927
2928 l_ind := l_ind + 1;
2929 l_wip_instances(l_ind).instance_id := wip_inst_rec.instance_id;
2930 l_wip_instances(l_ind).quantity := wip_inst_rec.quantity;
2931 l_wip_instances(l_ind).serial_number := wip_inst_rec.serial_number;
2932 l_wip_instances(l_ind).location_type_code := wip_inst_rec.location_type_code;
2933 l_wip_instances(l_ind).instance_usage_code := wip_inst_rec.instance_usage_code;
2934 l_wip_instances(l_ind).allocated_flag := 'N';
2935
2936 END LOOP;
2937 ELSIF p_option_serial_code IN (2,5) THEN
2938 FOR wip_inst_rec IN wip_srl_inst_cur(
2939 p_wip_entity_id => p_wip_entity_id,
2940 p_inventory_item_id => p_inventory_item_id)
2941 LOOP
2942
2943 l_instances_found := TRUE;
2944
2945 l_ind := l_ind + 1;
2946 l_wip_instances(l_ind).instance_id := wip_inst_rec.instance_id;
2947 l_wip_instances(l_ind).quantity := wip_inst_rec.quantity;
2948 l_wip_instances(l_ind).serial_number := wip_inst_rec.serial_number;
2949 l_wip_instances(l_ind).location_type_code := wip_inst_rec.location_type_code;
2950 l_wip_instances(l_ind).instance_usage_code := wip_inst_rec.instance_usage_code;
2951 l_wip_instances(l_ind).allocated_flag := 'N';
2952
2953 END LOOP;
2954 END IF;
2955
2956 IF NOT(l_instances_found) THEN
2957
2958 fnd_message.set_name('CSI', 'CSI_NO_WIP_COMP_INSTANCE');
2959 fnd_message.set_token('INV_ITEM_ID', p_inventory_item_id);
2960 fnd_message.set_token('WIP_ENTITY_ID', p_wip_entity_id);
2961 fnd_msg_pub.add;
2962
2963 RAISE fnd_api.g_exc_error;
2964 END IF;
2965
2966
2967 IF p_option_serial_code = 6 THEN
2968 IF l_wip_instances.COUNT > 0 THEN
2969 FOR s_ind IN l_wip_instances.FIRST .. l_wip_instances.LAST
2970 LOOP
2971 IF l_wip_instances(s_ind).quantity > 1 THEN
2972
2973 IF l_wip_instances(s_ind).location_type_code <> 'INVENTORY' THEN
2974
2975 l_soi_instance_rec.instance_id := l_wip_instances(s_ind).instance_id;
2976 l_soi_instance_rec.quantity := l_wip_instances(s_ind).quantity;
2977 l_soi_instance_rec.instance_usage_code := l_wip_instances(s_ind).instance_usage_code;
2978
2979 split_instances_using_copy(
2980 p_instance_rec => l_soi_instance_rec,
2981 px_csi_txn_rec => px_csi_txn_rec,
2982 x_instance_tbl => l_splitted_instances,
2983 x_return_status => l_return_status);
2984
2985 IF l_return_status <> fnd_api.g_ret_sts_success THEN
2986 RAISE fnd_api.g_exc_error;
2987 END IF;
2988
2989 IF l_splitted_instances.COUNT > 0 THEN
2990 FOR spl_ind IN l_splitted_instances.FIRST .. l_splitted_instances.LAST
2991 LOOP
2992 n_ind := n_ind + 1;
2993 n_wip_instances(n_ind).instance_id := l_splitted_instances(spl_ind).instance_id;
2994 n_wip_instances(n_ind).quantity := l_splitted_instances(spl_ind).quantity;
2995 n_wip_instances(n_ind).location_type_code :=
2996 l_splitted_instances(spl_ind).location_type_code;
2997 n_wip_instances(n_ind).instance_usage_code :=
2998 l_splitted_instances(spl_ind).instance_usage_code;
2999 n_wip_instances(n_ind).allocated_flag := 'N';
3000 END LOOP;
3001 END IF;
3002 END IF;
3003 ELSE
3004 n_ind := n_ind + 1;
3005 n_wip_instances(n_ind) := l_wip_instances(s_ind);
3006 END IF;
3007 END LOOP;
3008 l_wip_instances := n_wip_instances;
3009 END IF;
3010 END IF;
3011
3012 -- just the debug
3013 IF l_wip_instances.COUNT > 0 THEN
3014 FOR d_ind IN l_wip_instances.FIRST .. l_wip_instances.LAST
3015 LOOP
3016 debug('wip instances record # '||d_ind);
3017 debug(' instance_id : '||l_wip_instances(d_ind).instance_id);
3018 debug(' quantity : '||l_wip_instances(d_ind).quantity);
3019 debug(' serial_number : '||l_wip_instances(d_ind).serial_number);
3020 debug(' instance_usage_code: '||l_wip_instances(d_ind).instance_usage_code);
3021 debug(' location_type_code : '||l_wip_instances(d_ind).location_type_code);
3022 END LOOP;
3023 END IF;
3024 x_wip_instances := l_wip_instances;
3025
3026 EXCEPTION
3027 WHEN fnd_api.g_exc_error THEN
3028 x_return_status := fnd_api.g_ret_sts_error;
3029 END get_wip_instances;
3030
3031 PROCEDURE get_wip_instances_for_line(
3032 p_option_line_rec IN oe_order_lines_all%rowtype,
3033 p_parent_line_rec IN oe_order_pub.line_rec_type,
3034 p_option_serial_code IN number,
3035 p_class_option_ratio IN number,
3036 p_config_rec IN config_rec,
3037 p_config_instances IN config_serial_inst_tbl,
3038 px_csi_txn_rec IN OUT nocopy csi_datastructures_pub.transaction_rec,
3039 px_wip_instances IN OUT nocopy wip_instances,
3040 x_return_status OUT nocopy varchar2)
3041 IS
3042 l_ratio number;
3043 l_wip_instances wip_instances;
3044 l_in_rel_wip_instances wip_instances;
3045 l_temp_wip_instances wip_instances;
3046 l_tot_wip_inst_qty number := 0;
3047
3048 l_parent_instance_id number;
3049
3050 l_n_wip_instance wip_instance;
3051 n_ind binary_integer := 0;
3052 l_n_wip_instances wip_instances;
3053 l_splitted_instances csi_datastructures_pub.instance_tbl;
3054 l_option_count number := 0;
3055
3056 l_new_instance_rec csi_datastructures_pub.instance_rec;
3057
3058 l_return_status varchar2(1) := fnd_api.g_ret_sts_success;
3059
3060 FUNCTION tot_wip_inst_qty(
3061 p_wip_instances IN wip_instances)
3062 RETURN number
3063 IS
3064 l_total number := 0;
3065 BEGIN
3066 IF p_wip_instances.COUNT > 0 THEN
3067 FOR l_ind IN p_wip_instances.FIRST ..p_wip_instances.LAST
3068 LOOP
3069 l_total := l_total + p_wip_instances(l_ind).quantity;
3070 END LOOP;
3071 END IF;
3072 RETURN l_total;
3073 END tot_wip_inst_qty;
3074
3075 PROCEDURE get_in_rel_options (
3076 p_config_instances IN config_serial_inst_tbl,
3077 px_wip_instances IN OUT nocopy wip_instances,
3078 x_return_status OUT nocopy varchar2)
3079 IS
3080 n_ind binary_integer:= 0;
3081 l_n_wip_instances wip_instances;
3082 l_parent_instance_id number;
3083 BEGIN
3084 x_return_status := fnd_api.g_ret_sts_success;
3085 api_log('get_in_rel_options');
3086 IF px_wip_instances.count > 0 THEN
3087 FOR l_ind IN px_wip_instances.FIRST ..px_wip_instances.LAST
3088 LOOP
3089
3090 IF px_wip_instances(l_ind).instance_usage_code = 'IN_RELATIONSHIP' THEN
3091
3092 SELECT object_id
3093 INTO l_parent_instance_id
3094 FROM csi_ii_relationships
3095 WHERE subject_id = px_wip_instances(l_ind).instance_id
3096 AND relationship_type_code = 'COMPONENT-OF'
3097 AND sysdate BETWEEN nvl(active_start_date, sysdate-1)
3098 AND nvl(active_end_date, sysdate+1);
3099
3100 IF p_config_instances.COUNT > 0 THEN
3101 FOR c_ind IN p_config_instances.FIRST .. p_config_instances.LAST
3102 LOOP
3103 IF p_config_instances(c_ind).instance_id = l_parent_instance_id THEN
3104 n_ind := n_ind + 1;
3105 l_n_wip_instances(n_ind) := px_wip_instances(l_ind);
3106 END IF;
3107 END LOOP;
3108 END IF;
3109
3110 END IF;
3111 END LOOP;
3112 END IF;
3113 debug(' in_rel_options.count : '||l_n_wip_instances.COUNT);
3114 px_wip_instances := l_n_wip_instances;
3115 EXCEPTION
3116 WHEN fnd_api.g_exc_error THEN
3117 x_return_status := fnd_api.g_ret_sts_error;
3118 END get_in_rel_options;
3119
3120 PROCEDURE mark_and_get(
3121 px_wip_instances IN OUT nocopy wip_instances,
3122 x_wip_instance OUT nocopy wip_instance)
3123 IS
3124 l_ind binary_integer := 0;
3125 BEGIN
3126 IF px_wip_instances.COUNT > 0 THEN
3127 l_ind := 0;
3128 LOOP
3129 l_ind := px_wip_instances.NEXT(l_ind);
3130 EXIT WHEN l_ind is null;
3131 x_wip_instance := px_wip_instances(l_ind);
3132 px_wip_instances.DELETE(l_ind);
3133 EXIT;
3134 END LOOP;
3135 END IF;
3136 END mark_and_get;
3137
3138 PROCEDURE filter_processed_options(
3139 p_split_from_line_id IN number,
3140 p_inventory_item_id IN number,
3141 px_wip_instances IN OUT nocopy wip_instances)
3142 IS
3143 l_wip_instances wip_instances;
3144 l_ind binary_integer := 0;
3145 px_ind binary_integer := 0;
3146 CURSOR inst_cur IS
3147 SELECT instance_id
3148 FROM csi_item_instances
3149 WHERE inventory_item_id = p_inventory_item_id
3150 AND last_oe_order_line_id = p_split_from_line_id;
3151 BEGIN
3152 IF px_wip_instances.COUNT > 0 THEN
3153 FOR inst_rec IN inst_cur
3154 LOOP
3155
3156 px_ind := 0;
3157 LOOP
3158 px_ind := px_wip_instances.NEXT(px_ind);
3159 EXIT WHEN px_ind is null;
3160 IF px_wip_instances(px_ind).instance_id = inst_rec.instance_id THEN
3161 px_wip_instances.DELETE(px_ind);
3162 END IF;
3163 END LOOP;
3164
3165 END LOOP;
3166 END IF;
3167
3168 IF px_wip_instances.COUNT > 0 THEN
3169 px_ind := 0;
3170 LOOP
3171 px_ind := px_wip_instances.NEXT(px_ind);
3172 EXIT WHEN px_ind is null;
3173 l_ind := l_ind + 1;
3174 l_wip_instances(l_ind) := px_wip_instances(px_ind);
3175 END LOOP;
3176 END IF;
3177
3178 px_wip_instances := l_wip_instances;
3179
3180 END filter_processed_options;
3181
3182 BEGIN
3183
3184 x_return_status := fnd_api.g_ret_sts_success;
3185
3186 api_log('get_wip_instances_for_line');
3187
3188 l_wip_instances := px_wip_instances;
3189
3190 -- order short closed when under shipped. bug 3690762
3191 IF p_option_line_rec.fulfilled_quantity <> p_option_line_rec.ordered_quantity THEN
3192 l_option_count := p_option_line_rec.fulfilled_quantity;
3193 ELSE
3194 l_option_count := p_option_line_rec.ordered_quantity;
3195 END IF;
3196
3197 IF p_config_rec.serial_code in (2, 5) THEN
3198
3199 -- as the relations will be built at wip we need to get the options that was tied in
3200 -- a component of relation at wip
3201 l_in_rel_wip_instances := l_wip_instances;
3202
3203 get_in_rel_options(
3204 p_config_instances => p_config_instances,
3205 px_wip_instances => l_in_rel_wip_instances,
3206 x_return_status => l_return_status);
3207 IF x_return_status <> fnd_api.g_ret_sts_success THEN
3208 RAISE fnd_api.g_exc_error;
3209 END IF;
3210
3211 --fix for bug 4705806:If all the option instances for the order line are not in_rel
3212 --we pick instances left in wip and convert them into CP
3213 IF l_in_rel_wip_instances.COUNT <> l_option_count THEN
3214 debug('In_rel option count <> order line quantity,so picking option instances in_wip');
3215 n_ind := l_in_rel_wip_instances.COUNT;
3216 FOR l_ind IN l_wip_instances.FIRST ..l_wip_instances.LAST
3217 LOOP
3218 EXIT WHEN l_in_rel_wip_instances.COUNT >= l_option_count;
3219 IF l_wip_instances(l_ind).instance_usage_code = 'IN_WIP' THEN
3220 n_ind := n_ind + 1;
3221 l_in_rel_wip_instances(n_ind) := px_wip_instances(l_ind);
3222 END IF;
3223 END LOOP;
3224 END IF;
3225 debug('in_rel + in_wip options.count : '||l_in_rel_wip_instances.COUNT);
3226 --end of fix 4705806
3227
3228
3229 px_wip_instances := l_in_rel_wip_instances;
3230
3231 END IF;
3232
3233 -- config item is non serialized/serialized at so issue
3234 IF p_config_rec.serial_code IN (1, 6) OR l_in_rel_wip_instances.COUNT = 0 THEN
3235
3236 -- filter out the wip instances that were processed for a split from order line
3237 IF p_option_line_rec.split_from_line_id is not null THEN
3238 filter_processed_options(
3239 p_split_from_line_id => p_option_line_rec.split_from_line_id,
3240 p_inventory_item_id => p_option_line_rec.inventory_item_id,
3241 px_wip_instances => l_wip_instances);
3242 END IF;
3243
3244 IF p_option_serial_code in (2, 5, 6) THEN
3245
3246 l_temp_wip_instances := l_wip_instances;
3247 FOR ind IN 1 .. l_option_count
3248 LOOP
3249 mark_and_get(
3250 px_wip_instances => l_temp_wip_instances,
3251 x_wip_instance => l_n_wip_instance);
3252 IF nvl(l_n_wip_instance.instance_id, fnd_api.g_miss_num) <> fnd_api.g_miss_num THEN
3253 n_ind := n_ind + 1;
3254 l_n_wip_instances(n_ind) := l_n_wip_instance;
3255 END IF;
3256 END LOOP;
3257
3258 px_wip_instances := l_n_wip_instances;
3259
3260 ELSE -- option is non serial case
3261 IF l_wip_instances.COUNT > 0 THEN
3262
3263 l_tot_wip_inst_qty := tot_wip_inst_qty(l_wip_instances);
3264
3265 IF p_parent_line_rec.ordered_quantity = 1 THEN
3266 IF l_tot_wip_inst_qty > p_option_line_rec.fulfilled_quantity THEN
3267 --split the wip instance to take the order quantity out for this line
3268 --if it is an over issue case the excess stays in WIP
3269 IF l_wip_instances.COUNT = 1 THEN
3270
3271 split_instance(
3272 p_instance_id => l_wip_instances(1).instance_id,
3273 p_quantity => p_option_line_rec.fulfilled_quantity,
3274 px_csi_txn_rec => px_csi_txn_rec,
3275 x_instance_rec => l_new_instance_rec,
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 n_ind := n_ind + 1;
3283 l_n_wip_instances(n_ind).instance_id := l_new_instance_rec.instance_id;
3284 l_n_wip_instances(n_ind).quantity := l_new_instance_rec.quantity;
3285 l_n_wip_instances(n_ind).location_type_code
3286 := l_new_instance_rec.location_type_code;
3287 l_n_wip_instances(n_ind).instance_usage_code
3288 := l_new_instance_rec.instance_usage_code;
3289 l_n_wip_instances(n_ind).allocated_flag:= 'N';
3290
3291 px_wip_instances := l_n_wip_instances;
3292 ELSE
3293 -- this needs to be fixed. change with a logic to loop thru the
3294 -- instances and get only the fullfilled quantity equivalent
3295 px_wip_instances := l_wip_instances;
3296 END IF;
3297 ELSE
3298 px_wip_instances := l_wip_instances;
3299 END IF;
3300
3301 ELSE -- parent ordered quantity > 1
3302
3303 l_ratio := p_option_line_rec.ordered_quantity/p_parent_line_rec.ordered_quantity;
3304
3305 IF l_wip_instances.COUNT = 1 THEN
3306
3307 split_instance_using_ratio(
3308 p_instance_id => l_wip_instances(1).instance_id,
3309 p_qty_ratio => l_ratio,
3310 p_parent_qty => p_parent_line_rec.ordered_quantity,
3311 p_organization_id => p_option_line_rec.ship_from_org_id,
3312 px_csi_txn_rec => px_csi_txn_rec,
3313 x_splitted_instances => l_splitted_instances,
3314 x_return_status => l_return_status);
3315
3316 IF l_return_status <> fnd_Api.g_ret_sts_success THEN
3317 RAISE fnd_api.g_exc_error;
3318 END IF;
3319
3320 IF l_splitted_instances.COUNT > 0 THEN
3321 FOR l_ind IN l_splitted_instances.FIRST .. l_splitted_instances.LAST
3322 LOOP
3323 n_ind := n_ind + 1;
3324 l_n_wip_instances(n_ind).instance_id := l_splitted_instances(l_ind).instance_id;
3325 l_n_wip_instances(n_ind).quantity := l_splitted_instances(l_ind).quantity;
3326 l_n_wip_instances(n_ind).location_type_code :=
3327 l_splitted_instances(l_ind).location_type_code;
3328 l_n_wip_instances(n_ind).instance_usage_code :=
3329 l_splitted_instances(l_ind).instance_usage_code;
3330 l_n_wip_instances(n_ind).allocated_flag:= 'N';
3331 END LOOP;
3332 END IF;
3333
3334 IF p_option_line_rec.fulfilled_quantity <> p_option_line_rec.ordered_quantity THEN
3335
3336 l_temp_wip_instances.DELETE;
3337 l_temp_wip_instances := l_n_wip_instances;
3338
3339 l_n_wip_instances.DELETE;
3340 n_ind := 0;
3341
3342 FOR l_ind IN 1 .. (p_option_line_rec.fulfilled_quantity/l_ratio)
3343 LOOP
3344 mark_and_get(
3345 px_wip_instances => l_temp_wip_instances,
3346 x_wip_instance => l_n_wip_instance);
3347
3348 IF nvl(l_n_wip_instance.instance_id, fnd_api.g_miss_num) <> fnd_api.g_miss_num THEN
3349 n_ind := n_ind + 1;
3350 l_n_wip_instances(n_ind) := l_n_wip_instance;
3351 END IF;
3352 END LOOP;
3353 px_wip_instances := l_n_wip_instances;
3354 ELSE
3355 px_wip_instances := l_n_wip_instances;
3356 END IF;
3357
3358 ELSE
3359
3360 IF l_wip_instances.COUNT > 0 THEN
3361 FOR l_ind IN l_wip_instances.FIRST .. l_wip_instances.LAST
3362 LOOP
3363
3364 IF l_wip_instances(l_ind).quantity > l_ratio THEN
3365
3366 split_instance_using_ratio(
3367 p_instance_id => l_wip_instances(l_ind).instance_id,
3368 p_qty_ratio => l_ratio,
3369 p_parent_qty => p_parent_line_rec.ordered_quantity,
3370 p_organization_id => p_option_line_rec.ship_from_org_id,
3371 px_csi_txn_rec => px_csi_txn_rec,
3372 x_splitted_instances => l_splitted_instances,
3373 x_return_status => l_return_status);
3374
3375 IF l_return_status <> fnd_Api.g_ret_sts_success THEN
3376 RAISE fnd_api.g_exc_error;
3377 END IF;
3378
3379 IF l_splitted_instances.COUNT > 0 THEN
3380 FOR l_ind IN l_splitted_instances.FIRST .. l_splitted_instances.LAST
3381 LOOP
3382 n_ind := n_ind + 1;
3383 l_n_wip_instances(n_ind).instance_id := l_splitted_instances(l_ind).instance_id;
3384 l_n_wip_instances(n_ind).quantity := l_splitted_instances(l_ind).quantity;
3385 l_n_wip_instances(n_ind).location_type_code :=
3386 l_splitted_instances(l_ind).location_type_code;
3387 l_n_wip_instances(n_ind).instance_usage_code :=
3388 l_splitted_instances(l_ind).instance_usage_code;
3389 l_n_wip_instances(n_ind).allocated_flag:= 'N';
3390 END LOOP;
3391 END IF;
3392 ELSE
3393 n_ind := n_ind + 1;
3394 l_n_wip_instances(n_ind) := l_wip_instances(l_ind);
3395 END IF;
3396 END LOOP;
3397 END IF;
3398
3399 IF p_option_line_rec.fulfilled_quantity <> p_option_line_rec.ordered_quantity THEN
3400
3401 l_temp_wip_instances.DELETE;
3402 l_temp_wip_instances := l_n_wip_instances;
3403 l_n_wip_instances.DELETE;
3404 n_ind := 0;
3405
3406 FOR l_ind IN 1 .. (p_option_line_rec.fulfilled_quantity/l_ratio)
3407 LOOP
3408 mark_and_get(
3409 px_wip_instances => l_temp_wip_instances,
3410 x_wip_instance => l_n_wip_instance);
3411
3412 IF nvl(l_n_wip_instance.instance_id, fnd_api.g_miss_num) <> fnd_api.g_miss_num THEN
3413 n_ind := n_ind + 1;
3414 l_n_wip_instances(n_ind) := l_n_wip_instance;
3415 END IF;
3416 END LOOP;
3417
3418 px_wip_instances := l_n_wip_instances;
3419
3420 ELSE
3421 px_wip_instances := l_n_wip_instances;
3422 END IF;
3423 END IF;
3424
3425 END IF;
3426 END IF;
3427 END IF;
3428 END IF; -- serial/ non serial configured item
3429
3430 -- just the debug
3431 IF px_wip_instances.COUNT > 0 THEN
3432 FOR d_ind IN px_wip_instances.FIRST .. px_wip_instances.LAST
3433 LOOP
3434 debug('wip instances record # '||d_ind);
3435 debug(' instance_id : '||px_wip_instances(d_ind).instance_id);
3436 debug(' quantity : '||px_wip_instances(d_ind).quantity);
3437 debug(' serial_number : '||px_wip_instances(d_ind).serial_number);
3438 debug(' instance_usage_code: '||px_wip_instances(d_ind).instance_usage_code);
3439 debug(' location_type_code : '||px_wip_instances(d_ind).location_type_code);
3440 END LOOP;
3441 END IF;
3442
3443 EXCEPTION
3444 WHEN fnd_api.g_exc_error THEN
3445 x_return_status := fnd_api.g_ret_sts_error;
3446 END get_wip_instances_for_line;
3447
3448 -- enhancements to be made in the genealogy area in this routine
3449 PROCEDURE distribute_wip_instances(
3450 p_qty_ratio IN number,
3451 p_option_serial_code IN number,
3452 p_parent_line_rec IN oe_order_pub.line_rec_type,
3453 p_parent_instances IN parent_instances,
3454 p_wip_instances IN wip_instances,
3455 px_default_info_rec IN OUT nocopy default_info_rec,
3456 x_ii_rltns_tbl OUT nocopy csi_datastructures_pub.ii_relationship_tbl,
3457 x_return_status OUT nocopy varchar2)
3458 IS
3459
3460 l_parent_instances parent_instances;
3461 l_wip_instances wip_instances;
3462 l_alloc_wip_instance wip_instance;
3463 ii_ind binary_integer := 0;
3464 l_ii_rltns_tbl csi_datastructures_pub.ii_relationship_tbl;
3465
3466 PROCEDURE mark_and_get(
3467 p_parent_instance IN parent_instance,
3468 px_wip_instances IN OUT NOCOPY wip_instances,
3469 x_alloc_wip_instance OUT NOCOPY wip_instance)
3470 IS
3471 BEGIN
3472 IF px_wip_instances.COUNT > 0 THEN
3473 FOR l_ind IN px_wip_instances.FIRST .. px_wip_instances.LAST
3474 LOOP
3475 IF px_wip_instances(l_ind).allocated_flag = 'N' THEN
3476 px_wip_instances(l_ind).allocated_flag := 'Y';
3477 x_alloc_wip_instance := px_wip_instances(l_ind);
3478 exit;
3479 END IF;
3480 END LOOP;
3481 END IF;
3482 END mark_and_get;
3483
3484 BEGIN
3485
3486 x_return_status := fnd_api.g_ret_sts_success;
3487 api_log('distribute_wip_instances');
3488
3489 l_parent_instances := p_parent_instances;
3490 l_wip_instances := p_wip_instances;
3491
3492 IF p_option_serial_code = 1 THEN
3493 IF l_parent_instances.COUNT > 0 THEN
3494 FOR p_ind IN l_parent_instances.FIRST .. l_parent_instances.LAST
3495 LOOP
3496
3497 mark_and_get(
3498 p_parent_instance => l_parent_instances(p_ind),
3499 px_wip_instances => l_wip_instances,
3500 x_alloc_wip_instance => l_alloc_wip_instance);
3501
3502 ii_ind := ii_ind + 1;
3503 l_ii_rltns_tbl(ii_ind).subject_id := l_alloc_wip_instance.instance_id;
3504 l_ii_rltns_tbl(ii_ind).object_id := l_parent_instances(p_ind).instance_id;
3505 l_ii_rltns_tbl(ii_ind).relationship_type_code := 'COMPONENT-OF';
3506 l_ii_rltns_tbl(ii_ind).cascade_ownership_flag := px_default_info_rec.cascade_owner_flag;
3507
3508 END LOOP;
3509 END IF;
3510 ELSE
3511 IF l_parent_instances.COUNT > 0 THEN
3512 FOR p_ind IN l_parent_instances.FIRST .. l_parent_instances.LAST
3513 LOOP
3514
3515 FOR r_ind IN 1..p_qty_ratio
3516 LOOP
3517
3518 mark_and_get(
3519 p_parent_instance => l_parent_instances(p_ind),
3520 px_wip_instances => l_wip_instances,
3521 x_alloc_wip_instance => l_alloc_wip_instance);
3522
3523 ii_ind := ii_ind + 1;
3524 l_ii_rltns_tbl(ii_ind).subject_id := l_alloc_wip_instance.instance_id;
3525 l_ii_rltns_tbl(ii_ind).object_id := l_parent_instances(p_ind).instance_id;
3526 l_ii_rltns_tbl(ii_ind).relationship_type_code := 'COMPONENT-OF';
3527 l_ii_rltns_tbl(ii_ind).cascade_ownership_flag := px_default_info_rec.cascade_owner_flag;
3528
3529 END LOOP;
3530
3531 END LOOP;
3532 END IF;
3533 END IF;
3534
3535 x_ii_rltns_tbl := l_ii_rltns_tbl;
3536
3537 EXCEPTION
3538 WHEN fnd_api.g_exc_error THEN
3539 x_return_status := fnd_api.g_ret_sts_error;
3540 END distribute_wip_instances;
3541
3542 PROCEDURE make_or_buy_from_unit_txn(
3543 p_serial_number IN varchar2,
3544 p_inventory_item_id IN number,
3545 p_sub_config_flag IN varchar2,
3546 px_config_rec IN OUT nocopy config_rec,
3547 x_make_or_buy_flag OUT nocopy varchar2)
3548 IS
3549 CURSOR all_txn_cur(
3550 p_serial_number in varchar2,
3551 p_item_id in number)
3552 IS
3553 SELECT mmt.creation_date mtl_creation_date,
3554 mmt.transaction_id mtl_txn_id,
3555 to_char(mmt.transaction_date,'dd-mm-yyyy hh24:mi:ss') mtl_txn_date,
3556 mmt.organization_id organization_id,
3557 mmt.transaction_type_id mtl_type_id,
3558 mtt.transaction_type_name mtl_txn_name,
3559 mmt.transaction_action_id mtl_action_id,
3560 mmt.transaction_source_type_id mtl_source_type_id,
3561 mmt.transaction_source_id mtl_source_id
3562 FROM mtl_unit_transactions mut,
3563 mtl_material_transactions mmt,
3564 mtl_transaction_types mtt
3565 WHERE mut.serial_number = p_serial_number
3566 AND mut.inventory_item_id = p_item_id
3567 AND mmt.transaction_id = mut.transaction_id
3568 AND mtt.transaction_type_id = mmt.transaction_type_id
3569 UNION
3570 SELECT mmt.creation_date mtl_creation_date,
3571 mmt.transaction_id mtl_txn_id,
3572 to_char(mmt.transaction_date,'dd-mm-yy hh24:mi:ss') mtl_txn_date,
3573 mmt.organization_id organization_id,
3574 mmt.transaction_type_id mtl_type_id,
3575 mtt.transaction_type_name mtl_txn_name,
3576 mmt.transaction_action_id mtl_action_id,
3577 mmt.transaction_source_type_id mtl_source_type_id,
3578 mmt.transaction_source_id mtl_source_id
3579 FROM mtl_unit_transactions mut,
3580 mtl_transaction_lot_numbers mtln,
3581 mtl_material_transactions mmt,
3582 mtl_transaction_types mtt
3583 WHERE mut.serial_number = p_serial_number
3584 AND mut.inventory_item_id = p_item_id
3585 AND mtln.serial_transaction_id = mut.transaction_id
3586 AND mmt.transaction_id = mtln.transaction_id
3587 AND mtt.transaction_type_id = mmt.transaction_type_id
3588 ORDER BY 1 desc, 2 desc;
3589 BEGIN
3590 FOR all_txn_rec IN all_txn_cur(
3591 p_serial_number => p_serial_number,
3592 p_item_id => p_inventory_item_id)
3593 LOOP
3594 debug(' '||all_txn_cur%rowcount||
3595 '. '||all_txn_rec.mtl_txn_date||
3596 ' '||all_txn_rec.mtl_txn_name);
3597 IF (all_txn_rec.mtl_source_type_id = 5 AND all_txn_rec.mtl_action_id = 31)
3598 OR
3599 (all_txn_rec.mtl_source_type_id = 1 AND all_txn_rec.mtl_action_id = 27)
3600 THEN
3601 IF all_txn_rec.mtl_source_type_id = 5 THEN
3602
3603 x_make_or_buy_flag := 'M';
3604 IF p_sub_config_flag = 'N' THEN
3605 px_config_rec.config_wip_job_id := all_txn_rec.mtl_source_id;
3606 px_config_rec.config_wip_org_id := all_txn_rec.organization_id;
3607 ELSE
3608 px_config_rec.sub_config_wip_job_id := all_txn_rec.mtl_source_id;
3609 px_config_rec.sub_config_wip_org_id := all_txn_rec.organization_id;
3610 END IF;
3611 ELSE
3612 x_make_or_buy_flag := 'B';
3613 END IF;
3614 exit;
3615 END IF;
3616 END LOOP;
3617 END make_or_buy_from_unit_txn;
3618
3619 PROCEDURE get_wip_info_from_txn(
3620 px_config_rec IN OUT nocopy config_rec)
3621 IS
3622
3623 CURSOR config_srl_cur (
3624 p_line_id in number,
3625 p_item_id in number)
3626 IS
3627 SELECT instance_id,
3628 serial_number
3629 FROM csi_item_instances
3630 WHERE inventory_item_id = p_item_id
3631 AND last_oe_order_line_id = p_line_id;
3632
3633 l_make_or_buy_flag varchar2(1) := 'B';
3634 BEGIN
3635 api_log('get_wip_info_from_txn');
3636 FOR config_srl_rec in config_srl_cur(
3637 p_line_id => px_config_rec.line_id,
3638 p_item_id => px_config_rec.item_id)
3639 LOOP
3640 make_or_buy_from_unit_txn(
3641 p_serial_number => config_srl_rec.serial_number,
3642 p_inventory_item_id => px_config_rec.item_id,
3643 p_sub_config_flag => 'N',
3644 px_config_rec => px_config_rec,
3645 x_make_or_buy_flag => l_make_or_buy_flag);
3646 exit;
3647 END LOOP;
3648 END get_wip_info_from_txn;
3649
3650 PROCEDURE get_job_for_config_line(
3651 p_config_rec IN config_rec,
3652 x_wip_entity_id OUT nocopy number,
3653 x_wip_organization_id OUT nocopy number,
3654 x_request_id OUT nocopy number)
3655 IS
3656
3657 l_job_found boolean := FALSE;
3658
3659 CURSOR all_job_cur(p_source_line_id IN number) IS
3660 SELECT wip_entity_id,
3661 organization_id,
3662 request_id
3663 FROM wip_discrete_jobs
3664 WHERE primary_item_id = p_config_rec.item_id
3665 AND organization_id = p_config_rec.ship_organization_id
3666 AND source_line_id = p_source_line_id
3667 AND status_type <> 7 -- excluding the cancelled wip jobs
3668 ORDER by wip_entity_id desc;
3669
3670 BEGIN
3671
3672 l_job_found := FALSE;
3673
3674 FOR all_job_rec IN all_job_cur(p_config_rec.line_id)
3675 LOOP
3676 x_wip_entity_id := all_job_rec.wip_entity_id;
3677 x_wip_organization_id := all_job_rec.organization_id;
3678 x_request_id := all_job_rec.request_id;
3679 l_job_found := TRUE;
3680 exit;
3681 END LOOP;
3682
3683 IF NOT(l_job_found) AND p_config_rec.split_from_line_id IS NOT null THEN
3684 FOR all_job_rec IN all_job_cur(p_config_rec.split_from_line_id)
3685 LOOP
3686 x_wip_entity_id := all_job_rec.wip_entity_id;
3687 x_wip_organization_id := all_job_rec.organization_id;
3688 x_request_id := all_job_rec.request_id;
3689 l_job_found := TRUE;
3690 exit;
3691 END LOOP;
3692 END IF;
3693
3694 END get_job_for_config_line;
3695
3696 PROCEDURE get_sub_model_wip_info(
3697 px_config_rec IN OUT nocopy config_rec,
3698 x_return_status OUT nocopy varchar2)
3699 IS
3700 l_config_rec config_rec;
3701 l_make_or_buy_flag varchar2(1);
3702
3703 CURSOR issued_srl_cur IS
3704 SELECT mut.serial_number,
3705 mut.inventory_item_id
3706 FROM mtl_material_transactions mmt,
3707 mtl_unit_transactions mut
3708 WHERE mmt.transaction_source_type_id = 5
3709 AND mmt.transaction_action_id = 1
3710 AND mmt.inventory_item_id = px_config_rec.sub_config_item_id
3711 AND mmt.transaction_source_id = px_config_rec.config_wip_job_id
3712 AND mut.transaction_id = mmt.transaction_id
3713 AND mut.inventory_item_id = mmt.inventory_item_id
3714 UNION
3715 SELECT mut.serial_number,
3716 mut.inventory_item_id
3717 FROM mtl_material_transactions mmt,
3718 mtl_transaction_lot_numbers mtln,
3719 mtl_unit_transactions mut
3720 WHERE mmt.transaction_source_type_id = 5
3721 AND mmt.transaction_action_id = 1
3722 AND mmt.inventory_item_id = px_config_rec.sub_config_item_id
3723 AND mmt.transaction_source_id = px_config_rec.config_wip_job_id
3724 AND mtln.transaction_id = mmt.transaction_id
3725 AND mtln.inventory_item_id = mmt.inventory_item_id
3726 AND mut.transaction_id = mtln.serial_transaction_id
3727 AND mut.inventory_item_id = mtln.inventory_item_id;
3728
3729 BEGIN
3730 l_config_rec := px_config_rec;
3731
3732 SELECT serial_number_control_code
3733 INTO l_config_rec.sub_model_serial_code
3734 FROM mtl_system_items
3735 WHERE inventory_item_id = l_config_rec.sub_config_item_id
3736 AND organization_id = l_config_rec.ship_organization_id;
3737
3738 IF l_config_rec.sub_model_serial_code in (2, 5) THEN
3739 debug(' sub model is either serialized at receipt/predefined.');
3740 FOR issued_srl_rec IN issued_srl_cur
3741 LOOP
3742 -- for each of the serial get the completion transaction
3743 make_or_buy_from_unit_txn(
3744 p_serial_number => issued_srl_rec.serial_number,
3745 p_inventory_item_id => issued_srl_rec.inventory_item_id,
3746 p_sub_config_flag => 'Y',
3747 px_config_rec => l_config_rec,
3748 x_make_or_buy_flag => l_make_or_buy_flag);
3749 exit;
3750 END LOOP;
3751 IF l_make_or_buy_flag = 'M' THEN
3752 l_config_rec.sub_config_make_flag := 'Y';
3753 ELSE
3754 l_config_rec.sub_config_make_flag := 'N';
3755 END IF;
3756 ELSE
3757 debug(' sub model is either non serialized/at so issue.');
3758 BEGIN
3759 SELECT wip_entity_id,
3760 organization_id
3761 INTO l_config_rec.sub_config_wip_job_id,
3762 l_config_rec.sub_config_wip_org_id
3763 FROM wip_discrete_jobs
3764 WHERE primary_item_id = l_config_rec.sub_config_item_id
3765 AND request_id = l_config_rec.request_id
3766 AND rownum = 1;
3767 l_config_rec.sub_config_make_flag := 'Y';
3768 EXCEPTION
3769 WHEN no_data_found THEN
3770 l_config_rec.sub_config_make_flag := 'N';
3771 END;
3772 END IF;
3773
3774 px_config_rec := l_config_rec;
3775
3776 END get_sub_model_wip_info;
3777
3778 PROCEDURE get_config_info(
3779 p_line_id IN number,
3780 p_ato_header_id IN number,
3781 p_ato_line_id IN number,
3782 px_default_info_rec IN OUT nocopy default_info_rec,
3783 x_config_rec OUT nocopy config_rec,
3784 x_return_status OUT nocopy varchar2)
3785 IS
3786
3787 l_config_rec config_rec;
3788 l_wip_found boolean := FALSE;
3789 l_parent_ato_line_id number;
3790 l_return_status varchar2(1) := fnd_api.g_ret_sts_success;
3791
3792 BEGIN
3793
3794 x_return_status := fnd_api.g_ret_sts_success;
3795 api_log('get_config_info');
3796
3797 BEGIN
3798 SELECT oel.line_id,
3799 oel.inventory_item_id,
3800 oel.ship_from_org_id,
3801 oel.ordered_quantity,
3802 oel.split_from_line_id
3803 INTO l_config_rec.line_id,
3804 l_config_rec.item_id,
3805 l_config_rec.ship_organization_id,
3806 l_config_rec.order_quantity,
3807 l_config_rec.split_from_line_id
3808 FROM oe_order_lines_all oel
3809 WHERE oel.header_id = p_ato_header_id
3810 AND oel.link_to_line_id = p_ato_line_id
3811 AND oel.item_type_code = 'CONFIG';
3812 EXCEPTION
3813 WHEN no_data_found THEN
3814 null;
3815 WHEN too_many_rows THEN
3816 SELECT oel.line_id,
3817 oel.inventory_item_id,
3818 oel.ship_from_org_id,
3819 oel.ordered_quantity,
3820 oel.split_from_line_id
3821 INTO l_config_rec.line_id,
3822 l_config_rec.item_id,
3823 l_config_rec.ship_organization_id,
3824 l_config_rec.order_quantity,
3825 l_config_rec.split_from_line_id
3826 FROM oe_order_lines_all oel
3827 WHERE oel.header_id = p_ato_header_id
3828 AND oel.link_to_line_id = p_ato_line_id
3829 AND oel.item_type_code = 'CONFIG'
3830 AND oel.split_from_line_id is null;
3831
3832 END;
3833
3834 IF l_config_rec.line_id is not null THEN
3835
3836 SELECT serial_number_control_code
3837 INTO l_config_rec.serial_code
3838 FROM mtl_system_items
3839 WHERE inventory_item_id = l_config_rec.item_id
3840 AND organization_id = l_config_rec.ship_organization_id;
3841
3842 get_job_for_config_line(
3843 p_config_rec => l_config_rec,
3844 x_wip_entity_id => l_config_rec.config_wip_job_id,
3845 x_wip_organization_id => l_config_rec.config_wip_org_id,
3846 x_request_id => l_config_rec.request_id);
3847
3848 IF l_config_rec.config_wip_job_id is null THEN
3849 IF l_config_rec.serial_code in (2, 5) THEN
3850 get_wip_info_from_txn(
3851 px_config_rec => l_config_rec);
3852 END IF;
3853 END IF;
3854
3855 END IF;
3856
3857 IF l_config_rec.config_wip_job_id is not null THEN
3858 l_config_rec.make_flag := 'Y';
3859 ELSE
3860 l_config_rec.make_flag := 'N';
3861 END IF;
3862
3863 IF l_config_rec.make_flag = 'Y' THEN
3864 BEGIN
3865
3866 SELECT parent_ato_line_id
3867 INTO l_parent_ato_line_id
3868 FROM bom_cto_order_lines
3869 WHERE line_id = p_line_id;
3870
3871 IF l_parent_ato_line_id is not null THEN
3872
3873 IF l_parent_ato_line_id <> p_ato_line_id THEN
3874 l_config_rec.sub_model_flag := 'Y';
3875 l_config_rec.sub_model_line_id := l_parent_ato_line_id;
3876 ELSIF px_default_info_rec.identified_item_type = 'ATO_SUB_MODEL' THEN
3877 l_config_rec.sub_model_flag := 'Y';
3878 l_config_rec.sub_model_line_id := p_line_id;
3879 ELSE
3880 l_config_rec.sub_model_flag := 'N';
3881 END IF;
3882
3883 IF l_config_rec.sub_model_flag = 'Y' THEN
3884
3885 SELECT config_item_id,
3886 wip_supply_type
3887 INTO l_config_rec.sub_config_item_id,
3888 l_config_rec.sub_model_wip_supply_type
3889 FROM bom_cto_order_lines
3890 WHERE line_id = l_config_rec.sub_model_line_id;
3891
3892 IF l_config_rec.sub_config_item_id is not null
3893 AND
3894 l_config_rec.sub_model_wip_supply_type <> 6
3895 THEN
3896 get_sub_model_wip_info(
3897 px_config_rec => l_config_rec,
3898 x_return_status => l_return_status);
3899 IF l_return_status <> fnd_api.g_ret_sts_success THEN
3900 RAISE fnd_api.g_exc_error;
3901 END IF;
3902 ELSE
3903 l_config_rec.sub_config_make_flag := 'N';
3904 END IF;
3905
3906 END IF;
3907
3908 ELSE
3909 l_config_rec.sub_model_flag := 'N';
3910 END IF;
3911
3912 EXCEPTION
3913 WHEN no_data_found THEN
3914 l_config_rec.sub_model_flag := 'N';
3915 END;
3916
3917 END IF;
3918
3919 debug(' config_line_id : '||l_config_rec.line_id);
3920 debug(' config_item_id : '||l_config_rec.item_id);
3921 debug(' config_serial_code : '||l_config_rec.serial_code);
3922 debug(' config_ord_qty : '||l_config_rec.order_quantity);
3923 debug(' config_ship_org_id : '||l_config_rec.ship_organization_id);
3924 debug(' config_wip_job_id : '||l_config_rec.config_wip_job_id);
3925 debug(' config_wip_org_id : '||l_config_rec.config_wip_org_id);
3926 debug(' make_flag : '||l_config_rec.make_flag);
3927 debug(' sub_model_flag : '||l_config_rec.sub_model_flag);
3928 IF l_config_rec.sub_model_flag = 'Y' THEN
3929 debug(' sub_mdl_line_id : '||l_config_rec.sub_model_line_id);
3930 debug(' sub_mdl_wip_supply : '||l_config_rec.sub_model_wip_supply_type);
3931 debug(' sub_cfg_item_id : '||l_config_rec.sub_config_item_id);
3932 debug(' sub_cfg_serial_code: '||l_config_rec.sub_model_serial_code);
3933 debug(' sub_cfg_wip_job_id : '||l_config_rec.sub_config_wip_job_id);
3934 debug(' sub_cfg_wip_org_id : '||l_config_rec.sub_config_wip_org_id);
3935 debug(' sub_cfg_make_flag : '||l_config_rec.sub_config_make_flag);
3936 END IF;
3937
3938 x_config_rec := l_config_rec;
3939
3940 EXCEPTION
3941 WHEN fnd_api.g_exc_error THEN
3942 x_return_status := fnd_api.g_ret_sts_error;
3943 END get_config_info;
3944
3945 PROCEDURE get_config_nsrl_instances(
3946 p_config_rec IN config_rec,
3947 p_sub_config_flag IN varchar2,
3948 x_config_instances OUT NOCOPY config_serial_inst_tbl,
3949 x_return_status OUT NOCOPY varchar2)
3950 IS
3951 CURSOR config_inst_cur IS
3952 SELECT instance_id,
3953 location_type_code
3954 FROM csi_item_instances
3955 WHERE inventory_item_id = p_config_rec.item_id
3956 AND last_oe_order_line_id = p_config_rec.line_id;
3957
3958 l_c_ind binary_integer := 0;
3959 l_config_instances config_serial_inst_tbl;
3960
3961 BEGIN
3962 x_return_status := fnd_api.g_ret_sts_success;
3963 api_log('get_config_nsrl_instances');
3964 FOR config_inst_rec IN config_inst_cur
3965 LOOP
3966 l_c_ind := l_c_ind + 1;
3967 l_config_instances(l_c_ind).instance_id := config_inst_rec.instance_id;
3968 l_config_instances(l_c_ind).location_type_code := config_inst_rec.location_type_code;
3969 l_config_instances(l_c_ind).ship_flag := 'Y';
3970 l_config_instances(l_c_ind).reship_flag := 'N';
3971 END LOOP;
3972
3973 IF l_config_instances.count > 0 THEN
3974 FOR l_d_ind IN l_config_instances.FIRST .. l_config_instances.LAST
3975 LOOP
3976 debug('config_instances. record # '||l_d_ind);
3977 debug(' serial_number : '||l_config_instances(l_d_ind).serial_number);
3978 debug(' instance_id : '||l_config_instances(l_d_ind).instance_id);
3979 debug(' location_type_code : '||l_config_instances(l_d_ind).location_type_code);
3980 debug(' ship_flag : '||l_config_instances(l_d_ind).ship_flag);
3981 debug(' reship_flag : '||l_config_instances(l_d_ind).reship_flag);
3982 END LOOP;
3983 END IF;
3984
3985 x_config_instances := l_config_instances;
3986
3987 EXCEPTION
3988 WHEN fnd_api.g_exc_error THEN
3989 x_return_status := fnd_api.g_ret_sts_error;
3990 END get_config_nsrl_instances;
3991
3992 PROCEDURE get_config_srl_instances(
3993 p_config_rec IN config_rec,
3994 p_sub_config_flag IN varchar2,
3995 px_default_info_rec IN OUT nocopy default_info_rec,
3996 px_csi_txn_rec IN OUT NOCOPY csi_datastructures_pub.transaction_rec,
3997 x_config_instances OUT NOCOPY config_serial_inst_tbl,
3998 x_return_status OUT NOCOPY varchar2)
3999 IS
4000
4001 CURSOR inst_cur IS
4002 SELECT instance_id,
4003 serial_number,
4004 location_type_code
4005 FROM csi_item_instances
4006 WHERE inventory_item_id = p_config_rec.item_id
4007 AND last_oe_order_line_id = p_config_rec.line_id;
4008
4009 l_config_inst_found boolean := FALSE;
4010
4011 CURSOR wsh_cur IS
4012 SELECT serial_number,
4013 to_serial_number
4014 FROM wsh_deliverables_v
4015 WHERE source_line_id = p_config_rec.line_id
4016 AND serial_number is not null;
4017
4018 CURSOR in_rel_sc_inst_cur IS
4019 SELECT cii_sub.instance_id,
4020 cii_sub.serial_number,
4021 cii_sub.location_type_code
4022 FROM csi_item_instances cii_obj,
4023 csi_ii_relationships cir,
4024 csi_item_instances cii_sub
4025 WHERE cii_obj.inventory_item_id = p_config_rec.item_id
4026 AND cii_obj.last_oe_order_line_id = p_config_rec.line_id
4027 AND cir.object_id = cii_obj.instance_id
4028 AND cir.relationship_type_code = 'COMPONENT-OF'
4029 AND cii_sub.instance_id = cir.subject_id
4030 AND cii_sub.inventory_item_id = p_config_rec.sub_config_item_id;
4031
4032 CURSOR nsrl_sc_inst_cur IS
4033 SELECT cii.instance_id,
4034 cii.serial_number,
4035 cii.location_type_code
4036 FROM csi_item_instances cii
4037 WHERE cii.inventory_item_id = p_config_rec.sub_config_item_id
4038 AND ((cii.location_type_code = 'WIP'
4039 AND
4040 cii.wip_job_id = p_config_rec.config_wip_job_id)
4041 OR
4042 (cii.last_wip_job_id = p_config_rec.config_wip_job_id));
4043
4044 l_fm_number number;
4045 l_to_number number;
4046
4047 l_fm_prefix varchar2(80);
4048 l_to_prefix varchar2(80);
4049
4050 l_prefix varchar2(80);
4051 l_suffix varchar2(80);
4052
4053 l_prefix_length number;
4054 l_suffix_length number;
4055 l_serial_number varchar2(80);
4056 l_instance_id number;
4057 l_location_type_code varchar2(30);
4058
4059 l_c_ind binary_integer := 0;
4060 l_config_instances config_serial_inst_tbl;
4061
4062 l_order_hdr_rec oe_order_headers_all%rowtype;
4063 l_order_line_rec oe_order_lines_all%rowtype;
4064 l_tld_tbl csi_t_datastructures_grp.txn_line_detail_tbl;
4065
4066 l_return_status varchar2(1) := fnd_api.g_ret_sts_success;
4067
4068 BEGIN
4069
4070 x_return_status := fnd_api.g_ret_sts_success;
4071 api_log('get_config_srl_instances');
4072
4073 IF p_sub_config_flag = 'N' THEN
4074 FOR inst_rec IN inst_cur
4075 LOOP
4076 l_config_inst_found := TRUE;
4077 l_c_ind := l_c_ind + 1;
4078 l_config_instances(l_c_ind).serial_number := inst_rec.serial_number;
4079 l_config_instances(l_c_ind).instance_id := inst_rec.instance_id;
4080 l_config_instances(l_c_ind).location_type_code := inst_rec.location_type_code;
4081 l_config_instances(l_c_ind).ship_flag := 'Y';
4082 l_config_instances(l_c_ind).reship_flag := 'N';
4083 END LOOP;
4084
4085 -- check if the record is still in wsh (shipped in OM but not in INV yet cases)
4086 IF NOT l_config_inst_found THEN
4087 FOR wsh_rec IN wsh_cur
4088 LOOP
4089 l_to_number := 1;
4090 IF wsh_rec.to_serial_number is not null THEN
4091
4092 inv_validate.number_from_sequence(
4093 p_sequence => wsh_rec.serial_number,
4094 x_prefix => l_fm_prefix,
4095 x_number => l_fm_number);
4096
4097 inv_validate.number_from_sequence(
4098 p_sequence => wsh_rec.to_serial_number,
4099 x_prefix => l_to_prefix,
4100 x_number => l_to_number);
4101
4102 l_prefix := l_fm_prefix;
4103 l_prefix_length := nvl(length(l_prefix),0);
4104 l_suffix_length := length(wsh_rec.serial_number) - l_prefix_length;
4105
4106 FOR l_ind IN l_fm_number .. l_to_number
4107 LOOP
4108 l_suffix := lpad(to_char(l_ind), l_suffix_length, '0');
4109 l_serial_number := l_prefix||l_suffix;
4110
4111 BEGIN
4112 SELECT instance_id ,
4113 location_type_code
4114 INTO l_instance_id,
4115 l_location_type_code
4116 FROM csi_item_instances
4117 WHERE inventory_item_id = p_config_rec.item_id
4118 AND serial_number = l_serial_number;
4119
4120 l_c_ind := l_c_ind + 1;
4121 l_config_instances(l_c_ind).serial_number := l_serial_number;
4122 l_config_instances(l_c_ind).instance_id := l_instance_id;
4123 l_config_instances(l_c_ind).location_type_code := l_location_type_code;
4124 l_config_instances(l_c_ind).ship_flag := 'N';
4125
4126 IF p_config_rec.serial_code = 6 THEN
4127 l_config_instances(l_c_ind).reship_flag := 'Y';
4128 ELSE
4129 l_config_instances(l_c_ind).reship_flag := 'N';
4130 END IF;
4131
4132 EXCEPTION
4133 WHEN no_data_found THEN
4134 null;
4135 END;
4136 END LOOP;
4137
4138 ELSE
4139 l_serial_number := wsh_rec.serial_number;
4140 BEGIN
4141 SELECT instance_id,
4142 location_type_code
4143 INTO l_instance_id,
4144 l_location_type_code
4145 FROM csi_item_instances
4146 WHERE inventory_item_id = p_config_rec.item_id
4147 AND serial_number = l_serial_number;
4148
4149 l_c_ind := l_c_ind + 1;
4150 l_config_instances(l_c_ind).serial_number := l_serial_number;
4151 l_config_instances(l_c_ind).instance_id := l_instance_id;
4152 l_config_instances(l_c_ind).location_type_code := l_location_type_code;
4153 l_config_instances(l_c_ind).ship_flag := 'N';
4154
4155 IF p_config_rec.serial_code = 6 THEN
4156 l_config_instances(l_c_ind).reship_flag := 'Y';
4157 ELSE
4158 l_config_instances(l_c_ind).reship_flag := 'N';
4159 END IF;
4160
4161 EXCEPTION
4162 WHEN no_data_found THEN
4163 null;
4164 END;
4165 END IF;
4166 END LOOP;
4167 END IF;
4168 ELSE -- sub models
4169
4170 SELECT * INTO l_order_line_rec
4171 FROM oe_order_lines_all
4172 WHERE line_id = p_config_rec.sub_model_line_id;
4173
4174 SELECT * INTO l_order_hdr_rec
4175 FROM oe_order_headers_all
4176 WHERE header_id = l_order_line_rec.header_id;
4177
4178 IF p_config_rec.serial_code in (2, 5) THEN
4179 FOR inst_rec IN in_rel_sc_inst_cur
4180 LOOP
4181 l_c_ind := l_c_ind + 1;
4182 l_config_instances(l_c_ind).serial_number := inst_rec.serial_number;
4183 l_config_instances(l_c_ind).instance_id := inst_rec.instance_id;
4184 l_config_instances(l_c_ind).location_type_code := inst_rec.location_type_code;
4185 l_config_instances(l_c_ind).ship_flag := 'Y';
4186 l_config_instances(l_c_ind).reship_flag := 'N';
4187 END LOOP;
4188 ELSE
4189 FOR inst_rec IN nsrl_sc_inst_cur
4190 LOOP
4191 l_c_ind := l_c_ind + 1;
4192 l_config_instances(l_c_ind).serial_number := inst_rec.serial_number;
4193 l_config_instances(l_c_ind).instance_id := inst_rec.instance_id;
4194 l_config_instances(l_c_ind).location_type_code := inst_rec.location_type_code;
4195 l_config_instances(l_c_ind).ship_flag := 'Y';
4196 l_config_instances(l_c_ind).reship_flag := 'N';
4197
4198 IF inst_rec.location_type_code = 'WIP' THEN
4199 convert_wip_instance_to_cp(
4200 p_instance_id => inst_rec.instance_id,
4201 p_order_hdr_rec => l_order_hdr_rec,
4202 p_order_line_rec => l_order_line_rec,
4203 p_tld_tbl => l_tld_tbl,
4204 px_default_info_rec => px_default_info_rec,
4205 px_csi_txn_rec => px_csi_txn_rec,
4206 x_return_status => l_return_status);
4207 IF l_return_status <> fnd_api.g_ret_sts_success THEN
4208 RAISE fnd_api.g_exc_error;
4209 END IF;
4210 l_config_instances(l_c_ind).location_type_code := 'HZ_PARTY_SITES';
4211 END IF;
4212
4213 END LOOP;
4214 END IF;
4215 END IF;
4216
4217 IF l_config_instances.count > 0 THEN
4218 FOR l_d_ind IN l_config_instances.FIRST .. l_config_instances.LAST
4219 LOOP
4220 debug('config_instances. record # '||l_d_ind);
4221 debug(' serial_number : '||l_config_instances(l_d_ind).serial_number);
4222 debug(' instance_id : '||l_config_instances(l_d_ind).instance_id);
4223 debug(' location_type_code : '||l_config_instances(l_d_ind).location_type_code);
4224 debug(' ship_flag : '||l_config_instances(l_d_ind).ship_flag);
4225 debug(' reship_flag : '||l_config_instances(l_d_ind).reship_flag);
4226 END LOOP;
4227 END IF;
4228
4229 x_config_instances := l_config_instances;
4230
4231 EXCEPTION
4232 WHEN fnd_api.g_exc_error THEN
4233 x_return_status := fnd_api.g_ret_sts_error;
4234 END get_config_srl_instances;
4235
4236 PROCEDURE get_config_shipped_serials(
4237 px_config_instances IN OUT nocopy config_serial_inst_tbl,
4238 x_return_status OUT nocopy varchar2)
4239 IS
4240 l_config_instances config_serial_inst_tbl;
4241 l_c_ind binary_integer := 0;
4242 BEGIN
4243 x_return_status := fnd_api.g_ret_sts_success;
4244 api_log('get_config_shipped_serials');
4245 IF px_config_instances.COUNT > 0 THEN
4246 FOR l_ind IN px_config_instances.FIRST .. px_config_instances.LAST
4247 LOOP
4248 IF px_config_instances(l_ind).ship_flag = 'Y' THEN
4249 l_c_ind := l_c_ind + 1;
4250 l_config_instances(l_c_ind) := px_config_instances(l_ind);
4251 END IF;
4252 END LOOP;
4253 END IF;
4254 debug(' shipped srls count : '||l_config_instances.COUNT);
4255 px_config_instances := l_config_instances;
4256 EXCEPTION
4257 WHEN fnd_api.g_exc_error THEN
4258 x_return_status := fnd_api.g_ret_sts_error;
4259 END get_config_shipped_serials;
4260
4261 PROCEDURE check_for_re_shipment(
4262 p_header_id IN number,
4263 px_config_instances IN OUT NOCOPY config_serial_inst_tbl,
4264 x_reship_found OUT NOCOPY boolean,
4265 x_return_status OUT NOCOPY varchar2)
4266 IS
4267
4268 CURSOR txn_cur(p_instance_id in number) IS
4269 SELECT ct.transaction_type_id
4270 FROM csi_item_instances_h cih,
4271 csi_transactions ct
4272 WHERE cih.instance_id = p_instance_id
4273 AND ct.transaction_id = cih.transaction_id
4274 AND NOT (ct.transaction_type_id = 51 AND ct.source_header_ref_id = p_header_id)
4275 ORDER BY ct.transaction_date desc;
4276
4277 BEGIN
4278 x_return_status := fnd_api.g_ret_sts_success;
4279 api_log('check_for_re_shipment');
4280 x_reship_found := FALSE;
4281 IF px_config_instances.COUNT > 0 THEN
4282 FOR l_ind IN px_config_instances.FIRST .. px_config_instances.LAST
4283 LOOP
4284 debug(' instance_id : '||px_config_instances(l_ind).instance_id);
4285 IF px_config_instances(l_ind).reship_flag = 'N' THEN
4286 FOR txn_rec IN txn_cur ( px_config_instances(l_ind).instance_id)
4287 LOOP
4288 debug(' txn_type_id : '||txn_rec.transaction_type_id);
4289 IF txn_rec.transaction_type_id = 51 THEN
4290 px_config_instances(l_ind).reship_flag := 'Y';
4291 x_reship_found := TRUE;
4292 END IF;
4293 END LOOP;
4294 ELSE
4295 x_reship_found := TRUE;
4296 END IF;
4297 debug(' reship_flag : '||px_config_instances(l_ind).reship_flag);
4298 END LOOP;
4299 END IF;
4300 EXCEPTION
4301 WHEN fnd_api.g_exc_error THEN
4302 x_return_status := fnd_api.g_ret_sts_error;
4303 END check_for_re_shipment;
4304
4305 PROCEDURE get_reship_count(
4306 p_config_instances IN config_serial_inst_tbl,
4307 x_reship_count OUT NOCOPY number,
4308 x_return_status OUT NOCOPY varchar2)
4309 IS
4310 l_reship_count number := 0;
4311 BEGIN
4312 x_return_status := fnd_api.g_ret_sts_success;
4313 IF p_config_instances.COUNT > 0 THEN
4314 FOR l_ind IN p_config_instances.FIRST .. p_config_instances.LAST
4315 LOOP
4316 IF p_config_instances(l_ind).reship_flag = 'Y' THEN
4317 l_reship_count := l_reship_count + 1;
4318 END IF;
4319 END LOOP;
4320 END IF;
4321 debug(' reship count : '||l_reship_count);
4322 x_reship_count := l_reship_count;
4323 EXCEPTION
4324 WHEN fnd_api.g_exc_error THEN
4325 x_return_status := fnd_api.g_ret_sts_error;
4326 END get_reship_count;
4327
4328 PROCEDURE eliminate_reshipped_instances(
4329 p_config_instances IN config_serial_inst_tbl,
4330 px_instances_tbl IN OUT NOCOPY csi_datastructures_pub.instance_tbl,
4331 x_return_status OUT NOCOPY varchar2)
4332 IS
4333 l_instances_tbl csi_datastructures_pub.instance_tbl;
4334 l_i_ind binary_integer := 0;
4335 l_reshipped boolean := FALSE;
4336 BEGIN
4337 x_return_status := fnd_api.g_ret_sts_success;
4338 api_log('eliminate_reshipped_instances');
4339
4340 IF px_instances_tbl.COUNT > 0 THEN
4341 FOR l_ind IN px_instances_tbl.FIRST .. px_instances_tbl.LAST
4342 LOOP
4343 l_reshipped := FALSE;
4344 IF p_config_instances.COUNT > 0 THEN
4345 FOR l_r_ind IN p_config_instances.FIRST .. p_config_instances.LAST
4346 LOOP
4347 IF px_instances_tbl(l_ind).instance_id = p_config_instances(l_r_ind).instance_id
4348 AND
4349 p_config_instances(l_r_ind).reship_flag = 'Y'
4350 THEN
4351 l_reshipped := TRUE;
4352 exit;
4353 END IF;
4354 END LOOP;
4355 END IF;
4356 IF NOT l_reshipped THEN
4357 l_i_ind := l_i_ind + 1;
4358 l_instances_tbl(l_i_ind) := px_instances_tbl(l_ind);
4359 END IF;
4360 END LOOP;
4361 END IF;
4362 debug(' after eliminating the reshipped instances - COUNT :'||l_instances_tbl.COUNT);
4363 px_instances_tbl := l_instances_tbl;
4364 EXCEPTION
4365 WHEN fnd_api.g_exc_error THEN
4366 x_return_status := fnd_api.g_ret_sts_error;
4367 END eliminate_reshipped_instances;
4368
4369 PROCEDURE get_option_instances(
4370 p_config_instance_id IN number,
4371 p_option_item_id IN number,
4372 x_option_instances OUT NOCOPY csi_datastructures_pub.instance_tbl,
4373 x_return_status OUT NOCOPY varchar2)
4374 IS
4375 l_option_instances csi_datastructures_pub.instance_tbl;
4376
4377 CURSOR option_inst_cur IS
4378 SELECT cii.instance_id
4379 FROM csi_item_instances cii,
4380 csi_ii_relationships cir
4381 WHERE cir.object_id = p_config_instance_id
4382 AND cir.relationship_type_code = 'COMPONENT-OF'
4383 AND cii.instance_id = cir.subject_id
4384 AND cii.inventory_item_id = p_option_item_id
4385 AND sysdate BETWEEN nvl(cii.active_start_date, sysdate-1)
4386 AND nvl(cii.active_end_date, sysdate+1);
4387 BEGIN
4388 FOR option_inst_rec IN option_inst_cur
4389 LOOP
4390 l_option_instances(option_inst_cur%rowcount).instance_id := option_inst_rec.instance_id;
4391 END LOOP;
4392 x_option_instances := l_option_instances;
4393 EXCEPTION
4394 WHEN fnd_api.g_exc_error THEN
4395 x_return_status := fnd_api.g_ret_sts_error;
4396 END get_option_instances;
4397
4398 /* when the serialized config item is shipped it moves the options along with */
4399 /* it because relations are created at the time of wip completion. When the */
4400 /* options are fulfilled we just have to break the relation and stamp the ord */
4401 /* line id so that the fulfillment of option class wil once again build the */
4402 /* component of relationships. */
4403
4404 PROCEDURE stamp_om_line(
4405 p_instance_id IN number,
4406 p_order_line_id IN number,
4407 px_csi_txn_rec IN OUT NOCOPY csi_datastructures_pub.transaction_rec,
4408 x_return_status OUT NOCOPY varchar2)
4409 IS
4410
4411 l_inst_object_ver_num number;
4412
4413 l_u_instance_rec csi_datastructures_pub.instance_rec;
4414 l_u_party_tbl csi_datastructures_pub.party_tbl;
4415 l_u_party_acct_tbl csi_datastructures_pub.party_account_tbl;
4416 l_u_inst_asset_tbl csi_datastructures_pub.instance_asset_tbl;
4417 l_u_ext_attrib_val_tbl csi_datastructures_pub.extend_attrib_values_tbl;
4418 l_u_pricing_attribs_tbl csi_datastructures_pub.pricing_attribs_tbl;
4419 l_u_org_units_tbl csi_datastructures_pub.organization_units_tbl;
4420 l_u_inst_id_lst csi_datastructures_pub.id_tbl;
4421
4422 l_return_status varchar2(1) := fnd_api.g_ret_sts_success;
4423 l_msg_count number;
4424 l_msg_data varchar2(2000);
4425
4426 BEGIN
4427
4428 x_return_status := fnd_api.g_ret_sts_success;
4429 api_log('stamp_om_line');
4430
4431 -- check if the instance is in WIP
4432 SELECT object_version_number
4433 INTO l_inst_object_ver_num
4434 FROM csi_item_instances
4435 WHERE instance_id = p_instance_id;
4436
4437 l_u_instance_rec.instance_id := p_instance_id ;
4438 l_u_instance_rec.last_oe_order_line_id := p_order_line_id;
4439 l_u_instance_rec.object_version_number := l_inst_object_ver_num;
4440
4441 csi_t_gen_utility_pvt.dump_api_info(
4442 p_api_name => 'update_item_instance',
4443 p_pkg_name => 'csi_item_instance_pub');
4444
4445 debug(' instance_id : '||l_u_instance_rec.instance_id);
4446 debug(' last_oe_line_id : '||l_u_instance_rec.last_oe_order_line_id);
4447 debug(' instance_ovn : '||l_u_instance_rec.object_version_number);
4448
4449 csi_item_instance_pub.update_item_instance(
4450 p_api_version => 1.0,
4451 p_commit => fnd_api.g_false,
4452 p_init_msg_list => fnd_api.g_true,
4453 p_validation_level => fnd_api.g_valid_level_full,
4454 p_instance_rec => l_u_instance_rec,
4455 p_ext_attrib_values_tbl => l_u_ext_attrib_val_tbl,
4456 p_party_tbl => l_u_party_tbl,
4457 p_account_tbl => l_u_party_acct_tbl,
4458 p_pricing_attrib_tbl => l_u_pricing_attribs_tbl,
4459 p_org_assignments_tbl => l_u_org_units_tbl,
4460 p_txn_rec => px_csi_txn_rec,
4461 p_asset_assignment_tbl => l_u_inst_asset_tbl,
4462 x_instance_id_lst => l_u_inst_id_lst,
4463 x_return_status => l_return_status,
4464 x_msg_count => l_msg_count,
4465 x_msg_data => l_msg_data);
4466
4467 IF l_return_status not in (fnd_api.g_ret_sts_success, 'W') THEN
4468 RAISE fnd_api.g_exc_error;
4469 END IF;
4470
4471 debug('wip issued component instance updated with the om info. instance_id : '||
4472 l_u_instance_rec.instance_id);
4473
4474 EXCEPTION
4475 WHEN fnd_api.g_exc_error THEN
4476 x_return_status := fnd_api.g_ret_sts_error;
4477 END stamp_om_line;
4478
4479 PROCEDURE stamp_om_line_for_options(
4480 p_order_hdr_rec IN oe_order_headers_all%rowtype,
4481 p_order_line_rec IN oe_order_lines_all%rowtype,
4482 p_wip_instances IN wip_instances,
4483 p_tld_tbl IN csi_t_datastructures_grp.txn_line_detail_tbl,
4484 px_default_info_rec IN OUT nocopy default_info_rec,
4485 px_csi_txn_rec IN OUT nocopy csi_datastructures_pub.transaction_rec,
4486 x_return_status OUT nocopy varchar2)
4487 IS
4488 l_return_status varchar2(1) := fnd_api.g_ret_sts_success;
4489 BEGIN
4490 x_return_status := fnd_api.g_ret_sts_success;
4491 api_log('stamp_om_line_for_options');
4492
4493 IF p_wip_instances.COUNT > 0 THEN
4494 FOR l_ind IN p_wip_instances.FIRST .. p_wip_instances.LAST
4495 LOOP
4496
4497 IF p_wip_instances(l_ind).instance_usage_code = 'IN_RELATIONSHIP' THEN
4498
4499 stamp_om_line(
4500 p_instance_id => p_wip_instances(l_ind).instance_id,
4501 p_order_line_id => p_order_line_rec.line_id,
4502 px_csi_txn_rec => px_csi_txn_rec,
4503 x_return_status => l_return_status);
4504
4505 IF l_return_status <> fnd_api.g_ret_sts_success THEN
4506 RAISE fnd_api.g_exc_error;
4507 END IF;
4508
4509 ELSE
4510
4511 convert_wip_instance_to_cp(
4512 p_instance_id => p_wip_instances(l_ind).instance_id,
4513 p_order_hdr_rec => p_order_hdr_rec,
4514 p_order_line_rec => p_order_line_rec,
4515 p_tld_tbl => p_tld_tbl,
4516 px_default_info_rec => px_default_info_rec,
4517 px_csi_txn_rec => px_csi_txn_rec,
4518 x_return_status => l_return_status);
4519
4520 IF l_return_status <> fnd_api.g_ret_sts_success THEN
4521 RAISE fnd_api.g_exc_error;
4522 END IF;
4523
4524 END IF;
4525
4526 END LOOP;
4527 END IF;
4528
4529 EXCEPTION
4530 WHEN fnd_api.g_exc_error THEN
4531 x_return_status := fnd_api.g_ret_sts_error;
4532 END stamp_om_line_for_options;
4533
4534 PROCEDURE get_config_serial_code(
4535 p_ato_line_id IN number,
4536 x_serial_code OUT NOCOPY number,
4537 x_return_status OUT NOCOPY varchar2)
4538 IS
4539 CURSOR config_cur IS
4540 SELECT msi.serial_number_control_code
4541 FROM mtl_system_items msi,
4542 oe_order_lines_all oel
4543 WHERE oel.link_to_line_id = p_ato_line_id
4544 AND oel.item_type_code = 'CONFIG'
4545 AND msi.organization_id = oel.ship_from_org_id
4546 AND msi.inventory_item_id = oel.inventory_item_id;
4547 BEGIN
4548
4549 x_return_status := fnd_api.g_ret_sts_success;
4550 api_log('get_config_serial_code');
4551 FOR config_rec IN config_cur
4552 LOOP
4553 x_serial_code := config_rec.serial_number_control_code;
4554 END LOOP;
4555
4556 EXCEPTION
4557 WHEN fnd_api.g_exc_error THEN
4558 x_return_status := fnd_api.g_ret_sts_error;
4559 END get_config_serial_code;
4560
4561
4562 PROCEDURE break_relation(
4563 p_relationship_id IN number,
4564 p_relationship_ovn IN number,
4565 px_csi_txn_rec IN OUT nocopy csi_datastructures_pub.transaction_rec,
4566 x_return_status OUT nocopy varchar2)
4567 IS
4568 l_exp_rltns_rec csi_datastructures_pub.ii_relationship_rec;
4569 l_instance_id_lst csi_datastructures_pub.id_tbl;
4570
4571 l_return_status varchar2(1) := fnd_api.g_ret_sts_success;
4572 l_msg_count number;
4573 l_msg_data varchar2(2000);
4574 BEGIN
4575 x_return_status := fnd_api.g_ret_sts_success;
4576 api_log('break_relation');
4577
4578 l_exp_rltns_rec.relationship_id := p_relationship_id;
4579 l_exp_rltns_rec.object_version_number:= p_relationship_ovn;
4580
4581 debug(' relationship_id :'||l_exp_rltns_rec.relationship_id);
4582
4583 IF nvl(p_relationship_id, fnd_api.g_miss_num) <> fnd_api.g_miss_num THEN
4584 SELECT object_version_number
4585 INTO l_exp_rltns_rec.object_version_number
4586 FROM csi_ii_relationships
4587 WHERE relationship_id = l_exp_rltns_rec.relationship_id;
4588
4589 debug(' relationship_ovn :'||l_exp_rltns_rec.object_version_number);
4590 csi_t_gen_utility_pvt.dump_api_info(
4591 p_pkg_name => 'csi_ii_relationships_pub',
4592 p_api_name => 'expire_relationship');
4593
4594 csi_ii_relationships_pub.expire_relationship(
4595 p_api_version => 1.0,
4596 p_commit => fnd_api.g_false,
4597 p_init_msg_list => fnd_api.g_false,
4598 p_validation_level => fnd_api.g_valid_level_full,
4599 p_relationship_rec => l_exp_rltns_rec,
4600 p_txn_rec => px_csi_txn_rec,
4601 x_instance_id_lst => l_instance_id_lst,
4602 x_return_status => l_return_status,
4603 x_msg_count => l_msg_count,
4604 x_msg_data => l_msg_data);
4605
4606 IF l_return_status <> fnd_api.g_ret_sts_success THEN
4607 RAISE fnd_api.g_exc_error;
4608 END IF;
4609 END IF;
4610 EXCEPTION
4611 WHEN fnd_api.g_exc_error THEN
4612 x_return_status := fnd_api.g_ret_sts_error;
4613 END break_relation;
4614
4615 /* this routine check the relationship record for the ato component in WIP */
4616 /* and breaks the relation */
4617
4618 PROCEDURE check_and_break_relation(
4619 p_instance_id IN number,
4620 px_csi_txn_rec IN OUT nocopy csi_datastructures_pub.transaction_rec,
4621 x_return_status OUT nocopy varchar2)
4622 IS
4623
4624
4625 l_relationship_query_rec csi_datastructures_pub.relationship_query_rec;
4626 l_relationship_tbl csi_datastructures_pub.ii_relationship_tbl;
4627 l_time_stamp date := sysdate;
4628
4629 l_return_status varchar2(1) := fnd_api.g_ret_sts_success;
4630 l_msg_count number := 0;
4631 l_msg_data varchar2(2000);
4632
4633 BEGIN
4634
4635 x_return_status := fnd_api.g_ret_sts_success;
4636 api_log('check_and_break_relation');
4637
4638 debug(' subject instance id :'||p_instance_id);
4639
4640 l_relationship_query_rec.subject_id := p_instance_id;
4641 l_relationship_query_rec.relationship_type_code := 'COMPONENT-OF';
4642
4643 csi_t_gen_utility_pvt.dump_api_info(
4644 p_pkg_name => 'csi_ii_relationships_pub',
4645 p_api_name => 'get_relationships');
4646
4647 csi_ii_relationships_pub.get_relationships(
4648 p_api_version => 1.0,
4649 p_commit => fnd_api.g_false,
4650 p_init_msg_list => fnd_api.g_true,
4651 p_validation_level => fnd_api.g_valid_level_full,
4652 p_relationship_query_rec => l_relationship_query_rec,
4653 p_depth => 1,
4654 p_time_stamp => l_time_stamp,
4655 p_active_relationship_only => fnd_api.g_true,
4656 x_relationship_tbl => l_relationship_tbl,
4657 x_return_status => l_return_status,
4658 x_msg_count => l_msg_count,
4659 x_msg_data => l_msg_data);
4660
4661 IF l_return_status <> fnd_api.g_ret_sts_success THEN
4662 RAISE fnd_api.g_exc_error;
4663 END IF;
4664
4665 debug(' relationship table count :'||l_relationship_tbl.COUNT);
4666
4667 IF l_relationship_tbl.COUNT > 0 THEN
4668 FOR l_ind IN l_relationship_tbl.FIRST .. l_relationship_tbl.LAST
4669 LOOP
4670
4671 break_relation(
4672 p_relationship_id => l_relationship_tbl(l_ind).relationship_id,
4673 p_relationship_ovn => l_relationship_tbl(l_ind).object_version_number,
4674 px_csi_txn_rec => px_csi_txn_rec,
4675 x_return_status => l_return_status);
4676
4677 IF l_return_status <> fnd_api.g_ret_sts_success THEN
4678 RAISE fnd_api.g_exc_error;
4679 END IF;
4680
4681 END LOOP;
4682 END IF;
4683
4684 debug('check and break relation successful.');
4685
4686 EXCEPTION
4687 WHEN fnd_api.g_exc_error THEN
4688 x_return_status := fnd_api.g_ret_sts_error;
4689 END check_and_break_relation;
4690
4691 PROCEDURE mark_and_get_config(
4692 px_config_instances IN OUT nocopy config_serial_inst_tbl,
4693 x_config_instance OUT nocopy config_serial_inst_rec,
4694 x_return_status OUT nocopy varchar2)
4695 IS
4696 px_ind binary_integer := 0;
4697 BEGIN
4698 x_return_status := fnd_api.g_ret_sts_success;
4699 api_log('mark_and_get_config');
4700
4701 IF px_config_instances.COUNT > 0 THEN
4702 px_ind := px_config_instances.NEXT(px_ind);
4703 IF px_ind is null THEN
4704 null;
4705 ELSE
4706 x_config_instance := px_config_instances(px_ind);
4707 px_config_instances.DELETE(px_ind);
4708 END IF;
4709 END IF;
4710
4711 EXCEPTION
4712 WHEN fnd_api.g_exc_error THEN
4713 x_return_status := fnd_api.g_ret_sts_error;
4714 END mark_and_get_config;
4715
4716 PROCEDURE mark_and_get_src_tld(
4717 px_src_tld_tbl IN OUT nocopy csi_t_datastructures_grp.txn_line_detail_tbl,
4718 x_src_tld_rec OUT nocopy csi_t_datastructures_grp.txn_line_detail_rec,
4719 x_return_status OUT nocopy varchar2)
4720 IS
4721 px_ind binary_integer := 0;
4722 BEGIN
4723 x_return_status := fnd_api.g_ret_sts_success;
4724 api_log('mark_and_get_src_tld');
4725
4726 IF px_src_tld_tbl.COUNT > 0 THEN
4727 px_ind := px_src_tld_tbl.NEXT(px_ind);
4728 IF px_ind is null THEN
4729 null;
4730 ELSE
4731 x_src_tld_rec := px_src_tld_tbl(px_ind);
4732 px_src_tld_tbl.DELETE(px_ind);
4733 END IF;
4734 END IF;
4735
4736 EXCEPTION
4737 WHEN fnd_api.g_exc_error THEN
4738 x_return_status := fnd_api.g_ret_sts_error;
4739 END mark_and_get_src_tld;
4740
4741 PROCEDURE mark_and_get_nsrl_option(
4742 p_class_quantity IN number,
4743 p_quantity_ratio IN number,
4744 px_ii_rltns_tbl IN OUT nocopy csi_datastructures_pub.ii_relationship_tbl,
4745 px_csi_txn_rec IN OUT nocopy csi_datastructures_pub.transaction_rec,
4746 x_option_ii_rltns_rec OUT nocopy csi_datastructures_pub.ii_relationship_rec,
4747 x_return_status OUT nocopy varchar2)
4748 IS
4749
4750 px_ind binary_integer := 0;
4751 px_new_ind binary_integer := 0;
4752
4753 l_instance_quantity number;
4754 l_vld_organization_id number;
4755
4756 l_splitted_instances csi_datastructures_pub.instance_tbl;
4757
4758 l_return_status varchar2(1) := fnd_api.g_ret_sts_success;
4759 l_msg_count number;
4760 l_msg_data varchar2(2000);
4761
4762 BEGIN
4763 x_return_status := fnd_api.g_ret_sts_success;
4764 api_log('mark_and_get_nsrl_option');
4765
4766 px_ind := 0;
4767
4768 IF px_ii_rltns_tbl.COUNT > 0 THEN
4769
4770 px_ind := px_ii_rltns_tbl.NEXT(px_ind);
4771 x_option_ii_rltns_rec := px_ii_rltns_tbl(px_ind);
4772
4773 SELECT quantity ,
4774 last_vld_organization_id
4775 INTO l_instance_quantity ,
4776 l_vld_organization_id
4777 FROM csi_item_instances
4778 WHERE instance_id = px_ii_rltns_tbl(px_ind).subject_id;
4779
4780 IF l_instance_quantity > p_quantity_ratio THEN
4781
4782 -- decrement quantity on the inrel instance and create another one
4783 -- with the same information
4784
4785 split_instance_using_ratio(
4786 p_instance_id => px_ii_rltns_tbl(px_ind).subject_id,
4787 p_qty_ratio => p_quantity_ratio,
4788 p_parent_qty => p_class_quantity,
4789 p_organization_id => l_vld_organization_id,
4790 px_csi_txn_rec => px_csi_txn_rec,
4791 x_splitted_instances => l_splitted_instances,
4792 x_return_status => l_return_status);
4793
4794 IF l_return_status <> fnd_Api.g_ret_sts_success THEN
4795 RAISE fnd_api.g_exc_error;
4796 END IF;
4797
4798 px_new_ind := px_ind;
4799
4800 IF l_splitted_instances.COUNT > 0 THEN
4801 FOR l_ind IN l_splitted_instances.FIRST .. l_splitted_instances.LAST
4802 LOOP
4803 IF l_splitted_instances(l_ind).instance_id <> px_ii_rltns_tbl(px_ind).subject_id THEN
4804
4805 px_new_ind := px_new_ind + 1;
4806 px_ii_rltns_tbl(px_new_ind).subject_id := l_splitted_instances(l_ind).instance_id;
4807 px_ii_rltns_tbl(px_new_ind).object_id := px_ii_rltns_tbl(px_ind).object_id;
4808 px_ii_rltns_tbl(px_new_ind).relationship_type_code := 'COMPONENT-OF';
4809
4810 BEGIN
4811 SELECT relationship_id,
4812 object_version_number
4813 INTO px_ii_rltns_tbl(px_new_ind).relationship_id,
4814 px_ii_rltns_tbl(px_new_ind).object_version_number
4815 FROM csi_ii_relationships
4816 WHERE object_id = px_ii_rltns_tbl(px_new_ind).object_id
4817 AND subject_id = px_ii_rltns_tbl(px_new_ind).subject_id
4818 AND relationship_type_code = 'COMPONENT-OF';
4819 EXCEPTION
4820 WHEN no_data_found THEN
4821 px_ii_rltns_tbl(px_new_ind).relationship_id := fnd_api.g_miss_num;
4822 END;
4823 END IF;
4824 END LOOP;
4825 END IF;
4826
4827 IF nvl(px_ii_rltns_tbl(px_ind).relationship_id, fnd_api.g_miss_num) <> fnd_api.g_miss_num THEN
4828 break_relation(
4829 p_relationship_id => px_ii_rltns_tbl(px_ind).relationship_id,
4830 p_relationship_ovn => px_ii_rltns_tbl(px_ind).object_version_number,
4831 px_csi_txn_rec => px_csi_txn_rec,
4832 x_return_status => l_return_status);
4833
4834 IF l_return_status <> fnd_api.g_ret_sts_success THEN
4835 RAISE fnd_api.g_exc_error;
4836 END IF;
4837 END IF;
4838
4839 px_ii_rltns_tbl.DELETE(px_ind);
4840
4841 ELSE
4842
4843 IF nvl(px_ii_rltns_tbl(px_ind).relationship_id, fnd_api.g_miss_num) <> fnd_api.g_miss_num THEN
4844 break_relation(
4845 p_relationship_id => px_ii_rltns_tbl(px_ind).relationship_id,
4846 p_relationship_ovn => px_ii_rltns_tbl(px_ind).object_version_number,
4847 px_csi_txn_rec => px_csi_txn_rec,
4848 x_return_status => l_return_status);
4849
4850 IF l_return_status <> fnd_api.g_ret_sts_success THEN
4851 RAISE fnd_api.g_exc_error;
4852 END IF;
4853 END IF;
4854
4855 px_ii_rltns_tbl.DELETE(px_ind);
4856
4857 END IF;
4858 END IF;
4859 EXCEPTION
4860 WHEN fnd_api.g_exc_error THEN
4861 x_return_status := fnd_api.g_ret_sts_error;
4862 END mark_and_get_nsrl_option;
4863
4864 PROCEDURE mark_and_get_srl_option(
4865 px_ii_rltns_tbl IN OUT nocopy csi_datastructures_pub.ii_relationship_tbl,
4866 x_option_ii_rltns_rec OUT nocopy csi_datastructures_pub.ii_relationship_rec,
4867 x_return_status OUT nocopy varchar2)
4868 IS
4869 px_ind binary_integer := 0;
4870 BEGIN
4871 x_return_status := fnd_api.g_ret_sts_success;
4872 api_log('mark_and_get_srl_option');
4873 IF px_ii_rltns_tbl.COUNT > 0 THEN
4874 px_ind := px_ii_rltns_tbl.NEXT(px_ind);
4875 x_option_ii_rltns_rec := px_ii_rltns_tbl(px_ind);
4876 px_ii_rltns_tbl.DELETE(px_ind);
4877 END IF;
4878 EXCEPTION
4879 WHEN fnd_api.g_exc_error THEN
4880 x_return_status := fnd_api.g_ret_sts_error;
4881 END mark_and_get_srl_option;
4882
4883 PROCEDURE filter_option_instances(
4884 p_option_line_rec IN oe_order_pub.line_rec_type,
4885 p_option_serial_code IN number,
4886 p_config_rec IN config_rec,
4887 p_transaction_line_id IN number,
4888 px_ii_rltns_tbl IN OUT nocopy csi_datastructures_pub.ii_relationship_tbl,
4889 px_csi_txn_rec IN OUT nocopy csi_datastructures_pub.transaction_rec,
4890 x_return_status OUT nocopy varchar2)
4891 IS
4892 l_option_instance varchar2(1);
4893 l_ind binary_integer := 0;
4894 l_ii_rltns_tbl csi_datastructures_pub.ii_relationship_tbl;
4895 l_wip_instances wip_instances;
4896 l_return_status varchar2(1) := fnd_api.g_ret_sts_success;
4897 CURSOR option_cp_cur IS
4898 SELECT cii.instance_id
4899 FROM csi_item_instances cii
4900 WHERE cii.inventory_item_id = p_option_line_rec.inventory_item_id
4901 AND cii.last_oe_order_line_id = p_option_line_rec.line_id
4902 AND cii.location_type_code = 'HZ_PARTY_SITES'
4903 AND cii.instance_usage_code = 'OUT_OF_ENTERPRISE'
4904 AND not exists (
4905 SELECT 'x' FROM csi_t_txn_line_details ctld
4906 WHERE ctld.transaction_line_id = p_transaction_line_id
4907 AND ctld.source_transaction_flag = 'N'
4908 AND ctld.instance_id = cii.instance_id);
4909 BEGIN
4910
4911 x_return_status := fnd_api.g_ret_sts_success;
4912 api_log('filter_option_instances');
4913
4914 IF px_ii_rltns_tbl.COUNT > 0 THEN
4915 FOR px_ind IN px_ii_rltns_tbl.FIRST .. px_ii_rltns_tbl.LAST
4916 LOOP
4917 BEGIN
4918 SELECT 'Y' INTO l_option_instance
4919 FROM csi_item_instances cii
4920 WHERE cii.instance_id = px_ii_rltns_tbl(px_ind).subject_id
4921 AND cii.inventory_item_id = p_option_line_rec.inventory_item_id;
4922
4923 l_ind := l_ind + 1;
4924 l_ii_rltns_tbl(l_ind) := px_ii_rltns_tbl(px_ind);
4925 EXCEPTION
4926 WHEN no_data_found THEN
4927 null;
4928 END;
4929 END LOOP;
4930 END IF;
4931
4932 IF l_ii_rltns_tbl.COUNT = 0 THEN
4933 FOR option_cp_rec IN option_cp_cur
4934 LOOP
4935 l_ind := l_ind + 1;
4936 l_ii_rltns_tbl(l_ind).subject_id := option_cp_rec.instance_id;
4937 END LOOP;
4938 END IF;
4939
4940 IF l_ii_rltns_tbl.COUNT = 0 THEN
4941 -- check if the option instances are left in WIP due to no allocation at WIP
4942 get_wip_instances(
4943 p_wip_entity_id => p_config_rec.config_wip_job_id,
4944 p_inventory_item_id => p_option_line_rec.inventory_item_id,
4945 p_organization_id => p_config_rec.ship_organization_id,
4946 p_option_serial_code => p_option_serial_code,
4947 p_config_rec => p_config_rec,
4948 px_csi_txn_rec => px_csi_txn_rec,
4949 x_wip_instances => l_wip_instances,
4950 x_return_status => l_return_status);
4951 IF l_return_status <> fnd_api.g_ret_sts_success THEN
4952 RAISE fnd_api.g_exc_error;
4953 END IF;
4954
4955 IF l_wip_instances.COUNT > 0 THEN
4956 FOR w_ind IN l_wip_instances.FIRST .. l_wip_instances.LAST
4957 LOOP
4958 l_ind := l_ind + 1;
4959 l_ii_rltns_tbl(l_ind).subject_id := l_wip_instances(w_ind).instance_id;
4960 IF l_wip_instances(w_ind).instance_usage_code = 'IN_RELATIONSHIP' THEN
4961 SELECT relationship_id,
4962 object_version_number
4963 INTO l_ii_rltns_tbl(l_ind).relationship_id,
4964 l_ii_rltns_tbl(l_ind).object_version_number
4965 FROM csi_ii_relationships
4966 WHERE subject_id = l_wip_instances(w_ind).instance_id
4967 AND relationship_type_code = 'COMPONENT-OF'
4968 AND sysdate between nvl(active_start_date, sysdate-1)
4969 and nvl(active_end_date, sysdate+1);
4970 END IF;
4971 END LOOP;
4972 END IF;
4973
4974 END IF;
4975
4976 px_ii_rltns_tbl := l_ii_rltns_tbl;
4977
4978 EXCEPTION
4979 WHEN fnd_api.g_exc_error THEN
4980 x_return_status := fnd_api.g_ret_sts_error;
4981 END filter_option_instances;
4982
4983 PROCEDURE check_wip_requirements(
4984 p_wip_entity_id IN number,
4985 p_option_item_id IN number,
4986 x_wip_processing OUT NOCOPY boolean)
4987 IS
4988 l_wip_processing boolean := TRUE;
4989
4990 l_phantom varchar2(1);
4991 l_wip_supply_type number;
4992 l_quantity_issued number;
4993
4994 BEGIN
4995 BEGIN
4996 SELECT 'Y' INTO l_phantom
4997 FROM sys.dual
4998 WHERE EXISTS (
4999 SELECT '1' FROM wip_requirement_operations
5000 WHERE wip_entity_id = p_wip_entity_id
5001 AND inventory_item_id = p_option_item_id
5002 AND wip_supply_type = 6); --phantoms
5003 debug(' supply_type : phantom - just the fulfillment of option' );
5004 l_wip_processing := FALSE;
5005 EXCEPTION
5006 WHEN no_data_found THEN
5007 BEGIN
5008 SELECT wip_supply_type,
5009 quantity_issued
5010 INTO l_wip_supply_type,
5011 l_quantity_issued
5012 FROM wip_requirement_operations
5013 WHERE wip_entity_id = p_wip_entity_id
5014 AND inventory_item_id = p_option_item_id
5015 AND rownum = 1;
5016
5017 debug(' supply_type : non phantom - '||l_wip_supply_type||
5018 ' quantity issued - '||l_quantity_issued );
5019 EXCEPTION
5020 WHEN no_data_found THEN
5021 debug(' wip requirements deleted/altered/substituted. will just fulfill the line.');
5022 l_wip_processing := FALSE;
5023 END;
5024 END;
5025 x_wip_processing := l_wip_processing;
5026 END check_wip_requirements;
5027
5028 /* routine to plug in the option classes in between the build option relation at WIP */
5029 PROCEDURE rebuild_relation_for_ato(
5030 p_order_line_rec IN oe_order_lines_all%rowtype,
5031 p_config_rec IN config_rec,
5032 p_config_instances IN config_serial_inst_tbl,
5033 px_default_info_rec IN OUT NOCOPY default_info_rec,
5034 px_csi_txn_rec IN OUT NOCOPY csi_datastructures_pub.transaction_rec,
5035 x_return_status OUT nocopy varchar2)
5036 IS
5037
5038 l_src_tld_tbl csi_t_datastructures_grp.txn_line_detail_tbl;
5039 l_temp_src_tld_tbl csi_t_datastructures_grp.txn_line_detail_tbl;
5040
5041 l_config_class_ratio number;
5042
5043 lp_ind binary_integer := 0;
5044 l_parent_instances parent_instances;
5045 l_parent_is_oc boolean;
5046 l_config_instances config_serial_inst_tbl;
5047 l_config_instance config_serial_inst_rec;
5048
5049 l_sub_config_instances config_serial_inst_tbl;
5050 l_sub_config_instance config_serial_inst_rec;
5051 l_child_line_tbl oe_order_pub.line_tbl_type;
5052 l_parent_line_rec oe_order_pub.line_rec_type;
5053
5054 l_config_ns_tld_id number;
5055 l_sub_config_ns_tld_id number;
5056
5057 l_oc_tld_rec csi_t_datastructures_grp.txn_line_detail_rec;
5058
5059 oct_ind binary_integer := 0;
5060 l_oc_tld_tbl csi_t_datastructures_grp.txn_line_detail_tbl;
5061
5062 l_ii_rltns_qry_rec csi_datastructures_pub.relationship_query_rec;
5063 l_ii_rltns_tbl csi_datastructures_pub.ii_relationship_tbl;
5064 l_temp_ii_rltns_tbl csi_datastructures_pub.ii_relationship_tbl;
5065
5066 l_time_stamp date := null;
5067
5068 l_pcm_tbl parent_child_map_tbl;
5069 pcm_ind binary_integer := 0;
5070
5071 l_class_option_ratio number;
5072 l_option_serial_code number;
5073 l_option_ii_rltns_rec csi_datastructures_pub.ii_relationship_rec;
5074 l_option_ns_tld_id number;
5075
5076 l_exp_rltns_rec csi_datastructures_pub.ii_relationship_rec;
5077 l_instance_id_lst csi_datastructures_pub.id_tbl;
5078
5079 l_t_rltns_tbl csi_t_datastructures_grp.txn_ii_rltns_tbl;
5080 l_wip_processing boolean := FALSE;
5081
5082 l_msg_count number := 0;
5083 l_msg_data varchar2(2000);
5084 l_return_status varchar2(1) := fnd_api.g_ret_sts_success;
5085
5086 CURSOR sc_inst_cur(
5087 p_top_config_instance_id IN number,
5088 p_sub_config_item_id IN number)
5089 IS
5090 SELECT cir.subject_id,
5091 cir.relationship_id,
5092 cir.object_version_number
5093 FROM csi_item_instances cii_sub,
5094 csi_ii_relationships cir
5095 WHERE cir.object_id = p_top_config_instance_id
5096 AND cir.relationship_type_code = 'COMPONENT-OF'
5097 AND sysdate between nvl(cir.active_start_date, sysdate-1)
5098 and nvl(cir.active_end_date, sysdate+1)
5099 AND cii_sub.instance_id = cir.subject_id
5100 AND cii_sub.inventory_item_id = p_sub_config_item_id;
5101
5102 PROCEDURE get_config_wrt_child(
5103 p_config_rec IN config_rec,
5104 p_parent_is_oc IN boolean,
5105 p_parent_instance IN parent_instance,
5106 x_config_instance OUT nocopy config_serial_inst_rec,
5107 x_return_status OUT nocopy varchar2)
5108 IS
5109 l_iir_tbl csi_datastructures_pub.ii_relationship_tbl;
5110 l_return_status varchar2(1) := fnd_api.g_ret_sts_success;
5111 l_msg_count number;
5112 l_msg_data varchar2(2000);
5113 BEGIN
5114
5115 x_return_status := fnd_api.g_ret_sts_success;
5116
5117 api_log('get_config_wrt_child');
5118
5119 IF p_parent_is_oc THEN
5120
5121 csi_item_instance_grp.get_all_parents(
5122 p_api_version => 1.0,
5123 p_commit => fnd_api.g_false,
5124 p_init_msg_list => fnd_api.g_true,
5125 p_validation_level => fnd_api.g_valid_level_full,
5126 p_subject_id => p_parent_instance.instance_id,
5127 x_rel_tbl => l_iir_tbl,
5128 x_return_status => l_return_status,
5129 x_msg_count => l_msg_count,
5130 x_msg_data => l_msg_data);
5131
5132 IF l_return_status <> fnd_api.g_ret_sts_success THEN
5133 RAISE fnd_api.g_exc_error;
5134 END IF;
5135 IF l_iir_tbl.COUNT > 0 THEN
5136 FOR iir_ind IN l_iir_tbl.FIRST .. l_iir_tbl.LAST
5137 LOOP
5138 BEGIN
5139 SELECT instance_id
5140 INTO x_config_instance.instance_id
5141 FROM csi_item_instances
5142 WHERE instance_id = l_iir_tbl(iir_ind).object_id
5143 AND inventory_item_id = p_config_rec.item_id;
5144 exit;
5145 EXCEPTION
5146 WHEN no_data_found THEN
5147 null;
5148 END;
5149 END LOOP;
5150 END IF;
5151 ELSE
5152 x_config_instance.instance_id := p_parent_instance.instance_id;
5153 END IF;
5154 debug(' config_instance_id : '||x_config_instance.instance_id);
5155 EXCEPTION
5156 WHEN fnd_api.g_exc_error THEN
5157 x_return_status := fnd_api.g_ret_sts_error;
5158 END get_config_wrt_child;
5159
5160 BEGIN
5161
5162 x_return_status := fnd_api.g_ret_sts_success;
5163
5164 api_log('rebuild_relation_for_ato');
5165
5166 IF p_order_line_rec.item_type_code = 'CLASS' THEN
5167 get_tld(
5168 p_source_table => 'OE_ORDER_LINES_ALL',
5169 p_source_id => p_order_line_rec.line_id,
5170 p_source_flag => 'Y',
5171 p_processing_status => 'IN_PROCESS',
5172 x_line_dtl_tbl => l_src_tld_tbl,
5173 x_return_status => l_return_status);
5174
5175 IF l_return_status <> fnd_api.g_ret_sts_success THEN
5176 RAISE fnd_api.g_exc_error;
5177 END IF;
5178
5179 get_ib_trackable_parent(
5180 p_current_line_id => p_order_line_rec.line_id,
5181 p_om_vld_org_id => px_default_info_rec.om_vld_org_id,
5182 x_parent_line_rec => l_parent_line_rec,
5183 x_return_status => l_return_status);
5184
5185 IF l_return_status <> fnd_api.g_ret_sts_success THEN
5186 RAISE fnd_api.g_exc_error;
5187 END IF;
5188
5189 l_config_class_ratio := p_order_line_rec.ordered_quantity/l_parent_line_rec.ordered_quantity;
5190 debug(' config_class_ratio : '||l_config_class_ratio);
5191
5192 IF px_default_info_rec.identified_item_type = 'ATO_SUB_MODEL' THEN
5193
5194 get_config_srl_instances(
5195 p_config_rec => p_config_rec,
5196 p_sub_config_flag => 'Y',
5197 px_default_info_rec => px_default_info_rec,
5198 px_csi_txn_rec => px_csi_txn_rec,
5199 x_config_instances => l_sub_config_instances,
5200 x_return_status => l_return_status);
5201 IF l_return_status <> fnd_api.g_ret_sts_success THEN
5202 RAISE fnd_api.g_exc_error;
5203 END IF;
5204
5205 IF p_order_line_rec.ato_line_id = l_parent_line_rec.line_id THEN
5206 l_parent_is_oc := FALSE;
5207 debug('sub model directly under the model');
5208 -- the child is a sub config item. this is the most tricky part because we are tryig
5209 -- to put that guy as a child of the ato sub model breaking from the parent config.
5210 IF p_config_rec.serial_code = 1 THEN
5211 get_config_nsrl_instances(
5212 p_config_rec => p_config_rec,
5213 p_sub_config_flag => 'N',
5214 x_config_instances => l_config_instances,
5215 x_return_status => l_return_status);
5216 IF l_return_status <> fnd_api.g_ret_sts_success THEN
5217 RAISE fnd_api.g_exc_error;
5218 END IF;
5219 ELSE
5220 l_config_instances := p_config_instances;
5221 END IF;
5222
5223 IF l_config_instances.COUNT > 0 THEN
5224 FOR lc_ind IN l_config_instances.FIRST .. l_config_instances.LAST
5225 LOOP
5226 lp_ind := lp_ind + 1;
5227 l_parent_instances(lp_ind).instance_id := l_config_instances(lc_ind).instance_id;
5228 END LOOP;
5229 END IF;
5230 ELSE
5231
5232 l_parent_is_oc := TRUE;
5233
5234 debug('sub model not directly under the model');
5235 -- get_parent_instances
5236 get_parent_instances (
5237 p_parent_line_id => l_parent_line_rec.line_id,
5238 p_parent_item_id => l_parent_line_rec.inventory_item_id,
5239 x_parent_instances => l_parent_instances,
5240 x_return_status => l_return_status);
5241
5242 debug(' parent instances count : '||l_parent_instances.COUNT);
5243
5244 END IF;
5245
5246 l_temp_src_tld_tbl := l_src_tld_tbl;
5247
5248 IF l_parent_instances.COUNT > 0 THEN
5249
5250 debug('parent relationship');
5251
5252 FOR pi_ind IN l_parent_instances.FIRST .. l_parent_instances.LAST
5253 LOOP
5254
5255 -- for each of the parent config instance for the class build a non source tld
5256 build_non_source_rec(
5257 p_transaction_line_id => px_default_info_rec.transaction_line_id,
5258 p_instance_id => l_parent_instances(pi_ind).instance_id,
5259 px_default_info_rec => px_default_info_rec,
5260 x_txn_line_dtl_id => l_config_ns_tld_id,
5261 x_return_status => l_return_status);
5262
5263 IF l_return_status <> fnd_api.g_ret_sts_success THEN
5264 RAISE fnd_api.g_exc_error;
5265 END IF;
5266
5267 oct_ind := 0;
5268 l_oc_tld_tbl.DELETE;
5269
5270 FOR config_class_ratio_ind IN 1 .. l_config_class_ratio
5271 LOOP
5272
5273 mark_and_get_src_tld(
5274 px_src_tld_tbl => l_temp_src_tld_tbl,
5275 x_src_tld_rec => l_oc_tld_rec,
5276 x_return_status => l_return_status);
5277
5278 IF l_return_status <> fnd_api.g_ret_sts_success THEN
5279 RAISE fnd_api.g_exc_error;
5280 END IF;
5281
5282 IF nvl(l_oc_tld_rec.txn_line_detail_id, fnd_api.g_miss_num) <> fnd_api.g_miss_num THEN
5283
5284 oct_ind := oct_ind + 1;
5285 l_oc_tld_tbl(oct_ind) := l_oc_tld_rec;
5286
5287 pcm_ind := pcm_ind + 1;
5288 l_pcm_tbl(pcm_ind).object_tld_id := l_config_ns_tld_id;
5289 l_pcm_tbl(pcm_ind).subject_tld_id := l_oc_tld_rec.txn_line_detail_id;
5290
5291 END IF;
5292
5293 END LOOP; -- class/ratio apportion
5294
5295 debug('child relation.');
5296
5297 get_config_wrt_child(
5298 p_config_rec => p_config_rec,
5299 p_parent_is_oc => l_parent_is_oc,
5300 p_parent_instance => l_parent_instances(pi_ind),
5301 x_config_instance => l_config_instance,
5302 x_return_status => l_return_status);
5303
5304 IF l_return_status <> fnd_api.g_ret_sts_success THEN
5305 RAISE fnd_api.g_exc_error;
5306 END IF;
5307
5308 IF p_config_rec.serial_code in (2, 5) THEN
5309
5310 -- child relation
5311 FOR sc_inst_rec IN sc_inst_cur(
5312 p_top_config_instance_id => l_config_instance.instance_id,
5313 p_sub_config_item_id => p_config_rec.sub_config_item_id)
5314 LOOP
5315
5316 mark_and_get_src_tld(
5317 px_src_tld_tbl => l_oc_tld_tbl,
5318 x_src_tld_rec => l_oc_tld_rec,
5319 x_return_status => l_return_status);
5320 IF l_return_status <> fnd_api.g_ret_sts_success THEN
5321 RAISE fnd_api.g_exc_error;
5322 END IF;
5323
5324 break_relation(
5325 p_relationship_id => sc_inst_rec.relationship_id,
5326 p_relationship_ovn => sc_inst_rec.object_version_number,
5327 px_csi_txn_rec => px_csi_txn_rec,
5328 x_return_status => l_return_status);
5329
5330 IF l_return_status <> fnd_api.g_ret_sts_success THEN
5331 RAISE fnd_api.g_exc_error;
5332 END IF;
5333
5334 build_non_source_rec(
5335 p_transaction_line_id => px_default_info_rec.transaction_line_id,
5336 p_instance_id => sc_inst_rec.subject_id,
5337 px_default_info_rec => px_default_info_rec,
5338 x_txn_line_dtl_id => l_config_ns_tld_id,
5339 x_return_status => l_return_status);
5340
5341 IF l_return_status <> fnd_api.g_ret_sts_success THEN
5342 RAISE fnd_api.g_exc_error;
5343 END IF;
5344
5345 pcm_ind := pcm_ind + 1;
5346 l_pcm_tbl(pcm_ind).object_tld_id := l_oc_tld_rec.txn_line_detail_id;
5347 l_pcm_tbl(pcm_ind).subject_tld_id := l_config_ns_tld_id;
5348
5349 END LOOP;
5350 ELSE -- non serial/soi config block
5351
5352 IF l_sub_config_instances.COUNT > 0 THEN
5353
5354 FOR config_class_ratio_ind IN 1 .. l_config_class_ratio
5355 LOOP
5356
5357 mark_and_get_src_tld(
5358 px_src_tld_tbl => l_oc_tld_tbl,
5359 x_src_tld_rec => l_oc_tld_rec,
5360 x_return_status => l_return_status);
5361
5362 IF l_return_status <> fnd_api.g_ret_sts_success THEN
5363 RAISE fnd_api.g_exc_error;
5364 END IF;
5365
5366 IF nvl(l_oc_tld_rec.txn_line_detail_id, fnd_api.g_miss_num) <> fnd_api.g_miss_num
5367 THEN
5368
5369 mark_and_get_config(
5370 px_config_instances => l_sub_config_instances,
5371 x_config_instance => l_sub_config_instance,
5372 x_return_status => l_return_status);
5373
5374 IF l_sub_config_instance.instance_id is not null THEN
5375 build_non_source_rec(
5376 p_transaction_line_id => px_default_info_rec.transaction_line_id,
5377 p_instance_id => l_sub_config_instance.instance_id,
5378 px_default_info_rec => px_default_info_rec,
5379 x_txn_line_dtl_id => l_sub_config_ns_tld_id,
5380 x_return_status => l_return_status);
5381
5382 IF l_return_status <> fnd_api.g_ret_sts_success THEN
5383 RAISE fnd_api.g_exc_error;
5384 END IF;
5385
5386 pcm_ind := pcm_ind + 1;
5387 l_pcm_tbl(pcm_ind).object_tld_id := l_oc_tld_rec.txn_line_detail_id;
5388 l_pcm_tbl(pcm_ind).subject_tld_id := l_sub_config_ns_tld_id;
5389
5390 END IF;
5391
5392 END IF;
5393
5394 END LOOP;
5395 END IF;
5396
5397 END IF; -- config serial code in (2, 5)
5398
5399 END LOOP;
5400 END IF; -- config instance.count > 0
5401 ELSE -- non ato sub model classes
5402
5403 get_ib_trackable_children(
5404 p_current_line_id => p_order_line_rec.line_id,
5405 p_om_vld_org_id => px_default_info_rec.om_vld_org_id,
5406 x_trackable_line_tbl => l_child_line_tbl,
5407 x_return_status => l_return_status);
5408
5409 IF l_return_status <> fnd_api.g_ret_sts_success THEN
5410 RAISE fnd_api.g_exc_error;
5411 END IF;
5412
5413 get_ato_options_only(
5414 px_line_tbl => l_child_line_tbl,
5415 x_return_status => l_return_status);
5416
5417 IF l_return_status <> fnd_api.g_ret_sts_success THEN
5418 RAISE fnd_api.g_exc_error;
5419 END IF;
5420
5421 l_temp_src_tld_tbl := l_src_tld_tbl;
5422
5423 IF p_config_rec.sub_model_flag = 'N' THEN
5424 l_config_instances := p_config_instances;
5425 ELSE
5426 IF l_parent_line_rec.line_id = p_config_rec.sub_model_line_id THEN
5427 debug(' immediate child of an ato sub model');
5428 -- switch the l_config_instances with the sub_model_config_instances
5429 get_config_srl_instances(
5430 p_config_rec => p_config_rec,
5431 p_sub_config_flag => 'Y',
5432 px_default_info_rec => px_default_info_rec,
5433 px_csi_txn_rec => px_csi_txn_rec,
5434 x_config_instances => l_config_instances,
5435 x_return_status => l_return_status);
5436 IF l_return_status <> fnd_api.g_ret_sts_success THEN
5437 RAISE fnd_api.g_exc_error;
5438 END IF;
5439 END IF;
5440 END IF;
5441
5442 IF p_config_rec.serial_code <> 1 THEN
5443 get_config_shipped_serials(
5444 px_config_instances => l_config_instances,
5445 x_return_status => l_return_status);
5446
5447 IF l_return_status <> fnd_api.g_ret_sts_success THEN
5448 RAISE fnd_api.g_exc_error;
5449 END IF;
5450 END IF;
5451
5452 IF l_config_instances.COUNT > 0 THEN
5453 FOR ci_ind IN l_config_instances.FIRST .. l_config_instances.LAST
5454 LOOP
5455
5456 --{ begin parent relation code
5457
5458 -- for each of the parent config instance for the class build a non source tld
5459 build_non_source_rec(
5460 p_transaction_line_id => px_default_info_rec.transaction_line_id,
5461 p_instance_id => l_config_instances(ci_ind).instance_id,
5462 px_default_info_rec => px_default_info_rec,
5463 x_txn_line_dtl_id => l_config_ns_tld_id,
5464 x_return_status => l_return_status);
5465
5466 IF l_return_status <> fnd_api.g_ret_sts_success THEN
5467 RAISE fnd_api.g_exc_error;
5468 END IF;
5469
5470 oct_ind := 0;
5471
5472 FOR config_class_ratio_ind IN 1 .. l_config_class_ratio
5473 LOOP
5474
5475 mark_and_get_src_tld(
5476 px_src_tld_tbl => l_temp_src_tld_tbl,
5477 x_src_tld_rec => l_oc_tld_rec,
5478 x_return_status => l_return_status);
5479
5480 IF l_return_status <> fnd_api.g_ret_sts_success THEN
5481 RAISE fnd_api.g_exc_error;
5482 END IF;
5483
5484 IF nvl(l_oc_tld_rec.txn_line_detail_id, fnd_api.g_miss_num) <> fnd_api.g_miss_num THEN
5485
5486 oct_ind := oct_ind + 1;
5487 l_oc_tld_tbl(oct_ind) := l_oc_tld_rec;
5488
5489 pcm_ind := pcm_ind + 1;
5490 l_pcm_tbl(pcm_ind).object_tld_id := l_config_ns_tld_id;
5491 l_pcm_tbl(pcm_ind).subject_tld_id := l_oc_tld_rec.txn_line_detail_id;
5492
5493 END IF;
5494
5495 END LOOP;
5496
5497 -- } end parent relation code
5498
5499 -- { begin child relation code
5500
5501 l_ii_rltns_qry_rec.object_id := l_config_instances(ci_ind).instance_id;
5502 l_ii_rltns_qry_rec.relationship_type_code := 'COMPONENT-OF';
5503
5504 csi_t_gen_utility_pvt.dump_api_info(
5505 p_pkg_name => 'csi_ii_relationships_pub',
5506 p_api_name => 'get_relationships');
5507
5508 csi_ii_relationships_pub.get_relationships(
5509 p_api_version => 1.0,
5510 p_commit => fnd_api.g_false,
5511 p_init_msg_list => fnd_api.g_true,
5512 p_validation_level => fnd_api.g_valid_level_full,
5513 p_relationship_query_rec => l_ii_rltns_qry_rec,
5514 p_depth => 1,
5515 p_time_stamp => l_time_stamp,
5516 p_active_relationship_only => fnd_api.g_true,
5517 x_relationship_tbl => l_ii_rltns_tbl,
5518 x_return_status => l_return_status,
5519 x_msg_count => l_msg_count,
5520 x_msg_data => l_msg_data);
5521
5522 IF l_return_status <> fnd_api.g_ret_sts_success THEN
5523 RAISE fnd_api.g_exc_error;
5524 END IF;
5525
5526 debug(' ii relationship count :'||l_ii_rltns_tbl.COUNT);
5527
5528 IF l_ii_rltns_tbl.COUNT > 0 THEN
5529 l_config_instances(ci_ind).wip_config_flag := 'Y';
5530 ELSE
5531 l_config_instances(ci_ind).wip_config_flag := 'N';
5532 END IF;
5533
5534 l_temp_ii_rltns_tbl := l_ii_rltns_tbl;
5535
5536 IF l_child_line_tbl.COUNT > 0 THEN
5537 FOR cl_ind IN l_child_line_tbl.FIRST .. l_child_line_tbl.LAST
5538 LOOP
5539 --If condition included for Bug 4514821:To ensure that breaking of child compoenent
5540 --from config item and attaching with option class is done,only if
5541 --child item is involved in wip transaction.
5542 check_wip_requirements(
5543 p_wip_entity_id => p_config_rec.config_wip_job_id,
5544 p_option_item_id => l_child_line_tbl(cl_ind).inventory_item_id,
5545 x_wip_processing => l_wip_processing);
5546
5547 IF (l_wip_processing) THEN
5548
5549 debug('Child Item is involved in wip transaction, so trying to break relation with config');
5550
5551 SELECT serial_number_control_code
5552 INTO l_option_serial_code
5553 FROM mtl_system_items
5554 WHERE inventory_item_id = l_child_line_tbl(cl_ind).inventory_item_id
5555 AND organization_id = l_child_line_tbl(cl_ind).ship_from_org_id;
5556
5557 l_ii_rltns_tbl := l_temp_ii_rltns_tbl;
5558
5559 filter_option_instances(
5560 p_option_line_rec => l_child_line_tbl(cl_ind),
5561 p_option_serial_code => l_option_serial_code,
5562 p_config_rec => p_config_rec,
5563 p_transaction_line_id => px_default_info_rec.transaction_line_id,
5564 px_ii_rltns_tbl => l_ii_rltns_tbl,
5565 px_csi_txn_rec => px_csi_txn_rec,
5566 x_return_status => l_return_status);
5567
5568 --Included the return status check, as part of fixing bug 4514821
5569 IF l_return_status <> fnd_api.g_ret_sts_success THEN
5570 RAISE fnd_api.g_exc_error;
5571 END IF;
5572 debug('ii relationship count :'||l_ii_rltns_tbl.COUNT);
5573
5574
5575 l_class_option_ratio := l_child_line_tbl(cl_ind).ordered_quantity/
5576 p_order_line_rec.ordered_quantity;
5577
5578 IF l_oc_tld_tbl.COUNT > 0 THEN
5579 FOR l_oc_ind IN l_oc_tld_tbl.FIRST .. l_oc_tld_tbl.LAST
5580 LOOP
5581
5582 IF l_option_serial_code in (2, 5, 6) THEN
5583 debug(' serial option');
5584 FOR l_class_option_ratio_ind IN 1 .. l_class_option_ratio
5585 LOOP
5586 -- mark and get
5587
5588 mark_and_get_srl_option(
5589 px_ii_rltns_tbl => l_ii_rltns_tbl,
5590 x_option_ii_rltns_rec => l_option_ii_rltns_rec,
5591 x_return_status => l_return_status);
5592
5593 IF l_return_status <> fnd_api.g_ret_sts_success THEN
5594 RAISE fnd_api.g_exc_error;
5595 END IF;
5596
5597 build_non_source_rec(
5598 p_transaction_line_id => px_default_info_rec.transaction_line_id,
5599 p_instance_id => l_option_ii_rltns_rec.subject_id,
5600 px_default_info_rec => px_default_info_rec,
5601 x_txn_line_dtl_id => l_option_ns_tld_id,
5602 x_return_status => l_return_status);
5603
5604 IF l_return_status <> fnd_api.g_ret_sts_success THEN
5605 RAISE fnd_api.g_exc_error;
5606 END IF;
5607
5608 IF nvl(l_option_ii_rltns_rec.relationship_id, fnd_api.g_miss_num) <>
5609 fnd_api.g_miss_num
5610 THEN
5611 break_relation(
5612 p_relationship_id => l_option_ii_rltns_rec.relationship_id,
5613 p_relationship_ovn => l_option_ii_rltns_rec.object_version_number,
5614 px_csi_txn_rec => px_csi_txn_rec,
5615 x_return_status => l_return_status);
5616
5617 IF l_return_status <> fnd_api.g_ret_sts_success THEN
5618 RAISE fnd_api.g_exc_error;
5619 END IF;
5620 END IF;
5621
5622 pcm_ind := pcm_ind + 1;
5623 l_pcm_tbl(pcm_ind).object_tld_id := l_oc_tld_tbl(l_oc_ind).txn_line_detail_id;
5624 l_pcm_tbl(pcm_ind).subject_tld_id := l_option_ns_tld_id;
5625
5626 END LOOP; -- class option ratio check
5627 ELSE -- non serial ato option case
5628 debug(' non serial option');
5629
5630 mark_and_get_nsrl_option(
5631 p_class_quantity => p_order_line_rec.ordered_quantity,
5632 p_quantity_ratio => l_class_option_ratio,
5633 px_csi_txn_rec => px_csi_txn_rec,
5634 px_ii_rltns_tbl => l_ii_rltns_tbl,
5635 x_option_ii_rltns_rec => l_option_ii_rltns_rec,
5636 x_return_status => l_return_status);
5637
5638 IF l_return_status <> fnd_api.g_ret_sts_success THEN
5639 RAISE fnd_api.g_exc_error;
5640 END IF;
5641
5642 IF nvl(l_option_ii_rltns_rec.subject_id, fnd_api.g_miss_num) <> fnd_api.g_miss_num
5643 THEN
5644 build_non_source_rec(
5645 p_transaction_line_id => px_default_info_rec.transaction_line_id,
5646 p_instance_id => l_option_ii_rltns_rec.subject_id,
5647 px_default_info_rec => px_default_info_rec,
5648 x_txn_line_dtl_id => l_option_ns_tld_id,
5649 x_return_status => l_return_status);
5650
5651 IF l_return_status <> fnd_api.g_ret_sts_success THEN
5652 RAISE fnd_api.g_exc_error;
5653 END IF;
5654
5655 pcm_ind := pcm_ind + 1;
5656 l_pcm_tbl(pcm_ind).object_tld_id := l_oc_tld_tbl(l_oc_ind).txn_line_detail_id;
5657 l_pcm_tbl(pcm_ind).subject_tld_id := l_option_ns_tld_id;
5658 END IF;
5659
5660 END IF; -- option serial control check
5661
5662 END LOOP;
5663 END IF;
5664 END IF; --<<IF l_wip_processing = true >>Fix for bug 4514821
5665 END LOOP;
5666 END IF;
5667
5668 END LOOP; -- config serial instance loop
5669 END IF;
5670 END IF; -- sub models/NON sub models
5671 END IF; -- item type code = CLASS
5672
5673 IF l_pcm_tbl.COUNT > 0 THEN
5674 FOR l_pcm_ind IN l_pcm_tbl.FIRST .. l_pcm_tbl.LAST
5675 LOOP
5676 -- build ii_rltns table
5677 l_t_rltns_tbl(l_pcm_ind).txn_relationship_id := fnd_api.g_miss_num;
5678 l_t_rltns_tbl(l_pcm_ind).transaction_line_id := px_default_info_rec.transaction_line_id;
5679 l_t_rltns_tbl(l_pcm_ind).subject_id := l_pcm_tbl(l_pcm_ind).subject_tld_id;
5680 l_t_rltns_tbl(l_pcm_ind).object_id := l_pcm_tbl(l_pcm_ind).object_tld_id;
5681 l_t_rltns_tbl(l_pcm_ind).relationship_type_code := 'COMPONENT-OF';
5682 l_t_rltns_tbl(l_pcm_ind).active_start_date := sysdate;
5683 l_t_rltns_tbl(l_pcm_ind).subject_type := 'T';
5684 l_t_rltns_tbl(l_pcm_ind).object_type := 'T';
5685 END LOOP;
5686
5687 csi_t_txn_rltnshps_grp.create_txn_ii_rltns_dtls(
5688 p_api_version => 1.0,
5689 p_commit => fnd_api.g_false,
5690 p_init_msg_list => fnd_api.g_true,
5691 p_validation_level => fnd_api.g_valid_level_full,
5692 px_txn_ii_rltns_tbl => l_t_rltns_tbl,
5693 x_return_status => l_return_status,
5694 x_msg_count => l_msg_count,
5695 x_msg_data => l_msg_data);
5696 IF l_return_status <> fnd_api.g_ret_sts_success THEN
5697 RAISe fnd_api.g_exc_error;
5698 END IF;
5699
5700 END IF; -- pcm tbl count > 0
5701 EXCEPTION
5702 WHEN fnd_api.g_exc_error THEN
5703 x_return_status := fnd_api.g_ret_sts_error;
5704 END rebuild_relation_for_ato;
5705
5706 -- child order line instances should get hooked in to the ib trackable parent order line
5707 PROCEDURE build_parent_relation(
5708 p_order_line_rec IN oe_order_lines_all%rowtype,
5709 p_txn_line_rec IN csi_t_datastructures_grp.txn_line_rec,
5710 p_split_flag IN varchar2,
5711 p_identified_item_type IN varchar2,
5712 p_config_rec IN config_rec,
5713 p_config_instances IN config_serial_inst_tbl,
5714 px_default_info_rec IN OUT nocopy default_info_rec,
5715 px_csi_txn_rec IN OUT nocopy csi_datastructures_pub.transaction_rec,
5716 x_return_status OUT nocopy varchar2)
5717 IS
5718
5719 l_inst_query_rec csi_datastructures_pub.instance_query_rec;
5720 l_party_query_rec csi_datastructures_pub.party_query_rec;
5721 l_pty_acct_query_rec csi_datastructures_pub.party_account_query_rec;
5722
5723 l_instance_hdr_tbl csi_datastructures_pub.instance_header_tbl;
5724 l_instance_tbl csi_datastructures_pub.instance_tbl;
5725
5726 l_line_dtl_tbl csi_t_datastructures_grp.txn_line_detail_tbl;
5727 l_t_iir_tbl csi_t_datastructures_grp.txn_ii_rltns_tbl;
5728
5729 l_parent_line_rec oe_order_pub.line_rec_type := oe_order_pub.g_miss_line_rec;
5730 l_child_tld_rec csi_t_datastructures_grp.txn_line_detail_rec;
5731 l_ns_tld_id number;
5732
5733 l_qty_ratio number;
5734
5735 l_instance_found boolean;
5736
5737 l_i_ind binary_integer := 0;
5738 l_object_id number;
5739 l_subject_id number;
5740
5741 l_return_status varchar2(1) := fnd_api.g_ret_sts_success;
5742 l_msg_data varchar2(2000);
5743 l_msg_count number;
5744
5745
5746 l_satisfied varchar2(1) := 'N';
5747 l_qty_allocated number;
5748 l_new_tld_qty number;
5749 l_old_tld_qty number;
5750 l_child_of_sub_ato_mdl varchar2(1) := 'N';
5751
5752 l_config_instances config_serial_inst_tbl;
5753
5754 BEGIN
5755
5756
5757 x_return_status := fnd_api.g_ret_sts_success;
5758 api_log('build_parent_relation');
5759
5760 l_config_instances := p_config_instances;
5761
5762 get_ib_trackable_parent(
5763 p_current_line_id => p_txn_line_rec.source_transaction_id,
5764 p_om_vld_org_id => px_default_info_rec.om_vld_org_id,
5765 x_parent_line_rec => l_parent_line_rec,
5766 x_return_status => l_return_status);
5767
5768 IF l_return_status <> fnd_api.g_ret_sts_success THEN
5769 RAISE fnd_api.g_exc_error;
5770 END IF;
5771
5772 IF nvl(l_parent_line_rec.line_id, fnd_api.g_miss_num) <> fnd_api.g_miss_num THEN
5773
5774 get_tld(
5775 p_source_table => 'OE_ORDER_LINES_ALL',
5776 p_source_id => p_order_line_rec.line_id,
5777 p_source_flag => 'Y',
5778 p_processing_status => 'IN_PROCESS',
5779 x_line_dtl_tbl => l_line_dtl_tbl,
5780 x_return_status => l_return_status);
5781
5782 IF l_return_status <> fnd_api.g_ret_sts_success THEN
5783 RAISE fnd_api.g_exc_error;
5784 END IF;
5785
5786 l_child_of_sub_ato_mdl := 'N';
5787
5788 /* if parent line id is the ATO model then switch the line id to the configs
5789 because the class and option items should be underneath the config item
5790 */
5791 IF ( p_identified_item_type = 'ATO_CLASS'
5792 AND
5793 p_order_line_rec.ato_line_id = l_parent_line_rec.line_id
5794 )
5795 OR
5796 ( p_identified_item_type = 'ATO_OPTION'
5797 AND
5798 p_order_line_rec.ato_line_id = l_parent_line_rec.line_id
5799 )
5800 OR
5801 ( p_identified_item_type = 'ATO_SUB_MODEL'
5802 AND
5803 p_order_line_rec.ato_line_id = l_parent_line_rec.line_id
5804 )
5805 THEN
5806 IF nvl(p_config_rec.line_id, fnd_api.g_miss_num) <> fnd_api.g_miss_num THEN
5807 oe_line_util.query_row(
5808 p_line_id => p_config_rec.line_id,
5809 x_line_rec => l_parent_line_rec);
5810 END IF;
5811 ELSE
5812 IF p_config_rec.sub_model_flag = 'Y'
5813 AND
5814 (l_parent_line_rec.line_id = p_config_rec.sub_model_line_id)
5815 THEN
5816 l_child_of_sub_ato_mdl := 'Y';
5817 debug('immediate child of an ato sub model');
5818 -- switch the l_config_instances with the sub_model_config_instances
5819 IF p_config_rec.sub_model_serial_code IN (2, 5, 6) THEN
5820
5821 -- sub model is serialized so hook this line to the sub configured instances
5822 get_config_srl_instances(
5823 p_config_rec => p_config_rec,
5824 p_sub_config_flag => 'Y',
5825 px_default_info_rec => px_default_info_rec,
5826 px_csi_txn_rec => px_csi_txn_rec,
5827 x_config_instances => l_config_instances,
5828 x_return_status => l_return_status);
5829 IF l_return_status <> fnd_api.g_ret_sts_success THEN
5830 RAISE fnd_api.g_exc_error;
5831 END IF;
5832
5833 END IF;
5834 END IF;
5835 END IF;
5836
5837 l_qty_ratio := p_order_line_rec.ordered_quantity/l_parent_line_rec.ordered_quantity;
5838 debug(' parent_child_ratio : '||l_qty_ratio);
5839
5840 -- 2787905
5841 debug(' p_split_flag :'||p_split_flag);
5842 IF p_order_line_rec.ordered_quantity > 1 THEN
5843
5844
5845 IF p_split_flag = 'N' THEN
5846
5847 -- split txn_details in the ratio with the parent.
5848 split_txn_dtls_with_ratio(
5849 p_quantity_ratio => l_qty_ratio,
5850 px_line_dtl_tbl => l_line_dtl_tbl,
5851 x_return_status => l_return_status);
5852 IF l_return_status <> fnd_api.g_ret_sts_success THEN
5853 RAISE fnd_api.g_exc_error;
5854 END IF;
5855
5856 END IF;
5857
5858 END IF;
5859
5860 l_instance_found := FALSE;
5861
5862 IF l_child_of_sub_ato_mdl = 'Y' THEN
5863 --get sub model config instances in l_instance_tbl
5864 IF l_config_instances.COUNT > 0 THEN
5865 l_instance_found := TRUE;
5866 FOR lc_ind IN l_config_instances.FIRST..l_config_instances.LAST
5867 LOOP
5868 l_i_ind := l_i_ind + 1;
5869 l_instance_tbl(l_i_ind).instance_id := l_config_instances(lc_ind).instance_id;
5870 END LOOP;
5871 END IF;
5872 ELSE
5873 -- check if instance exists
5874 l_inst_query_rec.inventory_item_id := l_parent_line_rec.inventory_item_id;
5875 l_inst_query_rec.last_oe_order_line_id := l_parent_line_rec.line_id;
5876
5877 debug('query criteria for get_item_instances:');
5878 debug(' inventory_item_id : '||l_inst_query_rec.inventory_item_id);
5879 debug(' last_oe_order_line_id : '||l_inst_query_rec.last_oe_order_line_id);
5880
5881 csi_t_gen_utility_pvt.dump_api_info(
5882 p_api_name => 'get_item_instances',
5883 p_pkg_name => 'csi_item_instance_pub');
5884
5885 csi_item_instance_pub.get_item_instances(
5886 p_api_version => 1.0,
5887 p_commit => fnd_api.g_false,
5888 p_init_msg_list => fnd_api.g_true,
5889 p_validation_level => fnd_api.g_valid_level_full,
5890 p_instance_query_rec => l_inst_query_rec,
5891 p_party_query_rec => l_party_query_rec,
5892 p_account_query_rec => l_pty_acct_query_rec,
5893 p_transaction_id => null,
5894 p_resolve_id_columns => fnd_api.g_false,
5895 p_active_instance_only => fnd_api.g_true,
5896 x_instance_header_tbl => l_instance_hdr_tbl,
5897 x_return_status => l_return_status,
5898 x_msg_count => l_msg_count,
5899 x_msg_data => l_msg_data );
5900
5901 IF l_return_status <> fnd_api.g_ret_sts_success THEN
5902 RAISE fnd_api.g_exc_error;
5903 END IF;
5904
5905 IF l_instance_hdr_tbl.COUNT > 0 THEN
5906 l_instance_found := TRUE;
5907
5908 debug('instances found for the parent COUNT: '||l_instance_hdr_tbl.COUNT);
5909
5910 make_non_header_tbl(
5911 p_instance_header_tbl => l_instance_hdr_tbl,
5912 x_instance_tbl => l_instance_tbl,
5913 x_return_status => l_return_status);
5914
5915 END IF;
5916
5917 END IF;
5918
5919 IF l_instance_found THEN
5920
5921 IF l_parent_line_rec.item_type_code = 'CONFIG' THEN
5922 -- eliminate the reship parent instance because we do not want the relationship
5923 -- to be built.
5924 eliminate_reshipped_instances(
5925 p_config_instances => l_config_instances,
5926 px_instances_tbl => l_instance_tbl,
5927 x_return_status => l_return_status);
5928 IF l_return_status <> fnd_api.g_ret_sts_success THEN
5929 RAISE fnd_api.g_exc_error;
5930 END IF;
5931 END IF;
5932
5933 IF l_instance_tbl.COUNT > 0 THEN
5934 FOR l_i_ind IN l_instance_tbl.FIRST .. l_instance_tbl.LAST
5935 LOOP
5936
5937 build_non_source_rec(
5938 p_transaction_line_id => p_txn_line_rec.transaction_line_id,
5939 p_instance_id => l_instance_tbl(l_i_ind).instance_id,
5940 px_default_info_rec => px_default_info_rec,
5941 x_txn_line_dtl_id => l_ns_tld_id,
5942 x_return_status => l_return_status);
5943
5944 IF l_return_status <> fnd_api.g_ret_sts_success THEN
5945 raise fnd_api.g_exc_error;
5946 END IF;
5947
5948 l_object_id := l_ns_tld_id;
5949
5950 l_qty_allocated := 0;
5951 l_satisfied := 'N';
5952 l_new_tld_qty := 0;
5953 l_old_tld_qty := 0;
5954
5955 LOOP
5956
5957 mark_and_get_src_tld(
5958 px_src_tld_tbl => l_line_dtl_tbl,
5959 x_src_tld_rec => l_child_tld_rec,
5960 x_return_status => l_return_status);
5961
5962 IF nvl(l_child_tld_rec.txn_line_detail_id, fnd_api.g_miss_num) <> fnd_api.g_miss_num THEN
5963
5964 l_subject_id := l_child_tld_rec.txn_line_detail_id;
5965 l_qty_allocated := l_qty_allocated + l_child_tld_rec.quantity;
5966
5967 IF l_qty_allocated = l_qty_ratio THEN
5968 l_satisfied := 'Y';
5969 END IF;
5970
5971 IF l_qty_allocated > l_qty_ratio THEN
5972 l_new_tld_qty := l_qty_allocated - l_qty_ratio;
5973 l_old_tld_qty := l_child_tld_rec.quantity - l_new_tld_qty;
5974 -- split the tld and add the new rec in l_line_dtl_tbl at the end
5975 l_satisfied := 'Y';
5976 END IF;
5977
5978 l_t_iir_tbl.DELETE;
5979
5980 -- build ii_rltns table
5981 l_t_iir_tbl(1).txn_relationship_id := fnd_api.g_miss_num;
5982 l_t_iir_tbl(1).transaction_line_id := p_txn_line_rec.transaction_line_id;
5983 l_t_iir_tbl(1).subject_id := l_subject_id;
5984 l_t_iir_tbl(1).object_id := l_object_id;
5985 l_t_iir_tbl(1).relationship_type_code := 'COMPONENT-OF';
5986 l_t_iir_tbl(1).active_start_date := sysdate;
5987 l_t_iir_tbl(1).subject_type := 'T';
5988 l_t_iir_tbl(1).object_type := 'T';
5989
5990 csi_t_txn_rltnshps_grp.create_txn_ii_rltns_dtls(
5991 p_api_version => 1.0,
5992 p_commit => fnd_api.g_false,
5993 p_init_msg_list => fnd_api.g_true,
5994 p_validation_level => fnd_api.g_valid_level_full,
5995 px_txn_ii_rltns_tbl => l_t_iir_tbl,
5996 x_return_status => l_return_status,
5997 x_msg_count => l_msg_count,
5998 x_msg_data => l_msg_data);
5999
6000 IF l_return_status <> fnd_api.g_ret_sts_success THEN
6001 RAISE fnd_api.g_exc_error;
6002 END IF;
6003
6004 IF l_satisfied = 'Y' THEN
6005 exit;
6006 END IF;
6007
6008 ELSE
6009 EXIT;
6010 END IF; -- parent_tld_rec.tld_id is found
6011
6012 END LOOP; -- [quantity ratio loop]
6013
6014 END LOOP; -- [instances loop]
6015 END IF;
6016
6017 END IF; -- found parent instances
6018
6019 END IF; -- found an ib trackable parent
6020
6021 EXCEPTION
6022 WHEN fnd_api.g_exc_error THEN
6023 x_return_status := fnd_api.g_ret_sts_error;
6024 END build_parent_relation;
6025
6026 PROCEDURE mark_and_get_instances(
6027 p_qty_ratio IN number,
6028 px_instance_tbl IN OUT nocopy csi_datastructures_pub.instance_tbl,
6029 px_csi_txn_rec IN OUT NOCOPY csi_datastructures_pub.transaction_rec,
6030 x_instance_tbl OUT nocopy csi_datastructures_pub.instance_tbl,
6031 x_return_status OUT nocopy varchar2)
6032 IS
6033 l_satisfied varchar2(1) := 'N';
6034 l_qty_allocated number := 0;
6035 l_new_qty number;
6036 l_old_qty number;
6037 x_ind binary_integer := 0;
6038 px_ind binary_integer := 0;
6039 --fix for bug5096435
6040 l_return_status varchar2(1) := fnd_api.g_ret_sts_success;
6041 l_new_instance_rec csi_datastructures_pub.instance_rec;
6042 BEGIN
6043 x_return_status := fnd_api.g_ret_sts_success;
6044 api_log('mark_and_get_instances');
6045
6046 l_satisfied := 'N';
6047 IF px_instance_tbl.COUNT > 0 THEN
6048 LOOP
6049 px_ind := px_instance_tbl.NEXT(px_ind);
6050 IF px_ind is null THEN
6051 exit;
6052 ELSE --fix for bug5096435
6053 l_qty_allocated := l_qty_allocated + px_instance_tbl(px_ind).quantity;
6054 IF l_qty_allocated = p_qty_ratio THEN
6055 l_satisfied := 'Y';
6056 x_ind := x_ind + 1;
6057 x_instance_tbl(x_ind) := px_instance_tbl(px_ind);
6058 px_instance_tbl.DELETE(px_ind);
6059 ELSIF l_qty_allocated > p_qty_ratio THEN
6060 -- split instances
6061 l_new_qty := l_qty_allocated - p_qty_ratio;
6062 l_satisfied := 'Y';
6063 l_old_qty := px_instance_tbl(px_ind).quantity - l_new_qty;
6064 px_instance_tbl(px_ind).quantity := l_old_qty;
6065 --fix for bug5096435
6066 x_ind := x_ind + 1;
6067 x_instance_tbl(x_ind) := px_instance_tbl(px_ind);
6068 debug('splitting instance ' || px_instance_tbl(px_ind).instance_id ||' based on qty '|| l_new_qty);
6069 split_instance(
6070 p_instance_id => px_instance_tbl(px_ind).instance_id,
6071 p_quantity => l_new_qty,
6072 px_csi_txn_rec => px_csi_txn_rec,
6073 x_instance_rec => l_new_instance_rec,
6074 x_return_status => l_return_status);
6075 IF l_return_status <> fnd_api.g_ret_sts_success THEN
6076 RAISE fnd_api.g_exc_error;
6077 END IF;
6078 debug('New instance created after splitiing : ' || l_new_instance_rec.instance_id);
6079 px_instance_tbl(px_instance_tbl.LAST+1) := l_new_instance_rec;
6080 px_instance_tbl.DELETE(px_ind);
6081 ELSIF l_qty_allocated < p_qty_ratio THEN
6082 x_ind := x_ind + 1;
6083 x_instance_tbl(x_ind) := px_instance_tbl(px_ind);
6084 px_instance_tbl.DELETE(px_ind);
6085 l_satisfied := 'N';
6086 END IF;
6087 END IF;
6088 IF l_satisfied = 'Y' THEN
6089 exit;
6090 END IF;
6091 END LOOP;
6092 END IF;
6093 END mark_and_get_instances;
6094
6095 -- builds relation to the next level
6096 PROCEDURE build_child_relation(
6097 p_order_line_rec IN oe_order_lines_all%ROWTYPE,
6098 p_txn_line_rec IN csi_t_datastructures_grp.txn_line_rec,
6099 p_identified_item_type IN varchar2,
6100 px_default_info_rec IN OUT NOCOPY default_info_rec,
6101 px_csi_txn_rec IN OUT NOCOPY csi_datastructures_pub.transaction_rec,
6102 x_return_status OUT NOCOPY varchar2)
6103 IS
6104
6105 l_inst_query_rec csi_datastructures_pub.instance_query_rec;
6106 l_party_query_rec csi_datastructures_pub.party_query_rec;
6107 l_pty_acct_query_rec csi_datastructures_pub.party_account_query_rec;
6108
6109 l_instance_hdr_tbl csi_datastructures_pub.instance_header_tbl;
6110 l_instance_tbl csi_datastructures_pub.instance_tbl;
6111 l_alloc_instance_tbl csi_datastructures_pub.instance_tbl;
6112
6113
6114 l_tld_tbl csi_t_datastructures_grp.txn_line_detail_tbl;
6115
6116 l_child_line_tbl oe_order_pub.line_tbl_type;
6117 l_grand_child_line_tbl oe_order_pub.line_tbl_type;
6118 l_qty_ratio number;
6119
6120 l_model_order_qty number;
6121
6122 l_instance_found boolean;
6123
6124 l_ns_tld_id number;
6125 l_object_id number;
6126 l_subject_id number;
6127 l_t_iir_tbl csi_t_datastructures_grp.txn_ii_rltns_tbl;
6128
6129 l_return_status varchar2(1) := fnd_api.g_ret_sts_success;
6130 l_msg_data varchar2(2000);
6131 l_msg_count number;
6132
6133 --fix for bug5096435
6134 l_order_line_qty number;
6135 l_temp_child_line_rec oe_order_pub.Line_Rec_Type;
6136 l_next_item_id number := 0;
6137 l_temp_idx number := 0;
6138 l_temp_instance_hdr_tbl csi_datastructures_pub.instance_header_tbl;
6139 l_temp_index number := 0;
6140
6141 BEGIN
6142
6143 x_return_status := fnd_api.g_ret_sts_success;
6144 api_log('build_child_relation');
6145
6146 get_ib_trackable_children(
6147 p_current_line_id => p_order_line_rec.line_id,
6148 p_om_vld_org_id => px_default_info_rec.om_vld_org_id,
6149 x_trackable_line_tbl => l_child_line_tbl,
6150 x_return_status => l_return_status);
6151
6152 IF l_return_status <> fnd_api.g_ret_sts_success THEN
6153 RAISE fnd_api.g_exc_error;
6154 END IF;
6155
6156 --fix for bug5096435
6157 --Here child_line_tbl is sorted and rearranged to ensure that
6158 --two/more different remnant lines of same inventory item are put together
6159 --in the plsql table.
6160 IF p_order_line_rec.model_remnant_flag = 'Y' THEN
6161 FOR i IN 1..l_child_line_tbl.COUNT
6162 LOOP
6163 IF l_child_line_tbl(i).model_remnant_flag = 'Y' THEN
6164 l_temp_index := i+1;
6165 FOR j IN l_temp_index..l_child_line_tbl.COUNT
6166 LOOP
6167 IF l_child_line_tbl(j).inventory_item_id = l_child_line_tbl(i).inventory_item_id
6168 AND j <> l_temp_index THEN
6169 l_temp_child_line_rec := l_child_line_tbl(l_temp_index);
6170 l_child_line_tbl(l_temp_index) := l_child_line_tbl(j);
6171 l_child_line_tbl(j) := l_temp_child_line_rec;
6172 EXIT;
6173 END IF;
6174 END LOOP;
6175 END IF;
6176 END LOOP;
6177 END IF;
6178
6179 IF l_child_line_tbl.COUNT > 0 THEN
6180
6181 get_tld(
6182 p_source_table => 'OE_ORDER_LINES_ALL',
6183 p_source_id => p_order_line_rec.line_id,
6184 p_source_flag => 'Y',
6185 p_processing_status => 'IN_PROCESS',
6186 x_line_dtl_tbl => l_tld_tbl,
6187 x_return_status => l_return_status);
6188
6189 IF l_return_status <> fnd_api.g_ret_sts_success THEN
6190 RAISE fnd_api.g_exc_error;
6191 END IF;
6192
6193 FOR l_ind in l_child_line_tbl.FIRST..l_child_line_tbl.LAST
6194 LOOP
6195 --fix for 5096435
6196 --This check ensures that we figure out quantity ratio by summing
6197 --order quantity,incase if remnant lines of same item are put
6198 --unpreportionate quantity.
6199 IF p_order_line_rec.model_remnant_flag = 'Y' THEN
6200 IF l_ind <> l_child_line_tbl.LAST THEN
6201 l_next_item_id := l_child_line_tbl(l_ind+1).inventory_item_id;
6202 ELSE
6203 l_next_item_id := -99;
6204 END IF;
6205 IF l_child_line_tbl(l_ind).inventory_item_id <> l_next_item_id THEN
6206 BEGIN
6207 select sum(ordered_quantity)
6208 into l_order_line_qty
6209 from oe_order_lines_all
6210 where link_to_line_id = l_child_line_tbl(l_ind).link_to_line_id
6211 and inventory_item_id = l_child_line_tbl(l_ind).inventory_item_id
6212 and model_remnant_flag = 'Y';
6213 EXCEPTION
6214 WHEN others THEN
6215 NULL;
6216 END;
6217 l_qty_ratio := l_order_line_qty / p_order_line_rec.ordered_quantity;
6218 ELSE
6219 l_qty_ratio := -99;
6220 debug('Remnant order line splitted across inproper qty,so qty_ratio calculated with adding ordered quantity');
6221 END IF;
6222 ELSE
6223 l_qty_ratio := l_child_line_tbl(l_ind).ordered_quantity/ p_order_line_rec.ordered_quantity;
6224 END IF;
6225 debug('l_qty_ratio : ' || l_qty_ratio);
6226
6227 debug(' child_item_type :'||l_child_line_tbl(l_ind).item_type_code);
6228
6229 -- check if instance exists
6230 l_inst_query_rec.inventory_item_id := l_child_line_tbl(l_ind).inventory_item_id;
6231 l_inst_query_rec.last_oe_order_line_id := l_child_line_tbl(l_ind).line_id;
6232 l_instance_found := FALSE;
6233
6234 debug('query criteria for get_item_instances:');
6235 debug(' item id : '||l_inst_query_rec.inventory_item_id);
6236 debug(' line id : '||l_inst_query_rec.last_oe_order_line_id);
6237
6238 csi_t_gen_utility_pvt.dump_api_info(
6239 p_api_name => 'get_item_instances',
6240 p_pkg_name => 'csi_item_instance_pub');
6241
6242 csi_item_instance_pub.get_item_instances(
6243 p_api_version => 1.0,
6244 p_commit => fnd_api.g_false,
6245 p_init_msg_list => fnd_api.g_true,
6246 p_validation_level => fnd_api.g_valid_level_full,
6247 p_instance_query_rec => l_inst_query_rec,
6248 p_party_query_rec => l_party_query_rec,
6249 p_account_query_rec => l_pty_acct_query_rec,
6250 p_transaction_id => null,
6251 p_resolve_id_columns => fnd_api.g_false,
6252 p_active_instance_only => fnd_api.g_true,
6253 x_instance_header_tbl => l_instance_hdr_tbl,
6254 x_return_status => l_return_status,
6255 x_msg_count => l_msg_count,
6256 x_msg_data => l_msg_data);
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 debug('instances found for the child order line COUNT : '||l_instance_hdr_tbl.COUNT);
6263 --fix for bug5096435
6264 IF l_instance_hdr_tbl.COUNT > 0 THEN
6265 debug('instances found for the child order line : '||l_instance_hdr_tbl.COUNT);
6266 l_instance_found := TRUE;
6267 ELSE
6268 debug('instances not found for the child order line');
6269 l_instance_found := FALSE;
6270 END IF;
6271 IF l_instance_found THEN
6272 IF nvl(p_order_line_rec.model_remnant_flag,'N') = 'Y' THEN
6273 FOR i IN l_instance_hdr_tbl.FIRST..l_instance_hdr_tbl.LAST
6274 LOOP
6275 l_temp_idx := l_temp_idx + 1;
6276 l_temp_instance_hdr_tbl(l_temp_idx) := l_instance_hdr_tbl(i);
6277 END LOOP;
6278 IF l_qty_ratio <> -99 THEN
6279 l_temp_idx := 0;
6280 END IF;
6281 ELSE
6282 l_temp_instance_hdr_tbl := l_instance_hdr_tbl;
6283 END IF;
6284 END IF;
6285 --Here we ensure that we go for building non-source rec only after accumulating
6286 --all the instances created among two/more remnant lines belonging to same inv item.
6287 IF nvl(p_order_line_rec.model_remnant_flag,'N') <> 'Y' OR
6288 (p_order_line_rec.model_remnant_flag = 'Y' AND l_qty_ratio <> -99) THEN
6289 IF l_temp_instance_hdr_tbl.COUNT > 0 THEN
6290
6291 make_non_header_tbl(
6292 p_instance_header_tbl => l_temp_instance_hdr_tbl, --end of fix for bug5096435
6293 x_instance_tbl => l_instance_tbl,
6294 x_return_status => l_return_status);
6295
6296 IF l_return_status <> fnd_api.g_ret_sts_success THEN
6297 RAISE fnd_api.g_exc_error;
6298 END IF;
6299
6300 l_temp_instance_hdr_tbl.DELETE;
6301 FOR t_ind IN l_tld_tbl.FIRST .. l_tld_tbl.LAST
6302 LOOP
6303 --fix for bug5096435
6304 IF l_instance_tbl.COUNT = 0 THEN
6305 EXIT;
6306 END IF;
6307
6308 mark_and_get_instances(
6309 p_qty_ratio => l_qty_ratio,
6310 px_instance_tbl => l_instance_tbl,
6311 px_csi_txn_rec => px_csi_txn_rec,
6312 x_instance_tbl => l_alloc_instance_tbl,
6313 x_return_status => l_return_status);
6314
6315 IF l_return_status <> fnd_api.g_ret_sts_success THEN
6316 RAISE fnd_api.g_exc_error;
6317 END IF;
6318
6319 FOR a_ind IN l_alloc_instance_tbl.FIRST .. l_alloc_instance_tbl.LAST
6320 LOOP
6321
6322 build_non_source_rec(
6323 p_transaction_line_id => p_txn_line_rec.transaction_line_id,
6324 p_instance_id => l_alloc_instance_tbl(a_ind).instance_id,
6325 px_default_info_rec => px_default_info_rec,
6326 x_txn_line_dtl_id => l_ns_tld_id,
6327 x_return_status => l_return_status);
6328
6329 IF l_return_status <> fnd_api.g_ret_sts_success THEN
6330 RAISE fnd_api.g_exc_error;
6331 END IF;
6332
6333 l_object_id := l_tld_tbl(t_ind).txn_line_detail_id;
6334 l_subject_id := l_ns_tld_id;
6335
6336 -- create ii_relationship
6337 l_t_iir_tbl.DELETE;
6338 -- build ii_rltns table
6339 l_t_iir_tbl(1).txn_relationship_id := fnd_api.g_miss_num;
6340 l_t_iir_tbl(1).transaction_line_id := p_txn_line_rec.transaction_line_id;
6341 l_t_iir_tbl(1).subject_id := l_subject_id;
6342 l_t_iir_tbl(1).object_id := l_object_id;
6343 l_t_iir_tbl(1).relationship_type_code := 'COMPONENT-OF';
6344 l_t_iir_tbl(1).active_start_date := sysdate;
6345 l_t_iir_tbl(1).subject_type := 'T';
6346 l_t_iir_tbl(1).object_type := 'T';
6347
6348 csi_t_txn_rltnshps_grp.create_txn_ii_rltns_dtls(
6349 p_api_version => 1.0,
6350 p_commit => fnd_api.g_false,
6351 p_init_msg_list => fnd_api.g_true,
6352 p_validation_level => fnd_api.g_valid_level_full,
6353 px_txn_ii_rltns_tbl => l_t_iir_tbl,
6354 x_return_status => l_return_status,
6355 x_msg_count => l_msg_count,
6356 x_msg_data => l_msg_data);
6357
6358 IF l_return_status <> fnd_api.g_ret_sts_success THEN
6359 RAISE fnd_api.g_exc_error;
6360 END IF;
6361
6362 END LOOP; --<<end of l_alloc_instance_tbl>>
6363
6364 END LOOP; --<<end of l_tld_tbl>>
6365 END IF; --<<end if l_temp_instance_hdr_tbl.COUNT > 0 >>
6366 END IF; --<<end if remnant condition >>
6367 END LOOP; --<<end of l_child_line_tbl>>
6368 END IF; --<<end if l_child_line_tbl.COUNT > 0>>
6369
6370 EXCEPTION
6371 WHEN fnd_api.g_exc_error THEN
6372 x_return_status := fnd_api.g_ret_sts_error;
6373 END build_child_relation;
6374
6375 /* the wip issued instances for the ato options using the configured item */
6376 /* to wip job link and converts them as customer products and build the */
6377 /* component of relationship with the parent (ato oc or the config item) */
6378
6379 PROCEDURE process_ato_option_nsrl(
6380 p_order_hdr_rec IN oe_order_headers_all%rowtype,
6381 p_order_line_rec IN oe_order_lines_all%rowtype,
6382 p_config_rec IN config_rec,
6383 p_tld_tbl IN csi_t_datastructures_grp.txn_line_detail_tbl,
6384 px_default_info_rec IN OUT nocopy default_info_rec,
6385 x_return_status OUT nocopy Varchar2)
6386 IS
6387
6388 l_csi_txn_rec csi_datastructures_pub.transaction_rec;
6389
6390 l_parent_line_rec oe_order_pub.line_rec_type;
6391 l_option_serial_code number;
6392
6393 l_wip_instances wip_instances;
6394 l_parent_instances parent_instances;
6395
6396 l_config_instances config_serial_inst_tbl;
6397
6398 l_qty_ratio number;
6399
6400 l_ii_rltns_tbl csi_datastructures_pub.ii_relationship_tbl;
6401 l_ind binary_integer;
6402 l_msg_count number;
6403 l_msg_data varchar2(2000);
6404 l_return_status varchar2(1);
6405
6406 BEGIN
6407
6408 x_return_status := fnd_api.g_ret_sts_success;
6409
6410 api_log('process_ato_option_nsrl');
6411
6412 --assign the values for the csi_txn_rec
6413 l_csi_txn_rec.source_line_ref_id := p_order_line_rec.line_id;
6414 l_csi_txn_rec.source_line_ref := p_order_line_rec.line_number||'.'||
6415 p_order_line_rec.shipment_number||'.'||
6416 p_order_line_rec.option_number;
6417 l_csi_txn_rec.source_header_ref_id := p_order_line_rec.header_id;
6418 l_csi_txn_rec.source_header_ref := p_order_hdr_rec.order_number;
6419 l_csi_txn_rec.transaction_type_id := 51;
6420 l_csi_txn_rec.transaction_date := sysdate;
6421 l_csi_txn_rec.source_transaction_date := nvl(p_order_line_rec.fulfillment_date, sysdate);
6422 l_csi_txn_rec.transaction_status_code := 'PENDING';
6423
6424 BEGIN
6425
6426 SELECT serial_number_control_code
6427 INTO l_option_serial_code
6428 FROM mtl_system_items
6429 WHERE inventory_item_id = p_order_line_rec.inventory_item_id
6430 AND organization_id = p_order_line_rec.ship_from_org_id;
6431
6432 END;
6433
6434 get_wip_instances(
6435 p_wip_entity_id => p_config_rec.config_wip_job_id,
6436 p_inventory_item_id => p_order_line_rec.inventory_item_id,
6437 p_organization_id => p_config_rec.ship_organization_id,
6438 p_option_serial_code => l_option_serial_code,
6439 p_config_rec => p_config_rec,
6440 px_csi_txn_rec => l_csi_txn_rec,
6441 x_wip_instances => l_wip_instances,
6442 x_return_status => l_return_status);
6443
6444 IF l_return_status <> fnd_api.g_ret_sts_success THEN
6445 RAISE fnd_api.g_exc_error;
6446 END IF;
6447
6448 /* get the ib_trackable parent for the option item line */
6449 csi_order_fulfill_pub.get_ib_trackable_parent(
6450 p_current_line_id => p_order_line_rec.line_id,
6451 p_om_vld_org_id => px_default_info_rec.om_vld_org_id,
6452 x_parent_line_rec => l_parent_line_rec,
6453 x_return_status => l_return_status);
6454
6455 IF x_return_status <> fnd_api.g_ret_sts_success THEN
6456 RAISE fnd_api.g_exc_error;
6457 END IF;
6458
6459 l_parent_instances.DELETE;
6460
6461 IF nvl(l_parent_line_rec.line_id, fnd_api.g_miss_num) <> fnd_api.g_miss_num THEN
6462
6463 l_qty_ratio := p_order_line_rec.ordered_quantity/l_parent_line_rec.ordered_quantity;
6464
6465 debug(' parent_child_ratio :'||l_qty_ratio);
6466
6467 -- if the trackable parent is the ato model then build the relation
6468 IF l_parent_line_rec.line_id = p_order_line_rec.ato_line_id THEN
6469 -- build relation between the config line and option items from wip
6470
6471 debug('parent is ATO Model, switching the parent to the config line.');
6472
6473 get_parent_instances(
6474 p_parent_line_id => p_config_rec.line_id,
6475 p_parent_item_id => p_config_rec.item_id,
6476 x_parent_instances => l_parent_instances,
6477 x_return_status => l_return_status);
6478
6479 ELSE
6480
6481 IF l_parent_line_rec.item_type_code = 'CLASS' THEN
6482
6483 -- build relation with the ATO option class
6484 -- from the fulfillment interface for the option class
6485 -- we need to tie the ato option class to the config and not to the model.
6486
6487 debug(' parent is ATO class.');
6488
6489 get_parent_instances(
6490 p_parent_line_id => l_parent_line_rec.line_id,
6491 p_parent_item_id => l_parent_line_rec.inventory_item_id,
6492 x_parent_instances => l_parent_instances,
6493 x_return_status => l_return_status);
6494
6495 END IF;
6496
6497 END IF;
6498
6499 debug(' parent_instances count : '||l_parent_instances.COUNT);
6500
6501 END IF;
6502
6503 get_wip_instances_for_line(
6504 p_option_line_rec => p_order_line_rec,
6505 p_parent_line_rec => l_parent_line_rec,
6506 p_option_serial_code => l_option_serial_code,
6507 p_class_option_ratio => l_qty_ratio,
6508 p_config_rec => p_config_rec,
6509 p_config_instances => l_config_instances,
6510 px_csi_txn_rec => l_csi_txn_rec,
6511 px_wip_instances => l_wip_instances,
6512 x_return_status => l_return_status);
6513
6514 IF l_return_status <> fnd_api.g_ret_sts_success THEN
6515 RAISE fnd_api.g_exc_error;
6516 END IF;
6517
6518 IF l_wip_instances.COUNT > 0 THEN
6519
6520 stamp_om_line_for_options(
6521 p_order_hdr_rec => p_order_hdr_rec,
6522 p_order_line_rec => p_order_line_rec,
6523 p_wip_instances => l_wip_instances,
6524 p_tld_tbl => p_tld_tbl,
6525 px_default_info_rec => px_default_info_rec,
6526 px_csi_txn_rec => l_csi_txn_rec,
6527 x_return_status => l_return_status);
6528
6529 IF l_return_status <> fnd_api.g_ret_sts_success THEN
6530 RAISE fnd_api.g_exc_error;
6531 END IF;
6532
6533 IF l_parent_instances.COUNT > 0 THEN
6534 distribute_wip_instances(
6535 p_qty_ratio => l_qty_ratio,
6536 p_option_serial_code => l_option_serial_code,
6537 p_parent_line_rec => l_parent_line_rec,
6538 p_parent_instances => l_parent_instances,
6539 p_wip_instances => l_wip_instances,
6540 px_default_info_rec => px_default_info_rec,
6541 x_ii_rltns_tbl => l_ii_rltns_tbl,
6542 x_return_status => l_return_status);
6543
6544 IF l_return_status <> fnd_api.g_ret_sts_success THEN
6545 RAISE fnd_api.g_exc_error;
6546 END IF;
6547 END IF;
6548
6549 END IF;
6550
6551 IF l_ii_rltns_tbl.count > 0 THEN
6552
6553 csi_t_gen_utility_pvt.dump_csi_ii_rltns_tbl(l_ii_rltns_tbl);
6554
6555 csi_t_gen_utility_pvt.dump_api_info(
6556 p_pkg_name => 'csi_ii_relationships_pub',
6557 p_api_name => 'create_relationship');
6558
6559 csi_ii_relationships_pub.create_relationship(
6560 p_api_version => 1.0,
6561 p_commit => fnd_api.g_false,
6562 p_init_msg_list => fnd_api.g_true,
6563 p_validation_level => fnd_api.g_valid_level_full,
6564 p_relationship_tbl => l_ii_rltns_tbl,
6565 p_txn_rec => l_csi_txn_rec,
6566 x_return_status => l_return_status,
6567 x_msg_count => l_msg_count,
6568 x_msg_data => l_msg_data);
6569
6570 IF l_return_status <> fnd_api.g_ret_sts_success THEN
6571 RAISE fnd_api.g_exc_error;
6572 END IF;
6573
6574 END IF;
6575
6576 debug('Order Fulfillment of ATO option item successful.');
6577
6578 EXCEPTION
6579 WHEN fnd_api.g_exc_error THEN
6580 x_return_status := fnd_api.g_ret_sts_error;
6581 WHEN others then
6582 fnd_message.set_name ('FND','FND_GENERIC_MESSAGE');
6583 fnd_message.set_token('MESSAGE', substr(sqlerrm, 1, 300));
6584 fnd_msg_pub.add;
6585 x_return_status := fnd_api.g_ret_sts_error;
6586 END process_ato_option_nsrl;
6587
6588 PROCEDURE mark_and_get_class_instance(
6589 p_option_serial_code IN number,
6590 p_config_instance_id IN number,
6591 p_class_item_id IN number,
6592 p_class_option_ratio IN number,
6593 px_class_instances IN OUT nocopy parent_instances,
6594 x_class_instance OUT nocopy parent_instance,
6595 x_return_status OUT nocopy varchar2)
6596 IS
6597 CURSOR class_inst_cur IS
6598 SELECT cii.instance_id,
6599 cir.relationship_id,
6600 cir.object_version_number
6601 FROM csi_item_instances cii,
6602 csi_ii_relationships cir
6603 WHERE cir.object_id = p_config_instance_id
6604 AND cir.relationship_type_code = 'COMPONENT-OF'
6605 AND cii.instance_id = cir.subject_id
6606 AND cii.inventory_item_id = p_class_item_id;
6607
6608 l_class_instance parent_instance;
6609 l_temp_ratio number;
6610 l_delete_flag varchar2(1);
6611
6612 PROCEDURE srl_get_and_delete(
6613 p_instance_id IN number,
6614 p_class_option_ratio IN number,
6615 px_class_instances IN OUT nocopy parent_instances,
6616 x_class_instance OUT nocopy parent_instance)
6617 IS
6618 l_ind binary_integer := 0;
6619 BEGIN
6620 IF px_class_instances.COUNT > 0 THEN
6621 l_ind := 0;
6622 LOOP
6623 l_ind := px_class_instances.NEXT(l_ind);
6624 EXIT WHEN l_ind is null;
6625 IF px_class_instances(l_ind).instance_id = p_instance_id THEN
6626 x_class_instance := px_class_instances(l_ind);
6627 px_class_instances(l_ind).alloc_count := px_class_instances(l_ind).alloc_count + 1;
6628 IF px_class_instances(l_ind).alloc_count = p_class_option_ratio THEN
6629 px_class_instances.DELETE(l_ind);
6630 END IF;
6631 EXIT;
6632 END IF;
6633 END LOOP;
6634 END IF;
6635 END srl_get_and_delete;
6636
6637 BEGIN
6638 x_return_status := fnd_api.g_ret_sts_success;
6639 api_log('mark_and_get_class_instance');
6640
6641 FOR class_inst_rec IN class_inst_cur
6642 LOOP
6643
6644 srl_get_and_delete (
6645 p_instance_id => class_inst_rec.instance_id,
6646 p_class_option_ratio => p_class_option_ratio,
6647 px_class_instances => px_class_instances,
6648 x_class_instance => l_class_instance);
6649
6650 IF l_class_instance.instance_id is not null THEN
6651 x_class_instance := l_class_instance;
6652 x_class_instance.relationship_id := class_inst_rec.relationship_id;
6653 x_class_instance.relationship_ovn := class_inst_rec.object_version_number;
6654
6655 debug(' class_instance_id : '||l_class_instance.instance_id);
6656 debug(' instance_quantity : '||l_class_instance.quantity);
6657
6658 EXIT;
6659 END IF;
6660
6661 END LOOP;
6662
6663 EXCEPTION
6664 WHEN fnd_api.g_exc_error THEN
6665 x_return_status := fnd_api.g_ret_sts_error;
6666 END mark_and_get_class_instance;
6667
6668 PROCEDURE get_config_parent(
6669 p_wip_instance IN wip_instance,
6670 p_config_rec IN config_rec,
6671 x_config_instance OUT nocopy config_serial_inst_rec,
6672 x_return_status OUT nocopy varchar2)
6673 IS
6674
6675 l_ii_rltns_qry_rec csi_datastructures_pub.relationship_query_rec;
6676 l_ii_rltns_tbl csi_datastructures_pub.ii_relationship_tbl;
6677 l_time_stamp date := null;
6678
6679 l_config_instance config_serial_inst_rec;
6680
6681 l_msg_count number := 0;
6682 l_msg_data varchar2(2000);
6683 l_return_status varchar2(1) := fnd_api.g_ret_sts_success;
6684
6685 CURSOR inst_cur(p_instance_id IN number) IS
6686 SELECT instance_id,
6687 serial_number,
6688 location_type_code
6689 FROM csi_item_instances
6690 WHERE instance_id = p_instance_id
6691 AND inventory_item_id = p_config_rec.item_id;
6692
6693 BEGIN
6694 x_return_status := fnd_api.g_ret_sts_success;
6695 api_log('get_config_parent');
6696
6697 l_ii_rltns_qry_rec.subject_id := p_wip_instance.instance_id;
6698 l_ii_rltns_qry_rec.relationship_type_code := 'COMPONENT-OF';
6699
6700 debug(' subject_id : '||l_ii_rltns_qry_rec.subject_id);
6701 debug(' relationship_type : '||l_ii_rltns_qry_rec.relationship_type_code);
6702
6703 csi_t_gen_utility_pvt.dump_api_info(
6704 p_pkg_name => 'csi_ii_relationships_pub',
6705 p_api_name => 'get_relationships');
6706
6707 csi_ii_relationships_pub.get_relationships(
6708 p_api_version => 1.0,
6709 p_commit => fnd_api.g_false,
6710 p_init_msg_list => fnd_api.g_true,
6711 p_validation_level => fnd_api.g_valid_level_full,
6712 p_relationship_query_rec => l_ii_rltns_qry_rec,
6713 p_depth => 1,
6714 p_time_stamp => l_time_stamp,
6715 p_active_relationship_only => fnd_api.g_true,
6716 x_relationship_tbl => l_ii_rltns_tbl,
6717 x_return_status => l_return_status,
6718 x_msg_count => l_msg_count,
6719 x_msg_data => l_msg_data);
6720
6721 IF l_return_status <> fnd_api.g_ret_sts_success THEN
6722 RAISE fnd_api.g_exc_error;
6723 END IF;
6724
6725 debug(' ii_rltns_tbl count : '||l_ii_rltns_tbl.COUNT);
6726
6727 IF l_ii_rltns_tbl.COUNT > 0 THEN
6728 FOR l_ind IN l_ii_rltns_tbl.FIRST .. l_ii_rltns_tbl.LAST
6729 LOOP
6730 FOR inst_rec IN inst_cur(l_ii_rltns_tbl(l_ind).object_id)
6731 LOOP
6732 l_config_instance.instance_id := inst_rec.instance_id;
6733 l_config_instance.serial_number := inst_rec.serial_number;
6734 l_config_instance.location_type_code := inst_rec.location_type_code;
6735 l_config_instance.relationship_id := l_ii_rltns_tbl(l_ind).relationship_id;
6736 l_config_instance.relationship_ovn := l_ii_rltns_tbl(l_ind).object_version_number;
6737 END LOOP;
6738 END LOOP;
6739 END IF;
6740
6741 debug('parent_config_rec >');
6742 debug(' instance_id : '||l_config_instance.instance_id);
6743 debug(' serial_number : '||l_config_instance.serial_number);
6744 debug(' location_type_code : '||l_config_instance.location_type_code);
6745 debug(' relationship_id : '||l_config_instance.relationship_id);
6746 debug(' relationship_ovn : '||l_config_instance.relationship_ovn);
6747
6748 x_config_instance := l_config_instance;
6749
6750 EXCEPTION
6751 WHEN fnd_api.g_exc_error THEN
6752 x_return_status := fnd_api.g_ret_sts_error;
6753 END get_config_parent;
6754
6755 /* This routine is invoked from the fulfillment of ATO options of serialized*/
6756 /* Identifies the wip issued instances that are tied in relation with the */
6757 /* serialized config and re-builds the relation with the OC if OC is IB */
6758 /* trackable. Assy Component Relations are build at the WIP completion event*/
6759 PROCEDURE process_ato_option_srl(
6760 p_order_hdr_rec IN oe_order_headers_all%rowtype,
6761 p_order_line_rec IN oe_order_lines_all%rowtype,
6762 p_config_rec IN config_rec,
6763 p_config_instances IN config_serial_inst_tbl,
6764 p_tld_tbl IN csi_t_datastructures_grp.txn_line_detail_tbl,
6765 px_default_info_rec IN OUT nocopy default_info_rec,
6766 x_return_status OUT nocopy varchar2)
6767 IS
6768
6769 l_csi_txn_rec csi_datastructures_pub.transaction_rec;
6770
6771 l_parent_line_rec oe_order_pub.line_rec_type;
6772 l_option_serial_code number;
6773
6774 l_wip_instances wip_instances;
6775 l_parent_instances parent_instances;
6776 l_class_instance parent_instance;
6777
6778 l_class_option_ratio number;
6779 l_config_class_ratio number;
6780
6781 l_config_parent config_serial_inst_rec;
6782
6783 l_exp_rltns_rec csi_datastructures_pub.ii_relationship_rec;
6784 l_instance_id_lst csi_datastructures_pub.id_tbl;
6785
6786 l_ii_rltns_tbl csi_datastructures_pub.ii_relationship_tbl;
6787 l_ii_ind binary_integer := 0;
6788
6789 l_msg_count number;
6790 l_msg_data varchar2(2000);
6791 l_return_status varchar2(1);
6792
6793 do_nothing exception;
6794
6795 BEGIN
6796
6797 x_return_status := fnd_api.g_ret_sts_success;
6798
6799 api_log('process_ato_option_srl');
6800
6801 --assign the values for the csi_txn_rec
6802 l_csi_txn_rec.source_line_ref_id := p_order_line_rec.line_id;
6803 l_csi_txn_rec.source_line_ref := p_order_line_rec.line_number||'.'||
6804 p_order_line_rec.shipment_number||'.'||
6805 p_order_line_rec.option_number;
6806 l_csi_txn_rec.source_header_ref_id := p_order_line_rec.header_id;
6807 l_csi_txn_rec.source_header_ref := p_order_hdr_rec.order_number;
6808 l_csi_txn_rec.transaction_type_id := 51;
6809 l_csi_txn_rec.transaction_date := sysdate;
6810 l_csi_txn_rec.source_transaction_date := nvl(p_order_line_rec.fulfillment_date, sysdate);
6811 l_csi_txn_rec.transaction_status_code := 'PENDING';
6812
6813 SELECT serial_number_control_code
6814 INTO l_option_serial_code
6815 FROM mtl_system_items
6816 WHERE inventory_item_id = p_order_line_rec.inventory_item_id
6817 AND organization_id = p_order_line_rec.ship_from_org_id;
6818
6819 get_wip_instances(
6820 p_wip_entity_id => p_config_rec.config_wip_job_id,
6821 p_inventory_item_id => p_order_line_rec.inventory_item_id,
6822 p_organization_id => p_config_rec.ship_organization_id,
6823 p_option_serial_code => l_option_serial_code,
6824 p_config_rec => p_config_rec,
6825 px_csi_txn_rec => l_csi_txn_rec,
6826 x_wip_instances => l_wip_instances,
6827 x_return_status => l_return_status);
6828
6829 IF l_return_status <> fnd_api.g_ret_sts_success THEN
6830 RAISE fnd_api.g_exc_error;
6831 END IF;
6832
6833 debug('wip_instances count :'||l_wip_instances.COUNT);
6834
6835 /* get the ib_trackable parent for the option item line */
6836 csi_order_fulfill_pub.get_ib_trackable_parent(
6837 p_current_line_id => p_order_line_rec.line_id,
6838 p_om_vld_org_id => px_default_info_rec.om_vld_org_id,
6839 x_parent_line_rec => l_parent_line_rec,
6840 x_return_status => l_return_status);
6841
6842 IF x_return_status <> fnd_api.g_ret_sts_success THEN
6843 RAISE fnd_api.g_exc_error;
6844 END IF;
6845
6846 l_parent_instances.DELETE;
6847
6848 IF nvl(l_parent_line_rec.line_id, fnd_api.g_miss_num) <> fnd_api.g_miss_num THEN
6849
6850 -- if the trackable parent is the ato model then do nothing
6851 IF l_parent_line_rec.line_id = p_order_line_rec.ato_line_id THEN
6852
6853 -- stamp order line on the option instances
6854 stamp_om_line_for_options(
6855 p_order_hdr_rec => p_order_hdr_rec,
6856 p_order_line_rec => p_order_line_rec,
6857 p_wip_instances => l_wip_instances,
6858 p_tld_tbl => p_tld_tbl,
6859 px_default_info_rec => px_default_info_rec,
6860 px_csi_txn_rec => l_csi_txn_rec,
6861 x_return_status => l_return_status);
6862
6863 IF l_return_status <> fnd_api.g_ret_sts_success THEN
6864 RAISE fnd_api.g_exc_error;
6865 END IF;
6866
6867 RAISE do_nothing;
6868 ELSE
6869
6870 IF l_parent_line_rec.item_type_code = 'CLASS' THEN
6871
6872 debug(' parent is ato class');
6873 l_class_option_ratio := p_order_line_rec.ordered_quantity/l_parent_line_rec.ordered_quantity;
6874 debug(' class_option_ratio : '||l_class_option_ratio);
6875
6876 l_config_class_ratio := l_parent_line_rec.ordered_quantity/
6877 p_config_rec.order_quantity;
6878 debug(' config_class_ratio : '||l_config_class_ratio);
6879
6880 -- build relation with the ATO option class
6881 -- from the fulfillment interface for the option class
6882 -- we need to tie the ato option class to the config and not to the model.
6883
6884 get_parent_instances(
6885 p_parent_line_id => l_parent_line_rec.line_id,
6886 p_parent_item_id => l_parent_line_rec.inventory_item_id,
6887 x_parent_instances => l_parent_instances,
6888 x_return_status => l_return_status);
6889
6890 END IF;
6891
6892 END IF;
6893
6894 debug(' parent_instances count : '||l_parent_instances.COUNT);
6895
6896 END IF;
6897
6898 get_wip_instances_for_line(
6899 p_option_line_rec => p_order_line_rec,
6900 p_parent_line_rec => l_parent_line_rec,
6901 p_option_serial_code => l_option_serial_code,
6902 p_class_option_ratio => l_class_option_ratio,
6903 p_config_rec => p_config_rec,
6904 p_config_instances => p_config_instances,
6905 px_csi_txn_rec => l_csi_txn_rec,
6906 px_wip_instances => l_wip_instances,
6907 x_return_status => l_return_status);
6908
6909 IF l_return_status <> fnd_api.g_ret_sts_success THEN
6910 RAISE fnd_api.g_exc_error;
6911 END IF;
6912
6913 IF l_wip_instances.COUNT > 0 THEN
6914 stamp_om_line_for_options(
6915 p_order_hdr_rec => p_order_hdr_rec,
6916 p_order_line_rec => p_order_line_rec,
6917 p_wip_instances => l_wip_instances,
6918 p_tld_tbl => p_tld_tbl,
6919 px_default_info_rec => px_default_info_rec,
6920 px_csi_txn_rec => l_csi_txn_rec,
6921 x_return_status => l_return_status);
6922
6923 IF l_return_status <> fnd_api.g_ret_sts_success THEN
6924 RAISE fnd_api.g_exc_error;
6925 END IF;
6926 END IF;
6927
6928 IF l_parent_instances.COUNT > 0 THEN
6929 IF l_wip_instances.COUNT > 0 THEN
6930
6931 IF l_option_serial_code in (2, 5, 6) THEN
6932
6933 FOR l_w_ind IN l_wip_instances.FIRST .. l_wip_instances.LAST
6934 LOOP
6935
6936 get_config_parent(
6937 p_wip_instance => l_wip_instances(l_w_ind),
6938 p_config_rec => p_config_rec,
6939 x_config_instance => l_config_parent,
6940 x_return_status => l_return_status);
6941
6942 IF l_return_status <> fnd_api.g_ret_sts_success THEN
6943 RAISE fnd_api.g_exc_error;
6944 END IF;
6945
6946 mark_and_get_class_instance(
6947 p_option_serial_code => l_option_serial_code,
6948 p_config_instance_id => l_config_parent.instance_id,
6949 p_class_item_id => l_parent_line_rec.inventory_item_id,
6950 p_class_option_ratio => l_class_option_ratio,
6951 px_class_instances => l_parent_instances,
6952 x_class_instance => l_class_instance,
6953 x_return_status => l_return_status);
6954
6955 IF l_return_status <> fnd_api.g_ret_sts_success THEN
6956 RAISE fnd_api.g_exc_error;
6957 END IF;
6958
6959 IF l_class_instance.instance_id is not null THEN
6960 l_ii_ind := l_ii_ind + 1;
6961 l_ii_rltns_tbl(l_ii_ind).relationship_id := fnd_api.g_miss_num;
6962 l_ii_rltns_tbl(l_ii_ind).relationship_type_code := 'COMPONENT-OF';
6963 l_ii_rltns_tbl(l_ii_ind).object_id := l_class_instance.instance_id;
6964 l_ii_rltns_tbl(l_ii_ind).subject_id := l_wip_instances(l_w_ind).instance_id;
6965 l_ii_rltns_tbl(l_ii_ind).cascade_ownership_flag :=
6966 px_default_info_rec.cascade_owner_flag;
6967 END IF;
6968
6969 IF l_return_status <> fnd_api.g_ret_sts_success THEN
6970 RAISE fnd_api.g_exc_error;
6971 END IF;
6972
6973 IF l_config_parent.relationship_id is not null THEN
6974
6975 break_relation(
6976 p_relationship_id => l_config_parent.relationship_id,
6977 p_relationship_ovn => l_config_parent.relationship_ovn,
6978 px_csi_txn_rec => l_csi_txn_rec,
6979 x_return_status => l_return_status);
6980
6981 IF l_return_status <> fnd_api.g_ret_sts_success THEN
6982 RAISE fnd_api.g_exc_error;
6983 END IF;
6984 END IF;
6985
6986 END LOOP;
6987
6988 ELSE
6989
6990 FOR l_w_ind IN l_wip_instances.FIRST .. l_wip_instances.LAST
6991 LOOP
6992
6993 get_config_parent(
6994 p_wip_instance => l_wip_instances(l_w_ind),
6995 p_config_rec => p_config_rec,
6996 x_config_instance => l_config_parent,
6997 x_return_status => l_return_status);
6998
6999 IF l_return_status <> fnd_api.g_ret_sts_success THEN
7000 RAISE fnd_api.g_exc_error;
7001 END IF;
7002
7003 mark_and_get_class_instance(
7004 p_option_serial_code => l_option_serial_code,
7005 p_config_instance_id => l_config_parent.instance_id,
7006 p_class_item_id => l_parent_line_rec.inventory_item_id,
7007 p_class_option_ratio => 1,
7008 px_class_instances => l_parent_instances,
7009 x_class_instance => l_class_instance,
7010 x_return_status => l_return_status);
7011
7012 IF l_return_status <> fnd_api.g_ret_sts_success THEN
7013 RAISE fnd_api.g_exc_error;
7014 END IF;
7015
7016 IF l_class_instance.instance_id is not null THEN
7017 l_ii_ind := l_ii_ind + 1;
7018 l_ii_rltns_tbl(l_ii_ind).relationship_id := fnd_api.g_miss_num;
7019 l_ii_rltns_tbl(l_ii_ind).relationship_type_code := 'COMPONENT-OF';
7020 l_ii_rltns_tbl(l_ii_ind).object_id := l_class_instance.instance_id;
7021 l_ii_rltns_tbl(l_ii_ind).subject_id := l_wip_instances(l_w_ind).instance_id;
7022 l_ii_rltns_tbl(l_ii_ind).cascade_ownership_flag := px_default_info_rec.cascade_owner_flag;
7023 END IF;
7024
7025 IF l_config_parent.relationship_id is not null THEN
7026
7027 break_relation(
7028 p_relationship_id => l_config_parent.relationship_id,
7029 p_relationship_ovn => l_config_parent.relationship_ovn,
7030 px_csi_txn_rec => l_csi_txn_rec,
7031 x_return_status => l_return_status);
7032
7033 IF l_return_status <> fnd_api.g_ret_sts_success THEN
7034 RAISE fnd_api.g_exc_error;
7035 END IF;
7036 END IF;
7037
7038 END LOOP;
7039 END IF;
7040
7041 END IF;
7042 END IF;
7043
7044 IF l_ii_rltns_tbl.count > 0 THEN
7045
7046 csi_t_gen_utility_pvt.dump_csi_ii_rltns_tbl(l_ii_rltns_tbl);
7047
7048 csi_t_gen_utility_pvt.dump_api_info(
7049 p_pkg_name => 'csi_ii_relationships_pub',
7050 p_api_name => 'create_relationship');
7051
7052 csi_ii_relationships_pub.create_relationship(
7053 p_api_version => 1.0,
7054 p_commit => fnd_api.g_false,
7055 p_init_msg_list => fnd_api.g_true,
7056 p_validation_level => fnd_api.g_valid_level_full,
7057 p_relationship_tbl => l_ii_rltns_tbl,
7058 p_txn_rec => l_csi_txn_rec,
7059 x_return_status => l_return_status,
7060 x_msg_count => l_msg_count,
7061 x_msg_data => l_msg_data);
7062
7063 IF l_return_status <> fnd_api.g_ret_sts_success THEN
7064 RAISE fnd_api.g_exc_error;
7065 END IF;
7066
7067 END IF;
7068
7069 debug('Order Fulfillment of ATO option item successful.');
7070
7071 EXCEPTION
7072 WHEN do_nothing THEN
7073 x_return_status := fnd_api.g_ret_sts_success;
7074 WHEN fnd_api.g_exc_error THEN
7075 x_return_status := fnd_api.g_ret_sts_error;
7076 WHEN others then
7077 fnd_message.set_name ('FND','FND_GENERIC_MESSAGE');
7078 fnd_message.set_token('MESSAGE', substr(sqlerrm, 1, 300));
7079 fnd_msg_pub.add;
7080 x_return_status := fnd_api.g_ret_sts_error;
7081 END process_ato_option_srl;
7082
7083 -- for ato options that are processed from wip
7084 PROCEDURE process_ato_option_from_wip(
7085 p_order_header_rec IN oe_order_headers_all%rowtype,
7086 p_order_line_rec IN oe_order_lines_all%rowtype,
7087 p_config_rec IN config_rec,
7088 p_config_instances IN config_serial_inst_tbl,
7089 px_default_info_rec IN OUT nocopy default_info_rec,
7090 x_wip_processing OUT NOCOPY boolean,
7091 x_return_status OUT NOCOPY varchar2)
7092 IS
7093
7094 l_return_status varchar2(1) := fnd_api.g_ret_sts_success;
7095 l_wip_processing boolean := TRUE;
7096 l_src_tld_tbl csi_t_datastructures_grp.txn_line_detail_tbl;
7097 l_transaction_line_id number;
7098 l_mdl_ordered_qty number;
7099 l_model_hierarchy varchar2(100);
7100 l_qty_ratio number; --declared for bug5096435
7101
7102 BEGIN
7103
7104 x_return_status := fnd_api.g_ret_sts_success;
7105 api_log('process_ato_option_from_wip');
7106
7107 l_wip_processing := TRUE;
7108
7109 -- check wip requirement and see if this option is set as a phantom item in BOM.
7110 -- if yes then just allow the fulfillment
7111
7112 IF p_config_rec.sub_model_flag = 'Y'
7113 AND
7114 p_config_rec.sub_model_wip_supply_type <> 6 -- non phantom
7115 AND
7116 p_config_rec.sub_config_wip_job_id is not null
7117 THEN
7118 check_wip_requirements(
7119 p_wip_entity_id => p_config_rec.sub_config_wip_job_id,
7120 p_option_item_id => p_order_line_rec.inventory_item_id,
7121 x_wip_processing => l_wip_processing);
7122 ELSE
7123 check_wip_requirements(
7124 p_wip_entity_id => p_config_rec.config_wip_job_id,
7125 p_option_item_id => p_order_line_rec.inventory_item_id,
7126 x_wip_processing => l_wip_processing);
7127 END IF;
7128
7129 x_wip_processing := l_wip_processing;
7130
7131 IF l_wip_processing THEN
7132
7133 BEGIN
7134 SELECT transaction_line_id
7135 INTO l_transaction_line_id
7136 FROM csi_t_transaction_lines
7137 WHERE source_transaction_table = 'OE_ORDER_LINES_ALL'
7138 AND source_transaction_id = p_order_line_rec.line_id;
7139 EXCEPTION
7140 WHEN no_data_found THEN
7141 BEGIN
7142 SELECT transaction_line_id
7143 INTO l_transaction_line_id
7144 FROM csi_t_transaction_lines
7145 WHERE source_transaction_table = 'OE_ORDER_LINES_ALL'
7146 AND source_transaction_id = p_order_line_rec.top_model_line_id;
7147
7148 SELECT ordered_quantity
7149 INTO l_mdl_ordered_qty
7150 FROM oe_order_lines_all
7151 WHERE line_id = p_order_line_rec.top_model_line_id;
7152
7153 --Fix for bug5096435
7154 SELECT sum(ordered_quantity)/l_mdl_ordered_qty
7155 INTO l_qty_ratio
7156 FROM oe_order_lines_all
7157 WHERE link_to_line_id = p_order_line_rec.link_to_line_id
7158 AND inventory_item_id = p_order_line_rec.inventory_item_id;
7159
7160 SELECT to_char(p_order_line_rec.top_model_line_id)||':'||
7161 to_char(p_order_line_rec.line_id)||':'||
7162 to_char(p_order_line_rec.inventory_item_id)||':'||
7163 decode(nvl(p_order_line_rec.item_revision, '###'), '###',
7164 null, p_order_line_rec.item_revision||':')||
7165 to_char(l_qty_ratio)||':'||
7166 p_order_line_rec.order_quantity_uom ||':'||
7167 p_order_line_rec.ordered_quantity --added for bug5096435
7168 INTO l_model_hierarchy
7169 FROM sys.dual;
7170
7171 debug(' model hierarchy string: '||l_model_hierarchy);
7172
7173 csi_t_utilities_pvt.cascade_child(
7174 p_data_string => l_model_hierarchy,
7175 x_return_status => l_return_status );
7176
7177 IF l_return_status <> fnd_api.g_ret_sts_success THEN
7178 RAISE fnd_api.g_exc_error;
7179 END IF;
7180 EXCEPTION
7181 WHEN no_data_found THEN
7182 l_transaction_line_id := null;
7183 END;
7184 END;
7185
7186 IF l_transaction_line_id is not null THEN
7187 get_tld(
7188 p_source_table => 'OE_ORDER_LINES_ALL',
7189 p_source_id => p_order_line_rec.line_id,
7190 p_source_flag => 'Y',
7191 p_processing_status => 'UNPROCESSED',
7192 x_line_dtl_tbl => l_src_tld_tbl,
7193 x_return_status => l_return_status);
7194
7195 IF l_return_status <> fnd_api.g_ret_sts_success THEN
7196 RAISE fnd_api.g_exc_error;
7197 END IF;
7198 END IF;
7199
7200 IF p_config_rec.serial_code in (1, 6) THEN
7201
7202 process_ato_option_nsrl(
7203 p_order_hdr_rec => p_order_header_rec,
7204 p_order_line_rec => p_order_line_rec,
7205 p_config_rec => p_config_rec,
7206 p_tld_tbl => l_src_tld_tbl,
7207 px_default_info_rec => px_default_info_rec,
7208 x_return_status => l_return_status);
7209
7210 IF l_return_status <> fnd_api.g_ret_sts_success THEN
7211 RAISE fnd_api.g_exc_error;
7212 END IF;
7213
7214 ELSIF p_config_rec.serial_code IN (2,5) THEN
7215
7216 process_ato_option_srl(
7217 p_order_hdr_rec => p_order_header_rec,
7218 p_order_line_rec => p_order_line_rec,
7219 p_config_rec => p_config_rec,
7220 p_config_instances => p_config_instances,
7221 p_tld_tbl => l_src_tld_tbl,
7222 px_default_info_rec => px_default_info_rec,
7223 x_return_status => l_return_status);
7224
7225 IF l_return_status <> fnd_api.g_ret_sts_success THEN
7226 RAISE fnd_api.g_exc_error;
7227 END IF;
7228
7229 END IF;
7230 END IF;
7231
7232 EXCEPTION
7233 WHEN fnd_api.g_exc_error THEN
7234 x_return_status := fnd_api.g_ret_sts_error;
7235 END process_ato_option_from_wip;
7236
7237 PROCEDURE get_source_tlds(
7238 p_tld_tbl IN csi_t_datastructures_grp.txn_line_detail_tbl,
7239 x_src_tld_tbl OUT NOCOPY csi_t_datastructures_grp.txn_line_detail_tbl,
7240 x_src_tld_total_qty OUT NOCOPY number)
7241 IS
7242 l_src_tld_tbl csi_t_datastructures_grp.txn_line_detail_tbl;
7243 l_src_ind binary_integer := 0;
7244 l_src_tld_total_qty number := 0;
7245 BEGIN
7246 IF p_tld_tbl.COUNT > 0 THEN
7247 FOR l_ind IN p_tld_tbl.FIRST .. p_tld_tbl.LAST
7248 LOOP
7249 IF p_tld_tbl(l_ind).source_transaction_flag = 'Y' THEN
7250 l_src_ind := l_src_ind + 1;
7251 l_src_tld_tbl(l_src_ind) := p_tld_tbl(l_ind);
7252 l_src_tld_total_qty := l_src_tld_total_qty + p_tld_tbl(l_ind).quantity;
7253 END IF;
7254 END LOOP;
7255 END IF;
7256 x_src_tld_tbl := l_src_tld_tbl;
7257 x_src_tld_total_qty := l_src_tld_total_qty;
7258 END get_source_tlds;
7259
7260 -- bug 4966316 - item instance ownership conversion...
7261
7262 PROCEDURE demo_fulfillment(
7263 p_txn_type_id IN number,
7264 p_order_line_rec IN oe_order_lines_all%rowtype,
7265 p_line_dtl_tbl IN csi_t_datastructures_grp.txn_line_detail_tbl,
7266 px_csi_txn_rec IN OUT nocopy csi_datastructures_pub.transaction_rec,
7267 x_return_status OUT nocopy varchar2)
7268 IS
7269
7270 l_csi_txn_rec csi_datastructures_pub.transaction_rec;
7271
7272 l_txn_line_query_rec csi_t_datastructures_grp.txn_line_query_rec;
7273 l_txn_line_detail_query_rec csi_t_datastructures_grp.txn_line_detail_query_rec;
7274
7275 l_line_dtl_tbl csi_t_datastructures_grp.txn_line_detail_tbl;
7276 l_pty_dtl_tbl csi_t_datastructures_grp.txn_party_detail_tbl;
7277 l_pty_acct_tbl csi_t_datastructures_grp.txn_pty_acct_detail_tbl;
7278 l_ii_rltns_tbl csi_t_datastructures_grp.txn_ii_rltns_tbl;
7279 l_org_assgn_tbl csi_t_datastructures_grp.txn_org_assgn_tbl;
7280 l_txn_ext_attrib_tbl csi_t_datastructures_grp.txn_ext_attrib_vals_tbl;
7281 l_txn_systems_tbl csi_t_datastructures_grp.txn_systems_tbl;
7282 l_csi_ea_tbl csi_t_datastructures_grp.csi_ext_attribs_tbl;
7283 l_csi_eav_tbl csi_t_datastructures_grp.csi_ext_attrib_vals_tbl;
7284
7285 l_instance_rec csi_datastructures_pub.instance_header_rec;
7286 l_party_header_tbl csi_datastructures_pub.party_header_tbl;
7287 l_account_header_tbl csi_datastructures_pub.party_account_header_tbl;
7288 l_org_assignments_tbl csi_datastructures_pub.org_units_header_tbl;
7289 l_pricing_attrib_tbl csi_datastructures_pub.pricing_attribs_tbl;
7290 l_ext_attrib_tbl csi_datastructures_pub.extend_attrib_values_tbl;
7291 l_ext_attrib_def_tbl csi_datastructures_pub.extend_attrib_tbl;
7292 l_asset_assignment_tbl csi_datastructures_pub.instance_asset_header_tbl;
7293
7294 l_u_txn_line_rec csi_t_datastructures_grp.txn_line_rec;
7295 l_u_line_dtl_tbl csi_t_datastructures_grp.txn_line_detail_tbl;
7296 l_u_pty_dtl_tbl csi_t_datastructures_grp.txn_party_detail_tbl;
7297 l_u_pty_acct_tbl csi_t_datastructures_grp.txn_pty_acct_detail_tbl;
7298 l_u_ii_rltns_tbl csi_t_datastructures_grp.txn_ii_rltns_tbl;
7299 l_u_org_assgn_tbl csi_t_datastructures_grp.txn_org_assgn_tbl;
7300 l_u_eav_tbl csi_t_datastructures_grp.txn_ext_attrib_vals_tbl;
7301
7302 l_time_stamp date;
7303
7304 l_td_owner_id number;
7305 l_td_owner_type csi_i_parties.party_source_table%TYPE;
7306 l_inst_owner_id number;
7307 l_inst_owner_type csi_i_parties.party_source_table%TYPE;
7308 l_internal_party_id number;
7309 l_ownership_override varchar2(1) := 'N';
7310 l_return_status varchar2(1) := fnd_api.g_ret_sts_success;
7311 l_msg_data varchar2(2000);
7312 l_msg_count number;
7313 l_inst_loc_id number;
7314 l_inst_loc_type csi_item_instances.location_type_code%TYPE;
7315 l_split_new_inst_rec csi_datastructures_pub.instance_rec;
7316 l_split_src_inst_rec csi_datastructures_pub.instance_rec;
7317 l_quantity1 NUMBER;
7318 l_vld_orgn_id number;
7319
7320 BEGIN
7321
7322 csi_t_gen_utility_pvt.dump_api_info(
7323 p_api_name => 'demo_fulfillment',
7324 p_pkg_name => 'csi_order_fulfill_pub');
7325
7326 l_internal_party_id := csi_datastructures_pub.g_install_param_rec.internal_party_id;
7327 l_ownership_override := csi_datastructures_pub.g_install_param_rec.ownership_override_at_txn;
7328
7329 -- create csi_transaction
7330 create_csi_transaction(
7331 px_csi_txn_rec => px_csi_txn_rec,
7332 x_return_status => l_return_status);
7333
7334 IF l_return_status <> fnd_api.g_ret_sts_success THEN
7335 RAISE fnd_api.g_exc_error;
7336 END IF;
7337
7338 IF p_line_dtl_tbl.COUNT > 0 THEN
7339 FOR l_td_ind IN p_line_dtl_tbl.FIRST ..p_line_dtl_tbl.LAST
7340 LOOP
7341 IF nvl(p_line_dtl_tbl(l_td_ind).instance_id, fnd_api.g_miss_num)
7342 <> fnd_api.g_miss_num
7343 THEN
7344
7345 l_txn_line_detail_query_rec.txn_line_detail_id :=
7346 p_line_dtl_tbl(l_td_ind).txn_line_detail_id;
7347
7348 csi_t_txn_details_grp.get_transaction_details(
7349 p_api_version => 1,
7350 p_commit => fnd_api.g_false,
7351 p_init_msg_list => fnd_api.g_true,
7352 p_validation_level => fnd_api.g_valid_level_full,
7353 p_txn_line_query_rec => l_txn_line_query_rec,
7354 p_txn_line_detail_query_rec => l_txn_line_detail_query_rec,
7355 x_txn_line_detail_tbl => l_line_dtl_tbl,
7356 p_get_parties_flag => fnd_api.g_true,
7357 x_txn_party_detail_tbl => l_pty_dtl_tbl,
7358 p_get_pty_accts_flag => fnd_api.g_true,
7359 x_txn_pty_acct_detail_tbl => l_pty_acct_tbl,
7360 p_get_ii_rltns_flag => fnd_api.g_false,
7361 x_txn_ii_rltns_tbl => l_ii_rltns_tbl,
7362 p_get_org_assgns_flag => fnd_api.g_false,
7363 x_txn_org_assgn_tbl => l_org_assgn_tbl,
7364 p_get_ext_attrib_vals_flag => fnd_api.g_false,
7365 x_txn_ext_attrib_vals_tbl => l_txn_ext_attrib_tbl,
7366 p_get_csi_attribs_flag => fnd_api.g_false,
7367 x_csi_ext_attribs_tbl => l_csi_ea_tbl,
7368 p_get_csi_iea_values_flag => fnd_api.g_false,
7369 x_csi_iea_values_tbl => l_csi_eav_tbl,
7370 p_get_txn_systems_flag => fnd_api.g_false,
7371 x_txn_systems_tbl => l_txn_systems_tbl,
7372 x_return_status => l_return_status,
7373 x_msg_count => l_msg_count,
7374 x_msg_data => l_msg_data);
7375
7376 IF l_return_status <> fnd_api.g_ret_sts_success THEN
7377 debug('Get transaction details failed for RMA Fulfillment.');
7378 RAISE fnd_api.g_exc_error;
7379 END IF;
7380
7381 IF l_pty_dtl_tbl.COUNT > 0 THEN
7382 FOR l_ind IN l_pty_dtl_tbl.FIRST..l_pty_dtl_tbl.LAST
7383 LOOP
7384 IF l_pty_dtl_tbl(l_ind).relationship_type_code = 'OWNER' THEN
7385 l_td_owner_id := l_pty_dtl_tbl(l_ind).party_source_id;
7386 l_td_owner_type := l_pty_dtl_tbl(l_ind).party_source_table;
7387 exit;
7388 END IF;
7389 END LOOP;
7390 ELSE
7391 debug('Party not found. Txn Line Dtl ID:'||p_line_dtl_tbl(l_td_ind).txn_line_detail_id);
7392 l_td_owner_id := null;
7393 l_td_owner_type := null;
7394 --RAISE fnd_api.g_exc_error;
7395 END IF;
7396
7397 l_instance_rec.instance_id := l_line_dtl_tbl(1).instance_id;
7398
7399 csi_item_instance_pub.get_item_instance_details(
7400 p_api_version => 1.0,
7401 p_commit => fnd_api.g_false,
7402 p_init_msg_list => fnd_api.g_true,
7403 p_validation_level => fnd_api.g_valid_level_full,
7404 p_instance_rec => l_instance_rec,
7405 p_get_parties => fnd_api.g_true,
7406 p_party_header_tbl => l_party_header_tbl,
7407 p_get_accounts => fnd_api.g_true,
7408 p_account_header_tbl => l_account_header_tbl,
7409 p_get_org_assignments => fnd_api.g_false,
7410 p_org_header_tbl => l_org_assignments_tbl,
7411 p_get_pricing_attribs => fnd_api.g_false,
7412 p_pricing_attrib_tbl => l_pricing_attrib_tbl,
7413 p_get_ext_attribs => fnd_api.g_false,
7414 p_ext_attrib_tbl => l_ext_attrib_tbl,
7415 p_ext_attrib_def_tbl => l_ext_attrib_def_tbl,
7416 p_get_asset_assignments => fnd_api.g_false,
7417 p_asset_header_tbl => l_asset_assignment_tbl,
7418 p_time_stamp => l_time_stamp,
7419 x_return_status => l_return_status,
7420 x_msg_count => l_msg_count,
7421 x_msg_data => l_msg_data);
7422
7423 IF l_return_status <> fnd_api.g_ret_sts_success THEN
7424 debug('Get item instance details failed for RMA Fulfillment.');
7425 RAISE fnd_api.g_exc_error;
7426 END IF;
7427
7428 l_inst_loc_type := l_instance_rec.location_type_code;
7429 l_inst_loc_id := l_instance_rec.location_id;
7430
7431 IF nvl(l_line_dtl_tbl(1).inv_organization_id, fnd_api.g_miss_num)
7432 <> fnd_api.g_miss_num
7433 AND l_instance_rec.vld_organization_id <> l_line_dtl_tbl(1).inv_organization_id
7434 THEN
7435 l_vld_orgn_id := l_line_dtl_tbl(1).inv_organization_id; -- FP fix for bug 5072107
7436 IF l_instance_rec.inv_master_organization_id = l_line_dtl_tbl(1).inv_organization_id
7437 THEN
7438 -- this assignment is done so that conversion txns need not have the same
7439 -- shipped orgn context and ok as long as the master is the same
7440 -- addtl. check since the TLD rec will have the OM Master / Vldn Orgn
7441 -- as the inv_organization_id on it for Fulfillments.
7442 l_vld_orgn_id := l_instance_rec.vld_organization_id;
7443 ELSE
7444 fnd_message.set_name('CSI','CSI_INVALID_VLD_MAST_COMB');
7445 fnd_msg_pub.add;
7446 RAISE fnd_api.g_exc_error;
7447 END IF;
7448 END IF;
7449
7450 /* loop thru the party table to figure out the Instance Owner */
7451 IF l_party_header_tbl.COUNT > 0 THEN
7452 FOR l_ind IN l_party_header_tbl.FIRST..l_party_header_tbl.LAST
7453 LOOP
7454 IF l_party_header_tbl(l_ind).relationship_type_code = 'OWNER' THEN
7455 l_inst_owner_id := l_party_header_tbl(l_ind).party_id;
7456 l_inst_owner_type := l_party_header_tbl(l_ind).party_source_table;
7457 exit;
7458 END IF;
7459 END LOOP;
7460 ELSE
7461 debug('Party not found. Instance:'||l_instance_rec.instance_id);
7462 RAISE fnd_api.g_exc_error;
7463 END IF;
7464
7465 debug('Instance ID : '||l_instance_rec.instance_id);
7466 debug('Instance owner party type : '||l_inst_owner_type);
7467 debug('Instance owner party : '||l_inst_owner_id);
7468 debug('Txn detail owner party type: '||l_td_owner_type);
7469 debug('Txn detail owner party : '||l_td_owner_id);
7470 debug('Internal party : '||l_internal_party_id);
7471 debug('Instance Curr Location type: '||l_inst_loc_type);
7472 debug('Instance Curr Location ID : '||l_inst_loc_id);
7473 debug('Instance Vldn Organization : '||l_instance_rec.vld_organization_id);
7474 debug('OM Vldn Organization : '||l_line_dtl_tbl(1).inv_organization_id);
7475
7476 -- Validations:
7477 -- Current Location has to be External
7478 -- Conversion/Ownership Qty has to be EQ / LT the orig shipped qty
7479 -- If Party doesn't match orig party then install param authorization requd
7480 IF l_inst_owner_id = l_internal_party_id
7481 AND l_inst_owner_type = 'HZ_PARTIES' THEN
7482 -- check if TLD says expire? If yes, Invalid
7483 IF nvl(l_line_dtl_tbl(1).active_end_date, fnd_api.g_miss_date)
7484 <> fnd_api.g_miss_date THEN
7485 debug('Active End date :'||l_line_dtl_tbl(1).active_end_date
7486 || 'provided on transaction line detail: '
7487 || l_line_dtl_tbl(1).txn_line_detail_id);
7488 fnd_message.set_name('CSI','CSI_TXN_INVALID_INST_REF');
7489 fnd_message.set_token('INSTANCE_ID',l_instance_rec.instance_id);
7490 fnd_msg_pub.add;
7491 RAISE fnd_api.g_exc_error;
7492 ELSIF l_inst_loc_type
7493 NOT IN ( 'INVENTORY','HZ_PARTY_SITES', 'HZ_LOCATIONS', 'VENDOR_SITE', 'INTERNAL_SITE')
7494 THEN
7495 debug('Location type code is :'||l_inst_loc_type);
7496 fnd_message.set_name('CSI', 'CSI_TXN_SRC_LOC_INVALID');
7497 fnd_message.set_token('LOC_CODE', l_inst_loc_type);
7498 fnd_message.set_token('SRC_NAME', 'Conversion to a Customer Ownership ');
7499 fnd_msg_pub.add;
7500 RAISE fnd_api.g_exc_error;
7501 -- allow only externally located
7502 END IF;
7503 END IF;
7504
7505 IF l_td_owner_type is not null THEN
7506 IF l_inst_owner_type <> l_td_owner_type THEN
7507 -- let's trap as an error currently so that it prevents
7508 -- ownership changes from HZ_PARTY TO PO_VENDOR or etc etc
7509 debug('Owner Change.');
7510 fnd_message.set_name('CSI', 'CSI_API_INVALID_PARTY_SOURCE');
7511 fnd_message.set_token('PARTY_SOURCE_TABLE', l_td_owner_type);
7512 fnd_msg_pub.add;
7513 RAISE fnd_api.g_exc_error;
7514 ELSIF l_td_owner_id <> l_inst_owner_id THEN
7515 IF l_ownership_override = 'Y' THEN
7516 debug('Ownership Change and is allowed.');
7517 ELSE
7518 debug('Ownership Change but is not setup:'||l_ownership_override);
7519 fnd_message.set_name('CSI', 'CSI_SHIP_OWNER_MISMATCH');
7520 fnd_message.set_token('OLD_PARTY_ID',l_inst_owner_id);
7521 fnd_message.set_token('NEW_PARTY_ID',l_td_owner_id);
7522 fnd_message.set_token('INSTANCE_ID',l_instance_rec.instance_id);
7523 fnd_msg_pub.add;
7524 RAISE fnd_api.g_exc_error;
7525 END IF;
7526 END IF;
7527 ELSE -- no owner entered in TD
7528 IF ((l_inst_owner_type = 'HZ_PARTIES' )
7529 AND (l_inst_owner_id <> l_internal_party_id))
7530 THEN
7531 IF l_ownership_override = 'Y' THEN
7532 debug('Ownership Change and is allowed.');
7533 ELSE
7534 IF nvl(p_order_line_rec.end_customer_id,fnd_api.g_miss_num) <> fnd_api.g_miss_num
7535 AND l_inst_owner_id <> p_order_line_rec.end_customer_id
7536 THEN -- end customer exists
7537 -- for normal NON-partner order, checks for ownership override will be
7538 -- done anyway later in update_install_base since we do not have party_id here
7539 debug('Ownership Change but is not setup:'||l_ownership_override);
7540 fnd_message.set_name('CSI', 'CSI_SHIP_OWNER_MISMATCH');
7541 fnd_message.set_token('OLD_PARTY_ID',l_inst_owner_id);
7542 fnd_message.set_token('NEW_PARTY_ID',l_td_owner_id);
7543 fnd_message.set_token('INSTANCE_ID',l_instance_rec.instance_id);
7544 fnd_msg_pub.add;
7545 RAISE fnd_api.g_exc_error;
7546 END IF;
7547 END IF;
7548 END IF;
7549 END IF;
7550
7551 IF l_line_dtl_tbl(1).quantity <> l_instance_rec.quantity THEN
7552 debug('Original Instance Qty : '||l_instance_rec.quantity);
7553 debug('Qty being processed : '||l_line_dtl_tbl(1).quantity);
7554 -- check if the quantity is greater than the instance quantity
7555 IF p_line_dtl_tbl(l_td_ind).quantity > l_instance_rec.quantity THEN
7556 fnd_message.set_name('CSI','CSI_INT_QTY_CHK_FAILED');
7557 fnd_message.set_token('INSTANCE_ID',l_instance_rec.instance_id);
7558 fnd_msg_pub.add;
7559 RAISE fnd_api.g_exc_error;
7560 ELSIF l_line_dtl_tbl(1).quantity < l_instance_rec.quantity THEN
7561 -- split the instance and process....
7562 l_quantity1 := l_instance_rec.quantity - l_line_dtl_tbl(1).quantity ;
7563 l_split_src_inst_rec.instance_id := l_instance_rec.instance_id;
7564 -- l_csi_trxn_rec.split_reason_code := 'PARTIAL_RETURN';
7565
7566 csi_t_gen_utility_pvt.dump_api_info(
7567 p_pkg_name => 'csi_item_instance_pvt',
7568 p_api_name => 'split_item_instance');
7569
7570 csi_item_instance_pvt.split_item_instance (
7571 p_api_version => 1.0,
7572 p_commit => fnd_api.g_false,
7573 p_init_msg_list => fnd_api.g_true,
7574 p_validation_level => fnd_api.g_valid_level_full,
7575 p_source_instance_rec => l_split_src_inst_rec,
7576 p_quantity1 => l_quantity1,
7577 p_quantity2 => l_line_dtl_tbl(1).quantity,
7578 p_copy_ext_attribs => fnd_api.g_true,
7579 p_copy_org_assignments => fnd_api.g_true,
7580 p_copy_parties => fnd_api.g_true,
7581 p_copy_accounts => fnd_api.g_true,
7582 p_copy_asset_assignments => fnd_api.g_true,
7583 p_copy_pricing_attribs => fnd_api.g_true,
7584 p_txn_rec => px_csi_txn_rec,
7585 x_new_instance_rec => l_split_new_inst_rec,
7586 x_return_status => l_return_status,
7587 x_msg_count => l_msg_count,
7588 x_msg_data => l_msg_data);
7589
7590 IF NOT(l_return_status = fnd_api.g_ret_sts_success) THEN
7591 debug('csi_item_instance_pvt.split_item_instance raised errors');
7592 raise fnd_api.g_exc_error;
7593 END IF;
7594 l_u_line_dtl_tbl(1).instance_id := l_split_new_inst_rec.instance_id;
7595 l_u_line_dtl_tbl(1).preserve_detail_flag := 'Y';
7596 debug('Newly split Instance ID : '||l_split_new_inst_rec.instance_id);
7597 END IF;
7598 END IF;
7599
7600 -- update the transaction line detail table with the inprocess status
7601 l_u_txn_line_rec.transaction_line_id := p_line_dtl_tbl(l_td_ind).transaction_line_id;
7602
7603 l_u_line_dtl_tbl(1).txn_line_detail_id := p_line_dtl_tbl(l_td_ind).txn_line_detail_id;
7604
7605 IF nvl(l_vld_orgn_id, fnd_api.g_miss_num) <> fnd_api.g_miss_num THEN
7606 l_u_line_dtl_tbl(1).inv_organization_id := l_vld_orgn_id; -- FP fix for bug 5072107
7607 END IF;
7608
7609 l_u_line_dtl_tbl(1).transaction_line_id := p_line_dtl_tbl(l_td_ind).transaction_line_id;
7610 l_u_line_dtl_tbl(1).processing_status := 'IN_PROCESS';
7611
7612 csi_t_txn_details_grp.update_txn_line_dtls(
7613 p_api_version => 1.0,
7614 p_commit => fnd_api.g_false,
7615 p_init_msg_list => fnd_api.g_true,
7616 p_validation_level => fnd_api.g_valid_level_full,
7617 p_txn_line_rec => l_u_txn_line_rec,
7618 p_txn_line_detail_tbl => l_u_line_dtl_tbl,
7619 px_txn_ii_rltns_tbl => l_u_ii_rltns_tbl,
7620 px_txn_party_detail_tbl => l_u_pty_dtl_tbl,
7621 px_txn_pty_acct_detail_tbl => l_u_pty_acct_tbl,
7622 px_txn_org_assgn_tbl => l_u_org_assgn_tbl,
7623 px_txn_ext_attrib_vals_tbl => l_u_eav_tbl,
7624 x_return_status => l_return_status,
7625 x_msg_count => l_msg_count,
7626 x_msg_data => l_msg_data);
7627
7628 IF x_return_status <> fnd_api.g_ret_sts_success THEN
7629 debug('Update txn line dtls failed for RMA Fulfillment.');
7630 RAISE fnd_api.g_exc_error;
7631 END IF;
7632
7633 END IF;
7634 END LOOP;
7635 END IF;
7636
7637 EXCEPTION
7638 WHEN fnd_api.g_exc_error THEN
7639 x_return_status := fnd_api.g_ret_sts_error;
7640
7641 END demo_fulfillment;
7642
7643 -- configurator fulfillment
7644
7645 PROCEDURE cz_fulfillment(
7646 p_order_line_id IN number,
7647 x_return_status OUT NOCOPY varchar2,
7648 x_return_message OUT NOCOPY varchar2)
7649 IS
7650
7651 l_txn_line_rec csi_t_datastructures_grp.txn_line_rec;
7652 l_td_found boolean := FALSE;
7653
7654 l_source_header_rec csi_interface_pkg.source_header_rec;
7655 l_source_line_rec csi_interface_pkg.source_line_rec;
7656
7657 l_csi_txn_rec csi_datastructures_pub.transaction_rec;
7658
7659 l_txn_line_query_rec csi_t_datastructures_grp.txn_line_query_rec;
7660 l_txn_line_detail_query_rec csi_t_datastructures_grp.txn_line_detail_query_rec;
7661
7662 l_g_line_dtl_tbl csi_t_datastructures_grp.txn_line_detail_tbl;
7663 l_g_pty_dtl_tbl csi_t_datastructures_grp.txn_party_detail_tbl;
7664 l_g_pty_acct_tbl csi_t_datastructures_grp.txn_pty_acct_detail_tbl;
7665 l_g_ii_rltns_tbl csi_t_datastructures_grp.txn_ii_rltns_tbl;
7666 l_g_org_assgn_tbl csi_t_datastructures_grp.txn_org_assgn_tbl;
7667 l_g_ext_attrib_tbl csi_t_datastructures_grp.txn_ext_attrib_vals_tbl;
7668 l_g_csi_ea_tbl csi_t_datastructures_grp.csi_ext_attribs_tbl;
7669 l_g_csi_eav_tbl csi_t_datastructures_grp.csi_ext_attrib_vals_tbl;
7670 l_g_txn_systems_tbl csi_t_datastructures_grp.txn_systems_tbl;
7671
7672 l_txn_line_detail_tbl csi_t_datastructures_grp.txn_line_detail_tbl;
7673 l_txn_party_tbl csi_t_datastructures_grp.txn_party_detail_tbl;
7674 l_txn_party_acct_tbl csi_t_datastructures_grp.txn_pty_acct_detail_tbl;
7675 l_txn_org_assgn_tbl csi_t_datastructures_grp.txn_org_assgn_tbl;
7676 l_txn_ii_rltns_tbl csi_t_datastructures_grp.txn_ii_rltns_tbl;
7677 l_txn_eav_tbl csi_t_datastructures_grp.txn_ext_attrib_vals_tbl;
7678 l_txn_systems_tbl csi_t_datastructures_grp.txn_systems_tbl;
7679
7680 l_pricing_attribs_tbl csi_datastructures_pub.pricing_attribs_tbl;
7681
7682 -- Added this for unlock_item_instances
7683 l_config_tbl csi_cz_int.config_tbl;
7684
7685 l_return_status varchar2(1) := fnd_api.g_ret_sts_success;
7686 l_return_message varchar2(2000);
7687 l_msg_count number;
7688 l_msg_data varchar2(2000);
7689
7690 BEGIN
7691
7692 x_return_status := fnd_api.g_ret_sts_success;
7693
7694 debug('Configurator fulfillment for order line id :'||p_order_line_id);
7695
7696 api_log('cz_fulfillment');
7697
7698 savepoint cz_fulfillment;
7699
7700 csi_interface_pkg.get_source_info(
7701 p_source_table => csi_interface_pkg.g_om_source_table,
7702 p_source_id => p_order_line_id,
7703 x_source_header_rec => l_source_header_rec,
7704 x_source_line_rec => l_source_line_rec,
7705 x_return_status => l_return_status);
7706
7707 IF l_return_status <> fnd_api.g_ret_sts_success THEN
7708 RAISE fnd_api.g_exc_error;
7709 END IF;
7710
7711 -- check for user entered transaction details
7712 l_txn_line_rec.source_transaction_table := csi_interface_pkg.g_om_source_table;
7713 l_txn_line_rec.source_transaction_id := l_source_line_rec.source_line_id;
7714
7715 l_td_found := csi_t_txn_details_pvt.check_txn_details_exist(
7716 p_txn_line_rec => l_txn_line_rec);
7717
7718 -- if entered then re build using the transaction details using the source info
7719 IF l_td_found THEN
7720
7721 l_txn_line_query_rec.source_transaction_table := csi_interface_pkg.g_om_source_table;
7722 l_txn_line_query_rec.source_transaction_id := l_source_line_rec.source_line_id;
7723
7724 csi_t_txn_details_grp.get_transaction_details(
7725 p_api_version => 1.0,
7726 p_commit => fnd_api.g_false,
7727 p_init_msg_list => fnd_api.g_true,
7728 p_validation_level => fnd_api.g_valid_level_full,
7729 p_txn_line_query_rec => l_txn_line_query_rec,
7730 p_txn_line_detail_query_rec => l_txn_line_detail_query_rec,
7731 x_txn_line_detail_tbl => l_g_line_dtl_tbl,
7732 p_get_parties_flag => fnd_api.g_true,
7733 x_txn_party_detail_tbl => l_g_pty_dtl_tbl,
7734 p_get_pty_accts_flag => fnd_api.g_true,
7735 x_txn_pty_acct_detail_tbl => l_g_pty_acct_tbl,
7736 p_get_ii_rltns_flag => fnd_api.g_false,
7737 x_txn_ii_rltns_tbl => l_g_ii_rltns_tbl,
7738 p_get_org_assgns_flag => fnd_api.g_true,
7739 x_txn_org_assgn_tbl => l_g_org_assgn_tbl,
7740 p_get_ext_attrib_vals_flag => fnd_api.g_false,
7741 x_txn_ext_attrib_vals_tbl => l_g_ext_attrib_tbl,
7742 p_get_csi_attribs_flag => fnd_api.g_false,
7743 x_csi_ext_attribs_tbl => l_g_csi_ea_tbl,
7744 p_get_csi_iea_values_flag => fnd_api.g_false,
7745 x_csi_iea_values_tbl => l_g_csi_eav_tbl,
7746 p_get_txn_systems_flag => fnd_api.g_false,
7747 x_txn_systems_tbl => l_g_txn_systems_tbl,
7748 x_return_status => l_return_status,
7749 x_msg_count => l_msg_count,
7750 x_msg_data => l_msg_data);
7751
7752 IF l_return_status <> fnd_api.g_ret_sts_success THEN
7753 RAISE fnd_api.g_exc_error;
7754 END IF;
7755
7756 -- l_txn_line_rec.source_transaction_type_id := csi_interface_pkg.g_om_txn_type_id;
7757 l_txn_line_rec.source_transaction_type_id := csi_interface_pkg.g_macd_txn_type_id; --bug 5194812
7758
7759 l_txn_line_rec.processing_status := 'SUBMIT';
7760
7761 l_txn_line_detail_tbl := l_g_line_dtl_tbl;
7762 l_txn_party_tbl := l_g_pty_dtl_tbl;
7763 l_txn_party_acct_tbl := l_g_pty_acct_tbl;
7764 l_txn_org_assgn_tbl := l_g_org_assgn_tbl;
7765
7766 csi_interface_pkg.rebuild_txn_detail(
7767 p_source_table => csi_interface_pkg.g_om_source_table,
7768 p_source_id => p_order_line_id,
7769 p_source_header_rec => l_source_header_rec,
7770 p_source_line_rec => l_source_line_rec,
7771 p_csi_txn_rec => l_csi_txn_rec,
7772 px_txn_line_rec => l_txn_line_rec,
7773 px_txn_line_detail_tbl => l_txn_line_detail_tbl,
7774 px_txn_party_tbl => l_txn_party_tbl,
7775 px_txn_party_acct_tbl => l_txn_party_acct_tbl,
7776 px_txn_org_assgn_tbl => l_txn_org_assgn_tbl,
7777 x_pricing_attribs_tbl => l_pricing_attribs_tbl,
7778 x_return_status => l_return_status);
7779
7780 IF l_return_status <> fnd_api.g_ret_sts_success THEN
7781 RAISE fnd_api.g_exc_error;
7782 END IF;
7783
7784 ELSE -- if not entered then build a brand new one using the source info
7785
7786 --code for bug 5194812--
7787 l_txn_line_rec.source_transaction_type_id := csi_interface_pkg.g_macd_txn_type_id;
7788
7789 csi_interface_pkg.build_default_txn_detail(
7790 p_source_table => csi_interface_pkg.g_om_source_table,
7791 p_source_id => p_order_line_id,
7792 p_source_header_rec => l_source_header_rec,
7793 p_source_line_rec => l_source_line_rec,
7794 p_csi_txn_rec => l_csi_txn_rec,
7795 px_txn_line_rec => l_txn_line_rec, --bug 5194812, changed this param to IN OUT
7796 x_txn_line_detail_tbl => l_txn_line_detail_tbl,
7797 x_txn_party_tbl => l_txn_party_tbl,
7798 x_txn_party_acct_tbl => l_txn_party_acct_tbl,
7799 x_txn_org_assgn_tbl => l_txn_org_assgn_tbl,
7800 x_pricing_attribs_tbl => l_pricing_attribs_tbl,
7801 x_return_status => l_return_status);
7802
7803 IF l_return_status <> fnd_api.g_ret_sts_success THEN
7804 RAISE fnd_api.g_exc_error;
7805 END IF;
7806
7807 END IF;
7808
7809 --get the relations from om/config transaction details
7810
7811 csi_interface_pkg.get_relations(
7812 p_source_id => p_order_line_id,
7813 p_source_table => csi_interface_pkg.g_om_source_table,
7814 p_source_header_rec => l_source_header_rec,
7815 p_source_line_rec => l_source_line_rec,
7816 px_txn_line_rec => l_txn_line_rec,
7817 px_txn_line_dtl_tbl => l_txn_line_detail_tbl,
7818 x_txn_ii_rltns_tbl => l_txn_ii_rltns_tbl,
7819 x_txn_eav_tbl => l_txn_eav_tbl,
7820 x_return_status => l_return_status);
7821
7822 IF l_return_status <> fnd_api.g_ret_sts_success THEN
7823 RAISE fnd_api.g_exc_error;
7824 END IF;
7825
7826 -- Added the following call for unlockinig the config keys to be fulfilled
7827 IF l_txn_line_detail_tbl.count > 0
7828 THEN
7829 FOR inst in l_txn_line_detail_tbl.FIRST .. l_txn_line_detail_tbl.LAST
7830 Loop
7831 -- Unlock Routine
7832 l_config_tbl(1).source_application_id := 542;
7833 l_config_tbl(1).config_inst_hdr_id := l_txn_line_detail_tbl(inst).config_inst_hdr_id;
7834 l_config_tbl(1).config_inst_item_id := l_txn_line_detail_tbl(inst).config_inst_item_id;
7835 l_config_tbl(1).config_inst_rev_num := l_txn_line_detail_tbl(inst).config_inst_rev_num;
7836 l_config_tbl(1).instance_id := l_txn_line_detail_tbl(inst).instance_id;
7837 l_config_tbl(1).source_txn_header_ref := l_source_header_rec.source_header_id;
7838 l_config_tbl(1).source_txn_line_ref1 := l_source_line_rec.source_line_id;
7839
7840 csi_cz_int.unlock_item_instances(
7841 p_api_version => 1.0,
7842 p_init_msg_list => fnd_api.g_true,
7843 p_commit => fnd_api.g_false,
7844 p_validation_level => fnd_api.g_valid_level_full,
7845 p_config_tbl => l_config_tbl,
7846 x_return_status => l_return_status,
7847 x_msg_count => l_msg_count,
7848 x_msg_data => l_msg_data);
7849
7850 IF l_return_status <> fnd_api.g_ret_sts_success THEN
7851 RAISE fnd_api.g_exc_error;
7852 END IF;
7853 END LOOP;
7854 END IF;
7855
7856
7857 csi_interface_pkg.interface_ib(
7858 p_source_header_rec => l_source_header_rec,
7859 p_source_line_rec => l_source_line_rec,
7860 px_csi_txn_rec => l_csi_txn_rec,
7861 px_txn_line_rec => l_txn_line_rec,
7862 px_txn_line_dtl_tbl => l_txn_line_detail_tbl,
7863 px_txn_party_tbl => l_txn_party_tbl,
7864 px_txn_party_acct_tbl => l_txn_party_acct_tbl,
7865 px_txn_org_assgn_tbl => l_txn_org_assgn_tbl,
7866 px_txn_eav_tbl => l_txn_eav_tbl,
7867 px_txn_ii_rltns_tbl => l_txn_ii_rltns_tbl,
7868 px_pricing_attribs_tbl => l_pricing_attribs_tbl,
7869 x_return_status => l_return_status,
7870 x_return_message => l_return_message);
7871
7872 IF l_return_status <> fnd_api.g_ret_sts_success THEN
7873 RAISE fnd_api.g_exc_error;
7874 END IF;
7875
7876 debug('Configurator fulfillment successful for order line id :'||p_order_line_id);
7877
7878 EXCEPTION
7879 WHEN fnd_api.g_exc_error THEN
7880 x_return_status := fnd_api.g_ret_sts_error;
7881 x_return_message := csi_t_gen_utility_pvt.dump_error_stack;
7882 rollback to cz_fulfillment;
7883 debug(x_return_message);
7884 WHEN others THEN
7885 fnd_message.set_name ('FND', 'FND_GENERIC_MESSAGE');
7886 fnd_message.set_token('MESSAGE', 'OTHERS Error :'||substr(sqlerrm, 1, 300));
7887 fnd_msg_pub.add;
7888 x_return_status := fnd_api.g_ret_sts_error;
7889 x_return_message := csi_t_gen_utility_pvt.dump_error_stack;
7890 rollback to cz_fulfillment;
7891 debug(x_return_message);
7892 END cz_fulfillment;
7893
7894 PROCEDURE query_tld_and_update_ib(
7895 p_order_header_rec IN oe_order_headers_all%rowtype,
7896 p_order_line_rec IN csi_order_ship_pub.order_line_rec, --fix for bug5589710
7897 px_default_info_rec IN OUT NOCOPY default_info_rec,
7898 px_csi_txn_rec IN OUT NOCOPY csi_datastructures_pub.transaction_rec,
7899 px_error_rec IN OUT NOCOPY csi_datastructures_pub.transaction_error_rec,
7900 x_return_status OUT NOCOPY varchar2)
7901 IS
7902
7903 l_tl_query_rec csi_t_datastructures_grp.txn_line_query_rec;
7904 l_tld_query_rec csi_t_datastructures_grp.txn_line_detail_query_rec;
7905
7906 l_p_order_line_rec csi_order_ship_pub.order_line_rec;
7907
7908 l_p_tl_rec csi_t_datastructures_grp.txn_line_rec;
7909
7910 l_p_tld_tbl csi_t_datastructures_grp.txn_line_detail_tbl;
7911 l_p_tpd_tbl csi_t_datastructures_grp.txn_party_detail_tbl;
7912 l_p_tpa_tbl csi_t_datastructures_grp.txn_pty_acct_detail_tbl;
7913 l_p_tiir_tbl csi_t_datastructures_grp.txn_ii_rltns_tbl;
7914 l_p_toa_tbl csi_t_datastructures_grp.txn_org_assgn_tbl;
7915 l_p_teav_tbl csi_t_datastructures_grp.txn_ext_attrib_vals_tbl;
7916 l_p_tsys_tbl csi_t_datastructures_grp.txn_systems_tbl;
7917 l_p_pa_tbl csi_datastructures_pub.pricing_attribs_tbl;
7918 l_p_ea_tbl csi_t_datastructures_grp.csi_ext_attribs_tbl;
7919 l_p_eav_tbl csi_t_datastructures_grp.csi_ext_attrib_vals_tbl;
7920
7921 l_src_tld_tbl csi_t_datastructures_grp.txn_line_detail_tbl;
7922 l_src_tld_total_qty number := 0;
7923
7924 l_return_status varchar2(1) := fnd_api.g_ret_sts_success;
7925 l_msg_count number;
7926 l_msg_data varchar2(2000);
7927
7928 BEGIN
7929
7930 x_return_status := fnd_api.g_ret_sts_success;
7931
7932 api_log('query_tld_and_update_ib');
7933
7934 l_p_tl_rec.transaction_line_id := px_default_info_rec.transaction_line_id;
7935 l_p_tl_rec.source_transaction_table := 'OE_ORDER_LINES_ALL';
7936 l_p_tl_rec.source_transaction_id := p_order_line_rec.order_line_id;
7937 l_p_tl_rec.source_transaction_type_id := 51;
7938
7939 debug('get transaction details for the final process. IN_PROCESS Details');
7940
7941 l_tl_query_rec.transaction_line_id := px_default_info_rec.transaction_line_id;
7942 l_tl_query_rec.source_transaction_table := 'OE_ORDER_LINES_ALL';
7943 l_tl_query_rec.source_transaction_id := p_order_line_rec.order_line_id;
7944
7945 l_tld_query_rec.processing_status := 'IN_PROCESS';
7946 l_tld_query_rec.source_transaction_flag := fnd_api.g_miss_char;
7947
7948 csi_t_txn_details_grp.get_transaction_details(
7949 p_api_version => 1,
7950 p_commit => fnd_api.g_false,
7951 p_init_msg_list => fnd_api.g_true,
7952 p_validation_level => fnd_api.g_valid_level_full,
7953 p_txn_line_query_rec => l_tl_query_rec,
7954 p_txn_line_detail_query_rec => l_tld_query_rec,
7955 x_txn_line_detail_tbl => l_p_tld_tbl,
7956 p_get_parties_flag => fnd_api.g_true,
7957 x_txn_party_detail_tbl => l_p_tpd_tbl,
7958 p_get_pty_accts_flag => fnd_api.g_true,
7959 x_txn_pty_acct_detail_tbl => l_p_tpa_tbl,
7960 p_get_ii_rltns_flag => fnd_api.g_true,
7961 x_txn_ii_rltns_tbl => l_p_tiir_tbl,
7962 p_get_org_assgns_flag => fnd_api.g_true,
7963 x_txn_org_assgn_tbl => l_p_toa_tbl,
7964 p_get_ext_attrib_vals_flag => fnd_api.g_true,
7965 x_txn_ext_attrib_vals_tbl => l_p_teav_tbl,
7966 p_get_csi_attribs_flag => fnd_api.g_false,
7967 x_csi_ext_attribs_tbl => l_p_ea_tbl,
7968 p_get_csi_iea_values_flag => fnd_api.g_false,
7969 x_csi_iea_values_tbl => l_p_eav_tbl,
7970 p_get_txn_systems_flag => fnd_api.g_true,
7971 x_txn_systems_tbl => l_p_tsys_tbl,
7972 x_return_status => l_return_status,
7973 x_msg_count => l_msg_count,
7974 x_msg_data => l_msg_data);
7975
7976 IF l_return_status <> fnd_api.g_ret_sts_success THEN
7977 RAISE fnd_api.g_exc_error;
7978 END IF;
7979
7980 IF l_p_tld_tbl.COUNT > 0 THEN
7981
7982 get_source_tlds(
7983 p_tld_tbl => l_p_tld_tbl,
7984 x_src_tld_tbl => l_src_tld_tbl,
7985 x_src_tld_total_qty => l_src_tld_total_qty);
7986
7987 IF l_src_tld_tbl.COUNT = 1 THEN
7988 IF (p_order_line_rec.fulfilled_quantity <> p_order_line_rec.ordered_quantity)
7989 OR
7990 (p_order_line_rec.fulfilled_quantity <> l_src_tld_total_qty)
7991 THEN
7992 l_p_tld_tbl(1).quantity := p_order_line_rec.fulfilled_quantity;
7993 END IF;
7994 ELSE
7995 IF p_order_line_rec.fulfilled_quantity <> l_src_tld_total_qty THEN
7996 fnd_message.set_name ('CSI', 'CSI_FULFILL_TLD_QTY_MISMATCH');
7997 fnd_message.set_token('FULFILLED_QTY', p_order_line_rec.fulfilled_quantity);
7998 fnd_message.set_token('TOT_TLD_QTY', l_src_tld_total_qty);
7999 fnd_msg_pub.add;
8000 END IF;
8001 END IF;
8002
8003 -- assign default current and default install location
8004 FOR l_ind IN l_p_tld_tbl.FIRST .. l_p_tld_tbl.LAST
8005 LOOP
8006 IF l_p_tld_tbl(l_ind).source_transaction_flag = 'Y' THEN
8007 IF nvl(l_p_tld_tbl(l_ind).location_type_code,fnd_api.g_miss_char) =
8008 fnd_api.g_miss_char
8009 OR
8010 nvl(l_p_tld_tbl(l_ind).location_id, fnd_api.g_miss_num) = fnd_api.g_miss_num
8011 THEN
8012 l_p_tld_tbl(l_ind).location_type_code := 'HZ_PARTY_SITES';
8013 l_p_tld_tbl(l_ind).location_id := px_default_info_rec.current_party_site_id;
8014 END IF;
8015
8016 IF nvl(l_p_tld_tbl(l_ind).install_location_type_code,fnd_api.g_miss_char) =
8017 fnd_api.g_miss_char
8018 OR
8019 nvl(l_p_tld_tbl(l_ind).install_location_id, fnd_api.g_miss_num) = fnd_api.g_miss_num
8020 THEN
8021 l_p_tld_tbl(l_ind).install_location_type_code := 'HZ_PARTY_SITES';
8022 l_p_tld_tbl(l_ind).install_location_id :=
8023 px_default_info_rec.install_party_site_id;
8024 END IF;
8025 END IF;
8026 END LOOP;
8027 END IF;
8028
8029 csi_utl_pkg.get_pricing_attribs(
8030 p_line_id => p_order_line_rec.order_line_id,
8031 x_pricing_attb_tbl => l_p_pa_tbl,
8032 x_return_status => l_return_status);
8033
8034 IF l_return_status <> fnd_api.g_ret_sts_success THEN
8035 RAISE fnd_api.g_exc_error;
8036 END IF;
8037
8038 IF csi_t_gen_utility_pvt.g_debug_level >= 25 THEN
8039 csi_t_gen_utility_pvt.dump_txn_tables(
8040 p_ids_or_index_based => 'I',
8041 p_line_detail_tbl => l_p_tld_tbl,
8042 p_party_detail_tbl => l_p_tpd_tbl,
8043 p_pty_acct_tbl => l_p_tpa_tbl,
8044 p_ii_rltns_tbl => l_p_tiir_tbl,
8045 p_org_assgn_tbl => l_p_toa_tbl,
8046 p_ea_vals_tbl => l_p_teav_tbl);
8047 END IF;
8048
8049 -- defaults directly from OM
8050 l_p_order_line_rec.header_id := p_order_line_rec.header_id;
8051 l_p_order_line_rec.order_line_id := p_order_line_rec.order_line_id;
8052 l_p_order_line_rec.inv_item_id := p_order_line_rec.inv_item_id;
8053 l_p_order_line_rec.inv_org_id := p_order_line_rec.inv_org_id;
8054 l_p_order_line_rec.ordered_quantity := p_order_line_rec.ordered_quantity;
8055 l_p_order_line_rec.shipped_quantity := p_order_line_rec.shipped_quantity;
8056 l_p_order_line_rec.fulfilled_quantity := p_order_line_rec.fulfilled_quantity;
8057 l_p_order_line_rec.fulfillment_date := p_order_line_rec.fulfillment_date;
8058 l_p_order_line_rec.top_model_line_id := p_order_line_rec.top_model_line_id;
8059 l_p_order_line_rec.ato_line_id := p_order_line_rec.ato_line_id;
8060 l_p_order_line_rec.link_to_line_id := p_order_line_rec.link_to_line_id;
8061 l_p_order_line_rec.invoice_to_org_id := p_order_line_rec.invoice_to_org_id;
8062 l_p_order_line_rec.ship_to_org_id := p_order_line_rec.ship_to_org_id;
8063 l_p_order_line_rec.item_type_code := p_order_line_rec.item_type_code;
8064 l_p_order_line_rec.ordered_item := p_order_line_rec.ordered_item;
8065 l_p_order_line_rec.org_id := p_order_line_rec.org_id;
8066 l_p_order_line_rec.deliver_to_org_id := p_order_line_rec.deliver_to_org_id;
8067 l_p_order_line_rec.sold_from_org_id := p_order_line_rec.sold_from_org_id;
8068 l_p_order_line_rec.sold_to_org_id := p_order_line_rec.sold_to_org_id;
8069 l_p_order_line_rec.agreement_id := p_order_line_rec.agreement_id;
8070 l_p_order_line_rec.ship_to_contact_id := p_order_line_rec.ship_to_contact_id;
8071 l_p_order_line_rec.invoice_to_contact_id := p_order_line_rec.invoice_to_contact_id;
8072 l_p_order_line_rec.currency_code := p_order_header_rec.transactional_curr_code;
8073 l_p_order_line_rec.unit_price := p_order_line_rec.unit_price;
8074 l_p_order_line_rec.order_quantity_uom := p_order_line_rec.order_quantity_uom;
8075 l_p_order_line_rec.bom_item_type := p_order_line_rec.bom_item_type; --fix for bug5589710
8076
8077
8078 -- defaults derived from partner ordering/tca etc
8079 l_p_order_line_rec.om_vld_org_id := px_default_info_rec.om_vld_org_id;
8080 l_p_order_line_rec.primary_uom := px_default_info_rec.primary_uom_code;
8081 l_p_order_line_rec.ib_current_loc_id := px_default_info_rec.current_party_site_id;
8082 l_p_order_line_rec.ib_install_loc_id := px_default_info_rec.install_party_site_id;
8083 l_p_order_line_rec.customer_id := px_default_info_rec.owner_party_acct_id;
8084 l_p_order_line_rec.end_customer_id := px_default_info_rec.owner_party_acct_id;
8085 l_p_order_line_rec.trx_line_id := px_default_info_rec.transaction_line_id;
8086
8087 csi_order_ship_pub.update_install_base(
8088 p_api_version => 1.0,
8089 p_commit => fnd_api.g_false,
8090 p_init_msg_list => fnd_api.g_true,
8091 p_validation_level => fnd_api.g_valid_level_full,
8092 p_txn_line_rec => l_p_tl_rec,
8093 p_txn_line_detail_tbl => l_p_tld_tbl,
8094 p_txn_party_detail_tbl => l_p_tpd_tbl,
8095 p_txn_pty_acct_dtl_tbl => l_p_tpa_tbl,
8096 p_txn_org_assgn_tbl => l_p_toa_tbl,
8097 p_txn_ii_rltns_tbl => l_p_tiir_tbl,
8098 p_txn_ext_attrib_vals_tbl => l_p_teav_tbl,
8099 p_txn_systems_tbl => l_p_tsys_tbl,
8100 p_pricing_attribs_tbl => l_p_pa_tbl,
8101 p_order_line_rec => l_p_order_line_rec,
8102 p_trx_rec => px_csi_txn_rec,
8103 p_source => 'FULFILLMENT',
8104 p_validate_only => 'N',
8105 px_error_rec => px_error_rec,
8106 x_return_status => l_return_status,
8107 x_msg_count => l_msg_count,
8108 x_msg_data => l_msg_data);
8109
8110 IF l_return_status <> fnd_api.g_ret_sts_success THEN
8111 RAISE fnd_api.g_exc_error;
8112 END IF;
8113
8114 UPDATE csi_t_transaction_lines
8115 SET processing_status = 'PROCESSED'
8116 WHERE transaction_line_id = l_p_tl_rec.transaction_line_id;
8117
8118 EXCEPTION
8119 WHEN fnd_api.g_exc_error THEN
8120 x_return_status := fnd_api.g_ret_sts_error;
8121 END query_tld_and_update_ib;
8122
8123 /* Main interface program for Order Fulfillment */
8124 PROCEDURE order_fulfillment(
8125 p_order_line_id IN number,
8126 p_message_id IN number,
8127 x_return_status OUT NOCOPY varchar2,
8128 px_trx_error_rec IN OUT NOCOPY csi_datastructures_pub.transaction_error_rec)
8129 IS
8130
8131 l_api_name varchar2(30) := 'order_fulfillment';
8132
8133 l_default_info_rec default_info_rec;
8134 l_txn_line_id number;
8135 l_txn_type_id number := 51;
8136 l_txn_sub_type_id number ;
8137 l_sub_type_rec sub_type_rec;
8138 l_src_txn_table varchar2(30) := 'OE_ORDER_LINES_ALL';
8139 l_transaction_line_id number;
8140
8141 l_cascade_eligible varchar2(1) := 'N';
8142 l_model_hierarchy varchar2(300);
8143 l_mdl_ordered_qty number;
8144
8145 l_config_instances config_serial_inst_tbl;
8146 l_config_reship_found boolean := FALSE;
8147 l_config_reship_count number := 0;
8148
8149 l_option_instances csi_datastructures_pub.instance_tbl;
8150
8151 l_trk_child_tbl oe_order_pub.line_tbl_type;
8152 l_trk_parent_rec oe_order_pub.line_rec_type;
8153
8154 l_txn_line_rec csi_t_datastructures_grp.txn_line_rec;
8155 l_txn_line_query_rec csi_t_datastructures_grp.txn_line_query_rec;
8156 l_txn_line_detail_query_rec csi_t_datastructures_grp.txn_line_detail_query_rec;
8157 l_txn_source_rec csi_t_ui_pvt.txn_source_rec;
8158
8159 l_g_line_dtl_tbl csi_t_datastructures_grp.txn_line_detail_tbl;
8160 l_g_pty_dtl_tbl csi_t_datastructures_grp.txn_party_detail_tbl;
8161 l_g_pty_acct_tbl csi_t_datastructures_grp.txn_pty_acct_detail_tbl;
8162 l_g_ii_rltns_tbl csi_t_datastructures_grp.txn_ii_rltns_tbl;
8163 l_g_org_assgn_tbl csi_t_datastructures_grp.txn_org_assgn_tbl;
8164 l_g_ext_attrib_tbl csi_t_datastructures_grp.txn_ext_attrib_vals_tbl;
8165 l_g_csi_ea_tbl csi_t_datastructures_grp.csi_ext_attribs_tbl;
8166 l_g_csi_eav_tbl csi_t_datastructures_grp.csi_ext_attrib_vals_tbl;
8167 l_g_txn_systems_tbl csi_t_datastructures_grp.txn_systems_tbl;
8168
8169 l_line_dtl_tbl csi_t_datastructures_grp.txn_line_detail_tbl;
8170 l_pty_dtl_tbl csi_t_datastructures_grp.txn_party_detail_tbl;
8171 l_pty_acct_tbl csi_t_datastructures_grp.txn_pty_acct_detail_tbl;
8172 l_ii_rltns_tbl csi_t_datastructures_grp.txn_ii_rltns_tbl;
8173 l_org_assgn_tbl csi_t_datastructures_grp.txn_org_assgn_tbl;
8174 l_ext_attrib_tbl csi_t_datastructures_grp.txn_ext_attrib_vals_tbl;
8175 l_txn_systems_tbl csi_t_datastructures_grp.txn_systems_tbl;
8176
8177 l_p_line_dtl_tbl csi_t_datastructures_grp.txn_line_detail_tbl;
8178 l_p_pty_dtl_tbl csi_t_datastructures_grp.txn_party_detail_tbl;
8179 l_p_pty_acct_tbl csi_t_datastructures_grp.txn_pty_acct_detail_tbl;
8180 l_p_ii_rltns_tbl csi_t_datastructures_grp.txn_ii_rltns_tbl;
8181 l_p_org_assgn_tbl csi_t_datastructures_grp.txn_org_assgn_tbl;
8182 l_p_ext_attrib_tbl csi_t_datastructures_grp.txn_ext_attrib_vals_tbl;
8183 l_p_txn_systems_tbl csi_t_datastructures_grp.txn_systems_tbl;
8184 l_p_pricing_attribs_tbl csi_datastructures_pub.pricing_attribs_tbl;
8185 l_p_csi_ea_tbl csi_t_datastructures_grp.csi_ext_attribs_tbl;
8186 l_p_csi_eav_tbl csi_t_datastructures_grp.csi_ext_attrib_vals_tbl;
8187
8188 l_tmp_line_dtl_tbl csi_t_datastructures_grp.txn_line_detail_tbl;
8189 l_party_site_id number;
8190 l_owner_party_id number;
8191 l_owner_account_id number;
8192
8193 l_om_session_key csi_utility_grp.config_session_key;
8194 l_macd_processing boolean := FALSE;
8195
8196 l_inv_transactable_flag varchar2(1);
8197 l_serial_code number;
8198 l_lot_code number;
8199 l_revision_control_code number;
8200 l_locator_control_code number;
8201 l_ib_trackable_flag varchar2(1);
8202 l_bom_item_type number;
8203 l_reservable_type number;
8204 l_pick_components_flag varchar2(1);
8205 l_primary_uom_code varchar2(30);
8206 l_ato_line_id number;
8207 l_order_line_qty NUMBER; --added for bug5096435
8208 l_qty_ratio NUMBER;
8209
8210 l_cascaded_flag varchar2(1) := 'N';
8211 l_shippable_item_flag varchar2(1) := 'N';
8212
8213 l_order_line_rec oe_order_lines_all%rowtype;
8214 l_order_header_rec oe_order_headers_all%rowtype;
8215
8216 l_p_order_line_rec csi_order_ship_pub.order_line_rec;
8217 l_csi_txn_rec csi_datastructures_pub.transaction_rec;
8218
8219 l_identified_item_type varchar2(30);
8220 l_processing_status varchar2(30);
8221
8222 l_ato_rebuild_flag varchar2(1) := 'N';
8223
8224 l_config_rec config_rec;
8225 l_config_ratio number;
8226
8227 l_wip_processing boolean := FALSE;
8228 l_found boolean := FALSE;
8229 l_partial boolean := FALSE;
8230 l_inst_ref_found boolean := FALSE;
8231
8232 l_split_flag varchar2(30) := 'N';
8233 l_ratio_split_flag varchar2(1) := 'N';
8234 l_ratio_split_qty number := 0;
8235
8236 l_debug_level number;
8237 l_error_message varchar2(2000);
8238 l_return_status varchar2(1) := fnd_api.g_ret_sts_success;
8239 l_msg_data varchar2(2000);
8240 l_msg_count number;
8241
8242 ---Added (Start) for m-to-m enhancements
8243 l_temp_txn_ii_rltns_tbl csi_t_datastructures_grp.txn_ii_rltns_tbl;
8244 ---Added (End) for m-to-m enhancements
8245
8246 skip_regular_process exception;
8247 l_error_rec csi_datastructures_pub.transaction_error_rec;
8248
8249 -- For partner prdering
8250 l_end_customer_id number;
8251 l_current_site_use_id number;
8252 l_install_site_use_id number;
8253
8254 l_osp_vld_org_id number;
8255 l_src_tld_tbl csi_t_datastructures_grp.txn_line_detail_tbl;
8256 l_src_tld_total_qty number := 0;
8257 --
8258 l_ul_txn_line_id NUMBER;
8259 l_ul_instance_rec csi_datastructures_pub.instance_rec;
8260 l_u_parties_tbl csi_datastructures_pub.party_tbl;
8261 l_u_pty_accts_tbl csi_datastructures_pub.party_account_tbl;
8262 l_u_org_units_tbl csi_datastructures_pub.organization_units_tbl;
8263 l_u_ea_values_tbl csi_datastructures_pub.extend_attrib_values_tbl;
8264 l_u_pricing_tbl csi_datastructures_pub.pricing_attribs_tbl;
8265 l_u_assets_tbl csi_datastructures_pub.instance_asset_tbl;
8266 l_u_instance_ids_list csi_datastructures_pub.id_tbl;
8267
8268 BEGIN
8269
8270 savepoint order_fulfillment;
8271
8272 x_return_status := fnd_api.g_ret_sts_success;
8273 l_error_rec := px_trx_error_rec;
8274
8275 l_debug_level := csi_t_gen_utility_pvt.g_debug_level;
8276
8277 csi_t_gen_utility_pvt.build_file_name(
8278 p_file_segment1 => 'csisoful',
8279 p_file_segment2 => p_order_line_id);
8280
8281 api_log(l_api_name);
8282
8283 debug(' Transaction Time : '||to_char(sysdate, 'MM/DD/YY HH24:MI:SS'));
8284 debug(' Transaction Type : Sales Order Fulfillment');
8285 debug(' Order Line ID : '||p_order_line_id);
8286
8287 l_error_rec.source_id := p_order_line_id;
8288
8289 fnd_msg_pub.initialize;
8290
8291 /* this routine checks if ib is active */
8292 csi_utility_grp.check_ib_active;
8293
8294 l_default_info_rec.internal_party_id :=
8295 csi_datastructures_pub.g_install_param_rec.internal_party_id;
8296 l_default_info_rec.freeze_date :=
8297 csi_datastructures_pub.g_install_param_rec.freeze_date;
8298 l_default_info_rec.ownership_cascade_at_txn :=
8299 csi_datastructures_pub.g_install_param_rec.ownership_cascade_at_txn;
8300
8301 /* get the default sub type id */
8302 csi_utl_pkg.get_dflt_sub_type_id(
8303 p_transaction_type_id => l_txn_type_id,
8304 x_sub_type_id => l_txn_sub_type_id,
8305 x_return_status => l_return_status);
8306
8307 IF l_return_status <> fnd_api.g_ret_sts_success THEN
8308 raise fnd_api.g_exc_error;
8309 END IF;
8310
8311 l_default_info_rec.sub_type_id := l_txn_sub_type_id;
8312
8313 get_sub_type_rec(
8314 p_transaction_type_id => l_txn_type_id,
8315 p_sub_type_id => l_txn_sub_type_id,
8316 x_sub_type_rec => l_sub_type_rec,
8317 x_return_status => l_return_status);
8318
8319 IF l_return_status <> fnd_api.g_ret_sts_success THEN
8320 RAISE fnd_api.g_exc_error;
8321 END IF;
8322
8323 l_default_info_rec.src_change_owner := l_sub_type_rec.src_change_owner;
8324 l_default_info_rec.src_change_owner_code := l_sub_type_rec.src_change_owner_code;
8325 l_default_info_rec.src_status_id := l_sub_type_rec.src_status_id;
8326
8327
8328 BEGIN
8329
8330 SELECT *
8331 INTO l_order_line_rec
8332 FROM oe_order_lines_all
8333 WHERE line_id = p_order_line_id;
8334
8335 SELECT *
8336 INTO l_order_header_rec
8337 FROM oe_order_headers_all
8338 WHERE header_id = l_order_line_rec.header_id;
8339
8340 EXCEPTION
8341 WHEN no_data_found THEN
8342 fnd_message.set_name('CSI','CSI_INT_OE_LINE_ID_INVALID');
8343 fnd_message.set_token('OE_LINE_ID', p_order_line_id);
8344 fnd_msg_pub.add;
8345 RAISE fnd_api.g_exc_error;
8346 END;
8347
8348 IF l_order_line_rec.org_id is null THEN
8349 l_order_line_rec.org_id := l_order_header_rec.org_id;
8350 END IF;
8351
8352 IF l_order_line_rec.org_id is not null THEN
8353 l_default_info_rec.om_vld_org_id := oe_sys_parameters.value(
8354 param_name => 'MASTER_ORGANIZATION_ID',
8355 p_org_id => l_order_line_rec.org_id);
8356 END IF;
8357
8358 IF l_order_line_rec.ship_from_org_id is null THEN
8359 l_order_line_rec.ship_from_org_id := l_order_header_rec.ship_from_org_id;
8360 IF l_order_line_rec.ship_from_org_id is null THEN
8361 l_order_line_rec.ship_from_org_id := l_default_info_rec.om_vld_org_id;
8362 END IF;
8363 END IF;
8364
8365 IF l_order_line_rec.ship_to_org_id is null THEN
8366 l_order_line_rec.ship_to_org_id := l_order_header_rec.ship_to_org_id;
8367 END IF;
8368
8369 IF l_order_line_rec.sold_from_org_id is null THEN
8370 l_order_line_rec.sold_from_org_id := l_order_header_rec.sold_from_org_id;
8371 END IF;
8372
8373 IF l_order_line_rec.sold_to_org_id is null THEN
8374 l_order_line_rec.sold_to_org_id := l_order_header_rec.sold_to_org_id;
8375 END IF;
8376
8377 IF l_order_line_rec.agreement_id is null THEN
8378 l_order_line_rec.agreement_id := l_order_header_rec.agreement_id;
8379 END IF;
8380
8381 IF l_order_line_rec.ship_to_contact_id is null THEN
8382 l_order_line_rec.ship_to_contact_id := l_order_header_rec.ship_to_contact_id;
8383 END IF;
8384
8385 IF l_order_line_rec.invoice_to_contact_id is null THEN
8386 l_order_line_rec.invoice_to_contact_id := l_order_header_rec.invoice_to_contact_id;
8387 END IF;
8388
8389 -- for partner ordering
8390
8391 IF l_order_line_rec.invoice_to_org_id is null THEN
8392 l_order_line_rec.invoice_to_org_id := l_order_header_rec.invoice_to_org_id;
8393 END IF;
8394
8395 IF l_order_line_rec.deliver_to_org_id is null THEN
8396 l_order_line_rec.deliver_to_org_id := l_order_header_rec.deliver_to_org_id;
8397 END IF;
8398
8399 IF l_order_line_rec.fulfilled_quantity is null THEN
8400 l_order_line_rec.fulfilled_quantity := 0;
8401 END IF;
8402
8403 -- I have to do this because i spawn ib fulfillments for shippable ato opions
8404 -- right after the config shipments where the options may not have the fulfilled quantity
8405 -- Included the OR condition for handling Drop Shipment case where there might be any fulfilled qty.
8406 IF (l_order_line_rec.item_type_code = 'OPTION' AND l_order_line_rec.ato_line_id is not null)
8407 OR
8408 (l_order_line_rec.source_type_code = 'EXTERNAL') -- Bug 4168922
8409 THEN
8410 l_order_line_rec.fulfilled_quantity := l_order_line_rec.shipped_quantity;
8411 ELSE
8412 IF l_order_line_rec.fulfilled_quantity <= 0 THEN
8413 fnd_message.set_name('CSI', 'CSI_ORDER_LINE_NOT_FULFILLED');
8414 fnd_message.set_token('FULFILLED_QUANTITY', l_order_line_rec.fulfilled_quantity);
8415 fnd_msg_pub.add;
8416 RAISE fnd_api.g_exc_error;
8417 END IF;
8418 END IF;
8419
8420 get_partner_order_info(
8421 p_order_line_rec => l_order_line_rec,
8422 x_end_customer_id => l_end_customer_id,
8423 x_current_site_use_id => l_current_site_use_id,
8424 x_install_site_use_id => l_install_site_use_id,
8425 x_return_status => l_return_status);
8426
8427 IF l_return_status <> fnd_api.g_ret_sts_success THEN
8428 RAISE fnd_api.g_exc_error;
8429 END IF;
8430
8431
8432 IF nvl(l_current_site_use_id, fnd_api.g_miss_num) <> fnd_api.g_miss_num THEN
8433 BEGIN
8434 SELECT HCAS.party_site_id
8435 INTO l_party_site_id
8436 FROM hz_cust_site_uses_all HCSU,
8437 hz_cust_acct_sites_all HCAS
8438 WHERE HCSU.site_use_id = l_current_site_use_id
8439 AND HCAS.cust_acct_site_id = HCSU.cust_acct_site_id;
8440 l_default_info_rec.current_party_site_id := l_party_site_id;
8441 EXCEPTION
8442 WHEN no_data_found THEN
8443 fnd_message.set_name('CSI','CSI_TXN_SITE_USE_INVALID');
8444 fnd_message.set_token('SITE_USE_ID',l_current_site_use_id);
8445 fnd_message.set_token('SITE_USE_CODE','SITE_USE_ID');
8446 fnd_msg_pub.add;
8447 RAISE fnd_api.g_exc_error;
8448 END;
8449 END IF;
8450
8451 IF nvl(l_install_site_use_id,fnd_api.g_miss_num) <> fnd_api.g_miss_num THEN
8452 BEGIN
8453 SELECT HCAS.party_site_id
8454 INTO l_party_site_id
8455 FROM hz_cust_site_uses_all HCSU,
8456 hz_cust_acct_sites_all HCAS
8457 WHERE HCSU.site_use_id = l_install_site_use_id
8458 AND HCAS.cust_acct_site_id = HCSU.cust_acct_site_id;
8459 l_default_info_rec.install_party_site_id := l_party_site_id;
8460 EXCEPTION
8461 WHEN no_data_found THEN
8462 fnd_message.set_name('CSI','CSI_TXN_SITE_USE_INVALID');
8463 fnd_message.set_token('SITE_USE_ID',l_install_site_use_id);
8464 fnd_message.set_token('SITE_USE_CODE','SITE_USE_ID');
8465 fnd_msg_pub.add;
8466 RAISE fnd_api.g_exc_error;
8467 END;
8468 END IF;
8469
8470 -- IF l_order_line_rec.sold_to_org_id is not null THEN
8471 IF nvl(l_end_customer_id,fnd_api.g_miss_num) <> fnd_api.g_miss_num THEN
8472 SELECT party_id
8473 INTO l_owner_party_id
8474 FROM hz_cust_accounts
8475 WHERE cust_account_id = l_end_customer_id;
8476 l_default_info_rec.owner_party_acct_id := l_end_customer_id;
8477 l_default_info_rec.owner_party_id := l_owner_party_id;
8478 END IF;
8479
8480 -- building order line rec to pass it to Update Install Base Procedure
8481 l_p_order_line_rec.header_id := l_order_line_rec.header_id;
8482 l_p_order_line_rec.order_line_id := l_order_line_rec.line_id;
8483 l_p_order_line_rec.inv_item_id := l_order_line_rec.inventory_item_id;
8484 l_p_order_line_rec.inv_org_id := l_order_line_rec.ship_from_org_id;
8485 l_p_order_line_rec.ordered_quantity := l_order_line_rec.ordered_quantity;
8486 l_p_order_line_rec.shipped_quantity := l_order_line_rec.shipped_quantity;
8487 l_p_order_line_rec.fulfilled_quantity:= l_order_line_rec.fulfilled_quantity;
8488 l_p_order_line_rec.fulfillment_date := l_order_line_rec.fulfillment_date;
8489 l_p_order_line_rec.top_model_line_id := l_order_line_rec.top_model_line_id;
8490 l_p_order_line_rec.ato_line_id := l_order_line_rec.ato_line_id;
8491 l_p_order_line_rec.link_to_line_id := l_order_line_rec.link_to_line_id;
8492 l_p_order_line_rec.invoice_to_org_id := l_order_line_rec.invoice_to_org_id;
8493 l_p_order_line_rec.ship_to_org_id := l_order_line_rec.ship_to_org_id;
8494 l_p_order_line_rec.item_type_code := l_order_line_rec.item_type_code;
8495 l_p_order_line_rec.ordered_item := l_order_line_rec.ordered_item;
8496 l_p_order_line_rec.org_id := l_order_line_rec.org_id;
8497
8498 -- For partner ordering.
8499 l_p_order_line_rec.customer_id := l_end_customer_id;
8500 -- For bug 3304668
8501 l_p_order_line_rec.end_customer_id := l_end_customer_id;
8502 -- End bug fix 3304668
8503 l_p_order_line_rec.deliver_to_org_id := l_order_line_rec.deliver_to_org_id;
8504 --l_p_order_line_rec.ib_current_loc := l_ib_current_loc;
8505 l_p_order_line_rec.ib_current_loc_id := l_current_site_use_id; --5147603
8506 --l_p_order_line_rec.ib_install_loc := l_ib_install_loc;
8507 l_p_order_line_rec.ib_install_loc_id := l_install_site_use_id; --5147603
8508 -- Added for partner ordering.
8509 l_p_order_line_rec.sold_from_org_id := l_order_line_rec.sold_from_org_id;
8510 l_p_order_line_rec.sold_to_org_id := l_order_line_rec.sold_to_org_id;
8511 l_p_order_line_rec.agreement_id := l_order_line_rec.agreement_id;
8512 l_p_order_line_rec.ship_to_contact_id:= l_order_line_rec.ship_to_contact_id;
8513 l_p_order_line_rec.invoice_to_contact_id:= l_order_line_rec.invoice_to_contact_id;
8514
8515 l_p_order_line_rec.order_quantity_uom := l_order_line_rec.order_quantity_uom;--fix for bug5589710
8516 l_p_order_line_rec.unit_price := l_order_line_rec.unit_selling_price;
8517
8518
8519 l_error_rec.source_header_ref_id := l_order_header_rec.header_id;
8520 l_error_rec.source_header_ref := l_order_header_rec.order_number;
8521 l_error_rec.source_line_ref_id := p_order_line_id;
8522 l_error_rec.source_line_ref := l_order_line_rec.line_number||'.'||
8523 l_order_line_rec.shipment_number||'.'||
8524 l_order_line_rec.option_number;
8525 l_error_rec.inventory_item_id := l_order_line_rec.inventory_item_id;
8526
8527 debug('Order Information :');
8528 debug(' order_number : '||l_order_header_rec.order_number);
8529 debug(' header_id : '||l_order_header_rec.header_id);
8530 debug(' line_number : '||l_order_line_rec.line_number||'.'
8531 ||l_order_line_rec.shipment_number||'.'
8532 ||l_order_line_rec.option_number);
8533 debug(' ordered_item : '||l_order_line_rec.ordered_item);
8534 debug(' item_type_code : '||l_order_line_rec.item_type_code);
8535 debug(' status : '||l_order_line_rec.flow_status_code);
8536 debug(' inventory_item_id : '||l_order_line_rec.inventory_item_id);
8537 debug(' ship_from_org_id : '||l_order_line_rec.ship_from_org_id);
8538 debug(' ordered_quantity : '||l_order_line_rec.ordered_quantity);
8539 debug(' fulfilled_quantity : '||l_order_line_rec.fulfilled_quantity);
8540 debug(' fulfillment_date : '||l_order_line_rec.fulfillment_date);
8541 debug(' ato_line_id : '||l_order_line_rec.ato_line_id);
8542 debug(' top_model_line_id : '||l_order_line_rec.top_model_line_id);
8543 debug(' link_to_line_id : '||l_order_line_rec.link_to_line_id);
8544
8545 debug(' customer_id : '||l_end_customer_id);
8546 debug(' current_site_use_id: '||l_current_site_use_id);
8547 debug(' current_site_id : '||l_default_info_rec.current_party_site_id);
8548 debug(' install_site_use_id: '||l_install_site_use_id);
8549 debug(' install_site_id : '||l_default_info_rec.install_party_site_id);
8550
8551 get_item_type(
8552 p_item_type_code => l_order_line_rec.item_type_code,
8553 p_line_id => l_order_line_rec.line_id,
8554 p_ato_line_id => l_order_line_rec.ato_line_id,
8555 p_top_model_line_id => l_order_line_rec.top_model_line_id,
8556 x_item_type => l_identified_item_type);
8557
8558 l_default_info_rec.identified_item_type := l_identified_item_type;
8559
8560 dbms_application_info.set_client_info(l_order_line_rec.org_id);
8561
8562 l_om_session_key.session_hdr_id := l_order_line_rec.config_header_id;
8563 l_om_session_key.session_rev_num := l_order_line_rec.config_rev_nbr;
8564 l_om_session_key.session_item_id := l_order_line_rec.configuration_id;
8565
8566 l_macd_processing := csi_interface_pkg.check_macd_processing(
8567 p_config_session_key => l_om_session_key,
8568 x_return_status => l_return_status);
8569
8570 IF l_return_status <> fnd_api.g_ret_sts_success THEN
8571 RAISE fnd_api.g_exc_error;
8572 END IF;
8573
8574 IF l_macd_processing THEN
8575 -- srramakr TSO with Equipment
8576 -- If this is a MACD order for shippable item that was previously unlocked by the RMA process
8577 -- then we need to update the Order line ID for the Item Instance.
8578 --
8579 SELECT nvl(shippable_item_flag ,'N')
8580 INTO l_shippable_item_flag
8581 FROM MTL_SYSTEM_ITEMS_B
8582 WHERE inventory_item_id = l_order_line_rec.inventory_item_id
8583 AND organization_id = l_order_line_rec.ship_from_org_id;
8584 --
8585 IF l_shippable_item_flag = 'Y' THEN
8586 l_ul_instance_rec.instance_id := NULL;
8587 Begin
8588 SELECT changed_instance_id,ctl.transaction_line_id
8589 INTO l_ul_instance_rec.instance_id,l_ul_txn_line_id
8590 FROM CSI_T_TRANSACTION_LINES ctl,
8591 CSI_T_TXN_LINE_DETAILS ctld
8592 WHERE ctl.source_transaction_table = 'CONFIGURATOR'
8593 AND ctl.config_session_hdr_id = l_om_session_key.session_hdr_id
8594 AND ctl.config_session_rev_num = l_om_session_key.session_rev_num
8595 AND ctl.config_session_item_id = l_om_session_key.session_item_id
8596 AND ctld.transaction_line_id = ctl.transaction_line_id
8597 AND ctld.source_transaction_flag = 'Y';
8598 Exception
8599 when no_data_found then
8600 null;
8601 End;
8602 --
8603 IF l_ul_instance_rec.instance_id IS NOT NULL THEN
8604 select object_version_number
8605 into l_ul_instance_rec.object_version_number
8606 from CSI_ITEM_INSTANCES
8607 where instance_id = l_ul_instance_rec.instance_id;
8608 --
8609 l_ul_instance_rec.last_oe_order_line_id := p_order_line_id;
8610 --
8611 l_csi_txn_rec.source_line_ref_id := p_order_line_id;
8612 l_csi_txn_rec.source_line_ref := l_order_line_rec.line_number||'.'||
8613 l_order_line_rec.shipment_number||'.'||
8614 l_order_line_rec.option_number;
8615 l_csi_txn_rec.source_header_ref := l_order_header_rec.order_number;
8616 l_csi_txn_rec.source_header_ref_id := l_p_order_line_rec.header_id;
8617
8618 l_csi_txn_rec.transaction_type_id := csi_interface_pkg.g_macd_txn_type_id; --l_txn_type_id; --bug 5194812
8619
8620 l_csi_txn_rec.transaction_date := sysdate;
8621 l_csi_txn_rec.source_transaction_date := nvl(l_order_line_rec.fulfillment_date, sysdate);
8622 --
8623 debug(' Inside API :csi_item_instance_pub.update_item_instance');
8624 debug(' instance_id : '||l_ul_instance_rec.instance_id);
8625 debug(' Order Line ID : '||l_ul_instance_rec.last_oe_order_line_id);
8626 --
8627 csi_item_instance_pub.update_item_instance(
8628 p_api_version => 1.0,
8629 p_commit => fnd_api.g_false,
8630 p_init_msg_list => fnd_api.g_true,
8631 p_validation_level => fnd_api.g_valid_level_full,
8632 p_instance_rec => l_ul_instance_rec,
8633 p_party_tbl => l_u_parties_tbl,
8634 p_account_tbl => l_u_pty_accts_tbl,
8635 p_org_assignments_tbl => l_u_org_units_tbl,
8636 p_ext_attrib_values_tbl => l_u_ea_values_tbl,
8637 p_pricing_attrib_tbl => l_u_pricing_tbl,
8638 p_asset_assignment_tbl => l_u_assets_tbl,
8639 p_txn_rec => l_csi_txn_rec,
8640 x_instance_id_lst => l_u_instance_ids_list,
8641 x_return_status => l_return_status,
8642 x_msg_count => l_msg_count,
8643 x_msg_data => l_msg_data);
8644 --
8645 IF l_return_status <> fnd_api.g_ret_sts_success THEN
8646 RAISE fnd_api.g_exc_error;
8647 ELSE
8648 UPDATE csi_t_txn_line_details
8649 SET processing_status = 'PROCESSED'
8650 WHERE transaction_line_id = l_ul_txn_line_id;
8651 --
8652 RAISE skip_regular_process;
8653 END IF;
8654 END IF; -- Instance found check
8655 END IF; -- Shippable Item
8656 -- End of TSO with Equipment changes
8657
8658 cz_fulfillment(
8659 p_order_line_id => p_order_line_id,
8660 x_return_status => l_return_status,
8661 x_return_message => l_error_message);
8662
8663 IF l_return_status <> fnd_api.g_ret_sts_success THEN
8664 RAISE fnd_api.g_exc_error;
8665 END IF;
8666
8667 RAISE skip_regular_process;
8668
8669 END IF;
8670
8671 SELECT nvl(shippable_item_flag ,'N'),
8672 nvl(mtl_transactions_enabled_flag, 'N'),
8673 serial_number_control_code,
8674 lot_control_code,
8675 revision_qty_control_code,
8676 location_control_code,
8677 comms_nl_trackable_flag,
8678 bom_item_type,
8679 reservable_type,
8680 pick_components_flag,
8681 primary_uom_code
8682 INTO l_shippable_item_flag,
8683 l_inv_transactable_flag,
8684 l_serial_code,
8685 l_lot_code,
8686 l_revision_control_code,
8687 l_locator_control_code,
8688 l_ib_trackable_flag,
8689 l_bom_item_type,
8690 l_reservable_type,
8691 l_pick_components_flag,
8692 l_primary_uom_code
8693 FROM mtl_system_items
8694 WHERE inventory_item_id = l_order_line_rec.inventory_item_id
8695 AND organization_id = l_order_line_rec.ship_from_org_id;
8696
8697 debug(' serial_code : '||l_serial_code);
8698 debug(' shippable_flag : '||l_shippable_item_flag);
8699 debug(' transactable_flag : '||l_inv_transactable_flag);
8700 debug(' bom_item_type : '||l_bom_item_type);
8701
8702 l_p_order_line_rec.bom_item_type := l_bom_item_type;
8703 l_p_order_line_rec.reservable_type := l_reservable_type;
8704 l_p_order_line_rec.serial_code := l_serial_code;
8705 l_default_info_rec.primary_uom_code := l_primary_uom_code;
8706
8707 l_error_rec.inventory_item_id := l_order_line_rec.inventory_item_id;
8708 l_error_rec.src_serial_num_ctrl_code := l_serial_code;
8709 l_error_rec.src_lot_ctrl_code := l_lot_code;
8710 l_error_rec.src_rev_qty_ctrl_code := l_revision_control_code;
8711 l_error_rec.src_location_ctrl_code := l_locator_control_code;
8712 l_error_rec.comms_nl_trackable_flag := l_ib_trackable_flag;
8713
8714 --assign the values for the csi_txn_rec
8715 l_csi_txn_rec.source_line_ref_id := p_order_line_id;
8716 l_csi_txn_rec.source_line_ref := l_order_line_rec.line_number||'.'||
8717 l_order_line_rec.shipment_number||'.'||
8718 l_order_line_rec.option_number;
8719 l_csi_txn_rec.source_header_ref := l_order_header_rec.order_number;
8720 l_csi_txn_rec.source_header_ref_id := l_p_order_line_rec.header_id;
8721 l_csi_txn_rec.transaction_type_id := l_txn_type_id;
8722 l_csi_txn_rec.transaction_date := sysdate;
8723 l_csi_txn_rec.source_transaction_date := nvl(l_order_line_rec.fulfillment_date, sysdate);
8724 l_csi_txn_rec.transaction_status_code := 'PENDING';
8725 l_ato_rebuild_flag := 'N';
8726
8727 IF l_order_line_rec.item_type_code in ('OPTION', 'CLASS')
8728 AND
8729 l_order_line_rec.ato_line_id is not null
8730 THEN
8731
8732 get_config_info(
8733 p_line_id => l_order_line_rec.line_id,
8734 p_ato_header_id => l_order_line_rec.header_id,
8735 p_ato_line_id => l_order_line_rec.ato_line_id,
8736 px_default_info_rec => l_default_info_rec,
8737 x_config_rec => l_config_rec,
8738 x_return_status => l_return_status);
8739
8740 IF l_return_status <> fnd_api.g_ret_sts_success THEN
8741 RAISE fnd_api.g_exc_error;
8742 END IF;
8743
8744 IF l_order_line_rec.item_type_code = 'CLASS' THEN
8745 IF l_config_rec.make_flag = 'Y' THEN
8746 IF l_config_rec.serial_code IN (2, 5)
8747 OR
8748 l_default_info_rec.identified_item_type = 'ATO_SUB_MODEL'
8749 OR
8750 l_config_rec.sub_config_make_flag = 'Y'
8751 THEN
8752 l_ato_rebuild_flag := 'Y';
8753 END IF;
8754 END IF;
8755 END IF;
8756
8757 --5076453
8758 IF l_default_info_rec.identified_item_type ='ATO_MODEL' AND
8759 l_order_line_rec.item_type_code in ('CLASS') THEN
8760
8761 IF l_order_line_rec.ato_line_id=l_order_line_rec.line_id THEN
8762
8763 SELECT ato_line_id
8764 INTO l_ato_line_id
8765 FROM oe_order_lines_all
8766 WHERE line_id=l_order_line_rec.link_to_line_id;
8767
8768 IF l_ato_line_id IS NULL THEN
8769 l_ato_rebuild_flag :='N';
8770
8771 END IF;
8772 END IF;
8773 END IF;
8774
8775 debug('ato_rebuild_flag : '||l_ato_rebuild_flag);
8776
8777 IF l_config_rec.serial_code IN (2, 5, 6) THEN
8778 get_config_srl_instances(
8779 p_config_rec => l_config_rec,
8780 p_sub_config_flag => 'N',
8781 px_default_info_rec => l_default_info_rec,
8782 px_csi_txn_rec => l_csi_txn_rec,
8783 x_config_instances => l_config_instances,
8784 x_return_status => l_return_status);
8785
8786 IF l_return_status <> fnd_api.g_ret_sts_success THEN
8787 RAISE fnd_api.g_exc_error;
8788 END IF;
8789 END IF;
8790
8791 IF l_order_line_rec.item_type_code = 'OPTION' AND l_inv_transactable_flag = 'Y' THEN
8792
8793 IF l_config_rec.make_flag = 'Y' THEN
8794
8795 process_ato_option_from_wip(
8796 p_order_header_rec => l_order_header_rec,
8797 p_order_line_rec => l_order_line_rec,
8798 p_config_rec => l_config_rec,
8799 p_config_instances => l_config_instances,
8800 px_default_info_rec => l_default_info_rec,
8801 x_wip_processing => l_wip_processing,
8802 x_return_status => l_return_status);
8803
8804 IF l_return_status <> fnd_api.g_ret_sts_success THEN
8805 RAISE fnd_api.g_exc_error;
8806 END IF;
8807
8808 IF l_wip_processing THEN
8809 RAISE skip_regular_process;
8810 END IF;
8811
8812 END IF;
8813
8814 END IF;
8815
8816 -- if configuration is serialized then check if they are re-shippd
8817 IF l_config_rec.serial_code in (2, 5, 6) THEN
8818
8819 IF l_config_instances.COUNT > 0 THEN
8820 check_for_re_shipment(
8821 p_header_id => l_order_line_rec.header_id,
8822 px_config_instances => l_config_instances,
8823 x_reship_found => l_config_reship_found,
8824 x_return_status => l_return_status);
8825
8826 IF l_return_status <> fnd_api.g_ret_sts_success THEN
8827 RAISE fnd_api.g_exc_error;
8828 END IF;
8829 END IF;
8830
8831 IF l_config_reship_found THEN
8832 --assign the values for the csi_txn_rec
8833 -- get_reship_count
8834 get_reship_count(
8835 p_config_instances => l_config_instances,
8836 x_reship_count => l_config_reship_count,
8837 x_return_status => l_return_status);
8838
8839 IF l_config_instances.COUNT > 0 and l_config_reship_count > 0 THEN
8840
8841 l_csi_txn_rec.source_line_ref_id := p_order_line_id;
8842 l_csi_txn_rec.source_line_ref := l_order_line_rec.line_number||'.'||
8843 l_order_line_rec.shipment_number||'.'||
8844 l_order_line_rec.option_number;
8845 l_csi_txn_rec.source_header_ref_id := l_order_line_rec.header_id;
8846 l_csi_txn_rec.source_header_ref := l_order_header_rec.order_number;
8847 l_csi_txn_rec.transaction_type_id := l_txn_type_id;
8848 l_csi_txn_rec.transaction_date := sysdate;
8849 l_csi_txn_rec.source_transaction_date := sysdate ;
8850
8851 FOR l_cf_ind IN l_config_instances.FIRST .. l_config_instances.LAST
8852 LOOP
8853
8854 IF l_config_instances(l_cf_ind).reship_flag = 'Y' THEN
8855
8856 -- get_configs_inrelation_option_instances
8857 get_option_instances(
8858 p_config_instance_id => l_config_instances(l_cf_ind).instance_id,
8859 p_option_item_id => l_order_line_rec.inventory_item_id,
8860 x_option_instances => l_option_instances,
8861 x_return_status => l_return_status);
8862
8863 IF l_return_status <> fnd_api.g_ret_sts_success THEN
8864 RAISE fnd_api.g_exc_error;
8865 END IF;
8866
8867 IF l_option_instances.COUNT > 0 THEN
8868 FOR l_o_ind IN l_option_instances.FIRST .. l_option_instances.LAST
8869 LOOP
8870 -- stamp_om_line
8871 stamp_om_line(
8872 p_instance_id => l_option_instances(l_o_ind).instance_id,
8873 p_order_line_id => p_order_line_id,
8874 px_csi_txn_rec => l_csi_txn_rec,
8875 x_return_status => l_return_status);
8876
8877 IF l_return_status <> fnd_api.g_ret_sts_success THEN
8878 RAISE fnd_api.g_exc_error;
8879 END IF;
8880 END LOOP;
8881 END IF;
8882 END IF;
8883 END LOOP;
8884
8885 END IF;
8886
8887 IF l_config_reship_count > 0 THEN
8888
8889 -- get the ratio between the config item qty and option that is getting fulfilled
8890
8891 l_config_ratio := l_order_line_rec.ordered_quantity/l_config_rec.order_quantity;
8892
8893 l_order_line_rec.fulfilled_quantity :=
8894 l_order_line_rec.fulfilled_quantity - (l_config_ratio * l_config_reship_count);
8895
8896 debug(' config_ratio : '||l_config_ratio);
8897 debug(' fulfilled_quantity : '||l_order_line_rec.fulfilled_quantity);
8898
8899 IF l_order_line_rec.fulfilled_quantity = 0 THEN
8900 RAISE skip_regular_process;
8901 END IF;
8902
8903 END IF;
8904
8905 END IF;
8906 END IF;
8907
8908 END IF;
8909
8910 -- END MARK
8911
8912 -- initialization
8913 l_split_flag := 'N';
8914 l_ratio_split_flag := 'N';
8915 l_ratio_split_qty := 1;
8916
8917 IF l_order_line_rec.fulfilled_quantity > 1 THEN
8918
8919 l_split_flag := nvl(fnd_profile.value('CSI_AUTO_SPLIT_INSTANCE'), 'N');
8920
8921 debug(' auto split profile :'||l_split_flag);
8922
8923 l_ratio_split_flag := 'N';
8924
8925 IF l_serial_code <> 1 THEN
8926 l_split_flag := 'Y';
8927 END IF;
8928
8929 IF l_split_flag <> 'Y' THEN
8930
8931 get_ib_trackable_children(
8932 p_current_line_id => l_order_line_rec.line_id,
8933 p_om_vld_org_id => l_default_info_rec.om_vld_org_id,
8934 x_trackable_line_tbl => l_trk_child_tbl,
8935 x_return_status => l_return_status);
8936
8937 IF l_return_status <> fnd_api.g_ret_sts_success THEN
8938 RAISE fnd_api.g_exc_error;
8939 END IF;
8940
8941 IF l_trk_child_tbl.count > 0 THEN
8942
8943 l_split_flag := 'Y';
8944
8945 ELSE
8946
8947 debug('ib trackable children not found for order line');
8948
8949 get_ib_trackable_parent(
8950 p_current_line_id => l_order_line_rec.line_id,
8951 p_om_vld_org_id => l_default_info_rec.om_vld_org_id,
8952 x_parent_line_rec => l_trk_parent_rec,
8953 x_return_status => l_return_status);
8954
8955 IF l_return_status <> fnd_api.g_ret_sts_success THEN
8956 RAISE fnd_api.g_exc_error;
8957 END IF;
8958
8959 IF nvl(l_trk_parent_rec.line_id,fnd_api.g_miss_num) <> fnd_api.g_miss_num THEN
8960 l_ratio_split_flag := 'Y';
8961 l_split_flag := 'Y';
8962 --fix for bug5096435
8963 IF l_order_line_rec.model_remnant_flag = 'Y' THEN
8964 BEGIN
8965 select sum(ordered_quantity)
8966 into l_order_line_qty
8967 from oe_order_lines_all
8968 where link_to_line_id = l_order_line_rec.link_to_line_id
8969 and inventory_item_id = l_order_line_rec.inventory_item_id
8970 and model_remnant_flag = 'Y';
8971 EXCEPTION
8972 WHEN others THEN
8973 NULL;
8974 END;
8975 l_ratio_split_qty := l_order_line_qty/l_trk_parent_rec.ordered_quantity;
8976 ELSE --end of fix of bug 5096435
8977 l_ratio_split_qty := l_order_line_rec.ordered_quantity/
8978 l_trk_parent_rec.ordered_quantity;
8979 END IF;
8980 debug(' parent child ratio :'||l_ratio_split_qty);
8981 ELSE
8982 debug('ib trackable parent not found for order line');
8983 l_ratio_split_flag := 'N';
8984 l_split_flag := 'N';
8985 END IF;
8986
8987 END IF;
8988
8989 END IF; -- split_flag <> 'Y'
8990
8991 END IF; -- fulfilled_quantity > 1
8992
8993 debug(' split_flag : '||l_split_flag);
8994 debug(' ratio_split_flag : '||l_ratio_split_flag);
8995 debug(' ratio_split_qty : '||l_ratio_split_qty);
8996
8997 l_default_info_rec.split_flag := l_split_flag;
8998 l_default_info_rec.ratio_split_flag := l_ratio_split_flag;
8999 l_default_info_rec.split_ratio := l_ratio_split_qty;
9000
9001 /* the fulfillment event happens once and only once. This happens if all
9002 the shippable items(options/config) are shipped OR if the the line is
9003 short closed. If short closed then the fulfilled quantity can be less
9004 than the ordered quantity.
9005 */
9006
9007 debug(' ordered quantity : '||l_order_line_rec.ordered_quantity);
9008 debug(' fulfilled quantity : '||l_order_line_rec.fulfilled_quantity);
9009
9010 IF l_order_line_rec.fulfilled_quantity < l_order_line_rec.ordered_quantity
9011 THEN
9012 l_partial := TRUE;
9013 END IF;
9014
9015 -- check transaction details exist
9016 l_txn_line_rec.source_transaction_table := l_src_txn_table;
9017 l_txn_line_rec.source_transaction_id := p_order_line_id;
9018
9019 l_found := csi_t_txn_details_pvt.check_txn_details_exist(
9020 p_txn_line_rec => l_txn_line_rec);
9021
9022 l_txn_line_rec.source_transaction_type_id := l_txn_type_id;
9023
9024 IF NOT(l_found) THEN
9025
9026 debug('installation details not found for the order line.');
9027
9028 -- check if this line is eligible for cascade
9029 l_cascade_eligible := 'N';
9030
9031 IF l_order_line_rec.top_model_line_id is not null THEN
9032 BEGIN
9033 SELECT 'Y'
9034 INTO l_cascade_eligible
9035 FROM csi_t_transaction_lines
9036 WHERE source_transaction_table = l_src_txn_table
9037 AND source_transaction_id = l_order_line_rec.top_model_line_id;
9038 EXCEPTION
9039 WHEN others THEN
9040 null;
9041 END;
9042 END IF;
9043
9044 l_cascaded_flag := 'N';
9045
9046 IF l_cascade_eligible = 'Y' THEN
9047
9048 debug('top model line ('||l_order_line_rec.top_model_line_id||') has transaction details.');
9049
9050 SELECT ordered_quantity
9051 INTO l_mdl_ordered_qty
9052 FROM oe_order_lines_all
9053 WHERE line_id = l_order_line_rec.top_model_line_id;
9054
9055 --fix for bug5096435
9056 SELECT sum(ordered_quantity)/l_mdl_ordered_qty
9057 INTO l_qty_ratio
9058 FROM oe_order_lines_all
9059 WHERE link_to_line_id = l_order_line_rec.link_to_line_id
9060 AND inventory_item_id = l_order_line_rec.inventory_item_id;
9061
9062
9063 SELECT to_char(l_order_line_rec.top_model_line_id)||':'||
9064 to_char(l_order_line_rec.line_id)||':'||
9065 to_char(l_order_line_rec.inventory_item_id)||':'||
9066 decode(nvl(l_order_line_rec.item_revision, '###'),
9067 '###', null, l_order_line_rec.item_revision||':')||
9068 to_char(l_qty_ratio)||':'||
9069 l_order_line_rec.order_quantity_uom ||':'||
9070 l_order_line_rec.ordered_quantity --added for bug5096435
9071 INTO l_model_hierarchy
9072 FROM sys.dual;
9073
9074 csi_t_utilities_pvt.cascade_child(
9075 p_data_string => l_model_hierarchy,
9076 x_return_status => l_return_status );
9077
9078 IF l_return_status <> fnd_api.g_ret_sts_success THEN
9079 RAISE fnd_api.g_exc_error;
9080 END IF;
9081
9082 -- call cascade
9083 l_found := TRUE;
9084 l_cascaded_flag := 'Y';
9085
9086 ELSE
9087 l_found := FALSE;
9088 END IF;
9089
9090 END IF;
9091
9092 -- call the get api
9093 IF (l_found) then
9094
9095 BEGIN
9096
9097 SELECT processing_status ,
9098 transaction_line_id
9099 INTO l_processing_status,
9100 l_transaction_line_id
9101 FROM csi_t_transaction_lines
9102 WHERE source_transaction_table = l_src_txn_table
9103 AND source_transaction_id = p_order_line_id;
9104
9105 l_default_info_rec.transaction_line_id := l_transaction_line_id;
9106
9107 IF l_processing_status = 'PROCESSED' THEN
9108 debug('This transaction detail is already PROCESSED.');
9109 fnd_message.set_name('CSI', 'CSI_TXN_SRC_ALREADY_PROCESSED');
9110 fnd_message.set_token('SRC_TBL', l_src_txn_table);
9111 fnd_message.set_token('SRC_ID', p_order_line_id);
9112 fnd_msg_pub.add;
9113 RAISE fnd_api.g_exc_error;
9114 END IF;
9115
9116 UPDATE csi_t_transaction_lines
9117 SET processing_status = 'IN_PROCESS'
9118 WHERE transaction_line_id = l_transaction_line_id;
9119
9120 END;
9121
9122 -- build the txn_query_rec
9123 l_txn_line_query_rec.transaction_line_id := l_transaction_line_id;
9124 l_txn_line_detail_query_rec.transaction_line_id := l_transaction_line_id;
9125 l_txn_line_detail_query_rec.processing_status := 'UNPROCESSED';
9126 l_txn_line_detail_query_rec.source_transaction_flag := 'Y';
9127
9128 csi_t_txn_details_grp.get_transaction_details(
9129 p_api_version => 1,
9130 p_commit => fnd_api.g_false,
9131 p_init_msg_list => fnd_api.g_true,
9132 p_validation_level => fnd_api.g_valid_level_full,
9133 p_txn_line_query_rec => l_txn_line_query_rec,
9134 p_txn_line_detail_query_rec => l_txn_line_detail_query_rec,
9135 x_txn_line_detail_tbl => l_g_line_dtl_tbl,
9136 p_get_parties_flag => fnd_api.g_false,
9137 x_txn_party_detail_tbl => l_g_pty_dtl_tbl,
9138 p_get_pty_accts_flag => fnd_api.g_false,
9139 x_txn_pty_acct_detail_tbl => l_g_pty_acct_tbl,
9140 p_get_ii_rltns_flag => fnd_api.g_true,
9141 x_txn_ii_rltns_tbl => l_g_ii_rltns_tbl,
9142 p_get_org_assgns_flag => fnd_api.g_false,
9143 x_txn_org_assgn_tbl => l_g_org_assgn_tbl,
9144 p_get_ext_attrib_vals_flag => fnd_api.g_false,
9145 x_txn_ext_attrib_vals_tbl => l_g_ext_attrib_tbl,
9146 p_get_csi_attribs_flag => fnd_api.g_false,
9147 x_csi_ext_attribs_tbl => l_g_csi_ea_tbl,
9148 p_get_csi_iea_values_flag => fnd_api.g_false,
9149 x_csi_iea_values_tbl => l_g_csi_eav_tbl,
9150 p_get_txn_systems_flag => fnd_api.g_false,
9151 x_txn_systems_tbl => l_g_txn_systems_tbl,
9152 x_return_status => l_return_status,
9153 x_msg_count => l_msg_count,
9154 x_msg_data => l_msg_data);
9155
9156 IF l_return_status <> fnd_api.g_ret_sts_success THEN
9157 raise fnd_api.g_exc_error;
9158 END IF;
9159
9160 l_txn_line_rec.transaction_line_id := l_transaction_line_id;
9161
9162 /* check if instance reference is found in the user created txn details
9163 this would be for a RMA Fulfillment. Ex Cancelling an extended attribs
9164 for an existing instance etc..
9165 */
9166
9167 IF l_g_line_dtl_tbl.COUNT > 0 THEN
9168 FOR l_ind in l_g_line_dtl_tbl.FIRST..l_g_line_dtl_tbl.LAST
9169 LOOP
9170 IF l_g_line_dtl_tbl(l_ind).instance_exists_flag = 'Y' THEN
9171 l_inst_ref_found := TRUE;
9172 exit;
9173 END IF;
9174 END LOOP;
9175 END IF;
9176
9177 /* go to the end of the program and quit */
9178 IF (l_inst_ref_found) THEN
9179
9180 demo_fulfillment(
9181 p_txn_type_id => l_txn_type_id,
9182 p_order_line_rec => l_order_line_rec,
9183 p_line_dtl_tbl => l_g_line_dtl_tbl,
9184 px_csi_txn_rec => l_csi_txn_rec,
9185 x_return_status => l_return_status);
9186
9187 IF l_return_status <> fnd_api.g_ret_sts_success THEN
9188 RAISE fnd_api.g_exc_error;
9189 END IF;
9190
9191 goto DEMO_FULFILL;
9192
9193 END IF;
9194
9195 ELSE -- [Transaction Detail Not Found]
9196
9197 create_dflt_txn_dtls(
9198 p_order_line_rec => l_order_line_rec,
9199 px_default_info_rec => l_default_info_rec,
9200 x_txn_line_rec => l_txn_line_rec,
9201 x_tld_tbl => l_line_dtl_tbl,
9202 x_tiir_tbl => l_ii_rltns_tbl,
9203 x_return_status => l_return_status);
9204
9205 IF l_return_status <> fnd_api.g_ret_sts_success THEN
9206 RAISE fnd_api.g_exc_error;
9207 END IF;
9208
9209 l_default_info_rec.transaction_line_id := l_txn_line_rec.transaction_line_id;
9210
9211 END IF;
9212
9213 l_p_order_line_rec.trx_line_id := l_txn_line_rec.transaction_line_id;
9214
9215 UPDATE csi_t_transaction_lines
9216 SET processing_status = 'IN_PROCESS'
9217 WHERE transaction_line_id = l_txn_line_rec.transaction_line_id;
9218
9219 /* transaction details found case */
9220 IF (l_found) THEN
9221 l_line_dtl_tbl := l_g_line_dtl_tbl;
9222 l_ii_rltns_tbl := l_g_ii_rltns_tbl;
9223 ELSE
9224 l_line_dtl_tbl := l_line_dtl_tbl;
9225 l_ii_rltns_tbl := l_ii_rltns_tbl;
9226 END IF;
9227
9228
9229 IF l_split_flag = 'Y' THEN
9230 IF l_ratio_split_flag = 'Y' THEN
9231
9232 split_txn_dtls_with_ratio(
9233 p_quantity_ratio => l_ratio_split_qty,
9234 px_line_dtl_tbl => l_line_dtl_tbl,
9235 x_return_status => l_return_status);
9236
9237 IF l_return_status <> fnd_api.g_ret_sts_success THEN
9238 raise fnd_api.g_exc_error;
9239 END IF;
9240
9241 ELSE
9242
9243 split_txn_dtls(
9244 p_line_dtl_tbl => l_line_dtl_tbl,
9245 p_ii_rltns_tbl => l_ii_rltns_tbl,
9246 x_return_status => l_return_status);
9247
9248 IF l_return_status <> fnd_api.g_ret_sts_success THEN
9249 raise fnd_api.g_exc_error;
9250 END IF;
9251
9252 ---added (start) for m-to-m enhancements
9253 csi_utl_pkg.build_txn_relations(
9254 l_line_dtl_tbl,
9255 l_temp_txn_ii_rltns_tbl,
9256 x_return_status);
9257
9258 IF NOT(x_return_status = fnd_api.g_ret_sts_success) THEN
9259 RAISE fnd_api.g_exc_error;
9260 END IF;
9261
9262 IF l_temp_txn_ii_rltns_tbl.count > 0 THEN
9263 csi_t_txn_rltnshps_grp.create_txn_ii_rltns_dtls(
9264 p_api_version => 1.0,
9265 p_commit => fnd_api.g_false,
9266 p_init_msg_list => fnd_api.g_true,
9267 p_validation_level => fnd_api.g_valid_level_full,
9268 px_txn_ii_rltns_tbl => l_temp_txn_ii_rltns_tbl,
9269 x_return_status => x_return_status,
9270 x_msg_count => l_msg_count,
9271 x_msg_data => l_msg_data);
9272
9273 IF NOT(x_return_status = fnd_api.g_ret_sts_success) THEN
9274 raise fnd_api.g_exc_error;
9275 END IF;
9276 END IF ; ---l_temp_txn_ii_rltns_tbl.count>0
9277 ---added (end) for m-to-m enhancements
9278
9279 END IF;
9280 END IF;
9281
9282 IF l_line_dtl_tbl.COUNT > 0 THEN
9283 FOR l_td_ind IN l_line_dtl_tbl.FIRST .. l_line_dtl_tbl.LAST
9284 LOOP
9285 UPDATE csi_t_txn_line_details
9286 SET processing_status = 'IN_PROCESS'
9287 WHERE txn_line_detail_id = l_line_dtl_tbl(l_td_ind).txn_line_detail_id;
9288 END LOOP;
9289 END IF;
9290
9291 debug( 'creating csi transaction for the fulfillment line.');
9292
9293 create_csi_transaction(
9294 px_csi_txn_rec => l_csi_txn_rec,
9295 x_return_status => l_return_status);
9296
9297 IF l_return_status <> fnd_api.g_ret_sts_success THEN
9298 RAISE fnd_api.g_exc_error;
9299 END IF;
9300
9301 debug(' ato_rebuild_flag : '||l_ato_rebuild_flag);
9302
9303 IF l_order_line_rec.item_type_code in ('KIT', 'MODEL', 'CLASS') THEN
9304
9305 IF l_ato_rebuild_flag = 'Y' THEN
9306 rebuild_relation_for_ato(
9307 p_order_line_rec => l_order_line_rec,
9308 p_config_rec => l_config_rec,
9309 p_config_instances => l_config_instances,
9310 px_default_info_rec => l_default_info_rec,
9311 px_csi_txn_rec => l_csi_txn_rec,
9312 x_return_status => l_return_status);
9313
9314 IF l_return_status <> fnd_api.g_ret_sts_success THEN
9315 RAISE fnd_api.g_exc_error;
9316 END IF;
9317 ELSE
9318
9319 /* this routine checks for any relation within the order lines and builds
9320 a ii relation table for the final processor */
9321
9322 debug('Model remnant flag...'||l_order_line_rec.model_remnant_flag);
9323
9324 build_child_relation(
9325 p_order_line_rec => l_order_line_rec,
9326 p_txn_line_rec => l_txn_line_rec,
9327 p_identified_item_type => l_identified_item_type,
9328 px_default_info_rec => l_default_info_rec,
9329 px_csi_txn_rec => l_csi_txn_rec,
9330 x_return_status => l_return_status);
9331
9332 IF l_return_status <> fnd_api.g_ret_sts_success THEN
9333 RAISE fnd_api.g_exc_error;
9334 END IF;
9335
9336 END IF;
9337 END IF;
9338
9339 debug('Model remnant flag...'||l_order_line_rec.model_remnant_flag);
9340
9341
9342 IF nvl(l_order_line_rec.link_to_line_id, fnd_api.g_miss_num) <> fnd_api.g_miss_num THEN
9343
9344 IF l_ato_rebuild_flag = 'N' THEN
9345
9346 build_parent_relation(
9347 p_order_line_rec => l_order_line_rec,
9348 p_txn_line_rec => l_txn_line_rec,
9349 p_split_flag => l_split_flag,
9350 p_identified_item_type => l_identified_item_type,
9351 p_config_rec => l_config_rec,
9352 p_config_instances => l_config_instances,
9353 px_default_info_rec => l_default_info_rec,
9354 px_csi_txn_rec => l_csi_txn_rec,
9355 x_return_status => l_return_status);
9356
9357 IF l_return_status <> fnd_api.g_ret_sts_success THEN
9358 RAISE fnd_api.g_exc_error;
9359 END IF;
9360
9361 END IF;
9362
9363 END IF;
9364
9365 <<DEMO_FULFILL>>
9366
9367 -- get the transaction details for final processing
9368 /* mark all the non source transaction details as 'IN_PROCESS' */
9369
9370 UPDATE csi_t_txn_line_details
9371 SET processing_status = 'IN_PROCESS'
9372 WHERE transaction_line_id = l_txn_line_rec.transaction_line_id
9373 AND source_transaction_flag = 'N';
9374
9375 l_default_info_rec.current_party_site_id := l_current_site_use_id; --5147603
9376 l_default_info_rec.install_party_site_id := l_install_site_use_id; --5147603
9377
9378 query_tld_and_update_ib(
9379 p_order_header_rec => l_order_header_rec,
9380 p_order_line_rec => l_p_order_line_rec, --fix for bug 5589710
9381 px_default_info_rec => l_default_info_rec,
9382 px_csi_txn_rec => l_csi_txn_rec,
9383 px_error_rec => l_error_rec,
9384 x_return_status => l_return_status);
9385
9386 IF l_return_status <> fnd_api.g_ret_sts_success THEN
9387 RAISE fnd_api.g_exc_error;
9388 END IF;
9389
9390 debug('order fulfillment integration successfull for order line_id : '||p_order_line_id);
9391
9392 EXCEPTION
9393 WHEN skip_regular_process THEN
9394 x_return_status := fnd_api.g_ret_sts_success;
9395 WHEN fnd_api.g_exc_error THEN
9396 rollback to order_fulfillment;
9397 x_return_status := fnd_api.g_ret_sts_error;
9398 l_error_message := csi_t_gen_utility_pvt.dump_error_stack;
9399 l_error_rec.error_text := l_error_message;
9400 debug('Error(E) :'||l_error_message);
9401 px_trx_error_rec := l_error_rec;
9402
9403 UPDATE csi_t_transaction_lines
9404 SET processing_status = 'ERROR'
9405 WHERE source_transaction_id = p_order_line_id
9406 AND source_transaction_table = 'OE_ORDER_LINES_ALL';
9407
9408 csi_utl_pkg.update_txn_line_dtl (
9409 p_source_trx_id => p_order_line_id,
9410 p_source_trx_table => 'OE_ORDER_LINES_ALL',
9411 p_api_name => l_api_name,
9412 p_error_message => l_error_message );
9413
9414 WHEN others THEN
9415 rollback to order_fulfillment;
9416 fnd_message.set_name('FND','FND_GENERIC_MESSAGE');
9417 fnd_message.set_token('MESSAGE',substr(sqlerrm,1,540));
9418 fnd_msg_pub.add;
9419
9420 x_return_status := fnd_api.g_ret_sts_error;
9421 l_error_message := csi_t_gen_utility_pvt.dump_error_stack;
9422 l_error_rec.error_text := l_error_message;
9423 debug('Error(O) :'||l_error_message);
9424 px_trx_error_rec := l_error_rec;
9425
9426 UPDATE csi_t_transaction_lines
9427 SET processing_status = 'ERROR'
9428 WHERE source_transaction_id = p_order_line_id
9429 AND source_transaction_table = 'OE_ORDER_LINES_ALL';
9430
9431 csi_utl_pkg.update_txn_line_dtl (
9432 p_source_trx_id => p_order_line_id,
9433 p_source_trx_table => 'OE_ORDER_LINES_ALL',
9434 p_api_name => l_api_name,
9435 p_error_message => l_error_message );
9436
9437 END order_fulfillment;
9438
9439 PROCEDURE construct_txn_dtls(
9440 x_order_shipment_tbl IN OUT NOCOPY csi_order_ship_pub.order_shipment_tbl,
9441 p_order_line_rec IN csi_order_ship_pub.order_line_rec,
9442 p_trackable_parent IN boolean,
9443 x_trx_line_id OUT NOCOPY NUMBER,
9444 x_return_status OUT NOCOPY varchar2)
9445 IS
9446
9447 l_instance_id number;
9448 l_loop_count number := 0;
9449 l_inst_party_id number;
9450 l_ip_account_id number;
9451 l_sub_type_id number;
9452 l_party_site_id number;
9453 l_index number;
9454 l_trx_line_id number;
9455 l_txn_line_rec_exists boolean := FALSE;
9456 l_create_txn_line_dtls boolean := TRUE;
9457
9458 l_c_tld_rec csi_t_datastructures_grp.txn_line_detail_rec ;
9459
9460 l_c_tl_rec csi_t_datastructures_grp.txn_line_rec ;
9461 l_c_tld_tbl csi_t_datastructures_grp.txn_line_detail_tbl;
9462 l_c_tpd_tbl csi_t_datastructures_grp.txn_party_detail_tbl ;
9463 l_c_tpad_tbl csi_t_datastructures_grp.txn_pty_acct_detail_tbl;
9464 l_c_toa_tbl csi_t_datastructures_grp.txn_org_assgn_tbl;
9465 l_c_teav_tbl csi_t_datastructures_grp.txn_ext_attrib_vals_tbl;
9466 l_c_ts_tbl csi_t_datastructures_grp.txn_systems_tbl;
9467 l_c_tiir_tbl csi_t_datastructures_grp.txn_ii_rltns_tbl;
9468
9469 l_continue boolean := TRUE;
9470
9471 l_return_status varchar2(1) := fnd_api.g_ret_sts_success;
9472 l_msg_count number;
9473 l_msg_data varchar2(2000);
9474
9475 l_install_party_site_id number;
9476
9477 BEGIN
9478
9479 /* Initialize API return status to success */
9480 x_return_status := fnd_api.g_ret_sts_success;
9481
9482 api_log('construct_txn_dtls');
9483
9484 /* assign values for the columns in Txn_line_rec */
9485 l_c_tl_rec.source_transaction_id := p_order_line_rec.order_line_id ;
9486 l_c_tl_rec.source_transaction_table := 'OE_ORDER_LINES_ALL';
9487 l_c_tl_rec.source_transaction_type_id := 51;
9488 l_c_tl_rec.processing_status := 'IN_PROCESS';
9489 l_c_tl_rec.object_version_number := 1;
9490
9491 /* getting the default sub type id */
9492 csi_utl_pkg.get_dflt_sub_type_id(
9493 p_transaction_type_id => 51,
9494 x_sub_type_id => l_sub_type_id,
9495 x_return_status => l_return_status);
9496
9497 IF l_return_status <> fnd_api.g_ret_sts_success THEN
9498 raise fnd_api.g_exc_error;
9499 END IF;
9500
9501 /*------------------------------------------------------*/
9502 /* Check if transaction_line_rec exists .If it does not */
9503 /* exist then create the trx_line_rec only */
9504 /*------------------------------------------------------*/
9505
9506 l_continue := TRUE;
9507
9508 LOOP
9509
9510 BEGIN
9511
9512 SELECT transaction_line_id
9513 INTO l_trx_line_id
9514 FROM csi_t_transaction_lines
9515 WHERE source_transaction_id = l_c_tl_rec.source_transaction_id
9516 AND source_transaction_table = l_c_tl_rec.source_transaction_table
9517 AND source_transaction_type_id = l_c_tl_rec.source_transaction_type_id;
9518
9519 l_continue := TRUE;
9520 debug('Transaction Detail-Hdr Found. Ttansaction Line ID :'||l_trx_line_id);
9521
9522 EXCEPTION
9523 WHEN no_data_found THEN
9524 debug('Not Processed. So creating one.');
9525
9526 BEGIN
9527
9528 debug('Transaction Detail-Hdr NOT found. So, creating one.');
9529
9530 csi_t_transaction_lines_pkg.insert_row(
9531 px_transaction_line_id => l_c_tl_rec.transaction_line_id,
9532 p_source_transaction_type_id => l_c_tl_rec.source_transaction_type_id,
9533 p_source_transaction_table => l_c_tl_rec.source_transaction_table,
9534
9535 ---Added (Start) for m-to-m enhancements
9536 p_source_txn_header_id => l_c_tl_rec.source_txn_header_id,
9537 ---Added (End) for m-to-m enhancements
9538 p_source_transaction_id => l_c_tl_rec.source_transaction_id,
9539
9540 -- Added for CZ Integration (Begin)
9541 p_config_session_hdr_id => l_c_tl_rec.config_session_hdr_id ,
9542 p_config_session_rev_num => l_c_tl_rec.config_session_rev_num ,
9543 p_config_session_item_id => l_c_tl_rec.config_session_item_id ,
9544 p_config_valid_status => l_c_tl_rec.config_valid_status ,
9545 p_source_transaction_status => l_c_tl_rec.source_transaction_status ,
9546 -- Added for CZ Integration (End)
9547 p_error_code => l_c_tl_rec.error_code,
9548 p_error_explanation => l_c_tl_rec.error_explanation,
9549 p_processing_status => 'SUBMIT',
9550 p_attribute1 => l_c_tl_rec.attribute1,
9551 p_attribute2 => l_c_tl_rec.attribute2,
9552 p_attribute3 => l_c_tl_rec.attribute3,
9553 p_attribute4 => l_c_tl_rec.attribute4,
9554 p_attribute5 => l_c_tl_rec.attribute5,
9555 p_attribute6 => l_c_tl_rec.attribute6,
9556 p_attribute7 => l_c_tl_rec.attribute7,
9557 p_attribute8 => l_c_tl_rec.attribute8,
9558 p_attribute9 => l_c_tl_rec.attribute9,
9559 p_attribute10 => l_c_tl_rec.attribute10,
9560 p_attribute11 => l_c_tl_rec.attribute11,
9561 p_attribute12 => l_c_tl_rec.attribute12,
9562 p_attribute13 => l_c_tl_rec.attribute13,
9563 p_attribute14 => l_c_tl_rec.attribute14,
9564 p_attribute15 => l_c_tl_rec.attribute15,
9565 p_created_by => fnd_global.user_id,
9566 p_creation_date => sysdate,
9567 p_last_updated_by => fnd_global.user_id,
9568 p_last_update_date => sysdate,
9569 p_last_update_login => fnd_global.login_id,
9570 p_object_version_number => 1.0,
9571 p_context => l_c_tl_rec.context);
9572
9573 l_trx_line_id := l_c_tl_rec.transaction_line_id;
9574 l_continue := TRUE;
9575
9576 EXCEPTION
9577 WHEN dup_val_on_index THEN
9578 debug('DUP_VAL_ON_INDEX detected while creating Transaction Detail-Hdr.');
9579 l_continue := FALSE;
9580 WHEN others THEN
9581
9582 fnd_message.set_name('FND','FND_GENERIC_MESSAGE');
9583 fnd_message.set_token('MESSAGE','insert_row failed '||sqlerrm);
9584 fnd_msg_pub.add;
9585 raise fnd_api.g_exc_error;
9586 END;
9587 END ;
9588 IF l_continue THEN
9589 exit;
9590 END IF;
9591 END LOOP;
9592
9593 x_trx_line_id := l_trx_line_id;
9594
9595 IF x_order_shipment_tbl.count > 0 THEN
9596 FOR i IN x_order_shipment_tbl.FIRST..x_order_shipment_tbl.LAST LOOP
9597
9598 BEGIN
9599 SELECT party_site_id
9600 INTO l_party_site_id
9601 FROM hz_cust_acct_sites_all c,
9602 hz_cust_site_uses_all u
9603 WHERE c.cust_acct_site_id = u.cust_acct_site_id
9604 AND u.site_use_id = x_order_shipment_tbl(i).ib_current_loc_id;
9605 EXCEPTION
9606 WHEN no_data_found THEN
9607 fnd_message.set_name('CSI','CSI_INT_PTY_SITE_MISSING');
9608 fnd_message.set_token('LOCATION_ID', x_order_shipment_tbl(i).ib_current_loc_id);
9609 fnd_msg_pub.add;
9610 raise fnd_api.g_exc_error;
9611 WHEN too_many_rows THEN
9612 fnd_message.set_name('CSI','CSI_INT_MANY_PTY_SITE_FOUND');
9613 fnd_message.set_token('LOCATION_ID', x_order_shipment_tbl(i).ib_current_loc_id);
9614 fnd_msg_pub.add;
9615 raise fnd_api.g_exc_error;
9616 END;
9617
9618 IF x_order_shipment_tbl(i).ib_install_loc is not null
9619 AND
9620 x_order_shipment_tbl(i).ib_install_loc_id is not null
9621 AND
9622 x_order_shipment_tbl(i).ib_install_loc_id <> fnd_api.g_miss_num
9623 THEN
9624 BEGIN
9625 SELECT party_site_id
9626 INTO l_install_party_site_id
9627 FROM hz_cust_acct_sites_all c,
9628 hz_cust_site_uses_all u
9629 WHERE c.cust_acct_site_id = u.cust_acct_site_id
9630 AND u.site_use_id = x_order_shipment_tbl(i).ib_install_loc_id;
9631 EXCEPTION
9632 WHEN no_data_found THEN
9633 fnd_message.set_name('CSI','CSI_INT_PTY_SITE_MISSING');
9634 fnd_message.set_token('LOCATION_ID', x_order_shipment_tbl(i).ib_install_loc_id);
9635 fnd_msg_pub.add;
9636 raise fnd_api.g_exc_error;
9637 WHEN too_many_rows THEN
9638 fnd_message.set_name('CSI','CSI_INT_MANY_PTY_SITE_FOUND');
9639 fnd_message.set_token('LOCATION_ID', x_order_shipment_tbl(i).ib_install_loc_id);
9640 fnd_msg_pub.add;
9641 raise fnd_api.g_exc_error;
9642 END;
9643 END IF;
9644
9645 -- IF p_trackable_parent AND x_order_shipment_tbl(i).shipped_quantity > 1 THEN
9646 -- l_loop_count := x_order_shipment_tbl(i).shipped_quantity;
9647 -- x_order_shipment_tbl(i).shipped_quantity := 1;
9648 -- ELSE
9649 -- l_loop_count := 1;
9650 -- END IF;
9651
9652 -- FOR ind IN 1 .. l_loop_count
9653 -- LOOP
9654
9655 /* Initialize the pl/sql tables */
9656 l_c_tld_tbl.delete;
9657 l_c_tpd_tbl.delete;
9658 l_c_tpad_tbl.delete;
9659 l_c_toa_tbl.delete;
9660 l_c_teav_tbl.delete;
9661 l_c_ts_tbl.delete;
9662 l_c_tiir_tbl.delete;
9663
9664 /* assign values for the columns in Txn_line_details_tbl */
9665 IF ( x_order_shipment_tbl(i).instance_id is not null
9666 AND
9667 x_order_shipment_tbl(i).instance_id <> fnd_api.g_miss_num )
9668 THEN
9669 l_c_tld_tbl(i).instance_id := x_order_shipment_tbl(i).instance_id;
9670 l_c_tld_tbl(i).instance_exists_flag := 'Y';
9671
9672 l_inst_party_id := csi_utl_pkg.get_instance_party_id(x_order_shipment_tbl(i).instance_id);
9673
9674 IF l_inst_party_id = -1 THEN
9675 raise fnd_api.g_exc_error;
9676 END IF;
9677
9678 END IF;
9679
9680 l_c_tld_tbl(i).source_transaction_flag := 'Y';
9681 l_c_tld_tbl(i).sub_type_id := l_sub_type_id ;
9682 l_c_tld_tbl(i).inventory_item_id := x_order_shipment_tbl(i).inventory_item_id ;
9683 l_c_tld_tbl(i).inv_organization_id := x_order_shipment_tbl(i).organization_id ;
9684 l_c_tld_tbl(i).inventory_revision := x_order_shipment_tbl(i).revision ;
9685 l_c_tld_tbl(i).item_condition_id := fnd_api.g_miss_num;
9686 l_c_tld_tbl(i).instance_type_code := fnd_api.g_miss_char;
9687 l_c_tld_tbl(i).quantity := x_order_shipment_tbl(i).shipped_quantity ;
9688 l_c_tld_tbl(i).unit_of_measure := x_order_shipment_tbl(i).transaction_uom ;
9689 l_c_tld_tbl(i).serial_number := x_order_shipment_tbl(i).serial_number;
9690 l_c_tld_tbl(i).lot_number := x_order_shipment_tbl(i).lot_number;
9691 l_c_tld_tbl(i).location_type_code := 'HZ_PARTY_SITES';
9692 l_c_tld_tbl(i).location_id := l_party_site_id;
9693 -- For partner ordering
9694 l_c_tld_tbl(i).install_location_type_code := 'HZ_PARTY_SITES';
9695 l_c_tld_tbl(i).install_location_id := l_install_party_site_id;
9696 -- For partner ordering
9697 l_c_tld_tbl(i).sellable_flag := 'Y';
9698 l_c_tld_tbl(i).object_version_number := 1 ;
9699 l_c_tld_tbl(i).preserve_detail_flag := 'Y';
9700 l_c_tld_tbl(i).processing_status := 'IN_PROCESS';
9701 l_c_tld_tbl(i).active_start_date := x_order_shipment_tbl(i).transaction_date;
9702
9703 IF p_order_line_rec.serial_code <> 1 Then
9704 l_c_tld_tbl(i).mfg_serial_number_flag := 'Y';
9705 l_c_tld_tbl(i).quantity := 1;
9706 ELSE
9707 l_c_tld_tbl(i).mfg_serial_number_flag := 'N';
9708 END IF;
9709
9710 -- l_inst_party_id := csi_utl_pkg.get_instance_party_id(l_instance_id);
9711
9712 -- IF l_inst_party_id = -1 THEN
9713 -- raise fnd_api.g_exc_error;
9714 -- END IF;
9715
9716 /* assign values for the columns in txn_party_detail_tbl*/
9717 l_c_tpd_tbl(i).instance_party_id := l_inst_party_id;
9718 l_c_tpd_tbl(i).party_source_id := x_order_shipment_tbl(i).party_id;
9719 l_c_tpd_tbl(i).party_source_table := 'HZ_PARTIES';
9720 l_c_tpd_tbl(i).relationship_type_code := 'OWNER';
9721 l_c_tpd_tbl(i).contact_flag := 'N';
9722 l_c_tpd_tbl(i).preserve_detail_flag := 'Y';
9723 l_c_tpd_tbl(i).object_version_number := 1;
9724 l_c_tpd_tbl(i).txn_line_details_index := i;
9725
9726 /* get ip_account_id if instance_party_id exist */
9727
9728 IF l_inst_party_id is not null THEN
9729 l_ip_account_id := csi_utl_pkg.get_ip_account_id(l_inst_party_id);
9730
9731 -- /* If ip_account_id is -1 then */
9732 -- /* party account does not exist in IB */
9733
9734 IF l_ip_account_id = -1 THEN
9735 l_ip_account_id := NULL;
9736 debug('Party account not found for instance. create one.. ');
9737 END IF;
9738 END IF;
9739
9740 /* assign values for the columns in txn_pty_acct_dtl_tbl */
9741 l_c_tpad_tbl(i).ip_account_id := l_ip_account_id;
9742 l_c_tpad_tbl(i).account_id := x_order_shipment_tbl(i).party_account_id;
9743 l_c_tpad_tbl(i).bill_to_address_id := x_order_shipment_tbl(i).invoice_to_org_id;
9744 l_c_tpad_tbl(i).ship_to_address_id := x_order_shipment_tbl(i).ship_to_org_id;
9745 l_c_tpad_tbl(i).relationship_type_code := 'OWNER';
9746 l_c_tpad_tbl(i).preserve_detail_flag := 'Y';
9747 l_c_tpad_tbl(i).object_version_number := 1;
9748 l_c_tpad_tbl(i).txn_party_details_index := i;
9749
9750 /*assign values for the columns in x_txn_org_assgn_tbl */
9751 IF nvl(x_order_shipment_tbl(i).sold_from_org_id,fnd_api.g_miss_num) <> fnd_api.g_miss_num
9752 THEN
9753 l_c_toa_tbl(i).txn_operating_unit_id := fnd_api.g_miss_num;
9754 l_c_toa_tbl(i).txn_line_detail_id := fnd_api.g_miss_num;
9755 l_c_toa_tbl(i).instance_ou_id := fnd_api.g_miss_num;
9756 l_c_toa_tbl(i).operating_unit_id := x_order_shipment_tbl(i).sold_from_org_id;
9757 l_c_toa_tbl(i).relationship_type_code := 'SOLD_FROM';
9758 l_c_toa_tbl(i).preserve_detail_flag := 'Y';
9759 l_c_toa_tbl(i).txn_line_details_index := i;
9760 l_c_toa_tbl(i).object_version_number := 1;
9761 END IF;
9762
9763 -- Mark the shipment rec as processed
9764 x_order_shipment_tbl(i).txn_dtls_qty := x_order_shipment_tbl(i).shipped_quantity ;
9765 x_order_shipment_tbl(i).instance_match := 'Y';
9766 x_order_shipment_tbl(i).quantity_match := 'Y';
9767
9768 l_index := i;
9769 l_c_tld_rec := l_c_tld_tbl(i);
9770 l_c_tld_rec.transaction_line_id := l_trx_line_id;
9771
9772 -- call api to create the transaction line details
9773 csi_t_txn_line_dtls_pvt.create_txn_line_dtls(
9774 p_api_version => 1.0 ,
9775 p_commit => fnd_api.g_false,
9776 p_init_msg_list => fnd_api.g_true,
9777 p_validation_level => fnd_api.g_valid_level_none,
9778 p_txn_line_dtl_index => l_index,
9779 p_txn_line_dtl_rec => l_c_tld_rec,
9780 px_txn_party_dtl_tbl => l_c_tpd_tbl,
9781 px_txn_pty_acct_detail_tbl => l_c_tpad_tbl,
9782 px_txn_ii_rltns_tbl => l_c_tiir_tbl,
9783 px_txn_org_assgn_tbl => l_c_toa_tbl,
9784 px_txn_ext_attrib_vals_tbl => l_c_teav_tbl,
9785 x_return_status => l_return_status,
9786 x_msg_count => l_msg_count,
9787 x_msg_data => l_msg_data);
9788
9789 IF l_return_status <> fnd_api.g_ret_sts_success THEN
9790 raise fnd_api.g_exc_error;
9791 END IF;
9792
9793 -- END LOOP;
9794
9795 END LOOP; --end of processing all shipping table
9796 END IF; -- shipping table count > 0
9797
9798 EXCEPTION
9799 WHEN fnd_api.g_exc_error THEN
9800 x_return_status := fnd_api.g_ret_sts_error;
9801 WHEN fnd_api.g_exc_unexpected_error THEN
9802 x_return_status := fnd_api.g_ret_sts_unexp_error;
9803 END construct_txn_dtls;
9804
9805
9806 PROCEDURE logical_drop_ship(
9807 p_mtl_txn_id IN number,
9808 p_message_id IN number,
9809 x_return_status OUT NOCOPY varchar2,
9810 px_trx_error_rec IN OUT NOCOPY csi_datastructures_pub.transaction_error_rec)
9811 IS
9812
9813 l_api_name varchar2(30) := 'logical_drop_ship';
9814 l_txn_line_id number;
9815 l_txn_type_id number := 51;
9816 l_txn_sub_type_id number ;
9817 l_src_txn_table varchar2(30) := 'OE_ORDER_LINES_ALL';
9818 p_order_line_id number;
9819
9820 l_debug_level number;
9821 l_error_message varchar2(2000);
9822 l_return_status varchar2(1) := fnd_api.g_ret_sts_success;
9823 l_msg_data varchar2(2000);
9824 l_msg_count number;
9825
9826 skip_regular_process exception;
9827 l_error_rec csi_datastructures_pub.transaction_error_rec;
9828 l_order_line_rec csi_order_ship_pub.order_line_rec;
9829 x_order_shipment_tbl csi_order_ship_pub.order_shipment_tbl;
9830 l_count number := 0;
9831 l_party_id number;
9832 l_uom_rate number;
9833 l_shipped_qty number;
9834 p_trackable_parent boolean;
9835 x_trx_line_id number;
9836
9837 l_txn_line_rec csi_t_datastructures_grp.txn_line_rec;
9838 l_trx_detail_exist boolean := FALSE;
9839 l_trx_rec csi_datastructures_pub.transaction_rec;
9840
9841 l_exp_instance_rec csi_datastructures_pub.instance_rec;
9842 l_exp_instance_id_lst csi_datastructures_pub.id_tbl;
9843 l_exp_instance_id number;
9844 l_exp_obj_ver_num number;
9845 l_exp_active_end_date date;
9846 l_exp_loc_type_code varchar2(30);
9847
9848 p_instance_rec csi_datastructures_pub.instance_rec;
9849 p_ext_attrib_values_tbl csi_datastructures_pub.extend_attrib_values_tbl;
9850 p_party_tbl csi_datastructures_pub.party_tbl;
9851 p_party_account_tbl csi_datastructures_pub.party_account_tbl;
9852 p_pricing_attrib_tbl csi_datastructures_pub.pricing_attribs_tbl;
9853 p_org_assignments_tbl csi_datastructures_pub.organization_units_tbl;
9854 p_asset_assignment_tbl csi_datastructures_pub.instance_asset_tbl;
9855 p_txn_rec csi_datastructures_pub.transaction_rec;
9856 x_instance_id_lst csi_datastructures_pub.id_tbl;
9857 -- x_return_status varchar2(2000);
9858 x_msg_count number;
9859 x_msg_data varchar2(2000);
9860 t_output varchar2(2000);
9861 t_msg_dummy number;
9862 l_inst_party_id number;
9863
9864 l_inv_transactable_flag varchar2(1);
9865 l_serial_code number;
9866 l_lot_code number;
9867 l_revision_control_code number;
9868 l_locator_control_code number;
9869 l_ib_trackable_flag varchar2(1);
9870 l_shippable_item_flag varchar2(1) := 'N';
9871 l_ship_from_org_id number;
9872
9873
9874 CURSOR mmt_cur(p_mtl_txn_id IN NUMBER) IS
9875 SELECT ool.line_id,
9876 ool.header_id,
9877 ool.item_type_code,
9878 ool.cust_po_number,
9879 ool.line_type_id,
9880 ool.ato_line_id,
9881 ool.top_model_line_id,
9882 ool.link_to_line_id,
9883 NVL(ool.invoice_to_contact_id ,ooh.invoice_to_contact_id ) invoice_to_contact_id ,
9884 NVL(ool.ship_to_contact_id, ooh.ship_to_contact_id) ship_to_contact_id,
9885 NVL(ool.ship_from_org_id, ooh.ship_from_org_id) ship_from_org_id ,
9886 NVL(ool.sold_to_org_id, ooh.sold_to_org_id) sold_to_org_id ,
9887 NVL(ool.sold_from_org_id, ooh.sold_from_org_id) sold_from_org_id ,
9888 NVL(ool.ship_to_org_id, ooh.ship_to_org_id) ship_to_org_id ,
9889 NVL(ool.invoice_to_org_id, ooh.invoice_to_org_id) invoice_to_org_id ,
9890 NVL(ool.deliver_to_org_id, ooh.deliver_to_org_id) deliver_to_org_id ,
9891 ool.ordered_quantity,
9892 ool.shipped_quantity ord_line_shipped_qty,
9893 ool.order_quantity_uom,
9894 mmt.inventory_item_id inventory_item_id,
9895 mmt.organization_id inv_organization_id,
9896 mmt.revision revision,
9897 mmt.subinventory_code subinventory,
9898 mmt.locator_id locator_id,
9899 null lot_number,
9900 mut.serial_number serial_number,
9901 abs(mmt.transaction_quantity) shipped_quantity,
9902 mmt.transaction_uom,
9903 mmt.transaction_date,
9904 msi.lot_control_code,
9905 msi.serial_number_control_code,
9906 msi.reservable_type,
9907 haou.location_id hr_location_id,
9908 msei.location_id subinv_location_id,
9909 to_char(null) ib_owner,
9910 to_number(null) end_customer_id,
9911 to_char(null) ib_install_loc,
9912 to_number(null) ib_install_loc_id,
9913 to_char(null) ib_current_loc,
9914 to_number(null) ib_current_loc_id
9915 FROM oe_order_headers_all ooh,
9916 oe_order_lines_all ool,
9917 mtl_system_items msi,
9918 mtl_unit_transactions mut,
9919 mtl_material_transactions mmt,
9920 mtl_secondary_inventories msei,
9921 hr_all_organization_units haou
9922 WHERE mmt.transaction_id = p_mtl_txn_id
9923 AND mmt.transaction_id = mut.transaction_id(+)
9924 AND msi.organization_id = mmt.organization_id
9925 AND msi.inventory_item_id = mmt.inventory_item_id
9926 AND msi.lot_control_code = 1 -- no lot case
9927 AND mmt.organization_id = haou.organization_id(+)
9928 AND mmt.subinventory_code = msei.secondary_inventory_name(+)
9929 AND mmt.organization_id = msei.organization_id(+)
9930 AND ool.line_id = mmt.trx_source_line_id
9931 AND ooh.header_id = ool.header_id
9932 UNION
9933 SELECT ool.line_id,
9934 ool.header_id,
9935 ool.item_type_code,
9936 ool.cust_po_number,
9937 ool.line_type_id,
9938 ool.ato_line_id,
9939 ool.top_model_line_id,
9940 ool.link_to_line_id,
9941 NVL(ool.invoice_to_contact_id, ooh.invoice_to_contact_id ) invoice_to_contact_id ,
9942 NVL(ool.ship_to_contact_id, ooh.ship_to_contact_id) ship_to_contact_id,
9943 NVL(ool.ship_from_org_id , ooh.ship_from_org_id) ship_from_org_id ,
9944 NVL(ool.sold_to_org_id , ooh.sold_to_org_id) sold_to_org_id ,
9945 NVL(ool.sold_from_org_id, ooh.sold_from_org_id) sold_from_org_id ,
9946 NVL(ool.ship_to_org_id , ooh.ship_to_org_id) ship_to_org_id ,
9947 NVL(ool.invoice_to_org_id, ooh.invoice_to_org_id) invoice_to_org_id ,
9948 NVL(ool.deliver_to_org_id, ooh.deliver_to_org_id) deliver_to_org_id ,
9949 ool.ordered_quantity,
9950 ool.shipped_quantity ord_line_shipped_qty,
9951 ool.order_quantity_uom ,
9952 mmt.inventory_item_id inventory_item_id,
9953 mmt.organization_id inv_organization_id,
9954 mmt.revision revision,
9955 mmt.subinventory_code subinventory,
9956 mmt.locator_id locator_id,
9957 mtln.lot_number lot_number,
9958 mut.serial_number serial_number,
9959 abs(mtln.transaction_quantity) shipped_quantity,
9960 mmt.transaction_uom,
9961 mmt.transaction_date,
9962 msi.lot_control_code,
9963 msi.serial_number_control_code,
9964 msi.reservable_type,
9965 haou.location_id hr_location_id,
9966 msei.location_id subinv_location_id,
9967 to_char(null) ib_owner,
9968 to_number(null) end_customer_id,
9969 to_char(null) ib_install_loc,
9970 to_number(null) ib_install_loc_id,
9971 to_char(null) ib_current_loc,
9972 to_number(null) ib_current_loc_id
9973 FROM oe_order_headers_all ooh,
9974 oe_order_lines_all ool,
9975 mtl_system_items msi,
9976 mtl_unit_transactions mut,
9977 mtl_transaction_lot_numbers mtln,
9978 mtl_material_transactions mmt,
9979 mtl_secondary_inventories msei,
9980 hr_all_organization_units haou
9981 WHERE mmt.transaction_id = p_mtl_txn_id
9982 AND mmt.transaction_id = mtln.transaction_id(+)
9983 AND mtln.serial_transaction_id = mut.transaction_id(+)
9984 AND msi.organization_id = mmt.organization_id
9985 AND msi.inventory_item_id = mmt.inventory_item_id
9986 AND msi.lot_control_code = 2 -- lot control case
9987 AND mmt.organization_id = haou.organization_id(+)
9988 AND mmt.subinventory_code = msei.secondary_inventory_name(+)
9989 AND mmt.organization_id = msei.organization_id(+)
9990 AND mmt.trx_source_line_id = ool.line_id
9991 AND ool.header_id = ooh.header_id;
9992
9993 -- For partner prdering
9994 l_partner_rec oe_install_base_util.partner_order_rec;
9995 l_partner_owner_id NUMBER;
9996 l_partner_owner_acct_id NUMBER;
9997
9998 BEGIN
9999
10000 x_return_status := fnd_api.g_ret_sts_success;
10001 l_error_rec := px_trx_error_rec;
10002
10003 l_debug_level := csi_t_gen_utility_pvt.g_debug_level;
10004
10005 SELECT trx_source_line_id
10006 INTO p_order_line_id
10007 FROM mtl_material_transactions
10008 WHERE transaction_id = p_mtl_txn_id;
10009
10010 csi_t_gen_utility_pvt.build_file_name(
10011 p_file_segment1 => 'csisoful',
10012 p_file_segment2 => p_order_line_id);
10013
10014 api_log(l_api_name);
10015
10016 debug(' Transaction Time :'||to_char(sysdate, 'MM/DD/YY HH24:MI:SS'));
10017 debug(' Transaction Type : Logical Drop Shipment');
10018 debug(' Order Line ID :'||p_order_line_id);
10019
10020 l_error_rec.source_id := p_mtl_txn_id;
10021
10022 /* this routine checks if ib is active */
10023 csi_utility_grp.check_ib_active;
10024
10025 -- Get the order line details
10026 csi_utl_pkg.get_order_line_dtls(
10027 p_mtl_transaction_id => p_mtl_txn_id,
10028 x_order_line_rec => l_order_line_rec,
10029 x_return_status => l_return_status);
10030
10031 IF l_return_status <> fnd_api.g_ret_sts_success THEN
10032 raise fnd_api.g_exc_error;
10033 END IF;
10034
10035 dbms_application_info.set_client_info(l_order_line_rec.org_id);
10036
10037 SELECT ship_from_org_id
10038 INTO l_ship_from_org_id
10039 FROM oe_order_lines_all
10040 WHERE line_id = p_order_line_id;
10041
10042 SELECT nvl(shippable_item_flag ,'N'),
10043 nvl(mtl_transactions_enabled_flag, 'N'),
10044 serial_number_control_code,
10045 lot_control_code,
10046 revision_qty_control_code,
10047 location_control_code,
10048 comms_nl_trackable_flag
10049 INTO l_shippable_item_flag,
10050 l_inv_transactable_flag,
10051 l_serial_code,
10052 l_lot_code,
10053 l_revision_control_code,
10054 l_locator_control_code,
10055 l_ib_trackable_flag
10056 FROM mtl_system_items
10057 WHERE inventory_item_id = l_order_line_rec.inv_item_id
10058 AND organization_id = l_ship_from_org_id;
10059
10060 debug(' serial_control_code :'||l_serial_code);
10061 debug(' shippable_item_flag :'||l_shippable_item_flag);
10062 debug(' transactable_flag :'||l_inv_transactable_flag);
10063
10064 -- added for bug 3441361
10065 l_order_line_rec.serial_code := l_serial_code;
10066
10067 l_error_rec.src_serial_num_ctrl_code := l_serial_code;
10068 l_error_rec.src_lot_ctrl_code := l_lot_code;
10069 l_error_rec.src_rev_qty_ctrl_code := l_revision_control_code;
10070 l_error_rec.src_location_ctrl_code := l_locator_control_code;
10071 l_error_rec.comms_nl_trackable_flag := l_ib_trackable_flag;
10072
10073 l_error_rec.source_header_ref_id := l_order_line_rec.header_id;
10074 l_error_rec.source_header_ref := l_order_line_rec.order_number;
10075 l_error_rec.source_line_ref_id := p_order_line_id;
10076 l_error_rec.source_line_ref := l_order_line_rec.line_number;
10077 l_error_rec.inventory_item_id := l_order_line_rec.inv_item_id;
10078
10079 -- Assign parameters for txn_line_rec
10080 l_txn_line_rec.source_transaction_id := l_order_line_rec.order_line_id;
10081 l_txn_line_rec.source_transaction_table := 'OE_ORDER_LINES_ALL';
10082
10083 -- Check If user entered Transaction Details Exists
10084 l_trx_detail_exist := csi_t_txn_details_grp.check_txn_details_exist(
10085 p_txn_line_rec => l_txn_line_rec );
10086
10087 IF Not l_trx_detail_exist THEN
10088
10089 debug('User entered Transaction details not found');
10090
10091 -- Build Transaction Details.
10092 FOR mmt_rec IN mmt_cur(p_mtl_txn_id) LOOP
10093
10094 l_count := l_count + 1;
10095
10096 -- for partner ordering
10097 OE_INSTALL_BASE_UTIL.get_partner_ord_rec(p_order_line_id => mmt_rec.line_id,
10098 x_partner_order_rec => l_partner_rec);
10099
10100 IF l_partner_rec.IB_OWNER = 'END_CUSTOMER'
10101 THEN
10102 IF l_partner_rec.END_CUSTOMER_ID is null Then
10103 fnd_message.set_name('CSI','CSI_PARTNER_VAL_MISSING');
10104 fnd_msg_pub.add;
10105 raise fnd_api.g_exc_error;
10106 ELSE
10107 mmt_rec.ib_owner := l_partner_rec.ib_owner;
10108 mmt_rec.end_customer_id := l_partner_rec.end_customer_id;
10109 END IF;
10110 ELSIF l_partner_rec.IB_OWNER = 'INSTALL_BASE'
10111 THEN
10112 mmt_rec.ib_owner := l_partner_rec.ib_owner;
10113 mmt_rec.end_customer_id := fnd_api.g_miss_num;
10114 ELSE
10115 mmt_rec.end_customer_id := mmt_rec.sold_to_org_id;
10116 END IF;
10117
10118 IF l_partner_rec.IB_INSTALLED_AT_LOCATION is not null
10119 THEN
10120 mmt_rec.ib_install_loc := l_partner_rec.IB_INSTALLED_AT_LOCATION;
10121 IF mmt_rec.ib_install_loc = 'END_CUSTOMER'
10122 THEN
10123 IF l_partner_rec.end_customer_site_use_id is null
10124 THEN
10125 fnd_message.set_name('CSI','CSI_PARTNER_VAL_MISSING');
10126 fnd_msg_pub.add;
10127 raise fnd_api.g_exc_error;
10128 ELSE
10129 mmt_rec.ib_install_loc_id := l_partner_rec.end_customer_site_use_id;
10130 END IF;
10131 ELSIF mmt_rec.ib_install_loc = 'SHIP_TO'
10132 THEN
10133 IF mmt_rec.ship_to_org_id is null
10134 THEN
10135 fnd_message.set_name('CSI','CSI_PARTNER_VAL_MISSING');
10136 fnd_msg_pub.add;
10137 raise fnd_api.g_exc_error;
10138 ELSE
10139 mmt_rec.ib_install_loc_id := mmt_rec.ship_to_org_id;
10140 END IF;
10141 ELSIF mmt_rec.ib_install_loc = 'SOLD_TO'
10142 THEN
10143 IF l_partner_rec.SOLD_TO_SITE_USE_ID is null -- 3412544 mmt_rec.sold_to_org_id is null
10144 THEN
10145 fnd_message.set_name('CSI','CSI_PARTNER_VAL_MISSING');
10146 fnd_msg_pub.add;
10147 raise fnd_api.g_exc_error;
10148 ELSE
10149 mmt_rec.ib_install_loc_id := l_partner_rec.SOLD_TO_SITE_USE_ID; -- 3412544 mmt_rec.sold_to_org_id;
10150 END IF;
10151 ELSIF mmt_rec.ib_install_loc = 'DELIVER_TO'
10152 THEN
10153 IF mmt_rec.deliver_to_org_id is null
10154 THEN
10155 fnd_message.set_name('CSI','CSI_PARTNER_VAL_MISSING');
10156 fnd_msg_pub.add;
10157 raise fnd_api.g_exc_error;
10158 ELSE
10159 mmt_rec.ib_install_loc_id := mmt_rec.deliver_to_org_id;
10160 END IF;
10161 ELSIF mmt_rec.ib_install_loc = 'BILL_TO'
10162 THEN
10163 IF mmt_rec.invoice_to_org_id is null
10164 THEN
10165 fnd_message.set_name('CSI','CSI_PARTNER_VAL_MISSING');
10166 fnd_msg_pub.add;
10167 raise fnd_api.g_exc_error;
10168 ELSE
10169 mmt_rec.ib_install_loc_id := mmt_rec.invoice_to_org_id;
10170 END IF;
10171 ELSIF mmt_rec.ib_install_loc = 'INSTALL_BASE'
10172 THEN
10173 mmt_rec.ib_install_loc_id := fnd_api.g_miss_num;
10174 END IF;
10175 ELSE
10176 mmt_rec.ib_install_loc_id := mmt_rec.ship_to_org_id;
10177 END IF;
10178
10179 IF l_partner_rec.IB_CURRENT_LOCATION is not null
10180 THEN
10181 mmt_rec.ib_current_loc := l_partner_rec.IB_CURRENT_LOCATION;
10182 IF mmt_rec.ib_current_loc = 'END_CUSTOMER'
10183 THEN
10184 IF l_partner_rec.end_customer_site_use_id is null
10185 THEN
10186 fnd_message.set_name('CSI','CSI_PARTNER_VAL_MISSING');
10187 fnd_msg_pub.add;
10188 raise fnd_api.g_exc_error;
10189 ELSE
10190 mmt_rec.ib_current_loc_id := l_partner_rec.end_customer_site_use_id;
10191 END IF;
10192 ELSIF mmt_rec.ib_current_loc = 'SHIP_TO'
10193 THEN
10194 IF mmt_rec.ship_to_org_id is null
10195 THEN
10196 fnd_message.set_name('CSI','CSI_PARTNER_VAL_MISSING');
10197 fnd_msg_pub.add;
10198 raise fnd_api.g_exc_error;
10199 ELSE
10200 mmt_rec.ib_current_loc_id := mmt_rec.ship_to_org_id;
10201 END IF;
10202 ELSIF mmt_rec.ib_current_loc = 'SOLD_TO'
10203 THEN
10204 IF l_partner_rec.SOLD_TO_SITE_USE_ID is null -- 3412544 mmt_rec.sold_to_org_id is null
10205 THEN
10206 fnd_message.set_name('CSI','CSI_PARTNER_VAL_MISSING');
10207 fnd_msg_pub.add;
10208 raise fnd_api.g_exc_error;
10209 ELSE
10210 mmt_rec.ib_current_loc_id := l_partner_rec.SOLD_TO_SITE_USE_ID; -- 3412544 mmt_rec.sold_to_org_id;
10211 END IF;
10212 ELSIF mmt_rec.ib_current_loc = 'DELIVER_TO'
10213 THEN
10214 IF mmt_rec.deliver_to_org_id is null
10215 THEN
10216 fnd_message.set_name('CSI','CSI_PARTNER_VAL_MISSING');
10217 fnd_msg_pub.add;
10218 raise fnd_api.g_exc_error;
10219 ELSE
10220 mmt_rec.ib_current_loc_id := mmt_rec.deliver_to_org_id;
10221 END IF;
10222 ELSIF mmt_rec.ib_current_loc = 'BILL_TO'
10223 THEN
10224 IF mmt_rec.invoice_to_org_id is null
10225 THEN
10226 fnd_message.set_name('CSI','CSI_PARTNER_VAL_MISSING');
10227 fnd_msg_pub.add;
10228 raise fnd_api.g_exc_error;
10229 ELSE
10230 mmt_rec.ib_current_loc_id := mmt_rec.invoice_to_org_id;
10231 END IF;
10232 ELSIF mmt_rec.ib_current_loc = 'INSTALL_BASE'
10233 THEN
10234 mmt_rec.ib_current_loc_id := fnd_api.g_miss_num;
10235 END IF;
10236 ELSE
10237 mmt_rec.ib_current_loc_id := mmt_rec.ship_to_org_id;
10238 END IF;
10239
10240
10241 csi_utl_pkg.get_party_id(
10242 p_cust_acct_id => mmt_rec.end_customer_id, -- mmt_rec.sold_to_org_id,
10243 x_party_id => l_party_id,
10244 x_return_status => l_return_status);
10245
10246 IF l_return_status <> fnd_api.g_ret_sts_success THEN
10247 raise fnd_api.g_exc_error;
10248 END IF;
10249
10250 debug('Customer_id :'||mmt_rec.end_customer_id); -- mmt_rec.sold_to_org_id);
10251 debug('Party_id :'||l_party_id);
10252
10253 IF l_party_id = -1 THEN
10254 raise fnd_api.g_exc_error;
10255 END IF;
10256
10257 /* Convert the shipped qty to UOM in OM */
10258 inv_convert.inv_um_conversion (
10259 from_unit => mmt_rec.transaction_uom,
10260 to_unit => mmt_rec.order_quantity_uom,
10261 item_id => mmt_rec.inventory_item_id,
10262 uom_rate => l_uom_rate );
10263
10264 debug('UOM Conv Factor :'||l_uom_rate);
10265
10266 IF l_uom_rate = -99999 THEN
10267 debug('inv_convert.inv_um_conversion failed ');
10268 raise fnd_api.g_exc_error;
10269 END IF;
10270
10271 l_shipped_qty := (l_uom_rate * mmt_rec.shipped_quantity);
10272
10273 x_order_shipment_tbl(l_count).line_id := mmt_rec.line_id ;
10274 x_order_shipment_tbl(l_count).header_id := mmt_rec.header_id;
10275 -- x_order_shipment_tbl(l_count).instance_id := l_instance_header_tbl(1).instance_id;
10276 -- x_order_shipment_tbl(l_count).instance_qty := l_instance_header_tbl(1).quantity;
10277 x_order_shipment_tbl(l_count).party_id := l_party_id;
10278 x_order_shipment_tbl(l_count).party_source_table := 'HZ_PARTIES';
10279 x_order_shipment_tbl(l_count).party_account_id := mmt_rec.end_customer_id; -- mmt_rec.sold_to_org_id;
10280 x_order_shipment_tbl(l_count).inventory_item_id := mmt_rec.inventory_item_id ;
10281 x_order_shipment_tbl(l_count).organization_id := mmt_rec.inv_organization_id ;
10282 x_order_shipment_tbl(l_count).revision := mmt_rec.revision;
10283 x_order_shipment_tbl(l_count).subinventory := mmt_rec.subinventory ;
10284 x_order_shipment_tbl(l_count).locator_id := mmt_rec.locator_id ;
10285 x_order_shipment_tbl(l_count).lot_number := mmt_rec.lot_number ;
10286 x_order_shipment_tbl(l_count).serial_number := mmt_rec.serial_number ;
10287 x_order_shipment_tbl(l_count).transaction_uom := mmt_rec.transaction_uom ;
10288 x_order_shipment_tbl(l_count).order_quantity_uom := mmt_rec.order_quantity_uom ;
10289 x_order_shipment_tbl(l_count).invoice_to_org_id := mmt_rec.invoice_to_org_id;
10290 x_order_shipment_tbl(l_count).line_type_id := mmt_rec.line_type_id ;
10291 x_order_shipment_tbl(l_count).ordered_quantity := mmt_rec.ordered_quantity;
10292 x_order_shipment_tbl(l_count).ship_to_contact_id := mmt_rec.ship_to_contact_id;
10293 x_order_shipment_tbl(l_count).ship_to_org_id := mmt_rec.ship_to_org_id ;
10294 x_order_shipment_tbl(l_count).ship_from_org_id := mmt_rec.ship_from_org_id ;
10295 x_order_shipment_tbl(l_count).sold_to_org_id := mmt_rec.sold_to_org_id ;
10296 x_order_shipment_tbl(l_count).sold_from_org_id := mmt_rec.sold_from_org_id ;
10297 x_order_shipment_tbl(l_count).customer_id := mmt_rec.end_customer_id; -- mmt_rec.sold_to_org_id ;
10298 x_order_shipment_tbl(l_count).transaction_date := mmt_rec.transaction_date ;
10299 x_order_shipment_tbl(l_count).item_type_code := mmt_rec.item_type_code ;
10300 x_order_shipment_tbl(l_count).cust_po_number := mmt_rec.cust_po_number ;
10301 x_order_shipment_tbl(l_count).ato_line_id := mmt_rec.ato_line_id ;
10302 x_order_shipment_tbl(l_count).top_model_line_id := mmt_rec.top_model_line_id ;
10303 x_order_shipment_tbl(l_count).link_to_line_id := mmt_rec.link_to_line_id ;
10304 x_order_shipment_tbl(l_count).instance_match := 'N' ;
10305 x_order_shipment_tbl(l_count).quantity_match := 'N' ;
10306 x_order_shipment_tbl(l_count).invoice_to_contact_id := mmt_rec.invoice_to_contact_id ;
10307 x_order_shipment_tbl(l_count).ord_line_shipped_qty := mmt_rec.ord_line_shipped_qty;
10308 -- Added for Partner Ordering.
10309 x_order_shipment_tbl(l_count).ib_install_loc_id := mmt_rec.ib_install_loc_id;
10310 x_order_shipment_tbl(l_count).ib_current_loc_id := mmt_rec.ib_current_loc_id;
10311 x_order_shipment_tbl(l_count).ib_install_loc := mmt_rec.ib_install_loc;
10312 x_order_shipment_tbl(l_count).ib_current_loc := mmt_rec.ib_current_loc;
10313
10314 -- x_order_shipment_tbl(l_count).inst_obj_version_number := l_instance_header_tbl(1).object_version_number;
10315
10316 IF l_serial_code in (2,5,6) THEN
10317 x_order_shipment_tbl(l_count).shipped_quantity := 1;
10318
10319 -- Check if an instance with the same serial number exists as CUST_PROD
10320
10321 BEGIN
10322 SELECT instance_id,
10323 object_version_number,
10324 active_end_date,
10325 location_type_code
10326 INTO l_exp_instance_id,
10327 l_exp_obj_ver_num,
10328 l_exp_active_end_date,
10329 l_exp_loc_type_code
10330 FROM csi_item_instances
10331 WHERE inventory_item_id = mmt_rec.inventory_item_id
10332 AND serial_number = mmt_rec.serial_number;
10333 EXCEPTION
10334 WHEN no_data_found THEN
10335 null;
10336 END;
10337
10338 IF l_exp_instance_id is not null Then
10339 debug('found instance '||l_exp_instance_id||' for Item '||mmt_rec.inventory_item_id||' and serial number '||mmt_rec.serial_number);
10340 -- To do a drop shipment first expire the instance
10341 p_instance_rec.instance_id := l_exp_instance_id;
10342 p_instance_rec.object_version_number := l_exp_obj_ver_num;
10343 p_instance_rec.active_end_date := sysdate;
10344
10345 l_inst_party_id := csi_utl_pkg.get_instance_party_id(l_exp_instance_id);
10346
10347 IF l_inst_party_id = -1 THEN
10348 raise fnd_api.g_exc_error;
10349 END IF;
10350
10351 p_party_tbl(1).instance_party_id := l_inst_party_id;
10352 p_party_tbl(1).instance_id := l_exp_instance_id;
10353 -- p_party_tbl(1).party_source_table := 'HZ_PARTIES';
10354 p_party_tbl(1).party_id := l_party_id;
10355 p_party_tbl(1).relationship_type_code := 'OWNER';
10356 p_party_tbl(1).contact_flag := 'N';
10357
10358 BEGIN
10359 SELECT object_version_number
10360 INTO p_party_tbl(1).object_version_number
10361 FROM csi_i_parties
10362 WHERE instance_party_id = l_inst_party_id;
10363 END;
10364
10365 p_party_account_tbl(1).parent_tbl_index := 1;
10366 p_party_account_tbl(1).instance_party_id := l_inst_party_id;
10367 p_party_account_tbl(1).party_account_id := mmt_rec.end_customer_id; -- mmt_rec.sold_to_org_id;
10368 p_party_account_tbl(1).relationship_type_code := 'OWNER';
10369 p_party_account_tbl(1).bill_to_address := mmt_rec.invoice_to_org_id;
10370 p_party_account_tbl(1).ship_to_address := mmt_rec.ship_to_org_id;
10371
10372 p_txn_rec.transaction_id := fnd_api.g_miss_num;
10373 p_txn_rec.transaction_date := sysdate;
10374 p_txn_rec.source_transaction_date := sysdate;
10375 p_txn_rec.transaction_type_id := l_txn_type_id;
10376
10377 l_trx_rec.transaction_id := fnd_api.g_miss_num;
10378
10379 csi_t_gen_utility_pvt.dump_api_info(
10380 p_api_name => 'update_item_instance',
10381 p_pkg_name => 'csi_item_instance_pub');
10382
10383 csi_item_instance_pub.update_item_instance(
10384 p_api_version => 1.0,
10385 p_commit => fnd_api.g_false,
10386 p_init_msg_list => fnd_api.g_true,
10387 p_validation_level => fnd_api.g_valid_level_full,
10388 p_instance_rec => p_instance_rec,
10389 p_ext_attrib_values_tbl => p_ext_attrib_values_tbl,
10390 p_party_tbl => p_party_tbl,
10391 p_account_tbl => p_party_account_tbl,
10392 p_pricing_attrib_tbl => p_pricing_attrib_tbl,
10393 p_org_assignments_tbl => p_org_assignments_tbl,
10394 p_txn_rec => p_txn_rec,
10395 p_asset_assignment_tbl => p_asset_assignment_tbl,
10396 x_instance_id_lst => x_instance_id_lst,
10397 x_return_status => l_return_status,
10398 x_msg_count => x_msg_count,
10399 x_msg_data => x_msg_data );
10400
10401 IF NOT(l_return_status = fnd_api.g_ret_sts_success) THEN
10402 debug('csi_item_instance_pub.expire_item_instance');
10403 raise fnd_api.g_exc_error;
10404 END IF;
10405
10406 BEGIN
10407 SELECT object_version_number
10408 INTO l_exp_instance_rec.object_version_number
10409 FROM csi_item_instances
10410 WHERE instance_id = l_exp_instance_id;
10411 END;
10412
10413 x_order_shipment_tbl(l_count).instance_id := l_exp_instance_id;
10414 x_order_shipment_tbl(l_count).inst_obj_version_number := l_exp_instance_rec.object_version_number;
10415 END IF;
10416
10417 ELSE
10418 x_order_shipment_tbl(l_count).shipped_quantity := l_shipped_qty;
10419 END IF;
10420
10421
10422 END LOOP;
10423
10424 -- Building Transaction Details
10425 construct_txn_dtls(
10426 x_order_shipment_tbl => x_order_shipment_tbl,
10427 p_order_line_rec => l_order_line_rec,
10428 p_trackable_parent => p_trackable_parent,
10429 x_trx_line_id => x_trx_line_id,
10430 x_return_status => l_return_status );
10431
10432 IF l_return_status <> fnd_api.g_ret_sts_success THEN
10433 raise fnd_api.g_exc_error;
10434 END IF;
10435
10436 ELSE
10437
10438 debug('User entered transaction details found');
10439
10440 -- Check if an instance is refrenced in the source transaction line detail.
10441
10442
10443 END IF;
10444
10445 csi_order_fulfill_pub.order_fulfillment(
10446 p_order_line_id => l_order_line_rec.order_line_id,
10447 p_message_id => null,
10448 x_return_status => l_return_status,
10449 px_trx_error_rec => l_error_rec);
10450
10451 IF l_return_status <> fnd_api.g_ret_sts_success THEN
10452 RAISE fnd_api.g_exc_error;
10453 END IF;
10454
10455
10456
10457 EXCEPTION
10458 WHEN fnd_api.g_exc_error THEN
10459 x_return_status := fnd_api.g_ret_sts_error;
10460 l_error_rec.source_id := p_mtl_txn_id; -- For Bug 4168922
10461 l_error_message := csi_t_gen_utility_pvt.dump_error_stack;
10462 l_error_rec.error_text := l_error_message;
10463 debug('Error(E) :'||l_error_message);
10464 px_trx_error_rec := l_error_rec;
10465
10466 WHEN others THEN
10467 fnd_message.set_name('FND','FND_GENERIC_MESSAGE');
10468 fnd_message.set_token('MESSAGE',substr(sqlerrm,1,540));
10469 fnd_msg_pub.add;
10470
10471 x_return_status := fnd_api.g_ret_sts_error;
10472 l_error_rec.source_id := p_mtl_txn_id; -- For 4168922
10473 l_error_message := csi_t_gen_utility_pvt.dump_error_stack;
10474 l_error_rec.error_text := l_error_message;
10475 debug('Error(O) :'||l_error_message);
10476 px_trx_error_rec := l_error_rec;
10477
10478 END logical_drop_ship;
10479
10480 PROCEDURE order_fulfillment(
10481 p_order_line_id IN number,
10482 p_message_id IN number,
10483 x_return_status OUT NOCOPY varchar2,
10484 x_error_message OUT NOCOPY varchar2)
10485 IS
10486
10487 l_return_status VARCHAR2(1) := fnd_api.g_ret_sts_success;
10488 l_message_id NUMBER;
10489 l_error_code NUMBER;
10490 l_error_message VARCHAR2(4000);
10491
10492 BEGIN
10493
10494 x_return_status := fnd_api.g_ret_sts_success;
10495
10496 csi_ont_txn_pub.PostTransaction(
10497 p_order_line_id => p_order_line_id,
10498 x_message_id => l_message_id,
10499 x_error_code => l_error_code,
10500 x_return_status => l_return_status,
10501 x_error_message => l_error_message);
10502
10503 IF l_return_status <> fnd_api.g_ret_sts_success THEN
10504 RAISE fnd_api.g_exc_error;
10505 END IF;
10506
10507 EXCEPTION
10508 WHEN fnd_api.g_exc_error THEN
10509 x_return_status := fnd_api.g_ret_sts_error;
10510 END order_fulfillment;
10511
10512 /* to be used in the fulfillment workflow for the ib interface */
10513 PROCEDURE fulfill_wf(
10514 itemtype IN VARCHAR2,
10515 itemkey IN VARCHAR2,
10516 actid IN NUMBER,
10517 funcmode IN VARCHAR2,
10518 resultout IN OUT NOCOPY VARCHAR2)
10519 AS
10520
10521 l_order_line_id NUMBER;
10522
10523 l_return_status VARCHAR2(1);
10524 l_message_id NUMBER;
10525 l_error_code NUMBER;
10526 l_error_message VARCHAR2(4000);
10527
10528 BEGIN
10529
10530 IF (funcmode = 'RUN') THEN
10531
10532 l_order_line_id := TO_NUMBER(itemkey);
10533
10534 csi_ont_txn_pub.posttransaction(
10535 p_order_line_id => l_order_line_id,
10536 x_return_status => l_return_status,
10537 x_message_id => l_message_id,
10538 x_error_code => l_error_code,
10539 x_error_message => l_error_message);
10540
10541 IF l_return_status <> Fnd_Api.G_RET_STS_SUCCESS THEN
10542 resultout := 'COMPLETE:N';
10543 RETURN;
10544 ELSE
10545 resultout := 'COMPLETE:Y';
10546 RETURN;
10547 END IF;
10548
10549 END IF; -- End for 'RUN' mode
10550
10551 --
10552 -- CANCEL mode - activity 'compensation'
10553 --
10554 -- This is an event point is called with the effect of the activity must
10555 -- be undone, for example when a process is reset to an earlier point
10556 -- due to a loop back.
10557 --
10558 IF (funcmode = 'CANCEL') THEN
10559
10560 -- your cancel code goes here
10561 NULL;
10562
10563 -- no result needed
10564 resultout := 'COMPLETE';
10565 RETURN;
10566 END IF;
10567
10568
10569 EXCEPTION
10570 WHEN OTHERS THEN
10571 -- The line below records this function call in the error system
10572 -- in the case of an exception.
10573
10574 Wf_Core.context('OEOL', 'IB Integration', itemtype, itemkey, TO_CHAR(actid), funcmode);
10575 RAISE;
10576
10577 END fulfill_wf;
10578
10579 PROCEDURE fulfill_old_line(
10580 p_order_line_id IN NUMBER,
10581 x_return_status OUT NOCOPY VARCHAR2,
10582 x_error_message OUT NOCOPY VARCHAR2)
10583 IS
10584
10585 l_message_id NUMBER;
10586 l_bypass VARCHAR2(1);
10587
10588 l_return_status VARCHAR2(1);
10589 l_error_code VARCHAR2(30);
10590 l_error_message VARCHAR2(2000);
10591 l_error_rec csi_datastructures_pub.transaction_error_rec;
10592
10593 BEGIN
10594
10595 x_return_status := FND_API.G_RET_STS_SUCCESS;
10596
10597 csi_t_gen_utility_pvt.build_file_name(
10598 p_file_segment1 => 'csi',
10599 p_file_segment2 => to_char(sysdate, 'DDMMYY'),
10600 p_file_segment3 => 'invoke');
10601
10602 IF csi_datastructures_pub.g_install_param_rec.fetch_flag IS NULL THEN
10603 csi_gen_utility_pvt.populate_install_param_rec;
10604 END IF;
10605
10606 l_bypass := csi_datastructures_pub.g_install_param_rec.sfm_queue_bypass_flag;
10607
10608 IF l_bypass = 'Y' THEN
10609
10610 csi_t_gen_utility_pvt.add('Bypassing the SDP queue for the order line id: '||p_order_line_id);
10611
10612 csi_inv_txnstub_pkg.execute_trx_dpl(
10613 p_transaction_type => 'CSISOFUL',
10614 p_transaction_id => p_order_line_id,
10615 x_trx_return_status => l_return_status,
10616 x_trx_error_rec => l_error_rec);
10617
10618 IF (l_return_status <> fnd_api.g_ret_sts_success) then
10619 csi_inv_trxs_pkg.log_csi_error(l_error_rec);
10620 END IF;
10621
10622 ELSE
10623
10624 csi_t_gen_utility_pvt.add('Publishing the order line id '||p_order_line_id||' for fulfillment.');
10625
10626 csi_t_gen_utility_pvt.add('Transaction Type :CSISOFUL');
10627 csi_t_gen_utility_pvt.add('Transaction ID :'||p_order_line_id);
10628
10629 XNP_CSISOFUL_U.publish(
10630 xnp$order_line_id => p_order_line_id,
10631 x_message_id => l_message_id,
10632 x_error_code => l_error_code,
10633 x_error_message => l_error_message);
10634
10635 IF (l_error_message is not null) THEN
10636 x_error_message := l_error_message;
10637 RAISE fnd_api.g_exc_error;
10638 END IF;
10639
10640 END IF;
10641
10642 EXCEPTION
10643 WHEN fnd_api.g_exc_error THEN
10644 x_return_status := fnd_api.g_ret_sts_error;
10645 WHEN others THEN
10646 x_return_status := fnd_api.g_ret_sts_unexp_error;
10647 x_error_message := substr(sqlerrm, 1, 255);
10648 END fulfill_old_line;
10649
10650 --
10651 /******************************************************************************
10652 ** Procedure Name : Process_old_order_lines
10653 ** Author : srramakr
10654 **
10655 ** This Procedure is to process the Old Fulfillable order Lines created
10656 ** prior to moving into 11.5.6. The cut-off is check against the Freeze_date in
10657 ** CSI_INSTALL_PARAMETERS. The lines are read from the ASO Queue and validated.
10658 ** Once a line is eligible, we call the Fulfillment API which processes the line
10659 ** and creates the Item Instance.
10660 ********************************************************************************/
10661 --
10662 PROCEDURE process_old_order_lines (
10663 errbuf OUT NOCOPY VARCHAR2,
10664 retcode OUT NOCOPY NUMBER)
10665 IS
10666 l_return_status VARCHAR2(1);
10667 l_msg_count NUMBER;
10668 l_msg_data VARCHAR2(240);
10669 l_msg_index NUMBER;
10670 l_dequeue_mode VARCHAR2(240) DEFAULT DBMS_AQ.REMOVE;
10671 l_navigation VARCHAR2(240) DEFAULT DBMS_AQ.NEXT_MESSAGE;
10672 l_wait NUMBER DEFAULT DBMS_AQ.NO_WAIT;
10673 l_no_more_messages VARCHAR2(240);
10674 l_header_rec OE_Order_PUB.Header_Rec_Type;
10675 l_old_header_rec OE_Order_PUB.Header_Rec_Type;
10676 l_Header_Adj_tbl OE_Order_PUB.Header_Adj_Tbl_Type;
10677 l_old_Header_Adj_tbl OE_Order_PUB.Header_Adj_Tbl_Type;
10678 l_Header_Price_Att_tbl OE_Order_PUB.Header_Price_Att_Tbl_Type;
10679 l_old_Header_Price_Att_tbl OE_Order_PUB.Header_Price_Att_Tbl_Type;
10680 l_Header_Adj_Att_tbl OE_Order_PUB.Header_Adj_Att_Tbl_Type;
10681 l_old_Header_Adj_Att_tbl OE_Order_PUB.Header_Adj_Att_Tbl_Type;
10682 l_Header_Adj_Assoc_tbl OE_Order_PUB.Header_Adj_Assoc_Tbl_Type;
10683 l_old_Header_Adj_Assoc_tbl OE_Order_PUB.Header_Adj_Assoc_Tbl_Type;
10684 l_Header_Scredit_tbl OE_Order_PUB.Header_Scredit_Tbl_Type;
10685 l_old_Header_Scredit_tbl OE_Order_PUB.Header_Scredit_Tbl_Type;
10686 l_line_tbl OE_Order_PUB.Line_Tbl_Type;
10687 l_old_line_tbl OE_Order_PUB.Line_Tbl_Type;
10688 l_Line_Adj_tbl OE_Order_PUB.Line_Adj_Tbl_Type;
10689 l_old_Line_Adj_tbl OE_Order_PUB.Line_Adj_Tbl_Type;
10690 l_Line_Price_Att_tbl OE_Order_PUB.Line_Price_Att_Tbl_Type;
10691 l_old_Line_Price_Att_tbl OE_Order_PUB.Line_Price_Att_Tbl_Type;
10692 l_Line_Adj_Att_tbl OE_Order_PUB.Line_Adj_Att_Tbl_Type;
10693 l_old_Line_Adj_Att_tbl OE_Order_PUB.Line_Adj_Att_Tbl_Type;
10694 l_Line_Adj_Assoc_tbl OE_Order_PUB.Line_Adj_Assoc_Tbl_Type;
10695 l_old_Line_Adj_Assoc_tbl OE_Order_PUB.Line_Adj_Assoc_Tbl_Type;
10696 l_Line_Scredit_tbl OE_Order_PUB.Line_Scredit_Tbl_Type;
10697 l_old_Line_Scredit_tbl OE_Order_PUB.Line_Scredit_Tbl_Type;
10698 l_Lot_Serial_tbl OE_Order_PUB.Lot_Serial_Tbl_Type;
10699 l_old_Lot_Serial_tbl OE_Order_PUB.Lot_Serial_Tbl_Type;
10700 l_action_request_tbl OE_Order_PUB.request_tbl_type;
10701 --
10702 l_exp_line_tbl OE_Order_PUB.Line_Tbl_Type;
10703 l_exp_old_line_tbl OE_Order_PUB.Line_Tbl_Type;
10704 l_exp_count NUMBER;
10705 l_exp_flag VARCHAR2(1);
10706 l_line_count NUMBER;
10707 l_multi_org_flag VARCHAR2(1);
10708 l_organization_id NUMBER;
10709 l_order_line_id VARCHAR2(240);
10710 l_process_profile VARCHAR2(1);
10711 l_freeze_date DATE;
10712 l_error_message VARCHAR2(2000);
10713 v_commit_counter NUMBER := 0;
10714 v_exists VARCHAR2(1);
10715 --
10716 Process_Next EXCEPTION;
10717 ASO_HANDLE_NORMAL EXCEPTION;
10718 ASO_HANDLE_EXCEPTION EXCEPTION;
10719 BEGIN
10720 SAVEPOINT PROCESS_OLD_ORDER_LINES;
10721 --
10722 l_process_profile := fnd_profile.value('CSI_PROCESS_FULFILL_LINES');
10723 --
10724 if l_process_profile is null then
10725 fnd_file.put_line(fnd_file.log,'Profile CSI_PROCESS_FULFILL_LINES is not set');
10726 retcode := 2;
10727 RETURN;
10728 end if;
10729 --
10730 if l_process_profile = 'N' then
10731 fnd_file.put_line(fnd_file.log,'No more lines to be processed...');
10732 RETURN;
10733 end if;
10734 --
10735 -- Get the Date from CSI_INSTALL_PARAMETERS
10736
10737 IF csi_datastructures_pub.g_install_param_rec.fetch_flag IS NULL THEN
10738 csi_gen_utility_pvt.populate_install_param_rec;
10739 END IF;
10740
10741 l_freeze_date := csi_datastructures_pub.g_install_param_rec.freeze_date;
10742
10743 --
10744 -- Get the Multi-org Flag.
10745 l_multi_org_flag := 'X';
10746 Begin
10747 select multi_org_flag
10748 into l_multi_org_flag
10749 from FND_PRODUCT_GROUPS;
10750 Exception
10751 when others then
10752 null;
10753 End;
10754 fnd_file.put_line(fnd_file.log, 'Multi Org Flag is '||l_multi_org_flag);
10755 --
10756 fnd_file.put_line(fnd_file.log,'Processing Regular Queue..');
10757 WHILE(TRUE)
10758 LOOP
10759 BEGIN
10760 l_line_count := 0;
10761 ASO_ORDER_FEEDBACK_PUB.GET_NOTICE (
10762 p_api_version => 1.0,
10763 p_init_msg_list => FND_API.G_TRUE,
10764 p_commit => FND_API.G_FALSE,
10765 x_return_status => l_return_status,
10766 x_msg_count => l_msg_count,
10767 x_msg_data => l_msg_data,
10768 p_app_short_name => 'CS',
10769 p_wait => l_wait,
10770 x_no_more_messages => l_no_more_messages,
10771 x_header_rec => l_header_rec,
10772 x_old_header_rec => l_old_header_rec,
10773 x_Header_Adj_tbl => l_header_adj_tbl,
10774 x_old_Header_Adj_tbl => l_old_header_adj_tbl,
10775 x_Header_price_Att_tbl => l_header_price_att_tbl,
10776 x_old_Header_Price_Att_tbl => l_old_header_price_att_tbl,
10777 x_Header_Adj_Att_tbl => l_header_adj_att_tbl,
10778 x_old_Header_Adj_Att_tbl => l_old_header_adj_att_tbl,
10779 x_Header_Adj_Assoc_tbl => l_header_adj_assoc_tbl,
10780 x_old_Header_Adj_Assoc_tbl => l_old_header_adj_assoc_tbl,
10781 x_Header_Scredit_tbl => l_header_scredit_tbl,
10782 x_old_Header_Scredit_tbl => l_old_header_scredit_tbl,
10783 x_line_tbl => l_line_tbl,
10784 x_old_line_tbl => l_old_line_tbl,
10785 x_Line_Adj_tbl => l_line_adj_tbl,
10786 x_old_Line_Adj_tbl => l_old_line_adj_tbl,
10787 x_Line_Price_Att_tbl => l_line_price_att_tbl,
10788 x_old_Line_Price_Att_tbl => l_old_line_price_att_tbl,
10789 x_Line_Adj_Att_tbl => l_line_adj_att_tbl,
10790 x_old_Line_Adj_Att_tbl => l_old_line_adj_att_tbl,
10791 x_Line_Adj_Assoc_tbl => l_line_adj_assoc_tbl,
10792 x_old_Line_Adj_Assoc_tbl => l_old_line_adj_assoc_tbl,
10793 x_Line_Scredit_tbl => l_line_scredit_tbl,
10794 x_old_Line_Scredit_tbl => l_old_line_scredit_tbl,
10795 x_Lot_Serial_tbl => l_lot_serial_tbl,
10796 x_old_Lot_Serial_tbl => l_old_lot_serial_tbl,
10797 x_action_request_tbl => l_action_request_tbl);
10798 --
10799 IF NOT(l_return_status = FND_API.G_RET_STS_SUCCESS) THEN
10800 retcode := 2;
10801 fnd_file.put_line(fnd_file.log, 'Finished execution in failing to get queue message.');
10802 fnd_file.put_line(fnd_file.output, 'Process Old Order Lines Program finished with error. ');
10803 l_msg_index := 1;
10804 WHILE l_msg_count > 0
10805 LOOP
10806 l_msg_data := FND_MSG_PUB.GET( l_msg_index, FND_API.G_FALSE);
10807 fnd_file.PUT_LINE(fnd_file.log, 'message data = '||l_msg_data);
10808 l_msg_index := l_msg_index + 1;
10809 l_msg_count := l_msg_count - 1;
10810 END LOOP;
10811 ROLLBACK TO PROCESS_OLD_ORDER_LINES;
10812 RETURN;
10813 END IF;
10814 --
10815 EXIT WHEN l_no_more_messages = FND_API.G_TRUE;
10816 --
10817 l_line_count := l_line_tbl.count;
10818
10819 IF l_line_count <= 0 THEN
10820 fnd_file.put_line(fnd_file.log, 'No line info found for this message.');
10821 ELSE
10822 l_exp_count := 0;
10823 l_exp_flag := 'N';
10824 l_exp_line_tbl.delete;
10825 l_exp_old_line_tbl.delete;
10826 --
10827 FOR l_count IN 1..l_line_count
10828 Loop
10829 Begin
10830 l_order_line_id := to_char(l_line_tbl(l_count).line_id);
10831 fnd_file.put_line(fnd_file.log, 'Processing order line with id = '||l_order_line_id);
10832 -- We need to process the order lines which are fulfillable only.
10833 IF ( (WF_ENGINE.ACTIVITY_EXIST_IN_PROCESS(
10834 'OEOL' -- ITEM_TYPE
10835 ,to_char(l_line_tbl(l_count).line_id) -- ITEM_KEY
10836 ,'OEOL' -- ACTIVITY_ITEM_TYPE
10837 ,'SHIP_LINE' -- ACTIVITY
10838 )) OR -- fix for Bug 2818157
10839 NVL(l_line_tbl(l_count).shippable_flag,'N') = 'Y') THEN
10840 fnd_file.put_line(fnd_file.log,'This Line has Shipping Node. Ignoring this line...');
10841 Raise Process_Next;
10842 END IF;
10843 -- Check Fulfillment Event
10844 IF ((l_line_tbl(l_count).fulfilled_quantity > 0) AND
10845 (NVL(l_line_tbl(l_count).fulfilled_quantity,-1) <>
10846 NVL(l_old_line_tbl(l_count).fulfilled_quantity ,-1))) THEN
10847 --
10848 -- Check whether the line creation date is <= CSI Install Parameters Freeze date
10849 IF l_line_tbl(l_count).creation_date > l_freeze_date OR
10850 l_line_tbl(l_count).fulfillment_date < l_freeze_date THEN
10851 fnd_file.put_line(fnd_file.log,'Line creation date is after moving to 11.5.6. Ignoring this Line...');
10852 Raise Process_Next;
10853 END IF;
10854 --
10855 -- Get the Master Organization corresponding to the Order Line ORG ID.
10856 l_organization_id := null;
10857 IF l_multi_org_flag = 'Y' then
10858 Begin
10859
10860 l_organization_id :=
10861 oe_sys_parameters.value(
10862 param_name => 'MASTER_ORGANIZATION_ID',
10863 p_org_id => l_line_tbl(l_count).org_id);
10864
10865 select mp.master_organization_id
10866 into l_organization_id
10867 from MTL_PARAMETERS mp
10868 where mp.organization_id = l_organization_id;
10869
10870 Exception
10871 when others then
10872 fnd_file.put_line(fnd_file.log,'Unable to get Master Organization for ORG ID '
10873 ||to_char(l_line_tbl(l_count).org_id));
10874 l_exp_count := l_exp_count + 1;
10875 l_exp_flag := 'Y';
10876 l_exp_line_tbl(l_exp_count) := l_line_tbl(l_count);
10877 l_exp_old_line_tbl(l_exp_count) := l_old_line_tbl(l_count);
10878 Raise Process_Next;
10879 End;
10880 ELSE -- Non Multi-Org
10881 Begin
10882 l_organization_id :=
10883 oe_sys_parameters.value(
10884 param_name => 'MASTER_ORGANIZATION_ID',
10885 p_org_id => l_line_tbl(l_count).org_id);
10886
10887 select mp.master_organization_id
10888 into l_organization_id
10889 from MTL_PARAMETERS mp
10890 where mp.organization_id = l_organization_id;
10891 Exception
10892 when others then
10893 fnd_file.put_line(fnd_file.log,'Unable to get Master Organization for ORG ID ');
10894 l_exp_count := l_exp_count + 1;
10895 l_exp_flag := 'Y';
10896 l_exp_line_tbl(l_exp_count) := l_line_tbl(l_count);
10897 l_exp_old_line_tbl(l_exp_count) := l_old_line_tbl(l_count);
10898 Raise Process_Next;
10899 End;
10900 END IF;
10901 -- If Master Organization ID is NULL add the line to the Exception queue.
10902 IF l_organization_id is null THEN
10903 fnd_file.put_line(fnd_file.log,'Master organization is NULL for this Order Line');
10904 l_exp_count := l_exp_count + 1;
10905 l_exp_flag := 'Y';
10906 l_exp_line_tbl(l_exp_count) := l_line_tbl(l_count);
10907 l_exp_old_line_tbl(l_exp_count) := l_old_line_tbl(l_count);
10908 Raise Process_Next;
10909 END IF;
10910 -- Check if the item is NL Trackable or not
10911 IF NOT (csi_item_instance_vld_pvt.is_trackable(
10912 p_inv_item_id => l_line_tbl(l_count).inventory_item_id,
10913 p_org_id => l_organization_id))
10914 THEN
10915 fnd_file.put_line(fnd_file.log,'This Item is not NL Trackable. Ignoring this Line.');
10916 Raise Process_Next;
10917 END IF;
10918 --
10919 -- All the above conditions are met and the line is eligible for processing.
10920 fnd_file.put_line(fnd_file.log, 'This line has been fulfilled. Processing this line...');
10921 fulfill_old_line(
10922 p_order_line_id => l_line_tbl(l_count).line_id,
10923 x_return_status => l_return_status,
10924 x_error_message => l_error_message);
10925 IF NOT(l_return_status = FND_API.G_RET_STS_SUCCESS) THEN
10926 fnd_file.put_line(fnd_file.log,'Error while creating the Instance '
10927 ||'----'||l_error_message);
10928 fnd_file.put_line(fnd_file.log,'Please Use the Transaction Re-processing FORM to re-process this line..');
10929 Raise Process_Next;
10930 ELSE
10931 fnd_file.put_line(fnd_file.log,'Fulfillment API returned Success...');
10932 END IF;
10933 ELSE
10934 fnd_file.put_line(fnd_file.log, 'This line has not yet been fulfilled. Ignoring this line');
10935 END IF;
10936 Exception
10937 When Process_Next then
10938 null;
10939 End;
10940 End Loop;
10941 --
10942 IF l_exp_flag = 'Y' THEN
10943 Raise ASO_HANDLE_NORMAL;
10944 END IF;
10945 END IF;
10946 EXCEPTION
10947 When ASO_HANDLE_NORMAL then
10948 fnd_file.put_line(fnd_file.log, 'adding message to exception queue...');
10949 ASO_ORDER_FEEDBACk_PUB.HANDLE_EXCEPTION(
10950 p_api_version => 1.0,
10951 p_init_msg_list => FND_API.G_FALSE,
10952 p_commit => FND_API.G_FALSE,
10953 x_return_status => l_return_status,
10954 x_msg_count => l_msg_count,
10955 x_msg_data => l_msg_data,
10956 p_app_short_name => 'CS',
10957 p_header_rec => l_header_rec,
10958 p_old_header_rec => l_old_header_rec,
10959 p_header_adj_tbl => l_header_adj_tbl,
10960 p_old_header_adj_tbl => l_old_header_adj_tbl,
10961 p_header_price_att_tbl => l_header_price_att_tbl,
10962 p_old_header_price_att_tbl => l_old_header_price_att_tbl,
10963 p_Header_Adj_Att_tbl => l_Header_Adj_Att_tbl,
10964 p_old_Header_Adj_Att_tbl => l_old_Header_Adj_Att_tbl,
10965 p_Header_Adj_Assoc_tbl => l_Header_Adj_Assoc_tbl,
10966 p_old_Header_Adj_Assoc_tbl => l_old_Header_Adj_Assoc_tbl,
10967 p_Header_Scredit_tbl => l_Header_Scredit_tbl,
10968 p_old_Header_Scredit_tbl => l_old_Header_Scredit_tbl,
10969 p_line_tbl => l_exp_line_tbl,
10970 p_old_line_tbl => l_exp_old_line_tbl,
10971 p_Line_Adj_tbl => l_Line_Adj_tbl,
10972 p_old_Line_Adj_tbl => l_old_Line_Adj_tbl,
10973 p_Line_Price_Att_tbl => l_Line_Price_Att_tbl,
10974 p_old_Line_Price_Att_tbl => l_old_Line_Price_Att_tbl,
10975 p_Line_Adj_Att_tbl => l_Line_Adj_Att_tbl,
10976 p_old_Line_Adj_Att_tbl => l_old_Line_Adj_Att_tbl,
10977 p_Line_Adj_Assoc_tbl => l_Line_Adj_Assoc_tbl,
10978 p_old_Line_Adj_Assoc_tbl => l_old_Line_Adj_Assoc_tbl,
10979 p_Line_Scredit_tbl => l_Line_Scredit_tbl,
10980 p_old_Line_Scredit_tbl => l_old_Line_Scredit_tbl,
10981 p_Lot_Serial_tbl => l_Lot_Serial_tbl,
10982 p_old_Lot_Serial_tbl => l_old_Lot_Serial_tbl,
10983 p_action_request_tbl => l_action_request_tbl);
10984 END;
10985 COMMIT;
10986 fnd_file.put_line(fnd_file.log, 'Finished processing one message in the Order Queue');
10987 FND_MSG_PUB.initialize; -- reinit the error messages
10988 END LOOP;
10989 -- End of Processing Regular Queue
10990 fnd_file.put_line(fnd_file.log,'End of Regular Queue Processing ...');
10991 fnd_file.put_line(fnd_file.log,'Processing Exception Queue..');
10992 WHILE(TRUE)
10993 LOOP
10994 BEGIN
10995 l_line_count := 0;
10996 ASO_ORDER_FEEDBACK_PUB.GET_EXCEPTION (
10997 p_api_version => 1.0,
10998 p_init_msg_list => FND_API.G_TRUE,
10999 p_commit => FND_API.G_FALSE,
11000 x_return_status => l_return_status,
11001 x_msg_count => l_msg_count,
11002 x_msg_data => l_msg_data,
11003 p_app_short_name => 'CS',
11004 p_wait => l_wait,
11005 p_dequeue_mode => l_dequeue_mode,
11006 p_navigation => l_navigation,
11007 x_no_more_messages => l_no_more_messages,
11008 x_header_rec => l_header_rec,
11009 x_old_header_rec => l_old_header_rec,
11010 x_Header_Adj_tbl => l_header_adj_tbl,
11011 x_old_Header_Adj_tbl => l_old_header_adj_tbl,
11012 x_Header_price_Att_tbl => l_header_price_att_tbl,
11013 x_old_Header_Price_Att_tbl => l_old_header_price_att_tbl,
11014 x_Header_Adj_Att_tbl => l_header_adj_att_tbl,
11015 x_old_Header_Adj_Att_tbl => l_old_header_adj_att_tbl,
11016 x_Header_Adj_Assoc_tbl => l_header_adj_assoc_tbl,
11017 x_old_Header_Adj_Assoc_tbl => l_old_header_adj_assoc_tbl,
11018 x_Header_Scredit_tbl => l_header_scredit_tbl,
11019 x_old_Header_Scredit_tbl => l_old_header_scredit_tbl,
11020 x_line_tbl => l_line_tbl,
11021 x_old_line_tbl => l_old_line_tbl,
11022 x_Line_Adj_tbl => l_line_adj_tbl,
11023 x_old_Line_Adj_tbl => l_old_line_adj_tbl,
11024 x_Line_Price_Att_tbl => l_line_price_att_tbl,
11025 x_old_Line_Price_Att_tbl => l_old_line_price_att_tbl,
11026 x_Line_Adj_Att_tbl => l_line_adj_att_tbl,
11027 x_old_Line_Adj_Att_tbl => l_old_line_adj_att_tbl,
11028 x_Line_Adj_Assoc_tbl => l_line_adj_assoc_tbl,
11029 x_old_Line_Adj_Assoc_tbl => l_old_line_adj_assoc_tbl,
11030 x_Line_Scredit_tbl => l_line_scredit_tbl,
11031 x_old_Line_Scredit_tbl => l_old_line_scredit_tbl,
11032 x_Lot_Serial_tbl => l_lot_serial_tbl,
11033 x_old_Lot_Serial_tbl => l_old_lot_serial_tbl,
11034 x_action_request_tbl => l_action_request_tbl);
11035 --
11036 IF NOT(l_return_status = FND_API.G_RET_STS_SUCCESS) THEN
11037 retcode := 2;
11038 fnd_file.put_line(fnd_file.log, 'Finished execution in failing to get Exception queue message.');
11039 fnd_file.put_line(fnd_file.output, 'Process Old Order Lines Program finished with error. ');
11040 l_msg_index := 1;
11041 WHILE l_msg_count > 0
11042 LOOP
11043 l_msg_data := FND_MSG_PUB.GET(l_msg_index, FND_API.G_FALSE);
11044 fnd_file.PUT_LINE(fnd_file.log, 'message data = '||l_msg_data);
11045 l_msg_index := l_msg_index + 1;
11046 l_msg_count := l_msg_count - 1;
11047 END LOOP;
11048 ROLLBACK TO PROCESS_OLD_ORDER_LINES;
11049 RETURN;
11050 END IF;
11051 --
11052 EXIT WHEN l_no_more_messages = FND_API.G_TRUE;
11053 --
11054 l_line_count := l_line_tbl.count;
11055
11056 IF l_line_count <= 0 THEN
11057 fnd_file.put_line(fnd_file.log, 'No line info found for this message.');
11058 ELSE
11059 l_exp_count := 0;
11060 l_exp_flag := 'N';
11061 l_exp_line_tbl.delete;
11062 l_exp_old_line_tbl.delete;
11063 --
11064 FOR l_count IN 1..l_line_count
11065 Loop
11066 Begin
11067 l_order_line_id := to_char(l_line_tbl(l_count).line_id);
11068 fnd_file.put_line(fnd_file.log, 'Processing order line with id = '||l_order_line_id);
11069 -- We need to process the order lines which are fulfillable only.
11070 IF ( (WF_ENGINE.ACTIVITY_EXIST_IN_PROCESS(
11071 'OEOL' -- ITEM_TYPE
11072 ,to_char(l_line_tbl(l_count).line_id) -- ITEM_KEY
11073 ,'OEOL' -- ACTIVITY_ITEM_TYPE
11074 ,'SHIP_LINE' -- ACTIVITY
11075 )) AND
11076 NVL(l_line_tbl(l_count).shippable_flag,'N') = 'Y') THEN
11077 fnd_file.put_line(fnd_file.log,'This Line has Shipping Node. Ignoring this line...');
11078 Raise Process_Next;
11079 END IF;
11080 -- Check Fulfillment Event
11081 IF ((l_line_tbl(l_count).fulfilled_quantity > 0) AND
11082 (NVL(l_line_tbl(l_count).fulfilled_quantity,-1) <>
11083 NVL(l_old_line_tbl(l_count).fulfilled_quantity ,-1))) THEN
11084 --
11085 -- Check whether the line creation date is <= CSI Install Parameters Freeze date
11086 IF l_line_tbl(l_count).creation_date > l_freeze_date THEN
11087 fnd_file.put_line(fnd_file.log,'Line creation date is after moving to 11.5.6. Ignoring this Line..');
11088 Raise Process_Next;
11089 END IF;
11090 --
11091 -- Get the Master Organization corresponding to the Order Line ORG ID.
11092 l_organization_id := null;
11093 IF l_multi_org_flag = 'Y' then
11094 Begin
11095 l_organization_id :=
11096 oe_sys_parameters.value(
11097 param_name => 'MASTER_ORGANIZATION_ID',
11098 p_org_id => l_line_tbl(l_count).org_id);
11099
11100 select mp.master_organization_id
11101 into l_organization_id
11102 from MTL_PARAMETERS mp
11103 where mp.organization_id = l_organization_id;
11104 Exception
11105 when others then
11106 fnd_file.put_line(fnd_file.log,'Unable to get Master Organization for ORG ID '
11107 ||to_char(l_line_tbl(l_count).org_id));
11108 l_exp_count := l_exp_count + 1;
11109 l_exp_flag := 'Y';
11110 l_exp_line_tbl(l_exp_count) := l_line_tbl(l_count);
11111 l_exp_old_line_tbl(l_exp_count) := l_old_line_tbl(l_count);
11112 Raise Process_Next;
11113 End;
11114 ELSE -- Non Multi-Org
11115 Begin
11116 l_organization_id :=
11117 oe_sys_parameters.value(
11118 param_name => 'MASTER_ORGANIZATION_ID',
11119 p_org_id => l_line_tbl(l_count).org_id);
11120
11121 select mp.master_organization_id
11122 into l_organization_id
11123 from MTL_PARAMETERS mp
11124 where mp.organization_id = l_organization_id;
11125 Exception
11126 when others then
11127 fnd_file.put_line(fnd_file.log,'Unable to get Master Organization for ORG ID ');
11128 l_exp_count := l_exp_count + 1;
11129 l_exp_flag := 'Y';
11130 l_exp_line_tbl(l_exp_count) := l_line_tbl(l_count);
11131 l_exp_old_line_tbl(l_exp_count) := l_old_line_tbl(l_count);
11132 Raise Process_Next;
11133 End;
11134 END IF;
11135 -- If Master Organization ID is NULL add the line to the Exception queue.
11136 IF l_organization_id is null THEN
11137 fnd_file.put_line(fnd_file.log,'Master organization is NULL for this Order Line');
11138 l_exp_count := l_exp_count + 1;
11139 l_exp_flag := 'Y';
11140 l_exp_line_tbl(l_exp_count) := l_line_tbl(l_count);
11141 l_exp_old_line_tbl(l_exp_count) := l_old_line_tbl(l_count);
11142 Raise Process_Next;
11143 END IF;
11144 -- Check if the item is NL Trackable or not
11145 IF NOT (csi_item_instance_vld_pvt.is_trackable(
11146 p_inv_item_id => l_line_tbl(l_count).inventory_item_id,
11147 p_org_id => l_organization_id)) THEN
11148 fnd_file.put_line(fnd_file.log,'This Line is not NL Trackable. Ignoring this Line.');
11149 Raise Process_Next;
11150 END IF;
11151 --
11152 -- All the above conditions are met and the line is eligible for processing.
11153 fnd_file.put_line(fnd_file.log,'This line has been fulfilled. Processing this line..');
11154 fulfill_old_line(
11155 p_order_line_id => l_line_tbl(l_count).line_id,
11156 x_return_status => l_return_status,
11157 x_error_message => l_error_message);
11158 IF NOT(l_return_status = FND_API.G_RET_STS_SUCCESS) THEN
11159 fnd_file.put_line(fnd_file.log,'Error while creating the Instance '
11160 ||'----'||l_error_message);
11161 fnd_file.put_line(fnd_file.log,'Please Use the Transaction Re-processing FORM to re-process this line..');
11162 Raise Process_Next;
11163 ELSE
11164 fnd_file.put_line(fnd_file.log,'Fulfillment API returned Success...');
11165 END IF;
11166 ELSE
11167 fnd_file.put_line(fnd_file.log, 'This line has not yet been fulfilled. Ignoring this line');
11168 END IF;
11169 Exception
11170 When Process_Next then
11171 null;
11172 End;
11173 End Loop;
11174 --
11175 IF l_exp_flag = 'Y' THEN
11176 Raise ASO_HANDLE_EXCEPTION;
11177 END IF;
11178 END IF;
11179 EXCEPTION
11180 When ASO_HANDLE_EXCEPTION then
11181 fnd_file.put_line(fnd_file.log, 'Adding message to exception queue again ...');
11182 ASO_ORDER_FEEDBACk_PUB.HANDLE_EXCEPTION (
11183 p_api_version => 1.0,
11184 p_init_msg_list => FND_API.G_FALSE,
11185 p_commit => FND_API.G_FALSE,
11186 x_return_status => l_return_status,
11187 x_msg_count => l_msg_count,
11188 x_msg_data => l_msg_data,
11189 p_app_short_name => 'CS',
11190 p_header_rec => l_header_rec,
11191 p_old_header_rec => l_old_header_rec,
11192 p_header_adj_tbl => l_header_adj_tbl,
11193 p_old_header_adj_tbl => l_old_header_adj_tbl,
11194 p_header_price_att_tbl => l_header_price_att_tbl,
11195 p_old_header_price_att_tbl => l_old_header_price_att_tbl,
11196 p_Header_Adj_Att_tbl => l_Header_Adj_Att_tbl,
11197 p_old_Header_Adj_Att_tbl => l_old_Header_Adj_Att_tbl,
11198 p_Header_Adj_Assoc_tbl => l_Header_Adj_Assoc_tbl,
11199 p_old_Header_Adj_Assoc_tbl => l_old_Header_Adj_Assoc_tbl,
11200 p_Header_Scredit_tbl => l_Header_Scredit_tbl,
11201 p_old_Header_Scredit_tbl => l_old_Header_Scredit_tbl,
11202 p_line_tbl => l_exp_line_tbl,
11203 p_old_line_tbl => l_exp_old_line_tbl,
11204 p_Line_Adj_tbl => l_Line_Adj_tbl,
11205 p_old_Line_Adj_tbl => l_old_Line_Adj_tbl,
11206 p_Line_Price_Att_tbl => l_Line_Price_Att_tbl,
11207 p_old_Line_Price_Att_tbl => l_old_Line_Price_Att_tbl,
11208 p_Line_Adj_Att_tbl => l_Line_Adj_Att_tbl,
11209 p_old_Line_Adj_Att_tbl => l_old_Line_Adj_Att_tbl,
11210 p_Line_Adj_Assoc_tbl => l_Line_Adj_Assoc_tbl,
11211 p_old_Line_Adj_Assoc_tbl => l_old_Line_Adj_Assoc_tbl,
11212 p_Line_Scredit_tbl => l_Line_Scredit_tbl,
11213 p_old_Line_Scredit_tbl => l_old_Line_Scredit_tbl,
11214 p_Lot_Serial_tbl => l_Lot_Serial_tbl,
11215 p_old_Lot_Serial_tbl => l_old_Lot_Serial_tbl,
11216 p_action_request_tbl => l_action_request_tbl);
11217 END;
11218 COMMIT;
11219 fnd_file.put_line(fnd_file.log, 'Finished processing one message in the Order Exception Queue');
11220 FND_MSG_PUB.initialize; -- reinit the error messages
11221 END LOOP;
11222 fnd_file.put_line(fnd_file.log,'End of Exception Queue Processing ...');
11223 END Process_old_order_Lines;
11224
11225 --
11226 /************************************************************************************
11227 ** Procedure Name : Update_Profile
11228 ** Author : srramakr
11229 **
11230 ** This Procedure is to update the Profile CSI_PROCESS_FULFILL_LINES to N, so that
11231 ** the Process Old Fulfill Order Lines program does not get executed.
11232 ** It basically checks for fulfillable lines created prior to moving into 11.5.6
11233 ** and not yet fulfilled and still remain open.
11234 ** If the none of the order lines fall in the above category, it updates the profile
11235 ** to N.
11236 **************************************************************************************/
11237 --
11238 PROCEDURE Update_profile (
11239 errbuf OUT NOCOPY VARCHAR2,
11240 retcode OUT NOCOPY NUMBER)
11241 IS
11242 CURSOR OE_LINE_CUR(p_freeze_date DATE) IS
11243 SELECT line_id,inventory_item_id,org_id,shippable_flag
11244 FROM OE_ORDER_LINES_ALL
11245 WHERE creation_date <= p_freeze_date
11246 AND nvl(fulfilled_flag,'N') <> 'Y'
11247 AND open_flag = 'Y';
11248 --
11249 l_freeze_date DATE;
11250 l_organization_id NUMBER;
11251 l_multi_org_flag VARCHAR2(1);
11252 v_ret_counter NUMBER := 0;
11253 l_profile_option_id NUMBER;
11254 --
11255 Process_Next EXCEPTION;
11256 BEGIN
11257 -- Get the Profile Option ID
11258 Begin
11259 select profile_option_id
11260 into l_profile_option_id
11261 from FND_PROFILE_OPTIONS
11262 where upper(profile_option_name) = 'CSI_PROCESS_FULFILL_LINES';
11263 Exception
11264 when no_data_found then
11265 fnd_file.put_line(fnd_file.log,'Unable to find the Profile Option CSI_PROCESS_FULFILL_LINES');
11266 retcode := 2;
11267 RETURN;
11268 End;
11269
11270 -- Get the Date from CSI_INSTALL_PARAMETERS
11271 IF csi_datastructures_pub.g_install_param_rec.fetch_flag IS NULL THEN
11272 csi_gen_utility_pvt.populate_install_param_rec;
11273 END IF;
11274
11275 l_freeze_date := csi_datastructures_pub.g_install_param_rec.freeze_date;
11276
11277 --
11278 l_multi_org_flag := 'X';
11279 Begin
11280 select multi_org_flag
11281 into l_multi_org_flag
11282 from FND_PRODUCT_GROUPS;
11283 Exception
11284 when others then
11285 null;
11286 End;
11287 --
11288 fnd_file.put_line(fnd_file.log, 'Multi Org Flag is '||l_multi_org_flag);
11289 --
11290 For v_rec in OE_LINE_CUR(l_freeze_date)
11291 Loop
11292 Begin
11293 v_ret_counter := 0;
11294 if ( (WF_ENGINE.ACTIVITY_EXIST_IN_PROCESS(
11295 'OEOL' -- ITEM_TYPE
11296 ,to_char(v_rec.line_id) -- ITEM_KEY
11297 ,'OEOL' -- ACTIVITY_ITEM_TYPE
11298 ,'SHIP_LINE' -- ACTIVITY
11299 )) and
11300 nvl(v_rec.shippable_flag,'N') = 'Y' ) then
11301 Raise Process_Next;
11302 end if;
11303 --
11304 -- Get the Master Organization corresponding to the Order Line ORG ID.
11305 IF l_multi_org_flag = 'Y' then
11306 Begin
11307 l_organization_id :=
11308 oe_sys_parameters.value(
11309 param_name => 'MASTER_ORGANIZATION_ID',
11310 p_org_id => v_rec.org_id);
11311
11312 select mp.master_organization_id
11313 into l_organization_id
11314 from MTL_PARAMETERS mp
11315 where mp.organization_id = l_organization_id;
11316 Exception
11317 when others then
11318 fnd_file.put_line(fnd_file.log,'Unable to get Master Organization for ORG ID '
11319 ||to_char(v_rec.org_id));
11320 Raise Process_Next;
11321 End;
11322 ELSE -- Non Multi-Org
11323 Begin
11324 l_organization_id :=
11325 oe_sys_parameters.value(
11326 param_name => 'MASTER_ORGANIZATION_ID',
11327 p_org_id => v_rec.org_id);
11328
11329 select mp.master_organization_id
11330 into l_organization_id
11331 from MTL_PARAMETERS mp
11332 where mp.organization_id = l_organization_id;
11333 Exception
11334 when others then
11335 fnd_file.put_line(fnd_file.log,'Unable to get Master Organization for ORG ID ');
11336 Raise Process_Next;
11337 End;
11338 END IF;
11339 -- Check if the item is NL Trackable or not
11340 IF NOT (csi_item_instance_vld_pvt.is_trackable(
11341 p_inv_item_id => v_rec.inventory_item_id,
11342 p_org_id => l_organization_id)) THEN
11343 Raise Process_Next;
11344 END IF;
11345 v_ret_counter := 1;
11346 fnd_file.put_line(fnd_file.log,'There are still open fulfillable lines...');
11347 exit;
11348 Exception
11349 when Process_Next then
11350 null;
11351 End;
11352 End Loop;
11353 if v_ret_counter = 0 then
11354 fnd_file.put_line(fnd_file.log,'All Old Fulfillable lines have been Processed. Updating the Profile');
11355 -- update the profile
11356 UPDATE fnd_profile_option_values
11357 SET profile_option_value = 'N'
11358 WHERE profile_option_id = l_profile_option_id
11359 AND application_id=542 --fix for the bug 4907945
11360 AND level_id = 10001;
11361 commit;
11362 end if;
11363 END Update_Profile;
11364
11365 END csi_order_fulfill_pub;