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