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