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