DBA Data[Home] [Help]

PACKAGE BODY: APPS.CSI_INTERFACE_PKG

Source


1 PACKAGE BODY csi_interface_pkg AS
2 /* $Header: csipitxb.pls 120.29.12020000.3 2013/03/22 12:02:15 mvaradam ship $ */
3 
4   PROCEDURE debug(
5     p_message     IN varchar2)
6   IS
7   BEGIN
8     csi_t_gen_utility_pvt.add(p_message);
9   END debug;
10 
11   PROCEDURE api_log(
12     p_api_name    IN varchar2)
13   IS
14   BEGIN
15     csi_t_gen_utility_pvt.dump_api_info(
16       p_pkg_name => 'csi_interface_pkg',
17       p_api_name => p_api_name);
18   END api_log;
19 
20   PROCEDURE record_time(
21     p_label IN varchar2)
22   IS
23     l_time varchar2(200);
24   BEGIN
25     l_time := p_label||' Time :'||to_char(sysdate,'HH:MI:SS');
26     debug(l_time);
27   END record_time;
28 
29   PROCEDURE dump_instance_key(
30     p_instance_key            IN  csi_utility_grp.config_instance_key)
31   IS
32     l_rec    csi_utility_grp.config_instance_key;
33   BEGIN
34     l_rec := p_instance_key;
35     debug('configurator instance key  :');
36     debug('  inst_hdr_id              :'||l_rec.inst_hdr_id);
37     debug('  inst_item_id             :'||l_rec.inst_item_id);
38     debug('  inst_rev_num             :'||l_rec.inst_rev_num);
39     debug('  inst_baseline_rev_num    :'||l_rec.inst_baseline_rev_num);
40   END dump_instance_key;
41 
42   PROCEDURE dump_instance_keys(
43     p_instance_keys           IN  csi_utility_grp.config_instance_keys)
44   IS
45   BEGIN
46     IF p_instance_keys.COUNT > 0 THEN
47       FOR l_ind IN p_instance_keys.FIRST .. p_instance_keys.LAST
48       LOOP
49         dump_instance_key(p_instance_keys(l_ind));
50       END LOOP;
51     END IF;
52   END dump_instance_keys;
53 
54   PROCEDURE get_default_sub_type_id(
55     p_transaction_type_id  IN  number,
56     x_sub_type_id          OUT NOCOPY number,
57     x_return_status        OUT NOCOPY varchar2)
58   IS
59   BEGIN
60     x_return_status := fnd_api.g_ret_sts_success;
61     api_log('get_default_sub_type_id');
62 
63     BEGIN
64       SELECT sub_type_id
65       INTO   x_sub_type_id
66       FROM   csi_txn_sub_types
67       WHERE  transaction_type_id = p_transaction_type_id
68       AND    default_flag        = 'Y';
69     EXCEPTION
70       WHEN no_data_found THEN
71         fnd_message.set_name('CSI', 'CSI_DFLT_SUB_TYPE_MISSING');
72         fnd_message.set_token('TXN_TYPE_ID',p_transaction_type_id);
73         fnd_msg_pub.add;
74         RAISE fnd_api.g_exc_error;
75       WHEN too_many_rows THEN
76         fnd_message.set_name('CSI', 'CSI_MANY_DFLT_SUB_TYPES');
77         fnd_message.set_token('TXN_TYPE_ID',p_transaction_type_id);
78         fnd_msg_pub.add;
79         RAISE fnd_api.g_exc_error;
80     END;
81   EXCEPTION
82     WHEN fnd_api.g_exc_error THEN
83       x_return_status := fnd_api.g_ret_sts_error;
84   END get_default_sub_type_id;
85 
86   /* this routine gets the first trackable parent (order line record) from the
87      sales order tree for the current processing order line */
88 
89   PROCEDURE get_ib_trackable_parent(
90     p_source_line_rec    IN  source_line_rec,
91     x_parent_found       OUT NOCOPY boolean,
92     x_parent_line_rec    OUT NOCOPY source_line_rec,
93     x_return_status      OUT NOCOPY varchar2)
94   IS
95 
96     l_org_id              number;
97     l_organization_id     number;
98     l_parent_line_id      number;
99     l_parent_hdr_rec      source_header_rec;
100     l_next_parent_line_id number;
101     l_inventory_item_id   number;
102     l_ib_trackable_flag   varchar2(1) := 'N';
103 
104     l_return_status       varchar2(1) := fnd_api.g_ret_sts_success;
105 
106   BEGIN
107 
108     x_return_status := fnd_api.g_ret_sts_success;
109     api_log('get_ib_trackable_parent');
110 
111     x_parent_found := FALSE;
112 
113     l_parent_line_id := p_source_line_rec.link_to_line_id;
114 
115     LOOP
116 
117       SELECT inventory_item_id ,
118              link_to_line_id ,
119              org_id
120       INTO   l_inventory_item_id ,
121              l_next_parent_line_id,
122              l_org_id
123       FROM   oe_order_lines_all
124       WHERE  line_id = l_parent_line_id;
125 
126       l_organization_id := oe_sys_parameters.value(
127                              param_name => 'MASTER_ORGANIZATION_ID',
128                              p_org_id   => l_org_id);
129 
130       SELECT nvl(msi.comms_nl_trackable_flag, 'N')
131       INTO   l_ib_trackable_flag
132       FROM   mtl_system_items msi
133       WHERE  msi.inventory_item_id = l_inventory_item_id
134       AND    msi.organization_id   = l_organization_id;
135 
136       IF l_ib_trackable_flag = 'Y' THEN
137 
138         get_order_line_source_info(
139           p_order_line_id      => l_parent_line_id,
140           x_source_header_rec  => l_parent_hdr_rec,
141           x_source_line_rec    => x_parent_line_rec,
142           x_return_status      => l_return_status);
143 
144         IF l_return_status <> fnd_api.g_ret_sts_success THEN
145           RAISE fnd_api.g_exc_error;
146         END IF;
147 
148         x_parent_found := TRUE;
149         exit;
150 
151       ELSE
152         l_parent_line_id := l_next_parent_line_id;
153 
154         IF l_parent_line_id IS NULL THEN
155           x_parent_found := FALSE;
156           exit;
157         END IF;
158 
159       END IF;
160     END LOOP;
161   EXCEPTION
162     WHEN fnd_api.g_exc_error THEN
163       x_return_status := fnd_api.g_ret_sts_error;
164   END get_ib_trackable_parent;
165 
166 
167   /* this routine gets the first trackable parent (order line record) that has the
168      installation details from the sales order tree for the current processing
169      order line */
170 
171   PROCEDURE get_parent_with_txn_detail(
172     p_source_line_rec    IN  source_line_rec,
173     x_parent_found       OUT NOCOPY boolean,
174     x_parent_line_rec    OUT NOCOPY source_line_rec,
175     x_return_status      OUT NOCOPY varchar2)
176   IS
177     l_trackable_parent_found       boolean := FALSE;
178     l_parent_line_rec              source_line_rec;
179     l_current_line_rec             source_line_rec;
180     l_txn_line_rec                 csi_t_datastructures_grp.txn_line_rec;
181     l_td_found                     boolean := FALSE;
182     l_return_status                varchar2(1) := fnd_api.g_ret_sts_success;
183   BEGIN
184 
185     x_return_status := fnd_api.g_ret_sts_success;
186 
187     api_log('get_parent_with_txn_detail');
188 
189     l_current_line_rec := p_source_line_rec;
190 
191     LOOP
192 
193       get_ib_trackable_parent(
194         p_source_line_rec    => l_current_line_rec,
195         x_parent_found       => l_trackable_parent_found,
196         x_parent_line_rec    => l_parent_line_rec,
197         x_return_status      => l_return_status);
198 
199       IF l_return_status <> fnd_api.g_ret_sts_success THEN
200         RAISE fnd_api.g_exc_error;
201       END IF;
202 
203       IF NOT(l_trackable_parent_found) THEN
204         x_parent_found := FALSE;
205         exit;
206       END IF;
207 
208       debug('  Parent Line ID :'||l_parent_line_rec.source_line_id);
209 
210       -- check for txn details
211       l_txn_line_rec.source_transaction_table := g_om_source_table;
212       l_txn_line_rec.source_transaction_id    := l_parent_line_rec.source_line_id;
213 
214       l_td_found := csi_t_txn_details_pvt.check_txn_details_exist(
215                    p_txn_line_rec => l_txn_line_rec);
216 
217       IF l_td_found THEN
218         x_parent_found := TRUE;
219         exit;
220       ELSE
221 
222         l_current_line_rec := l_parent_line_rec;
223 
224         IF l_current_line_rec.link_to_line_id is null THEN
225           x_parent_found := FALSE;
226           exit;
227         END IF;
228       END IF;
229 
230     END LOOP;
231 
232     x_parent_line_rec := l_parent_line_rec;
233 
234   EXCEPTION
235     WHEN fnd_api.g_exc_error THEN
236       x_return_status := fnd_api.g_ret_sts_error;
237   END get_parent_with_txn_detail;
238 
239   PROCEDURE query_immediate_children (
240     p_parent_line_id     IN  number,
241     x_line_tbl           OUT NOCOPY source_line_tbl,
242     x_return_status      OUT NOCOPY varchar2)
243   IS
244 
245     l_hdr_rec     source_header_rec;
246     l_line_rec    source_line_rec;
247 
248     l_return_status varchar2(1) := fnd_api.g_ret_sts_success;
249 
250     CURSOR op_cur is
251       SELECT line_id
252       FROM   oe_order_lines_all
253       WHERE  link_to_line_id   = p_parent_line_id
254       ORDER BY line_number, shipment_number;
255 
256   BEGIN
257 
258     x_return_status := fnd_api.g_ret_sts_success;
259     api_log('query_immediate_children');
260 
261     debug('  Getting children for Line ID :'||p_parent_line_id);
262 
263     FOR op_rec IN op_cur
264     LOOP
265 
266       IF op_rec.line_id <> p_parent_line_id THEN
267 
268         get_order_line_source_info(
269           p_order_line_id      => op_rec.line_id,
270           x_source_header_rec  => l_hdr_rec,
271           x_source_line_rec    => l_line_rec,
272           x_return_status      => l_return_status);
273 
274         x_line_tbl(x_line_tbl.COUNT + 1) := l_line_rec;
275 
276       END IF;
277 
278     END LOOP;
279 
280     debug('  Children count :'||x_line_tbl.COUNT);
281 
282   EXCEPTION
283     WHEN fnd_api.g_exc_error THEN
284       x_return_status := fnd_api.g_ret_sts_error;
285   END query_immediate_children;
286 
287   PROCEDURE get_ib_trackable_children(
288     p_current_line_id    IN  number,
289     x_trackable_line_tbl OUT NOCOPY source_line_tbl,
290     x_return_status      OUT NOCOPY varchar2)
291   IS
292 
293     l_organization_id    number;
294     l_line_tbl           source_line_tbl;
295     l_line_tbl_nxt_lvl   source_line_tbl;
296     l_line_tbl_temp      source_line_tbl;
297     l_line_tbl_final     source_line_tbl;
298 
299     l_config_line_rec    source_line_rec;
300 
301     l_nxt_ind            binary_integer;
302     l_final_ind          binary_integer;
303 
304     l_ib_trackable_flag  varchar2(1);
305     l_config_found       boolean := FALSE;
306     l_return_status      varchar2(1) := fnd_api.g_ret_sts_success;
307 
308   BEGIN
309 
310     api_log('get_ib_trackable_children');
311 
312     x_return_status := fnd_api.g_ret_sts_success;
313 
314     l_final_ind := 0;
315 
316     query_immediate_children (
317       p_parent_line_id  => p_current_line_id,
318       x_line_tbl        => l_line_tbl,
319       x_return_status   => l_return_status);
320 
321     LOOP
322 
323       l_line_tbl_nxt_lvl.delete;
324       l_nxt_ind := 0;
325 
326       EXIT when l_line_tbl.count = 0;
327 
328       FOR l_ind IN l_line_tbl.FIRST .. l_line_tbl.LAST
329       LOOP
330 
331         l_organization_id := oe_sys_parameters.value(
332                                param_name => 'MASTER_ORGANIZATION_ID',
333                                p_org_id   => l_line_tbl(l_ind).org_id);
334 
335         SELECT nvl(msi.comms_nl_trackable_flag,'N')
336         INTO   l_ib_trackable_flag
337         FROM   mtl_system_items msi
338         WHERE  msi.inventory_item_id = l_line_tbl(l_ind).inventory_item_id
339         AND    msi.organization_id   = l_organization_id;
340 
341         /* if trackable populate it for the final out table */
342         IF l_ib_trackable_flag = 'Y' THEN
343 
344           l_final_ind := l_final_ind + 1;
345           l_line_tbl_final(l_final_ind) := l_line_tbl(l_ind);
346 
347         ELSE --[NOT Trackable]
348 
349           /* get the next level using this line ID as the parent */
350 
351           query_immediate_children (
352             p_parent_line_id  => l_line_tbl(l_ind).source_line_id,
353             x_line_tbl        => l_line_tbl_temp,
354             x_return_status   => l_return_status);
355 
356           IF l_line_tbl_temp.count > 0 THEN
357             FOR l_temp_ind IN l_line_tbl_temp.FIRST .. l_line_tbl_temp.LAST
358             LOOP
359 
360               l_nxt_ind := l_nxt_ind + 1;
361               l_line_tbl_nxt_lvl (l_nxt_ind) := l_line_tbl_temp(l_temp_ind);
362 
363             END LOOP;
364           END IF;
365 
366         END IF;
367 
368       END LOOP;
369 
370       EXIT WHEN l_line_tbl_nxt_lvl.COUNT = 0;
371 
372       l_line_tbl.DELETE;
373       l_line_tbl := l_line_tbl_nxt_lvl;
374 
375     END LOOP;
376 
377     l_config_found := FALSE;
378 
379     IF l_line_tbl_final.count > 0 THEN
380       FOR l_ind IN l_line_tbl_final.FIRST .. l_line_tbl_final.LAST
381       LOOP
382         IF l_line_tbl_final(l_ind).item_type_code = 'CONFIG' THEN
383           l_config_found := TRUE;
384           l_config_line_rec := l_line_tbl_final(l_ind);
385           exit;
386         END IF;
387       END LOOP;
388     END IF;
389 
390     IF l_config_found THEN
391       x_trackable_line_tbl(1) := l_config_line_rec;
392     ELSE
393       x_trackable_line_tbl := l_line_tbl_final;
394     END IF;
395     debug('  Trackable children count :'||x_trackable_line_tbl.count);
396 
397   EXCEPTION
398     WHEN fnd_api.g_exc_error THEN
399       x_return_status := fnd_api.g_ret_sts_success;
400   END  get_ib_trackable_children;
401 
402   --
403   --
404   --
405   PROCEDURE cascade_txn_detail(
406     p_parent_line_rec     IN  source_line_rec,
407     p_child_line_rec      IN  source_line_rec,
408     x_txn_line_detail_tbl OUT NOCOPY csi_t_datastructures_grp.txn_line_detail_tbl,
409     x_txn_party_tbl       OUT NOCOPY csi_t_datastructures_grp.txn_party_detail_tbl,
410     x_txn_party_acct_tbl  OUT NOCOPY csi_t_datastructures_grp.txn_pty_acct_detail_tbl,
411     x_txn_org_assgn_tbl   OUT NOCOPY csi_t_datastructures_grp.txn_org_assgn_tbl,
412     x_return_status       OUT NOCOPY varchar2)
413   IS
414 
415     l_txn_line_query_rec         csi_t_datastructures_grp.txn_line_query_rec;
416     l_txn_line_detail_query_rec  csi_t_datastructures_grp.txn_line_detail_query_rec;
417 
418     l_g_line_dtl_tbl       csi_t_datastructures_grp.txn_line_detail_tbl;
419     l_g_pty_dtl_tbl        csi_t_datastructures_grp.txn_party_detail_tbl;
420     l_g_pty_acct_tbl       csi_t_datastructures_grp.txn_pty_acct_detail_tbl;
421     l_g_ii_rltns_tbl       csi_t_datastructures_grp.txn_ii_rltns_tbl;
422     l_g_org_assgn_tbl      csi_t_datastructures_grp.txn_org_assgn_tbl;
423     l_g_ext_attrib_tbl     csi_t_datastructures_grp.txn_ext_attrib_vals_tbl;
424     l_g_csi_ea_tbl         csi_t_datastructures_grp.csi_ext_attribs_tbl;
425     l_g_csi_eav_tbl        csi_t_datastructures_grp.csi_ext_attrib_vals_tbl;
426     l_g_txn_systems_tbl    csi_t_datastructures_grp.txn_systems_tbl;
427 
428     l_c_td_ind             binary_integer;
429     l_c_pt_ind             binary_integer;
430     l_c_pa_ind             binary_integer;
431     l_c_oa_ind             binary_integer;
432     l_c_ea_ind             binary_integer;
433 
434     l_line_dtl_tbl         csi_t_datastructures_grp.txn_line_detail_tbl;
435     l_pty_dtl_tbl          csi_t_datastructures_grp.txn_party_detail_tbl;
436     l_pty_acct_tbl         csi_t_datastructures_grp.txn_pty_acct_detail_tbl;
437     l_org_assgn_tbl        csi_t_datastructures_grp.txn_org_assgn_tbl;
438 
439     l_return_status        varchar2(1) := fnd_api.g_ret_sts_success;
440     l_msg_data             varchar2(512);
441     l_msg_count            number;
442 
443   BEGIN
444 
445     x_return_status := fnd_api.g_ret_sts_success;
446 
447     api_log('cascade_txn_detail');
448 
449     l_txn_line_query_rec.source_transaction_table := g_om_source_table;
450     l_txn_line_query_rec.source_transaction_id    := p_parent_line_rec.source_line_id;
451 
452     l_txn_line_detail_query_rec.source_transaction_flag := 'Y';
453 
454     csi_t_txn_details_grp.get_transaction_details(
455       p_api_version               => 1.0,
456       p_commit                    => fnd_api.g_false,
457       p_init_msg_list             => fnd_api.g_true,
458       p_validation_level          => fnd_api.g_valid_level_full,
459       p_txn_line_query_rec        => l_txn_line_query_rec,
460       p_txn_line_detail_query_rec => l_txn_line_detail_query_rec,
461       x_txn_line_detail_tbl       => l_g_line_dtl_tbl,
462       p_get_parties_flag          => fnd_api.g_true,
463       x_txn_party_detail_tbl      => l_g_pty_dtl_tbl,
464       p_get_pty_accts_flag        => fnd_api.g_true,
465       x_txn_pty_acct_detail_tbl   => l_g_pty_acct_tbl,
466       p_get_ii_rltns_flag         => fnd_api.g_false,
467       x_txn_ii_rltns_tbl          => l_g_ii_rltns_tbl,
468       p_get_org_assgns_flag       => fnd_api.g_true,
469       x_txn_org_assgn_tbl         => l_g_org_assgn_tbl,
470       p_get_ext_attrib_vals_flag  => fnd_api.g_false,
471       x_txn_ext_attrib_vals_tbl   => l_g_ext_attrib_tbl,
472       p_get_csi_attribs_flag      => fnd_api.g_false,
473       x_csi_ext_attribs_tbl       => l_g_csi_ea_tbl,
474       p_get_csi_iea_values_flag   => fnd_api.g_false,
475       x_csi_iea_values_tbl        => l_g_csi_eav_tbl,
476       p_get_txn_systems_flag      => fnd_api.g_false,
477       x_txn_systems_tbl           => l_g_txn_systems_tbl,
478       x_return_status             => l_return_status,
479       x_msg_count                 => l_msg_count,
480       x_msg_data                  => l_msg_data);
481 
482     IF l_return_status <> fnd_api.g_ret_sts_success THEN
483       RAISE fnd_api.g_exc_error;
484     END IF;
485 
486     l_c_td_ind := 0;
487     l_c_pt_ind := 0;
488     l_c_pa_ind := 0;
489     l_c_oa_ind := 0;
490     l_c_ea_ind := 0;
491 
492     IF l_g_line_dtl_tbl.COUNT > 0 THEN
493       FOR l_td_ind IN l_g_line_dtl_tbl.FIRST .. l_g_line_dtl_tbl.LAST
494       LOOP
495 
496         FOR i in 1..l_g_line_dtl_tbl(l_td_ind).quantity
497         LOOP
498 
499           l_c_td_ind := l_c_td_ind + 1;
500 
501           l_line_dtl_tbl(l_c_td_ind)          := l_g_line_dtl_tbl(l_td_ind);
502           l_line_dtl_tbl(l_c_td_ind).quantity := p_child_line_rec.source_quantity/
503                                                  p_parent_line_rec.source_quantity;
504 
505           l_line_dtl_tbl(l_c_td_ind).transaction_line_id := fnd_api.g_miss_num;
506           l_line_dtl_tbl(l_c_td_ind).txn_line_detail_id  := fnd_api.g_miss_num;
507           l_line_dtl_tbl(l_c_td_ind).inventory_item_id   := p_child_line_rec.inventory_item_id;
508           l_line_dtl_tbl(l_c_td_ind).unit_of_measure     := p_child_line_rec.uom_code;
509           l_line_dtl_tbl(l_c_td_ind).inventory_revision  := p_child_line_rec.item_revision;
510           l_line_dtl_tbl(l_c_td_ind).csi_transaction_id  := fnd_api.g_miss_num;
511           l_line_dtl_tbl(l_c_td_ind).processing_status   := 'SUBMIT';
512           l_line_dtl_tbl(l_c_td_ind).instance_exists_flag := 'N';
513           l_line_dtl_tbl(l_c_td_ind).instance_id          := fnd_api.g_miss_num;
514           l_line_dtl_tbl(l_c_td_ind).source_txn_line_detail_id  :=
515                 l_g_line_dtl_tbl(l_td_ind).txn_line_detail_id;
516 
517           -- derive the item related attributes here
518 
519           IF l_g_pty_dtl_tbl.COUNT > 0 THEN
520             FOR l_pt_ind IN l_g_pty_dtl_tbl.FIRST .. l_g_pty_dtl_tbl.LAST
521             LOOP
522 
523               IF l_g_pty_dtl_tbl(l_pt_ind).txn_line_detail_id =
524                  l_g_line_dtl_tbl(l_td_ind).txn_line_detail_id THEN
525 
526                 l_c_pt_ind := l_c_pt_ind + 1;
527 
528                 l_pty_dtl_tbl(l_c_pt_ind) := l_g_pty_dtl_tbl(l_pt_ind);
529                 l_pty_dtl_tbl(l_c_pt_ind).txn_line_detail_id     := fnd_api.g_miss_num;
530                 l_pty_dtl_tbl(l_c_pt_ind).txn_party_detail_id    := fnd_api.g_miss_num;
531                 l_pty_dtl_tbl(l_c_pt_ind).txn_line_details_index := l_c_td_ind;
532                 l_pty_dtl_tbl(l_c_pt_ind).instance_party_id      := fnd_api.g_miss_num;
533 
534                 IF l_g_pty_acct_tbl.COUNT > 0 THEN
535 
536                   FOR l_pa_ind IN l_g_pty_acct_tbl.FIRST .. l_g_pty_acct_tbl.LAST
537                   LOOP
538                     IF l_g_pty_acct_tbl(l_pa_ind).txn_party_detail_id =
539                       l_g_pty_dtl_tbl(l_pt_ind).txn_party_detail_id THEN
540 
541                       l_c_pa_ind := l_c_pa_ind + 1;
542 
543                       l_pty_acct_tbl(l_c_pa_ind) := l_g_pty_acct_tbl(l_pa_ind);
544                       l_pty_acct_tbl(l_c_pa_ind).txn_party_detail_id     := fnd_api.g_miss_num;
545                       l_pty_acct_tbl(l_c_pa_ind).txn_account_detail_id   := fnd_api.g_miss_num;
546                       l_pty_acct_tbl(l_c_pa_ind).txn_party_details_index := l_c_pt_ind;
547                       l_pty_acct_tbl(l_c_pa_ind).ip_account_id           := fnd_api.g_miss_num;
548 
549                     END IF; -- pty acct detail id chk
550 
551                   END LOOP; -- party acct table loop
552 
553                 END IF; -- party acct count chk
554 
555               END IF; -- txn_line_detail_id check
556 
557             END LOOP; -- party table loop
558 
559           END IF; -- party count check
560 
561           IF l_g_org_assgn_tbl.COUNT > 0 THEN
562             FOR l_oa_ind IN l_g_org_assgn_tbl.FIRST .. l_g_org_assgn_tbl.LAST
563             LOOP
564               IF l_g_org_assgn_tbl(l_oa_ind).txn_line_detail_id =
565                 l_g_line_dtl_tbl(l_td_ind).txn_line_detail_id THEN
566 
567                 l_c_oa_ind := l_c_oa_ind + 1;
568                 l_org_assgn_tbl(l_c_oa_ind) := l_g_org_assgn_tbl(l_oa_ind);
569                 l_org_assgn_tbl(l_c_oa_ind).txn_line_detail_id     := fnd_api.g_miss_num;
570                 l_org_assgn_tbl(l_c_oa_ind).txn_operating_unit_id  := fnd_api.g_miss_num;
571                 l_org_assgn_tbl(l_c_oa_ind).txn_line_details_index := l_c_td_ind;
572                 l_org_assgn_tbl(l_c_oa_ind).instance_ou_id         := fnd_api.g_miss_num;
573 
574               END IF;
575             END LOOP;
576           END IF;
577         END LOOP;
578       END LOOP; -- txn line details loop
579     END IF;
580 
581     x_txn_line_detail_tbl := l_line_dtl_tbl;
582     x_txn_party_tbl       := l_pty_dtl_tbl;
583     x_txn_party_acct_tbl  := l_pty_acct_tbl;
584     x_txn_org_assgn_tbl   := l_org_assgn_tbl;
585 
586   EXCEPTION
587     WHEN fnd_api.g_exc_error THEN
588      x_return_status := fnd_api.g_ret_sts_error;
589   END cascade_txn_detail;
590 
591   PROCEDURE get_item_attributes(
592     p_transaction_id	   IN  number,-- Added for bug#14835893
593     p_inventory_item_id    IN  number,
594     p_organization_id      IN  number,
595     x_item_attrib_rec      OUT NOCOPY item_attributes_rec,
596     x_return_status        OUT NOCOPY varchar2)
597   IS
598   l_sql_stmt              VARCHAR2(2000);
599   l_exists                VARCHAR2(1) := 'N';
600   l_return                BOOLEAN;
601   l_status                VARCHAR2(1);
602   l_industry              VARCHAR2(1);
603   l_oracle_schema         VARCHAR2(30);
604   BEGIN
605     x_return_status := fnd_api.g_ret_sts_success;
606     api_log('get_item_attributes');
607 
608     -- get item based attributes
609     SELECT serial_number_control_code,
610          -- lot_control_code,
611 	     nvl(csi_utl_pkg.get_lot_ctrl_code(p_transaction_id),lot_control_code) lot_control_code,-- Added for bug#14835893
612            location_control_code,
613            revision_qty_control_code,
614            comms_nl_trackable_flag,
615            shippable_item_flag,
616            inventory_item_flag,
617            stock_enabled_flag,
618            bom_item_type,
619            pick_components_flag,
620            base_item_id,
621            primary_uom_code
622     INTO   x_item_attrib_rec.serial_control_code,
623            x_item_attrib_rec.lot_control_code,
624            x_item_attrib_rec.locator_control_code,
625            x_item_attrib_rec.revision_control_code,
626            x_item_attrib_rec.ib_trackable_flag,
627            x_item_attrib_rec.shippable_flag,
628            x_item_attrib_rec.inv_item_flag,
629            x_item_attrib_rec.stockable_flag,
630            x_item_attrib_rec.bom_item_type,
631            x_item_attrib_rec.pick_components_flag,
632            x_item_attrib_rec.model_item_id,
633            x_item_attrib_rec.primary_uom_code
634     FROM   mtl_system_items
635     WHERE  inventory_item_id = p_inventory_item_id
636     AND    organization_id   = p_organization_id;
637 
638     -- get org attributes aswell
639     -- Ib_item_instance_class column may or may not exists in mtl_system_items_b.
640     -- Hence used a Dynamic sal based on the existance of this column in ALL_TAB_COLUMNS.
641 
642     -- For Bug 3431768
643     l_return := FND_INSTALLATION.get_app_info('INV',l_status,l_industry,l_oracle_schema);
644 
645     IF NOT l_return THEN
646       fnd_message.set_name('CSI','CSI_FND_INVALID_SCHEMA_ERROR');
647       fnd_msg_pub.add;
648       RAISE fnd_api.g_exc_error;
649     END IF;
650     -- End fix for Bug 3431768
651 
652     Begin
653 	/* Modified for bug 15896185 - Online patching compatible fix
654       select 'X'
655       into l_exists
656       from all_tab_columns
657       where table_name = 'MTL_SYSTEM_ITEMS_B'
658       and   column_name = 'IB_ITEM_INSTANCE_CLASS'
659       and   OWNER       = l_oracle_schema
660       and   rownum < 2;
661 	 Modified for bug 15896185 - Online patching compatible fix*/
662       select 'X'
663       into l_exists
664       from user_synonyms syn,
665            all_tab_columns col
666       where syn.synonym_name = 'MTL_SYSTEM_ITEMS_B'
667       and   col.column_name = 'IB_ITEM_INSTANCE_CLASS'
668       and   col.OWNER       = l_oracle_schema
669       AND   col.owner      = syn.table_owner
670       AND   col.table_name  = syn.table_name
671       and   rownum < 2;
672 
673     Exception
674       when no_data_found then
675         l_exists := 'N';
676     End;
677     l_sql_stmt := 'select ib_item_instance_class from MTL_SYSTEM_ITEMS_B '||
678                   'where inventory_item_id = :item_id '||
679                   'and   organization_id = :vld_org_id';
680     --
681     IF l_exists = 'X' THEN
682       BEGIN
683         EXECUTE IMMEDIATE l_sql_stmt INTO x_item_attrib_rec.ib_item_instance_class USING p_inventory_item_id,p_organization_id;
684       EXCEPTION
685         WHEN OTHERS THEN
686           x_item_attrib_rec.ib_item_instance_class := null;
687       END;
688     ELSE
689       x_item_attrib_rec.ib_item_instance_class := null;
690     END If;
691 
692     l_exists := 'N';
693 
694     -- for config_model_type
695     Begin
696 	/* Modified for bug 15896185 - Online patching compatible fix
697       select 'X'
698       into l_exists
699       from all_tab_columns
700       where table_name = 'MTL_SYSTEM_ITEMS_B'
701       and   column_name = 'CONFIG_MODEL_TYPE'
702       and   OWNER       = l_oracle_schema
703       and   rownum < 2;
704 	 Modified for bug 15896185 - Online patching compatible fix*/
705       select 'X'
706       into l_exists
707       from user_synonyms syn,
708            all_tab_columns col
709       where syn.synonym_name = 'MTL_SYSTEM_ITEMS_B'
710       and   col.column_name = 'CONFIG_MODEL_TYPE'
711       and   col.OWNER       = l_oracle_schema
712       AND   col.owner      = syn.table_owner
713       AND   col.table_name  = syn.table_name
714       and   rownum < 2;
715 
716     Exception
717       when no_data_found then
718         l_exists := 'N';
719     End;
720     l_sql_stmt := 'select config_model_type from MTL_SYSTEM_ITEMS_B '||
721                   'where inventory_item_id = :item_id '||
722                   'and   organization_id = :vld_org_id';
723     --
724     IF l_exists = 'X' THEN
725       BEGIN
726         EXECUTE IMMEDIATE l_sql_stmt INTO x_item_attrib_rec.config_model_type USING p_inventory_item_id,p_organization_id;
727       EXCEPTION
728         WHEN OTHERS THEN
729           x_item_attrib_rec.config_model_type := null;
730       END;
731     ELSE
732       x_item_attrib_rec.config_model_type := null;
733     END If;
734 
735 
736     SELECT nvl(negative_inv_receipt_code,2)
737     INTO   x_item_attrib_rec.negative_balances_code
738     FROM   mtl_parameters
739     WHERE  organization_id = p_organization_id;
740 
741     debug('  serial_control_code   : '||x_item_attrib_rec.serial_control_code);
742     debug('  lot_control_code      : '||x_item_attrib_rec.lot_control_code);
743     debug('  locator_control_code  : '||x_item_attrib_rec.locator_control_code);
744     debug('  revision_control_code : '||x_item_attrib_rec.revision_control_code);
745     debug('  shippable_flag        : '||x_item_attrib_rec.shippable_flag);
746     debug('  primary_uom_code      : '||x_item_attrib_rec.primary_uom_code);
747 
748   EXCEPTION
749     WHEN fnd_api.g_exc_error THEN
750       x_return_status := fnd_api.g_ret_sts_error;
751   END get_item_attributes;
752 
753 
754   --
755   --
756   --
757   PROCEDURE get_pricing_attributes(
758     p_line_id               IN  number,
759     x_pricing_attribs_tbl   OUT NOCOPY csi_datastructures_pub.pricing_attribs_tbl,
760     x_return_status         OUT NOCOPY varchar2)
761   IS
762 
763     l_pa_tbl      csi_datastructures_pub.pricing_attribs_tbl;
764     l_ind         binary_integer := 0;
765 
766     CURSOR price_cur IS
767       SELECT pricing_context,
768              pricing_attribute1,
769              pricing_attribute2,
770              pricing_attribute3,
771              pricing_attribute4,
772              pricing_attribute5,
773              pricing_attribute6,
774              pricing_attribute7,
775              pricing_attribute8,
776              pricing_attribute9,
777              pricing_attribute10,
778              pricing_attribute11,
779              pricing_attribute12,
780              pricing_attribute13,
781              pricing_attribute14,
782              pricing_attribute15,
783              pricing_attribute16,
784              pricing_attribute17,
785              pricing_attribute18,
786              pricing_attribute19,
787              pricing_attribute20,
788              pricing_attribute21,
789              pricing_attribute22,
790              pricing_attribute23,
791              pricing_attribute24,
792              pricing_attribute25,
793              pricing_attribute26,
794              pricing_attribute27,
795              pricing_attribute28,
796              pricing_attribute29,
797              pricing_attribute30,
798              pricing_attribute31,
799              pricing_attribute32,
800              pricing_attribute33,
801              pricing_attribute34,
802              pricing_attribute35,
803              pricing_attribute36,
804              pricing_attribute37,
805              pricing_attribute38,
806              pricing_attribute39,
807              pricing_attribute40,
808              pricing_attribute41,
809              pricing_attribute42,
810              pricing_attribute43,
811              pricing_attribute44,
812              pricing_attribute45,
813              pricing_attribute46,
814              pricing_attribute47,
815              pricing_attribute48,
816              pricing_attribute49,
817              pricing_attribute50,
818              pricing_attribute51,
819              pricing_attribute52,
820              pricing_attribute53,
821              pricing_attribute54,
822              pricing_attribute55,
823              pricing_attribute56,
824              pricing_attribute57,
825              pricing_attribute58,
826              pricing_attribute59,
827              pricing_attribute60,
828              pricing_attribute61,
829              pricing_attribute62,
830              pricing_attribute63,
831              pricing_attribute64,
832              pricing_attribute65,
833              pricing_attribute66,
834              pricing_attribute67,
835              pricing_attribute68,
836              pricing_attribute69,
837              pricing_attribute70,
838              pricing_attribute71,
839              pricing_attribute72,
840              pricing_attribute73,
841              pricing_attribute74,
842              pricing_attribute75,
843              pricing_attribute76,
844              pricing_attribute77,
845              pricing_attribute78,
846              pricing_attribute79,
847              pricing_attribute80,
848              pricing_attribute81,
849              pricing_attribute82,
850              pricing_attribute83,
851              pricing_attribute84,
852              pricing_attribute85,
853              pricing_attribute86,
854              pricing_attribute87,
855              pricing_attribute88,
856              pricing_attribute89,
857              pricing_attribute90,
858              pricing_attribute91,
859              pricing_attribute92,
860              pricing_attribute93,
861              pricing_attribute94,
862              pricing_attribute95,
863              pricing_attribute96,
864              pricing_attribute97,
865              pricing_attribute98,
866              pricing_attribute99,
867              pricing_attribute100
868       FROM   oe_order_price_attribs
869       WHERE  line_id = p_line_id ;
870 
871   BEGIN
872 
873     x_return_status := fnd_api.g_ret_sts_success;
874 
875     api_log('get_pricing_attributes');
876 
877     -- Build the  pricing attribute table
878     FOR price_rec IN price_cur
879     LOOP
880 
881       l_ind := price_cur%rowcount;
882 
883       l_pa_tbl(l_ind).pricing_context      := price_rec.pricing_context ;
884       l_pa_tbl(l_ind).pricing_attribute1   := price_rec.pricing_attribute1;
885       l_pa_tbl(l_ind).pricing_attribute2   := price_rec.pricing_attribute2;
886       l_pa_tbl(l_ind).pricing_attribute3   := price_rec.pricing_attribute3;
887       l_pa_tbl(l_ind).pricing_attribute4   := price_rec.pricing_attribute4;
888       l_pa_tbl(l_ind).pricing_attribute5   := price_rec.pricing_attribute5;
889       l_pa_tbl(l_ind).pricing_attribute6   := price_rec.pricing_attribute6;
890       l_pa_tbl(l_ind).pricing_attribute7   := price_rec.pricing_attribute7;
891       l_pa_tbl(l_ind).pricing_attribute8   := price_rec.pricing_attribute8;
892       l_pa_tbl(l_ind).pricing_attribute9   := price_rec.pricing_attribute9;
893       l_pa_tbl(l_ind).pricing_attribute10  := price_rec.pricing_attribute10;
894       l_pa_tbl(l_ind).pricing_attribute11  := price_rec.pricing_attribute11;
895       l_pa_tbl(l_ind).pricing_attribute12  := price_rec.pricing_attribute12;
896       l_pa_tbl(l_ind).pricing_attribute13  := price_rec.pricing_attribute13;
897       l_pa_tbl(l_ind).pricing_attribute14  := price_rec.pricing_attribute14;
898       l_pa_tbl(l_ind).pricing_attribute15  := price_rec.pricing_attribute15;
899       l_pa_tbl(l_ind).pricing_attribute16  := price_rec.pricing_attribute16;
900       l_pa_tbl(l_ind).pricing_attribute17  := price_rec.pricing_attribute17;
901       l_pa_tbl(l_ind).pricing_attribute18  := price_rec.pricing_attribute18;
902       l_pa_tbl(l_ind).pricing_attribute19  := price_rec.pricing_attribute19;
903       l_pa_tbl(l_ind).pricing_attribute20  := price_rec.pricing_attribute20;
904       l_pa_tbl(l_ind).pricing_attribute21  := price_rec.pricing_attribute21;
905       l_pa_tbl(l_ind).pricing_attribute22  := price_rec.pricing_attribute22;
906       l_pa_tbl(l_ind).pricing_attribute23  := price_rec.pricing_attribute23;
907       l_pa_tbl(l_ind).pricing_attribute24  := price_rec.pricing_attribute24;
908       l_pa_tbl(l_ind).pricing_attribute25  := price_rec.pricing_attribute25;
909       l_pa_tbl(l_ind).pricing_attribute26  := price_rec.pricing_attribute26;
910       l_pa_tbl(l_ind).pricing_attribute27  := price_rec.pricing_attribute27;
911       l_pa_tbl(l_ind).pricing_attribute28  := price_rec.pricing_attribute28;
912       l_pa_tbl(l_ind).pricing_attribute29  := price_rec.pricing_attribute29;
913       l_pa_tbl(l_ind).pricing_attribute30  := price_rec.pricing_attribute30;
914       l_pa_tbl(l_ind).pricing_attribute31  := price_rec.pricing_attribute31;
915       l_pa_tbl(l_ind).pricing_attribute32  := price_rec.pricing_attribute32;
916       l_pa_tbl(l_ind).pricing_attribute33  := price_rec.pricing_attribute33;
917       l_pa_tbl(l_ind).pricing_attribute34  := price_rec.pricing_attribute34;
918       l_pa_tbl(l_ind).pricing_attribute35  := price_rec.pricing_attribute35;
919       l_pa_tbl(l_ind).pricing_attribute36  := price_rec.pricing_attribute36;
920       l_pa_tbl(l_ind).pricing_attribute37  := price_rec.pricing_attribute37;
921       l_pa_tbl(l_ind).pricing_attribute38  := price_rec.pricing_attribute38;
922       l_pa_tbl(l_ind).pricing_attribute39  := price_rec.pricing_attribute39;
923       l_pa_tbl(l_ind).pricing_attribute40  := price_rec.pricing_attribute40;
924       l_pa_tbl(l_ind).pricing_attribute41  := price_rec.pricing_attribute41;
925       l_pa_tbl(l_ind).pricing_attribute42  := price_rec.pricing_attribute42;
926       l_pa_tbl(l_ind).pricing_attribute43  := price_rec.pricing_attribute43;
927       l_pa_tbl(l_ind).pricing_attribute44  := price_rec.pricing_attribute44;
928       l_pa_tbl(l_ind).pricing_attribute45  := price_rec.pricing_attribute45;
929       l_pa_tbl(l_ind).pricing_attribute46  := price_rec.pricing_attribute46;
930       l_pa_tbl(l_ind).pricing_attribute47  := price_rec.pricing_attribute47;
931       l_pa_tbl(l_ind).pricing_attribute48  := price_rec.pricing_attribute48;
932       l_pa_tbl(l_ind).pricing_attribute49  := price_rec.pricing_attribute49;
933       l_pa_tbl(l_ind).pricing_attribute50  := price_rec.pricing_attribute50;
934       l_pa_tbl(l_ind).pricing_attribute51  := price_rec.pricing_attribute51;
935       l_pa_tbl(l_ind).pricing_attribute52  := price_rec.pricing_attribute52;
936       l_pa_tbl(l_ind).pricing_attribute53  := price_rec.pricing_attribute53;
937       l_pa_tbl(l_ind).pricing_attribute54  := price_rec.pricing_attribute54;
938       l_pa_tbl(l_ind).pricing_attribute55  := price_rec.pricing_attribute55;
939       l_pa_tbl(l_ind).pricing_attribute56  := price_rec.pricing_attribute56;
940       l_pa_tbl(l_ind).pricing_attribute57  := price_rec.pricing_attribute57;
941       l_pa_tbl(l_ind).pricing_attribute58  := price_rec.pricing_attribute58;
942       l_pa_tbl(l_ind).pricing_attribute59  := price_rec.pricing_attribute59;
943       l_pa_tbl(l_ind).pricing_attribute60  := price_rec.pricing_attribute60;
944       l_pa_tbl(l_ind).pricing_attribute61  := price_rec.pricing_attribute61;
945       l_pa_tbl(l_ind).pricing_attribute62  := price_rec.pricing_attribute62;
946       l_pa_tbl(l_ind).pricing_attribute63  := price_rec.pricing_attribute63;
947       l_pa_tbl(l_ind).pricing_attribute64  := price_rec.pricing_attribute64;
948       l_pa_tbl(l_ind).pricing_attribute65  := price_rec.pricing_attribute65;
949       l_pa_tbl(l_ind).pricing_attribute66  := price_rec.pricing_attribute66;
950       l_pa_tbl(l_ind).pricing_attribute67  := price_rec.pricing_attribute67;
951       l_pa_tbl(l_ind).pricing_attribute68  := price_rec.pricing_attribute68;
952       l_pa_tbl(l_ind).pricing_attribute69  := price_rec.pricing_attribute69;
953       l_pa_tbl(l_ind).pricing_attribute70  := price_rec.pricing_attribute70;
954       l_pa_tbl(l_ind).pricing_attribute71  := price_rec.pricing_attribute71;
955       l_pa_tbl(l_ind).pricing_attribute72  := price_rec.pricing_attribute72;
956       l_pa_tbl(l_ind).pricing_attribute73  := price_rec.pricing_attribute73;
957       l_pa_tbl(l_ind).pricing_attribute74  := price_rec.pricing_attribute74;
958       l_pa_tbl(l_ind).pricing_attribute75  := price_rec.pricing_attribute75;
959       l_pa_tbl(l_ind).pricing_attribute76  := price_rec.pricing_attribute76;
960       l_pa_tbl(l_ind).pricing_attribute77  := price_rec.pricing_attribute77;
961       l_pa_tbl(l_ind).pricing_attribute78  := price_rec.pricing_attribute78;
962       l_pa_tbl(l_ind).pricing_attribute79  := price_rec.pricing_attribute79;
963       l_pa_tbl(l_ind).pricing_attribute80  := price_rec.pricing_attribute80;
964       l_pa_tbl(l_ind).pricing_attribute81  := price_rec.pricing_attribute81;
965       l_pa_tbl(l_ind).pricing_attribute82  := price_rec.pricing_attribute82;
966       l_pa_tbl(l_ind).pricing_attribute83  := price_rec.pricing_attribute83;
967       l_pa_tbl(l_ind).pricing_attribute84  := price_rec.pricing_attribute84;
968       l_pa_tbl(l_ind).pricing_attribute85  := price_rec.pricing_attribute85;
969       l_pa_tbl(l_ind).pricing_attribute86  := price_rec.pricing_attribute86;
970       l_pa_tbl(l_ind).pricing_attribute87  := price_rec.pricing_attribute87;
971       l_pa_tbl(l_ind).pricing_attribute88  := price_rec.pricing_attribute88;
972       l_pa_tbl(l_ind).pricing_attribute89  := price_rec.pricing_attribute89;
973       l_pa_tbl(l_ind).pricing_attribute90  := price_rec.pricing_attribute90;
974       l_pa_tbl(l_ind).pricing_attribute91  := price_rec.pricing_attribute91;
975       l_pa_tbl(l_ind).pricing_attribute92  := price_rec.pricing_attribute92;
976       l_pa_tbl(l_ind).pricing_attribute93  := price_rec.pricing_attribute93;
977       l_pa_tbl(l_ind).pricing_attribute94  := price_rec.pricing_attribute94;
978       l_pa_tbl(l_ind).pricing_attribute95  := price_rec.pricing_attribute95;
979       l_pa_tbl(l_ind).pricing_attribute96  := price_rec.pricing_attribute96;
980       l_pa_tbl(l_ind).pricing_attribute97  := price_rec.pricing_attribute97;
981       l_pa_tbl(l_ind).pricing_attribute98  := price_rec.pricing_attribute98;
982       l_pa_tbl(l_ind).pricing_attribute99  := price_rec.pricing_attribute99;
983       l_pa_tbl(l_ind).pricing_attribute100 := price_rec.pricing_attribute100;
984 
985     END LOOP;
986 
987     x_pricing_attribs_tbl := l_pa_tbl;
988 
989   EXCEPTION
990     WHEN fnd_api.g_exc_error THEN
991       x_return_status := fnd_api.g_ret_sts_error;
992   END get_pricing_attributes;
993 
994 
995   PROCEDURE build_td_from_source(
996     p_split_flag            IN  varchar2,
997     p_split_quantity        IN  number,
998     p_split_loop            IN  number,
999     p_transaction_type_id   IN  number,
1000     p_source_header_rec     IN  source_header_rec,
1001     p_source_line_rec       IN  source_line_rec,
1002     p_csi_txn_rec           IN  csi_datastructures_pub.transaction_rec,
1003     x_txn_line_rec          OUT NOCOPY csi_t_datastructures_grp.txn_line_rec,
1004     x_txn_line_detail_tbl   OUT NOCOPY csi_t_datastructures_grp.txn_line_detail_tbl,
1005     x_txn_party_tbl         OUT NOCOPY csi_t_datastructures_grp.txn_party_detail_tbl,
1006     x_txn_party_acct_tbl    OUT NOCOPY csi_t_datastructures_grp.txn_pty_acct_detail_tbl,
1007     x_txn_org_assgn_tbl     OUT NOCOPY csi_t_datastructures_grp.txn_org_assgn_tbl,
1008     x_pricing_attribs_tbl   OUT NOCOPY csi_datastructures_pub.pricing_attribs_tbl,
1009     x_return_status         OUT NOCOPY varchar2)
1010   IS
1011 
1012     l_default_sub_type_id   number;
1013     l_split_flag            varchar2(1) := fnd_api.g_false;
1014     l_split_quantity        number;
1015     l_split_loop            number;
1016 
1017     l_td_ind                binary_integer := 0;
1018     l_pt_ind                binary_integer := 0;
1019     l_pa_ind                binary_integer := 0;
1020     l_oa_ind                binary_integer := 0;
1021     l_ea_ind                binary_integer := 0;
1022     l_owner_pt_ind          binary_integer := 0;
1023 
1024     -- for partner ordering Bug 3443175
1025     l_partner_rec             oe_install_base_util.partner_order_rec;
1026 
1027     l_item_attributes_rec   item_attributes_rec;
1028     l_return_status         varchar2(1) := fnd_api.g_ret_sts_success;
1029 
1030   BEGIN
1031 
1032     x_return_status := fnd_api.g_ret_sts_success;
1033 
1034     api_log('build_td_from_source');
1035 
1036     -- get the default sub_type_id
1037     get_default_sub_type_id(
1038       p_transaction_type_id  => p_transaction_type_id,
1039       x_sub_type_id          => l_default_sub_type_id,
1040       x_return_status        => l_return_status);
1041 
1042     x_txn_line_rec.source_transaction_type_id := p_transaction_type_id;
1043 
1044     IF l_return_status <> fnd_api.g_ret_sts_success THEN
1045       RAISE fnd_api.g_exc_error;
1046     END IF;
1047 
1048     -- for partner ordering MRK
1049     -- Included the If condition for Bug 3893279, Don't call this for project Contracts
1050     IF p_transaction_type_id <> 326
1051     THEN
1052       OE_INSTALL_BASE_UTIL.get_partner_ord_rec(p_order_line_id      => p_source_line_rec.source_LINE_ID,
1053                                                x_partner_order_rec  => l_partner_rec);
1054     END IF;
1055 
1056 
1057     l_split_flag := p_split_flag;
1058 
1059     IF l_split_flag = fnd_api.g_false THEN
1060 
1061       get_item_attributes(
1062 	   p_transaction_id       => p_csi_txn_rec.inv_material_transaction_id,--Added for bug# 14835893
1063         p_inventory_item_id    => p_source_line_rec.inventory_item_id,
1064         p_organization_id      => p_source_line_rec.organization_id,
1065         x_item_attrib_rec      => l_item_attributes_rec,
1066         x_return_status        => l_return_status);
1067 
1068       IF l_return_status <> fnd_api.g_ret_sts_success THEN
1069         RAISE fnd_api.g_exc_error;
1070       END IF;
1071 
1072       IF l_item_attributes_rec.serial_control_code <> 1 then
1073         l_split_flag     := fnd_api.g_true;
1074         l_split_quantity := 1;
1075         l_split_loop     := p_source_line_rec.source_quantity;
1076       END IF;
1077 
1078       IF l_split_flag = fnd_api.g_false THEN
1079         l_split_quantity := p_source_line_rec.source_quantity;
1080         l_split_loop     := 1;
1081       END IF;
1082 
1083     ELSE
1084       l_split_quantity := p_split_quantity;
1085       l_split_loop     := p_split_loop;
1086     END IF;
1087 
1088     --
1089     l_pt_ind := 0;
1090     l_pa_ind := 0;
1091     l_oa_ind := 0;
1092 
1093     FOR i IN 1 .. l_split_loop
1094     LOOP
1095 
1096       l_td_ind := i;
1097 
1098       x_txn_line_detail_tbl(l_td_ind).transaction_line_id := fnd_api.g_miss_num;
1099       x_txn_line_detail_tbl(l_td_ind).txn_line_detail_id  := fnd_api.g_miss_num;
1100       x_txn_line_detail_tbl(l_td_ind).sub_type_id         := l_default_sub_type_id;
1101       x_txn_line_detail_tbl(l_td_ind).inventory_item_id   := p_source_line_rec.inventory_item_id;
1102       x_txn_line_detail_tbl(l_td_ind).source_transaction_flag := 'Y';
1103       x_txn_line_detail_tbl(l_td_ind).inv_organization_id := p_source_line_rec.organization_id;
1104       x_txn_line_detail_tbl(l_td_ind).unit_of_measure     := p_source_line_rec.uom_code;
1105       x_txn_line_detail_tbl(l_td_ind).inventory_revision  := p_source_line_rec.item_revision;
1106       x_txn_line_detail_tbl(l_td_ind).quantity            := l_split_quantity;
1107 
1108       -- Added IF condition for Bug 4314464
1109       IF l_partner_rec.IB_CURRENT_LOCATION = 'INSTALL_BASE'
1110       THEN
1111         x_txn_line_detail_tbl(l_td_ind).location_type_code := fnd_api.g_miss_char;
1112         x_txn_line_detail_tbl(l_td_ind).location_id        := fnd_api.g_miss_num;
1113       ELSE
1114         x_txn_line_detail_tbl(l_td_ind).location_type_code := 'HZ_PARTY_SITES';
1115         x_txn_line_detail_tbl(l_td_ind).location_id        := p_source_line_rec.ship_to_party_site_id;
1116       END IF;
1117 
1118       -- Added for partner ordering
1119       -- Added IF condition for Bug 4314464
1120       IF l_partner_rec.IB_INSTALLED_AT_LOCATION = 'INSTALL_BASE'
1121       THEN
1122         x_txn_line_detail_tbl(l_td_ind).install_location_type_code := fnd_api.g_miss_char;
1123         x_txn_line_detail_tbl(l_td_ind).install_location_id        := fnd_api.g_miss_num;
1124       ELSE
1125         x_txn_line_detail_tbl(l_td_ind).install_location_type_code  := 'HZ_PARTY_SITES';
1126         x_txn_line_detail_tbl(l_td_ind).install_location_id         := p_source_line_rec.install_to_party_site_id;
1127       END IF;
1128       -- Added for partner ordering
1129 
1130       x_txn_line_detail_tbl(l_td_ind).processing_status   := 'SUBMIT';
1131       x_txn_line_detail_tbl(l_td_ind).instance_exists_flag := 'N';
1132       x_txn_line_detail_tbl(l_td_ind).object_version_number := 1.0;
1133 
1134       -- build owner party record
1135       l_pt_ind       := l_pt_ind + 1;
1136       l_owner_pt_ind := l_pt_ind;
1137 
1138       x_txn_party_tbl(l_pt_ind).txn_line_detail_id     := fnd_api.g_miss_num;
1139       x_txn_party_tbl(l_pt_ind).txn_party_detail_id    := fnd_api.g_miss_num;
1140       x_txn_party_tbl(l_pt_ind).txn_line_details_index := l_td_ind;
1141       x_txn_party_tbl(l_pt_ind).party_source_table     := 'HZ_PARTIES';
1142 
1143       -- For Bug 3443175.
1144       IF l_partner_rec.IB_OWNER = 'INSTALL_BASE'
1145       THEN
1146         x_txn_party_tbl(l_pt_ind).party_source_id      := fnd_api.g_miss_num;
1147       ELSE
1148         x_txn_party_tbl(l_pt_ind).party_source_id      := p_source_line_rec.owner_party_id;
1149       END IF;
1150 
1151       x_txn_party_tbl(l_pt_ind).relationship_type_code := 'OWNER';
1152       x_txn_party_tbl(l_pt_ind).contact_flag           := 'N';
1153       x_txn_party_tbl(l_pt_ind).object_version_number  := 1.0;
1154 
1155       -- build owner party account record
1156       l_pa_ind := l_pa_ind + 1;
1157       x_txn_party_acct_tbl(l_pa_ind).txn_party_detail_id     := fnd_api.g_miss_num;
1158       x_txn_party_acct_tbl(l_pa_ind).txn_account_detail_id   := fnd_api.g_miss_num;
1159       x_txn_party_acct_tbl(l_pa_ind).txn_party_details_index := l_owner_pt_ind;
1160 
1161       -- For Bug 3443175.
1162       IF l_partner_rec.IB_OWNER = 'INSTALL_BASE'
1163       THEN
1164         x_txn_party_acct_tbl(l_pa_ind).account_id := fnd_api.g_miss_num;
1165       ELSE
1166         x_txn_party_acct_tbl(l_pa_ind).account_id := p_source_line_rec.owner_party_account_id;
1167       END IF;
1168 
1169       x_txn_party_acct_tbl(l_pa_ind).relationship_type_code  := 'OWNER';
1170       IF p_source_line_rec.bill_to_address_id is not null THEN
1171         x_txn_party_acct_tbl(l_pa_ind).bill_to_address_id := p_source_line_rec.bill_to_address_id;
1172       END IF;
1173       IF p_source_line_rec.ship_to_address_id is not null THEN
1174         x_txn_party_acct_tbl(l_pa_ind).ship_to_address_id := p_source_line_rec.ship_to_address_id;
1175       END IF;
1176       x_txn_party_acct_tbl(l_pa_ind).object_version_number := 1.0;
1177 
1178       -- build sold_to party
1179 
1180       -- build ship_to contact
1181       IF p_source_line_rec.ship_to_contact_party_id is not null THEN
1182 
1183         l_pt_ind       := l_pt_ind + 1;
1184 
1185         x_txn_party_tbl(l_pt_ind).txn_line_detail_id     := fnd_api.g_miss_num;
1186         x_txn_party_tbl(l_pt_ind).txn_party_detail_id    := fnd_api.g_miss_num;
1187         x_txn_party_tbl(l_pt_ind).txn_line_details_index := l_td_ind;
1188         x_txn_party_tbl(l_pt_ind).party_source_table     := 'HZ_PARTIES';
1189         x_txn_party_tbl(l_pt_ind).party_source_id        :=
1190                                       p_source_line_rec.ship_to_contact_party_id;
1191         x_txn_party_tbl(l_pt_ind).relationship_type_code := 'SHIP_TO';
1192         x_txn_party_tbl(l_pt_ind).contact_flag           := 'Y';
1193         x_txn_party_tbl(l_pt_ind).contact_party_id       := l_owner_pt_ind;
1194         x_txn_party_tbl(l_pt_ind).object_version_number  := 1.0;
1195 
1196       END IF;
1197 
1198       -- build bill_to contact
1199       IF p_source_line_rec.bill_to_contact_party_id is not null THEN
1200 
1201         l_pt_ind       := l_pt_ind + 1;
1202 
1203         x_txn_party_tbl(l_pt_ind).txn_line_detail_id     := fnd_api.g_miss_num;
1204         x_txn_party_tbl(l_pt_ind).txn_party_detail_id    := fnd_api.g_miss_num;
1205         x_txn_party_tbl(l_pt_ind).txn_line_details_index := l_td_ind;
1206         x_txn_party_tbl(l_pt_ind).party_source_table     := 'HZ_PARTIES';
1207         x_txn_party_tbl(l_pt_ind).party_source_id        :=
1208                                       p_source_line_rec.bill_to_contact_party_id;
1209         x_txn_party_tbl(l_pt_ind).relationship_type_code := 'BILL_TO';
1210         x_txn_party_tbl(l_pt_ind).contact_flag           := 'Y';
1211         x_txn_party_tbl(l_pt_ind).contact_party_id          := l_owner_pt_ind;
1212         x_txn_party_tbl(l_pt_ind).object_version_number  := 1.0;
1213 
1214       END IF;
1215 
1216       -- build org units
1217       IF p_source_line_rec.sold_from_org_id is not null THEN
1218         l_oa_ind := l_oa_ind + 1;
1219         x_txn_org_assgn_tbl(l_oa_ind).txn_line_detail_id     := fnd_api.g_miss_num;
1220         x_txn_org_assgn_tbl(l_oa_ind).txn_line_details_index := l_td_ind;
1221         x_txn_org_assgn_tbl(l_oa_ind).operating_unit_id      :=
1222                                           p_source_line_rec.sold_from_org_id;
1223         x_txn_org_assgn_tbl(l_oa_ind).relationship_type_code := 'SOLD_FROM';
1224         x_txn_org_assgn_tbl(l_oa_ind).preserve_detail_flag   := 'Y';
1225         x_txn_org_assgn_tbl(l_oa_ind).object_version_number  := 1.0;
1226         x_txn_org_assgn_tbl(l_oa_ind).active_end_date        := NULL; --fix for bug5511381
1227       END IF;
1228 
1229     END LOOP;
1230 
1231   END build_td_from_source;
1232   /* ------------------------------------------------------------------- */
1233   /* use the source information and build a default transaction detail  */
1234   /* ------------------------------------------------------------------- */
1235 
1236   -- this routine also splits the txn_line_detail based on the srl cntrl flag
1237   -- and also based on the parent/child ratio so that the instance are
1238   -- based on the number of txn line detail records
1239 
1240   -- for shipping we might want to pass the mtl_txn_table based on which we should
1241   -- build the txn detail table
1242 
1243   -- cascades the txn details from the first parent with txn detail.
1244 
1245   PROCEDURE build_default_txn_detail(
1246     p_source_table          IN  varchar2,
1247     p_source_id             IN  number,
1248     p_source_header_rec     IN  source_header_rec,
1249     p_source_line_rec       IN  source_line_rec,
1250     p_csi_txn_rec           IN  csi_datastructures_pub.transaction_rec,
1251     px_txn_line_rec         IN OUT NOCOPY csi_t_datastructures_grp.txn_line_rec, --bug 5194812, changed this param to IN OUT
1252     x_txn_line_detail_tbl   OUT NOCOPY csi_t_datastructures_grp.txn_line_detail_tbl,
1253     x_txn_party_tbl         OUT NOCOPY csi_t_datastructures_grp.txn_party_detail_tbl,
1254     x_txn_party_acct_tbl    OUT NOCOPY csi_t_datastructures_grp.txn_pty_acct_detail_tbl,
1255     x_txn_org_assgn_tbl     OUT NOCOPY csi_t_datastructures_grp.txn_org_assgn_tbl,
1256     x_pricing_attribs_tbl   OUT NOCOPY csi_datastructures_pub.pricing_attribs_tbl,
1257     x_return_status         OUT NOCOPY varchar2)
1258   IS
1259 
1260     l_default_sub_type_id       number;
1261 
1262     l_cascade_flag              boolean := FALSE;
1263     l_cascade_string            varchar2(2000);
1264 
1265     l_parent_td_found           boolean := FALSE;
1266     l_parent_td_line_rec        source_line_rec;
1267     l_trackable_parent_found    boolean := FALSE;
1268     l_parent_line_rec           source_line_rec;
1269     l_child_order_line_tbl      source_line_tbl;
1270 
1271     l_txn_line_query_rec        csi_t_datastructures_grp.txn_line_query_rec;
1272     l_txn_line_detail_query_rec csi_t_datastructures_grp.txn_line_detail_query_rec;
1273 
1274     l_item_attributes_rec       item_attributes_rec;
1275 
1276     l_line_dtl_tbl              csi_t_datastructures_grp.txn_line_detail_tbl;
1277     l_pty_dtl_tbl               csi_t_datastructures_grp.txn_party_detail_tbl;
1278     l_pty_acct_tbl              csi_t_datastructures_grp.txn_pty_acct_detail_tbl;
1279     l_ii_rltns_tbl              csi_t_datastructures_grp.txn_ii_rltns_tbl;
1280     l_org_assgn_tbl             csi_t_datastructures_grp.txn_org_assgn_tbl;
1281     l_ext_attrib_tbl            csi_t_datastructures_grp.txn_ext_attrib_vals_tbl;
1282     l_csi_ea_tbl                csi_t_datastructures_grp.csi_ext_attribs_tbl;
1283     l_csi_eav_tbl               csi_t_datastructures_grp.csi_ext_attrib_vals_tbl;
1284     l_txn_systems_tbl           csi_t_datastructures_grp.txn_systems_tbl;
1285 
1286     l_split_flag                varchar2(1) := fnd_api.g_false;
1287     l_split_quantity            number      := 1;
1288     l_split_loop                number      := 1;
1289 
1290     l_return_status             varchar2(1) := fnd_api.g_ret_sts_success;
1291     l_msg_count                 number;
1292     l_msg_data                  varchar2(2000);
1293     l_transaction_type_id       number;
1294 
1295   BEGIN
1296 
1297     x_return_status := fnd_api.g_ret_sts_success;
1298 
1299     api_log('build_default_txn_detail');
1300 
1301     IF p_source_table = g_om_source_table THEN
1302 
1303       px_txn_line_rec.source_transaction_id      := p_source_line_rec.source_line_id;
1304       px_txn_line_rec.source_transaction_table   := g_om_source_table;
1305 
1306       --IF condition added for bug 5194812--
1307       IF nvl(px_txn_line_rec.source_transaction_type_id,fnd_api.g_miss_num) = fnd_api.g_miss_num THEN
1308         px_txn_line_rec.source_transaction_type_id := g_om_txn_type_id;
1309       END IF;
1310 
1311       px_txn_line_rec.processing_status          := 'SUBMIT';
1312 
1313       IF p_source_line_rec.link_to_line_id is not null THEN
1314 
1315         /* the following code is to identify the first trackable parent having
1316            the installation detail. This is to cascade the installation detail
1317         */
1318         get_parent_with_txn_detail(
1319           p_source_line_rec    => p_source_line_rec,
1320           x_parent_found       => l_parent_td_found,
1321           x_parent_line_rec    => l_parent_td_line_rec,
1322           x_return_status      => l_return_status);
1323 
1324         IF l_return_status <> fnd_api.g_ret_sts_success THEN
1325           RAISE fnd_api.g_exc_error;
1326         END IF;
1327 
1328         IF l_parent_td_found THEN
1329           debug('  Parent with transaction detail found. Line ID :'||l_parent_td_line_rec.source_line_id);
1330 
1331           cascade_txn_detail(
1332             p_parent_line_rec     => l_parent_td_line_rec,
1333             p_child_line_rec      => p_source_line_rec,
1334             x_txn_line_detail_tbl => l_line_dtl_tbl,
1335             x_txn_party_tbl       => l_pty_dtl_tbl,
1336             x_txn_party_acct_tbl  => l_pty_acct_tbl,
1337             x_txn_org_assgn_tbl   => l_org_assgn_tbl,
1338             x_return_status       => l_return_status);
1339 
1340           IF l_return_status <> fnd_api.g_ret_sts_success THEN
1341             RAISE fnd_api.g_exc_error;
1342           END IF;
1343 
1344           l_cascade_flag := TRUE;
1345 
1346         END IF;
1347 
1348       END IF;
1349 
1350       IF l_cascade_flag THEN
1351 
1352         x_txn_line_detail_tbl  := l_line_dtl_tbl;
1353         x_txn_party_tbl        := l_pty_dtl_tbl;
1354         x_txn_party_acct_tbl   := l_pty_acct_tbl;
1355         x_txn_org_assgn_tbl    := l_org_assgn_tbl;
1356 
1357         -- rebuild_txn_details
1358         rebuild_txn_detail(
1359           p_source_table         => p_source_table,
1360           p_source_id            => p_source_id,
1361           p_source_header_rec    => p_source_header_rec,
1362           p_source_line_rec      => p_source_line_rec,
1363           p_csi_txn_rec          => p_csi_txn_rec,
1364           px_txn_line_rec        => px_txn_line_rec,
1365           px_txn_line_detail_tbl => x_txn_line_detail_tbl,
1366           px_txn_party_tbl       => x_txn_party_tbl,
1367           px_txn_party_acct_tbl  => x_txn_party_acct_tbl,
1368           px_txn_org_assgn_tbl   => x_txn_org_assgn_tbl,
1369           x_pricing_attribs_tbl  => x_pricing_attribs_tbl,
1370           x_return_status        => l_return_status);
1371 
1372         IF l_return_status <> fnd_api.g_ret_sts_success THEN
1373           RAISE fnd_api.g_exc_error;
1374         END IF;
1375 
1376       ELSE -- not(l_cascade_flag) not cascaded from the parent
1377 
1378         /* this piece or code is to figure out if the order line is eligible for a
1379            split for building parent and child relationship
1380         */
1381         IF p_source_line_rec.link_to_line_id is not null THEN
1382 
1383           get_ib_trackable_parent(
1384             p_source_line_rec    => p_source_line_rec,
1385             x_parent_found       => l_trackable_parent_found,
1386             x_parent_line_rec    => l_parent_line_rec,
1387             x_return_status      => l_return_status);
1388 
1389           IF l_return_status <> fnd_api.g_ret_sts_success THEN
1390             RAISE fnd_api.g_exc_error;
1391           END IF;
1392 
1393           IF l_trackable_parent_found THEN
1394             l_split_flag     := fnd_api.g_true;
1395             l_split_quantity := p_source_line_rec.source_quantity/l_parent_line_rec.source_quantity;
1396             l_split_loop     := l_parent_line_rec.source_quantity;
1397           END IF;
1398 
1399         END IF;
1400 
1401         IF p_source_line_rec.source_quantity > 1 THEN
1402 
1403           get_ib_trackable_children(
1404             p_current_line_id    => p_source_line_rec.source_line_id,
1405             x_trackable_line_tbl => l_child_order_line_tbl,
1406             x_return_status      => l_return_status);
1407 
1408           IF l_return_status <> fnd_api.g_ret_sts_success THEN
1409             RAISE fnd_api.g_exc_error;
1410           END IF;
1411 
1412           IF l_child_order_line_tbl.COUNT > 0 THEN
1413             l_split_flag     := fnd_api.g_true;
1414             l_split_quantity := 1;
1415             l_split_loop     := p_source_line_rec.source_quantity;
1416           END IF;
1417 
1418         END IF;
1419 
1420         -- based on how it should be split while creating the default txn detail
1421         l_transaction_type_id := px_txn_line_rec.source_transaction_type_id;
1422 
1423         build_td_from_source(
1424           p_split_flag            => l_split_flag,
1425           p_split_quantity        => l_split_quantity,
1426           p_split_loop            => l_split_loop,
1427           p_transaction_type_id   => l_transaction_type_id , --bug 5194812
1428           p_source_header_rec     => p_source_header_rec,
1429           p_source_line_rec       => p_source_line_rec,
1430           p_csi_txn_rec           => p_csi_txn_rec,
1431           x_txn_line_rec          => px_txn_line_rec,
1432           x_txn_line_detail_tbl   => x_txn_line_detail_tbl,
1433           x_txn_party_tbl         => x_txn_party_tbl,
1434           x_txn_party_acct_tbl    => x_txn_party_acct_tbl,
1435           x_txn_org_assgn_tbl     => x_txn_org_assgn_tbl,
1436           x_pricing_attribs_tbl   => x_pricing_attribs_tbl,
1437           x_return_status         => l_return_status);
1438 
1439         IF l_return_status <> fnd_api.g_ret_sts_success THEN
1440           RAISE fnd_api.g_exc_error;
1441         END IF;
1442 
1443       END IF; -- cascade check
1444       --
1445     ELSIF p_source_table = g_oke_source_table THEN
1446 
1447       l_split_flag     := fnd_api.g_false;
1448       l_split_quantity := p_source_line_rec.source_quantity;
1449       l_split_loop     := 1;
1450 
1451       build_td_from_source(
1452         p_split_flag            => l_split_flag,
1453         p_split_quantity        => l_split_quantity,
1454         p_split_loop            => l_split_loop,
1455         p_transaction_type_id   => g_oke_txn_type_id,
1456         p_source_header_rec     => p_source_header_rec,
1457         p_source_line_rec       => p_source_line_rec,
1458         p_csi_txn_rec           => p_csi_txn_rec,
1459         x_txn_line_rec          => px_txn_line_rec,
1460         x_txn_line_detail_tbl   => x_txn_line_detail_tbl,
1461         x_txn_party_tbl         => x_txn_party_tbl,
1462         x_txn_party_acct_tbl    => x_txn_party_acct_tbl,
1463         x_txn_org_assgn_tbl     => x_txn_org_assgn_tbl,
1464         x_pricing_attribs_tbl   => x_pricing_attribs_tbl,
1465         x_return_status         => l_return_status);
1466 
1467       IF l_return_status <> fnd_api.g_ret_sts_success THEN
1468         RAISE fnd_api.g_exc_error;
1469       END IF;
1470 
1471     END IF;
1472 
1473     -- build pricing attribs
1474     get_pricing_attributes(
1475       p_line_id             => p_source_line_rec.source_line_id,
1476       x_pricing_attribs_tbl => x_pricing_attribs_tbl,
1477       x_return_status       => l_return_status);
1478 
1479     IF l_return_status <> fnd_api.g_ret_sts_success THEN
1480       RAISE fnd_api.g_exc_error;
1481     END IF;
1482 
1483   EXCEPTION
1484     WHEN fnd_api.g_exc_error THEN
1485       x_return_status := fnd_api.g_ret_sts_error;
1486   END build_default_txn_detail;
1487 
1488 
1489   /* ------------------------------------------------------------------- */
1490   /* this routine is to rebuild the user entered transaction detail with */
1491   /* the addition of all the defaults like contacts, org assignments etc.*/
1492   /* ------------------------------------------------------------------- */
1493 
1494   -- rebuild also splits the transaction detail bases on the serial control
1495   -- flag or the based on the parent/child ratios.
1496 
1497   PROCEDURE rebuild_txn_detail(
1498     p_source_table         IN  varchar2,
1499     p_source_id            IN  number,
1500     p_source_header_rec    IN  source_header_rec,
1501     p_source_line_rec      IN  source_line_rec,
1502     p_csi_txn_rec          IN  csi_datastructures_pub.transaction_rec,
1503     px_txn_line_rec        IN OUT NOCOPY csi_t_datastructures_grp.txn_line_rec,
1504     px_txn_line_detail_tbl IN OUT NOCOPY csi_t_datastructures_grp.txn_line_detail_tbl,
1505     px_txn_party_tbl       IN OUT NOCOPY csi_t_datastructures_grp.txn_party_detail_tbl,
1506     px_txn_party_acct_tbl  IN OUT NOCOPY csi_t_datastructures_grp.txn_pty_acct_detail_tbl,
1507     px_txn_org_assgn_tbl   IN OUT NOCOPY csi_t_datastructures_grp.txn_org_assgn_tbl,
1508     x_pricing_attribs_tbl  OUT NOCOPY csi_datastructures_pub.pricing_attribs_tbl,
1509     x_return_status        OUT NOCOPY varchar2)
1510   IS
1511     l_tld_tbl          csi_t_datastructures_grp.txn_line_detail_tbl;
1512     l_pty_tbl          csi_t_datastructures_grp.txn_party_detail_tbl;
1513     l_pa_tbl           csi_t_datastructures_grp.txn_pty_acct_detail_tbl;
1514     l_oa_tbl           csi_t_datastructures_grp.txn_org_assgn_tbl;
1515     l_ii_rltns_tbl     csi_t_datastructures_grp.txn_ii_rltns_tbl;
1516     l_eav_tbl          csi_t_datastructures_grp.txn_ext_attrib_vals_tbl;
1517     l_systems_tbl      csi_t_datastructures_grp.txn_systems_tbl;
1518 
1519     l_return_status          varchar2(1);
1520     l_msg_count              number;
1521     l_msg_data               varchar2(2000);
1522 
1523     l_owner_pty_index        binary_integer := 0;
1524 
1525     l_owner_found            boolean := FALSE;
1526     l_ship_to_contact_found  boolean := FALSE;
1527     l_bill_to_contact_found  boolean := FALSE;
1528     l_org_assignment_found   boolean := FALSE;
1529 
1530     l_n_pt_ind               binary_integer := 0;
1531     l_n_pa_ind               binary_integer := 0;
1532     l_oa_n_ind               binary_integer := 0;
1533 
1534   BEGIN
1535     x_return_status := fnd_api.g_ret_sts_success;
1536     api_log('rebuild_txn_detail');
1537 
1538     -- convert all the ids to indexes
1539 
1540     l_tld_tbl := px_txn_line_detail_tbl;
1541     l_pty_tbl := px_txn_party_tbl;
1542     l_pa_tbl  := px_txn_party_acct_tbl;
1543     l_oa_tbl  := px_txn_org_assgn_tbl;
1544 
1545     csi_t_utilities_pvt.convert_ids_to_index(
1546       px_line_dtl_tbl    => l_tld_tbl,
1547       px_pty_dtl_tbl     => l_pty_tbl,
1548       px_pty_acct_tbl    => l_pa_tbl,
1549       px_ii_rltns_tbl    => l_ii_rltns_tbl,
1550       px_org_assgn_tbl   => l_oa_tbl,
1551       px_ext_attrib_tbl  => l_eav_tbl,
1552       px_txn_systems_tbl => l_systems_tbl);
1553 
1554     -- check if the tld needs to be split based on
1555       -- a. order line being a parent
1556       -- b. serialized item
1557       -- c. the split profile is turned on
1558     -- for ATandT qty is always one so not putting in the logic now.
1559 
1560 
1561     IF l_tld_tbl.count > 0 THEN
1562       FOR l_ind IN l_tld_tbl.FIRST .. l_tld_tbl.LAST
1563       LOOP
1564 
1565         l_owner_found           := FALSE;
1566         l_ship_to_contact_found := FALSE;
1567         l_bill_to_contact_found := FALSE;
1568         l_org_assignment_found  := FALSE;
1569         l_owner_pty_index       := null;
1570 
1571         IF l_tld_tbl(l_ind).source_transaction_flag = 'Y' THEN
1572           -- check if every source tld has all the default contacts, org assign etc
1573           IF l_pty_tbl.COUNT > 0 THEN
1574             FOR l_pt_ind IN l_pty_tbl.FIRST .. l_pty_tbl.LAST
1575             LOOP
1576               IF l_pty_tbl(l_pt_ind).txn_line_details_index = l_ind THEN
1577                 -- check if owner record is there /compare it with the om line customer
1578                 -- check and default the contact party /ship to/ bill to
1579                 -- also eliminate the owner account based on the owner change flag
1580                 IF l_pty_tbl(l_pt_ind).relationship_type_code = 'OWNER' THEN
1581 
1582                   l_owner_found     := TRUE;
1583                   l_owner_pty_index := l_pt_ind;
1584 
1585                 END IF;
1586 
1587                 IF  l_pty_tbl(l_pt_ind).relationship_type_code = 'SHIP_TO'
1588                       AND
1589                     l_pty_tbl(l_pt_ind).contact_flag = 'Y'
1590                       AND
1591                     l_pty_tbl(l_pt_ind).party_source_table = 'HZ_PARTIES'
1592                       AND
1593                     l_pty_tbl(l_pt_ind).party_source_id = p_source_line_rec.ship_to_contact_party_id
1594                 THEN
1595                   l_ship_to_contact_found := TRUE;
1596                 END IF;
1597 
1598                 IF  l_pty_tbl(l_pt_ind).relationship_type_code = 'BILL_TO'
1599                       AND
1600                     l_pty_tbl(l_pt_ind).contact_flag = 'Y'
1601                       AND
1602                     l_pty_tbl(l_pt_ind).party_source_table = 'HZ_PARTIES'
1603                       AND
1604                     l_pty_tbl(l_pt_ind).party_source_id = p_source_line_rec.bill_to_contact_party_id
1605                 THEN
1606                   l_bill_to_contact_found := TRUE;
1607                 END IF;
1608 
1609                 IF l_pa_tbl.COUNT > 0 THEN
1610 
1611                   FOR l_pa_ind IN l_pa_tbl.FIRST .. l_pa_tbl.LAST
1612                   LOOP
1613                     IF l_pa_tbl(l_pa_ind).txn_party_details_index = l_pt_ind THEN
1614                       -- check and default the owner account
1615                       null;
1616                     END IF;
1617                   END LOOP;
1618                 END IF;
1619               END IF; -- txn_line_details_index = l_ind
1620             END LOOP;
1621           END IF; -- pty_tbl.count > 0
1622 
1623           IF l_oa_tbl.COUNT > 0 THEN
1624             FOR l_oa_ind IN l_oa_tbl.FIRST .. l_oa_tbl.LAST
1625             LOOP
1626               IF l_oa_tbl(l_oa_ind).txn_line_details_index = l_ind THEN
1627               -- check and default the org assignments
1628                 null;
1629                 IF l_oa_tbl(l_oa_ind).relationship_type_code = 'SOLD_FROM'
1630                      AND
1631                    l_oa_tbl(l_oa_ind).operating_unit_id      = p_source_line_rec.sold_from_org_id
1632                 THEN
1633                   l_org_assignment_found := TRUE;
1634                 END IF;
1635               END IF;
1636             END LOOP;
1637           END IF; -- l_oa_tbl.count > 0
1638 
1639           IF l_owner_found THEN
1640 
1641             IF NOT (l_ship_to_contact_found)
1642                  AND
1643                p_source_line_rec.ship_to_contact_party_id is not null
1644             THEN
1645 
1646               l_n_pt_ind := l_pty_tbl.count + 1;
1647 
1648               l_pty_tbl(l_n_pt_ind).txn_line_detail_id     := fnd_api.g_miss_num;
1649               l_pty_tbl(l_n_pt_ind).txn_party_detail_id    := fnd_api.g_miss_num;
1650               l_pty_tbl(l_n_pt_ind).txn_line_details_index := l_ind;
1651               l_pty_tbl(l_n_pt_ind).party_source_table     := 'HZ_PARTIES';
1652               l_pty_tbl(l_n_pt_ind).party_source_id        := p_source_line_rec.ship_to_contact_party_id;
1653               l_pty_tbl(l_n_pt_ind).relationship_type_code := 'SHIP_TO';
1654               l_pty_tbl(l_n_pt_ind).contact_flag           := 'Y';
1655               l_pty_tbl(l_n_pt_ind).contact_party_id       := l_owner_pty_index;
1656               l_pty_tbl(l_n_pt_ind).object_version_number  := 1.0;
1657             END IF;
1658 
1659             IF NOT (l_bill_to_contact_found)
1660                  AND
1661                p_source_line_rec.bill_to_contact_party_id is not null
1662             THEN
1663               l_pty_tbl(l_n_pt_ind).txn_line_detail_id     := fnd_api.g_miss_num;
1664               l_pty_tbl(l_n_pt_ind).txn_party_detail_id    := fnd_api.g_miss_num;
1665               l_pty_tbl(l_n_pt_ind).txn_line_details_index := l_ind;
1666               l_pty_tbl(l_n_pt_ind).party_source_table     := 'HZ_PARTIES';
1667               l_pty_tbl(l_n_pt_ind).party_source_id        := p_source_line_rec.bill_to_contact_party_id;
1668               l_pty_tbl(l_n_pt_ind).relationship_type_code := 'BILL_TO';
1669               l_pty_tbl(l_n_pt_ind).contact_flag           := 'Y';
1670               l_pty_tbl(l_n_pt_ind).contact_party_id       := l_owner_pty_index;
1671               l_pty_tbl(l_n_pt_ind).object_version_number  := 1.0;
1672             END IF;
1673 
1674           END IF;
1675 
1676           IF NOT(l_org_assignment_found) THEN
1677 
1678             l_oa_n_ind := l_oa_tbl.COUNT + 1;
1679 
1680             l_oa_tbl(l_oa_n_ind).txn_line_detail_id     := fnd_api.g_miss_num;
1681             l_oa_tbl(l_oa_n_ind).txn_line_details_index := l_ind;
1682             l_oa_tbl(l_oa_n_ind).operating_unit_id      := p_source_line_rec.sold_from_org_id;
1683             l_oa_tbl(l_oa_n_ind).relationship_type_code := 'SOLD_FROM';
1684             l_oa_tbl(l_oa_n_ind).preserve_detail_flag   := 'Y';
1685             l_oa_tbl(l_oa_n_ind).object_version_number  := 1.0;
1686 
1687           END IF;
1688 
1689         END IF; -- source_transaction_flag = 'Y'
1690       END LOOP; -- l_tld_tbl loop
1691     END IF; -- l_tld_tbl.count > 0
1692 
1693     px_txn_line_detail_tbl := l_tld_tbl;
1694     px_txn_party_tbl       := l_pty_tbl;
1695     px_txn_party_acct_tbl  := l_pa_tbl;
1696     px_txn_org_assgn_tbl   := l_oa_tbl;
1697 
1698     IF px_txn_line_rec.source_transaction_table = 'OE_ORDER_LINES_ALL' THEN
1699 
1700       get_pricing_attributes(
1701         p_line_id               => px_txn_line_rec.source_transaction_id,
1702         x_pricing_attribs_tbl   => x_pricing_attribs_tbl,
1703         x_return_status         => l_return_status);
1704 
1705       IF l_return_status <> fnd_api.g_ret_sts_success THEN
1706         RAISE fnd_api.g_exc_error;
1707       END IF;
1708 
1709     END IF;
1710 
1711 
1712   EXCEPTION
1713     WHEN fnd_api.g_exc_error THEN
1714       x_return_status := fnd_api.g_ret_sts_error;
1715   END rebuild_txn_detail;
1716 
1717   --
1718   --
1719   --
1720   PROCEDURE get_cz_txn_details(
1721     p_config_session_key   IN csi_utility_grp.config_session_key,
1722     x_txn_line_rec            OUT NOCOPY csi_t_datastructures_grp.txn_line_rec,
1723     x_txn_line_dtl_tbl        OUT NOCOPY csi_t_datastructures_grp.txn_line_detail_tbl,
1724     x_txn_party_tbl           OUT NOCOPY csi_t_datastructures_grp.txn_party_detail_tbl,
1725     x_txn_party_acct_tbl      OUT NOCOPY csi_t_datastructures_grp.txn_pty_acct_detail_tbl,
1726     x_txn_org_assgn_tbl       OUT NOCOPY csi_t_datastructures_grp.txn_org_assgn_tbl,
1727     x_txn_ii_rltns_tbl        OUT NOCOPY csi_t_datastructures_grp.txn_ii_rltns_tbl,
1728     x_txn_eav_tbl             OUT NOCOPY csi_t_datastructures_grp.txn_ext_attrib_vals_tbl,
1729     x_return_status           OUT NOCOPY varchar2)
1730   IS
1731 
1732     l_txn_line_query_rec         csi_t_datastructures_grp.txn_line_query_rec;
1733     l_txn_line_detail_query_rec  csi_t_datastructures_grp.txn_line_detail_query_rec;
1734 
1735     l_g_line_dtl_tbl       csi_t_datastructures_grp.txn_line_detail_tbl;
1736     l_g_pty_dtl_tbl        csi_t_datastructures_grp.txn_party_detail_tbl;
1737     l_g_pty_acct_tbl       csi_t_datastructures_grp.txn_pty_acct_detail_tbl;
1738     l_g_ii_rltns_tbl       csi_t_datastructures_grp.txn_ii_rltns_tbl;
1739     l_g_org_assgn_tbl      csi_t_datastructures_grp.txn_org_assgn_tbl;
1740     l_g_ext_attrib_tbl     csi_t_datastructures_grp.txn_ext_attrib_vals_tbl;
1741     l_g_csi_ea_tbl         csi_t_datastructures_grp.csi_ext_attribs_tbl;
1742     l_g_csi_eav_tbl        csi_t_datastructures_grp.csi_ext_attrib_vals_tbl;
1743     l_g_txn_systems_tbl    csi_t_datastructures_grp.txn_systems_tbl;
1744 
1745     l_return_status        varchar2(1) := fnd_api.g_ret_sts_success;
1746     l_msg_data             varchar2(512);
1747     l_msg_count            number;
1748 
1749   BEGIN
1750 
1751     x_return_status := fnd_api.g_ret_sts_success;
1752 
1753     api_log('get_cz_txn_details');
1754 
1755     --l_txn_line_query_rec.source_transaction_type_id := 401;
1756     l_txn_line_query_rec.source_transaction_table := 'CONFIGURATOR';
1757     l_txn_line_query_rec.config_session_hdr_id    := p_config_session_key.session_hdr_id;
1758     l_txn_line_query_rec.config_session_item_id   := p_config_session_key.session_item_id;
1759     l_txn_line_query_rec.config_session_rev_num   := p_config_session_key.session_rev_num;
1760 
1761     csi_t_txn_details_grp.get_transaction_details(
1762       p_api_version               => 1.0,
1763       p_commit                    => fnd_api.g_false,
1764       p_init_msg_list             => fnd_api.g_true,
1765       p_validation_level          => fnd_api.g_valid_level_full,
1766       p_txn_line_query_rec        => l_txn_line_query_rec,
1767       p_txn_line_detail_query_rec => l_txn_line_detail_query_rec,
1768       x_txn_line_detail_tbl       => l_g_line_dtl_tbl,
1769       p_get_parties_flag          => fnd_api.g_false,
1770       x_txn_party_detail_tbl      => l_g_pty_dtl_tbl,
1771       p_get_pty_accts_flag        => fnd_api.g_false,
1772       x_txn_pty_acct_detail_tbl   => l_g_pty_acct_tbl,
1773       p_get_ii_rltns_flag         => fnd_api.g_true,
1774       x_txn_ii_rltns_tbl          => l_g_ii_rltns_tbl,
1775       p_get_org_assgns_flag       => fnd_api.g_false,
1776       x_txn_org_assgn_tbl         => l_g_org_assgn_tbl,
1777       p_get_ext_attrib_vals_flag  => fnd_api.g_true,
1778       x_txn_ext_attrib_vals_tbl   => l_g_ext_attrib_tbl,
1779       p_get_csi_attribs_flag      => fnd_api.g_false,
1780       x_csi_ext_attribs_tbl       => l_g_csi_ea_tbl,
1781       p_get_csi_iea_values_flag   => fnd_api.g_false,
1782       x_csi_iea_values_tbl        => l_g_csi_eav_tbl,
1783       p_get_txn_systems_flag      => fnd_api.g_false,
1784       x_txn_systems_tbl           => l_g_txn_systems_tbl,
1785       x_return_status             => l_return_status,
1786       x_msg_count                 => l_msg_count,
1787       x_msg_data                  => l_msg_data);
1788 
1789     IF l_return_status <> fnd_api.g_ret_sts_success THEN
1790       RAISE fnd_api.g_exc_error;
1791     END IF;
1792 
1793     IF l_g_line_dtl_tbl.COUNT > 0 THEN
1794 
1795       BEGIN
1796         SELECT source_transaction_type_id,
1797                transaction_line_id,
1798                source_transaction_table,
1799                config_session_hdr_id,
1800                config_session_item_id,
1801                config_session_rev_num
1802         INTO   x_txn_line_rec.source_transaction_type_id,
1803                x_txn_line_rec.transaction_line_id,
1804                x_txn_line_rec.source_transaction_table,
1805                x_txn_line_rec.config_session_hdr_id,
1806                x_txn_line_rec.config_session_item_id,
1807                x_txn_line_rec.config_session_rev_num
1808         FROM   csi_t_transaction_lines
1809         WHERE  transaction_line_id = l_g_line_dtl_tbl(1).transaction_line_id;
1810       EXCEPTION
1811         WHEN no_data_found THEN
1812           null;
1813       END;
1814 
1815     END IF;
1816 
1817     IF l_g_line_dtl_tbl.COUNT > 0 THEN
1818       FOR l_ind IN l_g_line_dtl_tbl.FIRST .. l_g_line_dtl_tbl.LAST
1819       LOOP
1820         l_g_line_dtl_tbl(l_ind).source_txn_line_detail_id :=
1821                                 l_g_line_dtl_tbl(l_ind).txn_line_detail_id;
1822       END LOOP;
1823     END IF;
1824 
1825 
1826     x_txn_line_dtl_tbl := l_g_line_dtl_tbl;
1827     x_txn_ii_rltns_tbl := l_g_ii_rltns_tbl;
1828     x_txn_eav_tbl      := l_g_ext_attrib_tbl;
1829 
1830     debug('txn details record count :-');
1831     debug('  txn_line_dtl_tbl  :'||x_txn_line_dtl_tbl.COUNT);
1832     debug('  txn_ii_rltns_tbl  :'||x_txn_ii_rltns_tbl.COUNT);
1833     debug('  txn_eav_tbl       :'||x_txn_eav_tbl.COUNT);
1834 
1835   EXCEPTION
1836     WHEN fnd_api.g_exc_error THEN
1837       x_return_status := fnd_api.g_ret_sts_error;
1838   END get_cz_txn_details;
1839 
1840   --
1841   --
1842   --
1843   PROCEDURE get_config_keys_for_order(
1844     p_header_id            IN  number,
1845     x_config_session_keys  OUT NOCOPY csi_utility_grp.config_session_keys,
1846     x_return_status        OUT NOCOPY varchar2)
1847   IS
1848 
1849     CURSOR keys_cur IS
1850       SELECT config_header_id  config_session_hdr_id,
1851              config_rev_nbr    config_session_rev_num,
1852              configuration_id  config_session_item_id
1853       FROM   oe_order_lines_all
1854       WHERE  header_id = p_header_id;
1855 
1856     l_ind                  binary_integer := 0;
1857 
1858     l_return_status        varchar2(1);
1859     l_msg_count            number;
1860     l_msg_data             varchar2(2000);
1861 
1862   BEGIN
1863     x_return_status := fnd_api.g_ret_sts_success;
1864     api_log('get_config_keys_for_order');
1865 
1866     FOR keys_rec IN keys_cur
1867     LOOP
1868 
1869       l_ind := keys_cur%rowcount;
1870 
1871       x_config_session_keys(l_ind).session_hdr_id  := keys_rec.config_session_hdr_id;
1872       x_config_session_keys(l_ind).session_item_id := keys_rec.config_session_item_id;
1873       x_config_session_keys(l_ind).session_rev_num := keys_rec.config_session_rev_num;
1874 
1875     END LOOP;
1876 
1877   EXCEPTION
1878     WHEN fnd_api.g_exc_error THEN
1879       x_return_status := fnd_api.g_ret_sts_error;
1880   END get_config_keys_for_order;
1881 
1882   --
1883   --
1884   --
1885   PROCEDURE get_all_txn_rltns_for_order(
1886     p_header_id            IN  number,
1887     x_txn_ii_rltns_tbl     OUT NOCOPY csi_t_datastructures_grp.txn_ii_rltns_tbl,
1888     x_return_status        OUT NOCOPY varchar2)
1889   IS
1890 
1891     -- get_cz_txn_details variable
1892     l_txn_line_rec         csi_t_datastructures_grp.txn_line_rec;
1893     l_txn_line_dtl_tbl     csi_t_datastructures_grp.txn_line_detail_tbl;
1894     l_txn_party_tbl        csi_t_datastructures_grp.txn_party_detail_tbl;
1895     l_txn_party_acct_tbl   csi_t_datastructures_grp.txn_pty_acct_detail_tbl;
1896     l_txn_org_assgn_tbl    csi_t_datastructures_grp.txn_org_assgn_tbl;
1897     l_txn_ii_rltns_tbl     csi_t_datastructures_grp.txn_ii_rltns_tbl;
1898     l_txn_eav_tbl          csi_t_datastructures_grp.txn_ext_attrib_vals_tbl;
1899 
1900     l_order_session_keys   csi_utility_grp.config_session_keys;
1901     l_return_status        varchar2(1) := fnd_api.g_ret_sts_success;
1902 
1903     x_ind                  binary_integer := 0;
1904 
1905   BEGIN
1906 
1907     x_return_status := fnd_api.g_ret_sts_success;
1908     api_log('get_all_txn_rltns_for_order');
1909 
1910     -- get all the session keys for the order using the header_id
1911     get_config_keys_for_order(
1912       p_header_id            => p_header_id,
1913       x_config_session_keys  => l_order_session_keys,
1914       x_return_status        => l_return_status);
1915 
1916     IF l_return_status <> fnd_api.g_ret_sts_success THEN
1917       RAISE fnd_api.g_exc_error;
1918     END IF;
1919 
1920     IF l_order_session_keys.COUNT > 0 THEN
1921       FOR l_ind IN l_order_session_keys.FIRST .. l_order_session_keys.LAST
1922       LOOP
1923 
1924         get_cz_txn_details(
1925           p_config_session_key   => l_order_session_keys(l_ind),
1926           x_txn_line_rec         => l_txn_line_rec,
1927           x_txn_line_dtl_tbl     => l_txn_line_dtl_tbl,
1928           x_txn_party_tbl        => l_txn_party_tbl,
1929           x_txn_party_acct_tbl   => l_txn_party_acct_tbl,
1930           x_txn_org_assgn_tbl    => l_txn_org_assgn_tbl,
1931           x_txn_ii_rltns_tbl     => l_txn_ii_rltns_tbl,
1932           x_txn_eav_tbl          => l_txn_eav_tbl,
1933           x_return_status        => l_return_status);
1934 
1935         IF l_return_status <> fnd_api.g_ret_sts_success THEN
1936           RAISE fnd_api.g_exc_error;
1937         END IF;
1938 
1939         IF l_txn_ii_rltns_tbl.COUNT > 0 THEN
1940           FOR l_ii_ind IN l_txn_ii_rltns_tbl.FIRST .. l_txn_ii_rltns_tbl.LAST
1941           LOOP
1942 
1943             x_ind := x_ind + 1;
1944             x_txn_ii_rltns_tbl(x_ind) := l_txn_ii_rltns_tbl(l_ii_ind);
1945 
1946           END LOOP;
1947         END IF;
1948 
1949       END LOOP;
1950     END IF;
1951 
1952   EXCEPTION
1953     WHEN fnd_api.g_exc_error THEN
1954       x_return_status := fnd_api.g_ret_sts_error;
1955   END get_all_txn_rltns_for_order;
1956 
1957   --
1958   --
1959   --
1960   PROCEDURE filter_relations(
1961     p_instance_key         IN     csi_utility_grp.config_instance_key,
1962     p_transaction_line_id  IN     number,
1963     px_txn_ii_rltns_tbl    IN OUT NOCOPY csi_t_datastructures_grp.txn_ii_rltns_tbl,
1964     x_return_status           OUT NOCOPY varchar2)
1965   IS
1966 
1967     l_rltns_tbl            csi_t_datastructures_grp.txn_ii_rltns_tbl;
1968     l_new_rltns_tbl        csi_t_datastructures_grp.txn_ii_rltns_tbl;
1969     l_o_ind                binary_integer := 0;
1970     l_n_ind                binary_integer := 0;
1971     l_subject_object_flag  varchar2(1);
1972     l_instance_found       boolean := FALSE;
1973     l_already_processed    boolean := FALSE;
1974     l_processing_status    varchar2(30);
1975 
1976     l_dummy                varchar2(1);
1977     l_return_status        varchar2(1) := fnd_api.g_ret_sts_success;
1978 
1979   BEGIN
1980 
1981     x_return_status := fnd_api.g_ret_sts_success;
1982     api_log('filter_relations');
1983 
1984     l_rltns_tbl := px_txn_ii_rltns_tbl;
1985 
1986     -- rebuild the relations for eliminating the already processed relations
1987     -- and the cannot process relations (subject or object not as instance)
1988 
1989     IF l_rltns_tbl.count > 0 THEN
1990       FOR l_ind IN l_rltns_tbl.FIRST .. l_rltns_tbl.LAST
1991       LOOP
1992 
1993         l_instance_found := FALSE;
1994 
1995         IF (  l_rltns_tbl(l_ind).sub_config_inst_hdr_id = p_instance_key.inst_hdr_id
1996               AND
1997               l_rltns_tbl(l_ind).sub_config_inst_rev_num = p_instance_key.inst_rev_num
1998               AND
1999               l_rltns_tbl(l_ind).sub_config_inst_item_id = p_instance_key.inst_item_id
2000            )
2001         THEN
2002           l_subject_object_flag := 'O';
2003         ELSE
2004           null;
2005         END IF;
2006 
2007         IF (  l_rltns_tbl(l_ind).obj_config_inst_hdr_id = p_instance_key.inst_hdr_id
2008               AND
2009               l_rltns_tbl(l_ind).obj_config_inst_rev_num = p_instance_key.inst_rev_num
2010               AND
2011               l_rltns_tbl(l_ind).obj_config_inst_item_id = p_instance_key.inst_item_id
2012            )
2013         THEN
2014           l_subject_object_flag := 'S';
2015         ELSE
2016           null;
2017         END IF;
2018 
2019         -- check if it is existing as an instance in installed base
2020         -- if not then eliminate this relation
2021         debug('transaction_line_id   :'||l_rltns_tbl(l_ind).transaction_line_id);
2022         debug('p_transaction_line_id :'||p_transaction_line_id);
2023 
2024         l_processing_status := 'PROCESSED';
2025 
2026         IF l_rltns_tbl(l_ind).transaction_line_id <> p_transaction_line_id THEN
2027           BEGIN
2028             SELECT processing_status
2029             INTO   l_processing_status
2030             FROM   csi_t_transaction_lines
2031             WHERE  transaction_line_id = l_rltns_tbl(l_ind).transaction_line_id;
2032           END;
2033         END IF;
2034 
2035         IF l_processing_status = 'PROCESSED' THEN
2036 
2037            IF l_subject_object_flag = 'O' THEN
2038 
2039               debug('This relation is OBJECT to the current processing line detail');
2040 
2041               debug('  inst_hdr_id  :'||l_rltns_tbl(l_ind).obj_config_inst_hdr_id);
2042               debug('  inst_rev_num :'||l_rltns_tbl(l_ind).obj_config_inst_rev_num);
2043               debug('  inst_item_id :'||l_rltns_tbl(l_ind).obj_config_inst_item_id);
2044               debug('  relationship :'||l_rltns_tbl(l_ind).relationship_type_code);
2045 
2046               IF l_rltns_tbl(l_ind).object_type = 'I' THEN
2047                  l_instance_found := TRUE;
2048               ELSE
2049                  BEGIN
2050                     SELECT 'Y' INTO l_dummy
2051                     FROM   csi_item_instances
2052                     WHERE  config_inst_hdr_id  = l_rltns_tbl(l_ind).obj_config_inst_hdr_id
2053                     --AND    config_inst_rev_num = l_rltns_tbl(l_ind).obj_config_inst_rev_num
2054                     AND    config_inst_item_id = l_rltns_tbl(l_ind).obj_config_inst_item_id;
2055 
2056                     l_instance_found := TRUE;
2057                  EXCEPTION
2058                     WHEN NO_DATA_FOUND THEN
2059                        BEGIN
2060                           SELECT 'Y' INTO l_dummy
2061                           FROM CSI_T_TXN_LINE_DETAILS
2062                           WHERE txn_line_detail_id = l_rltns_tbl(l_ind).object_id
2063                           AND   instance_id IS NOT NULL;
2064 
2065                           l_instance_found := TRUE;
2066                        EXCEPTION
2067                           WHEN NO_DATA_FOUND THEN
2068                              l_instance_found := FALSE;
2069                        END;
2070                  END;
2071               END IF;
2072 
2073            ELSIF l_subject_object_flag = 'S' THEN
2074 
2075               debug('This relation is SUBJECT to the current processing line detail');
2076 
2077               debug('  inst_hdr_id  :'||l_rltns_tbl(l_ind).sub_config_inst_hdr_id);
2078               debug('  inst_rev_num :'||l_rltns_tbl(l_ind).sub_config_inst_rev_num);
2079               debug('  inst_item_id :'||l_rltns_tbl(l_ind).sub_config_inst_item_id);
2080               debug('  relationship :'||l_rltns_tbl(l_ind).relationship_type_code);
2081 
2082               IF l_rltns_tbl(l_ind).subject_type = 'I' THEN
2083                  l_instance_found := TRUE;
2084               ELSE
2085                  BEGIN
2086                     SELECT 'Y' INTO l_dummy
2087                     FROM   csi_item_instances
2088                     WHERE  config_inst_hdr_id  = l_rltns_tbl(l_ind).sub_config_inst_hdr_id
2089                     --AND    config_inst_rev_num = l_rltns_tbl(l_ind).sub_config_inst_rev_num
2090                     AND    config_inst_item_id = l_rltns_tbl(l_ind).sub_config_inst_item_id;
2091 
2092                     l_instance_found := TRUE;
2093                  EXCEPTION
2094                     WHEN NO_DATA_FOUND THEN
2095                        BEGIN
2096                           SELECT 'Y' INTO l_dummy
2097                           FROM CSI_T_TXN_LINE_DETAILS
2098                           WHERE txn_line_detail_id = l_rltns_tbl(l_ind).subject_id
2099                           AND   instance_id IS NOT NULL;
2100 
2101                           l_instance_found := TRUE;
2102                        EXCEPTION
2103                           WHEN NO_DATA_FOUND THEN
2104                              l_instance_found := FALSE;
2105                        END;
2106                  END;
2107               END IF;
2108 
2109            ELSE
2110               debug('neither subject nor object *');
2111 
2112               l_instance_found := FALSE;
2113            END IF;
2114         ELSE
2115           l_instance_found := FALSE;
2116         END IF;
2117 
2118         -- check if the relation is already processed into install base
2119 
2120         IF l_instance_found  THEN
2121           l_n_ind := l_new_rltns_tbl.COUNT + 1;
2122           l_new_rltns_tbl(l_n_ind) := l_rltns_tbl(l_ind);
2123         END IF;
2124 
2125       END LOOP;
2126     END IF;
2127 
2128     px_txn_ii_rltns_tbl := l_new_rltns_tbl;
2129   EXCEPTION
2130     WHEN fnd_api.g_exc_error THEN
2131       x_return_status := fnd_api.g_ret_sts_error;
2132   END filter_relations;
2133 
2134   --
2135   --
2136   --
2137   PROCEDURE get_cz_relations(
2138     p_source_header_rec    IN  source_header_rec,
2139     p_source_line_rec      IN  source_line_rec,
2140     px_txn_line_rec        IN OUT NOCOPY  csi_t_datastructures_grp.txn_line_rec,
2141     px_txn_line_dtl_tbl    IN OUT NOCOPY  csi_t_datastructures_grp.txn_line_detail_tbl,
2142     x_txn_ii_rltns_tbl     OUT NOCOPY csi_t_datastructures_grp.txn_ii_rltns_tbl,
2143     x_txn_eav_tbl          OUT NOCOPY csi_t_datastructures_grp.txn_ext_attrib_vals_tbl,
2144     x_return_status        OUT NOCOPY varchar2)
2145   IS
2146 
2147     l_line_session_key     csi_utility_grp.config_session_key;
2148 
2149     l_src_instance_key     csi_utility_grp.config_instance_key;
2150     l_src_tld_rec          csi_t_datastructures_grp.txn_line_detail_rec;
2151     l_src_tld_index        binary_integer := 0;
2152     l_source_identified    boolean := FALSE;
2153 
2154     l_tld_tbl              csi_t_datastructures_grp.txn_line_detail_tbl;
2155     l_n_td_ind             binary_integer := 0;
2156 
2157     l_filtered_rltns_tbl   csi_t_datastructures_grp.txn_ii_rltns_tbl;
2158 
2159     -- get txn details variables
2160     l_txn_line_rec         csi_t_datastructures_grp.txn_line_rec;
2161     l_txn_line_dtl_tbl     csi_t_datastructures_grp.txn_line_detail_tbl;
2162     l_txn_party_tbl        csi_t_datastructures_grp.txn_party_detail_tbl;
2163     l_txn_party_acct_tbl   csi_t_datastructures_grp.txn_pty_acct_detail_tbl;
2164     l_txn_org_assgn_tbl    csi_t_datastructures_grp.txn_org_assgn_tbl;
2165     l_txn_ii_rltns_tbl     csi_t_datastructures_grp.txn_ii_rltns_tbl;
2166     l_txn_eav_tbl          csi_t_datastructures_grp.txn_ext_attrib_vals_tbl;
2167 
2168     l_ord_txn_ii_rltns_tbl csi_t_datastructures_grp.txn_ii_rltns_tbl;
2169 
2170     l_return_status        varchar2(1);
2171     l_return_message       varchar2(2000);
2172 
2173     l_msg_count            number;
2174     l_msg_data             varchar2(2000);
2175 
2176   BEGIN
2177 
2178     x_return_status := fnd_api.g_ret_sts_success;
2179     api_log('get_cz_relations');
2180 
2181     l_tld_tbl := px_txn_line_dtl_tbl;
2182 
2183     -- get_cz_txn_detail for the current order line using the line session key
2184 
2185     csi_utility_grp.get_config_key_for_om_line(
2186       p_line_id              => p_source_line_rec.source_line_id,
2187       x_config_session_key   => l_line_session_key,
2188       x_return_status        => l_return_status,
2189       x_return_message       => l_return_message);
2190 
2191     IF l_return_status <> fnd_api.g_ret_sts_success THEN
2192       RAISE fnd_api.g_exc_error;
2193     END IF;
2194 
2195     get_cz_txn_details(
2196       p_config_session_key   => l_line_session_key,
2197       x_txn_line_rec         => l_txn_line_rec,
2198       x_txn_line_dtl_tbl     => l_txn_line_dtl_tbl,
2199       x_txn_party_tbl        => l_txn_party_tbl,
2200       x_txn_party_acct_tbl   => l_txn_party_acct_tbl,
2201       x_txn_org_assgn_tbl    => l_txn_org_assgn_tbl,
2202       x_txn_ii_rltns_tbl     => l_txn_ii_rltns_tbl,
2203       x_txn_eav_tbl          => l_txn_eav_tbl,
2204       x_return_status        => l_return_status);
2205 
2206     IF l_return_status <> fnd_api.g_ret_sts_success THEN
2207       RAISE fnd_api.g_exc_error;
2208     END IF;
2209 
2210     -- identify the txn line detail record that matches the current om line
2211     IF l_txn_line_dtl_tbl.COUNT > 0 THEN
2212       FOR l_ind IN l_txn_line_dtl_tbl.FIRST .. l_txn_line_dtl_tbl.LAST
2213       LOOP
2214         -- get the instance key for the source line detail record
2215         -- ## may have to change the condition here
2216         -- I should get only one record corresponding to the source being
2217         -- processed
2218 
2219         IF l_txn_line_dtl_tbl(l_ind).source_transaction_flag = 'Y' THEN
2220 
2221           l_src_instance_key.inst_hdr_id           := l_txn_line_dtl_tbl(l_ind).config_inst_hdr_id;
2222           l_src_instance_key.inst_rev_num          := l_txn_line_dtl_tbl(l_ind).config_inst_rev_num;
2223           l_src_instance_key.inst_item_id          := l_txn_line_dtl_tbl(l_ind).config_inst_item_id;
2224           l_src_instance_key.inst_baseline_rev_num := l_txn_line_dtl_tbl(l_ind).config_inst_baseline_rev_num;
2225 
2226           l_src_tld_rec       := l_txn_line_dtl_tbl(l_ind);
2227           l_src_tld_index     := l_ind;
2228           l_source_identified := TRUE;
2229           debug('dumping l_src_tld_rec..');
2230           csi_t_gen_utility_pvt.dump_line_detail_rec(l_src_tld_rec);
2231         ELSE
2232           l_n_td_ind := l_tld_tbl.COUNT + 1;
2233           l_tld_tbl(l_n_td_ind) := l_txn_line_dtl_tbl(l_ind);
2234 
2235           /* as the td indexes are chenged also remap the ext attrib indexes */
2236           IF l_txn_eav_tbl.COUNT > 0 THEN
2237             FOR l_e_ind IN l_txn_eav_tbl.FIRST .. l_txn_eav_tbl.LAST
2238             LOOP
2239               IF l_txn_eav_tbl(l_e_ind).txn_line_details_index = l_ind THEN
2240                 l_txn_eav_tbl(l_e_ind).txn_line_details_index := l_n_td_ind;
2241               END IF;
2242             END LOOP;
2243           END IF;
2244 
2245         END IF;
2246 
2247       END LOOP;
2248     END IF;
2249 
2250     IF NOT(l_source_identified) THEN
2251       -- message source could not identified in the cz_txn_detail
2252       debug('source is not identified...');
2253       RAISE fnd_api.g_exc_error;
2254     END IF;
2255 
2256     dump_instance_key(l_src_instance_key);
2257 
2258     l_filtered_rltns_tbl := l_txn_ii_rltns_tbl;
2259 
2260     -- filter it where the src istance key matches either in the subject or object
2261     filter_relations(
2262       p_instance_key         => l_src_instance_key,
2263       p_transaction_line_id  => l_txn_line_rec.transaction_line_id,
2264       px_txn_ii_rltns_tbl    => l_filtered_rltns_tbl,
2265       x_return_status        => l_return_status);
2266 
2267     IF l_return_status <> fnd_api.g_ret_sts_success THEN
2268       RAISE fnd_api.g_exc_error;
2269     END IF;
2270 
2271     -- return the filtered txn_ii_relation src_line detail and
2272 
2273     /* overlap the config source tld on the build or user entered source tld */
2274     IF l_tld_tbl.COUNT > 0 THEN
2275       FOR l_ind IN l_tld_tbl.FIRST .. l_tld_tbl.LAST
2276       LOOP
2277         IF l_tld_tbl(l_ind).source_transaction_flag = 'Y' THEN
2278 
2279           l_tld_tbl(l_ind).sub_type_id            := l_src_tld_rec.sub_type_id;
2280           l_tld_tbl(l_ind).config_inst_hdr_id     := l_src_tld_rec.config_inst_hdr_id;
2281           l_tld_tbl(l_ind).config_inst_rev_num    := l_src_tld_rec.config_inst_rev_num;
2282           l_tld_tbl(l_ind).config_inst_item_id    := l_src_tld_rec.config_inst_item_id;
2283           l_tld_tbl(l_ind).config_inst_baseline_rev_num := l_src_tld_rec.config_inst_baseline_rev_num;
2284           l_tld_tbl(l_ind).target_commitment_date := l_src_tld_rec.target_commitment_date;
2285           l_tld_tbl(l_ind).instance_description   := l_src_tld_rec.instance_description;
2286 
2287           l_tld_tbl(l_ind).active_start_date      := l_src_tld_rec.active_start_date;
2288           l_tld_tbl(l_ind).active_end_date        := l_src_tld_rec.active_end_date;
2289           --
2290           -- srramakr TSO with Equipment change.
2291           -- Since we started supporting Shippable items under MACD configuration and these items
2292           -- are serialized, there is a possiblity that Transaction detail record would have instance_id
2293           -- coming from build_shtd_tbl.
2294           -- Following instance_id assignment should be made based on instance_id value.
2295           --
2296           IF l_tld_tbl(l_ind).instance_id IS NULL OR
2297             l_tld_tbl(l_ind).instance_id = FND_API.G_MISS_NUM THEN
2298             IF l_src_tld_rec.instance_id IS NOT NULL
2299                AND
2300                l_src_tld_rec.instance_id <> FND_API.G_MISS_NUM
2301             THEN
2302               l_tld_tbl(l_ind).instance_id := l_src_tld_rec.instance_id;
2303               l_tld_tbl(l_ind).instance_exists_flag := 'Y';
2304             ELSE
2305               /* query install base to figure out the instance for the base line revision if TLD did not return*/
2306               BEGIN
2307                 SELECT instance_id
2308                 INTO   l_tld_tbl(l_ind).instance_id
2309                 FROM   csi_item_instances
2310                 WHERE  config_inst_hdr_id =  l_tld_tbl(l_ind).config_inst_hdr_id
2311                 AND    config_inst_item_id = l_tld_tbl(l_ind).config_inst_item_id;
2312                 l_tld_tbl(l_ind).instance_exists_flag := 'Y';
2313               EXCEPTION
2314                 WHEN no_data_found THEN
2315                   l_tld_tbl(l_ind).instance_id          := fnd_api.g_miss_num;
2316                   l_tld_tbl(l_ind).instance_exists_flag := 'N';
2317               END;
2318             END IF;
2319           END IF;
2320 
2321           -- Fixed for Bug 4381930, Moved the Instance_id Query to above
2322           -- and assign the cz values if instance_id is existing, re-configuration case
2323           -- else take the values build from order or user entered.
2324 
2325           IF nvl(l_tld_tbl(l_ind).instance_id,fnd_api.g_miss_num) <> fnd_api.g_miss_num THEN
2326 
2327             l_tld_tbl(l_ind).location_type_code     := l_src_tld_rec.location_type_code;
2328             l_tld_tbl(l_ind).location_id            := l_src_tld_rec.location_id;
2329             -- Added for partner ordering
2330             l_tld_tbl(l_ind).install_location_type_code     := l_src_tld_rec.install_location_type_code;
2331             l_tld_tbl(l_ind).install_location_id            := l_src_tld_rec.install_location_id;
2332             --
2333             -- Bug 4633376 CZ always passes the location info for re-configuration. Hence, inorder to
2334             -- distinguish between first time configuration and re-configuration, we use the instance_id.
2335             --
2336           ELSE
2337             IF nvl(l_src_tld_rec.location_id,fnd_api.g_miss_num) <> fnd_api.g_miss_num
2338                AND
2339                nvl(l_src_tld_rec.location_type_code,fnd_api.g_miss_char) <> fnd_api.g_miss_char
2340             THEN
2341               l_tld_tbl(l_ind).location_type_code     := l_src_tld_rec.location_type_code;
2342               l_tld_tbl(l_ind).location_id            := l_src_tld_rec.location_id;
2343             END IF;
2344             --
2345             IF nvl(l_src_tld_rec.install_location_id,fnd_api.g_miss_num) <> fnd_api.g_miss_num
2346                AND
2347                nvl(l_src_tld_rec.install_location_type_code,fnd_api.g_miss_char) <> fnd_api.g_miss_char
2348             THEN
2349               l_tld_tbl(l_ind).install_location_type_code     := l_src_tld_rec.install_location_type_code;
2350               l_tld_tbl(l_ind).install_location_id            := l_src_tld_rec.install_location_id;
2351             END IF;
2352           END IF;
2353           --
2354           -- srramakr Bug 4665537 TSO with Equipment.
2355           -- Inventory Revision and organization_id could come from WSH which is what we need to take.
2356           --
2357           IF l_tld_tbl(l_ind).inventory_revision IS NOT NULL AND
2358              l_tld_tbl(l_ind).inventory_revision = fnd_api.g_miss_char THEN
2359              l_tld_tbl(l_ind).inventory_revision := l_src_tld_rec.inventory_revision;
2360           END IF;
2361           --
2362           IF nvl(l_tld_tbl(l_ind).inv_organization_id,fnd_api.g_miss_num) = fnd_api.g_miss_num THEN
2363              l_tld_tbl(l_ind).inv_organization_id := l_src_tld_rec.inv_organization_id;
2364           END IF;
2365           --
2366           l_tld_tbl(l_ind).source_txn_line_detail_id := l_src_tld_rec.txn_line_detail_id;
2367 
2368           IF l_txn_eav_tbl.COUNT > 0 THEN
2369             FOR l_eav_ind IN l_txn_eav_tbl.FIRST .. l_txn_eav_tbl.LAST
2370             LOOP
2371               IF l_txn_eav_tbl(l_eav_ind).txn_line_detail_id = l_src_tld_rec.txn_line_detail_id
2372               THEN
2373                 l_txn_eav_tbl(l_eav_ind).txn_line_details_index := l_ind;
2374                 l_txn_eav_tbl(l_eav_ind).txn_line_detail_id := fnd_api.g_miss_num;
2375                 l_txn_eav_tbl(l_eav_ind).txn_attrib_detail_id := fnd_api.g_miss_num;
2376               END IF;
2377             END LOOP;
2378           END IF;
2379         /* Begin fix for Bug 3502896 */
2380         ELSE
2381           csi_t_gen_utility_pvt.add(' NON SOURCE LINE ');
2382           BEGIN
2383             SELECT instance_id
2384             INTO   l_tld_tbl(l_ind).instance_id
2385             FROM   csi_item_instances
2386             WHERE  config_inst_hdr_id =  l_tld_tbl(l_ind).config_inst_hdr_id
2387             AND    config_inst_item_id = l_tld_tbl(l_ind).config_inst_item_id;
2388             l_tld_tbl(l_ind).instance_exists_flag := 'Y';
2389           EXCEPTION
2390             WHEN no_data_found THEN
2391               l_tld_tbl(l_ind).instance_id          := fnd_api.g_miss_num;
2392               l_tld_tbl(l_ind).instance_exists_flag := 'N';
2393 			  fnd_message.set_name('CSI','CSI_TXN_CZ_INVALID_DATA');
2394 			  fnd_message.set_token('INST_HDR_ID',l_tld_tbl(l_ind).config_inst_hdr_id);
2395 			  fnd_message.set_token('INST_REV_NBR',l_tld_tbl(l_ind).config_inst_rev_num);
2396 			  fnd_message.set_token('CONFIG_ITEM_ID',l_tld_tbl(l_ind).config_inst_item_id);
2397 			  fnd_msg_pub.add;
2398               RAISE fnd_api.g_exc_error;
2399           END;
2400         /* End fix for Bug 3502896 */
2401         END IF;
2402       END LOOP;
2403     END IF;
2404 
2405     px_txn_line_rec       := l_txn_line_rec;
2406     px_txn_line_dtl_tbl   := l_tld_tbl;
2407     x_txn_ii_rltns_tbl    := l_filtered_rltns_tbl;
2408     x_txn_eav_tbl         := l_txn_eav_tbl;
2409 
2410   EXCEPTION
2411     WHEN fnd_api.g_exc_error THEN
2412       x_return_status := fnd_api.g_ret_sts_error;
2413   END get_cz_relations;
2414   --
2415   --
2416   --
2417   PROCEDURE get_instances_for_source(
2418     p_source_line_rec       IN  source_line_rec,
2419     x_instance_tbl          OUT NOCOPY csi_datastructures_pub.instance_tbl,
2420     x_return_status         OUT NOCOPY varchar2)
2421   IS
2422 
2423     l_inst_query_rec        csi_datastructures_pub.instance_query_rec;
2424     l_party_query_rec       csi_datastructures_pub.party_query_rec;
2425     l_pty_acct_query_rec    csi_datastructures_pub.party_account_query_rec;
2426 
2427     l_instance_hdr_tbl      csi_datastructures_pub.instance_header_tbl;
2428     l_return_status         varchar2(1) := fnd_api.g_ret_sts_success;
2429     l_msg_count             number;
2430     l_msg_data              varchar2(2000);
2431 
2432   BEGIN
2433 
2434     x_return_status := fnd_api.g_ret_sts_success;
2435     api_log('get_instances_for_source');
2436 
2437     l_inst_query_rec.inventory_item_id     := p_source_line_rec.inventory_item_id;
2438     l_inst_query_rec.last_oe_order_line_id := p_source_line_rec.source_line_id;
2439 
2440     csi_t_gen_utility_pvt.dump_instance_query_rec(
2441       p_instance_query_rec => l_inst_query_rec);
2442 
2443     csi_t_gen_utility_pvt.dump_api_info(
2444       p_api_name => 'get_item_instances',
2445       p_pkg_name => 'csi_item_instance_pub');
2446 
2447     csi_item_instance_pub.get_item_instances(
2448       p_api_version          =>  1.0,
2449       p_commit               =>  fnd_api.g_false,
2450       p_init_msg_list        =>  fnd_api.g_true,
2451       p_validation_level     =>  fnd_api.g_valid_level_full,
2452       p_instance_query_rec   =>  l_inst_query_rec,
2453       p_party_query_rec      =>  l_party_query_rec,
2454       p_account_query_rec    =>  l_pty_acct_query_rec,
2455       p_transaction_id       =>  null,
2456       p_resolve_id_columns   =>  fnd_api.g_false,
2457       p_active_instance_only =>  fnd_api.g_true,
2458       x_instance_header_tbl  =>  l_instance_hdr_tbl,
2459       x_return_status        =>  l_return_status,
2460       x_msg_count            =>  l_msg_count,
2461       x_msg_data             =>  l_msg_data);
2462 
2463     IF l_return_status <> fnd_api.g_ret_sts_success THEN
2464       RAISE fnd_api.g_exc_error;
2465     END IF;
2466 
2467     -- call get item instances here
2468     csi_utl_pkg.make_non_header_tbl(
2469       p_instance_header_tbl => l_instance_hdr_tbl,
2470       x_instance_tbl        => x_instance_tbl,
2471       x_return_status       => l_return_status);
2472 
2473     IF l_return_status <> fnd_api.g_ret_sts_success THEN
2474       RAISE fnd_api.g_exc_error;
2475     END IF;
2476 
2477   EXCEPTION
2478     WHEN fnd_api.g_exc_error THEN
2479       x_return_status := fnd_api.g_ret_sts_error;
2480   END get_instances_for_source;
2481 
2482 
2483   --
2484   --
2485   --
2486   PROCEDURE get_om_relations(
2487     p_source_line_rec      IN  source_line_rec,
2488     px_txn_line_dtl_tbl    IN OUT NOCOPY csi_t_datastructures_grp.txn_line_detail_tbl,
2489     x_txn_ii_rltns_tbl     OUT NOCOPY csi_t_datastructures_grp.txn_ii_rltns_tbl,
2490     x_return_status        OUT NOCOPY varchar2)
2491   IS
2492 
2493     l_parent_found         boolean := FALSE;
2494     l_parent_line_rec      source_line_rec;
2495 
2496     l_parent_instance_tbl  csi_datastructures_pub.instance_tbl;
2497     l_return_status        varchar2(1) := fnd_api.g_ret_sts_success;
2498 
2499   BEGIN
2500 
2501     x_return_status := fnd_api.g_ret_sts_success;
2502     api_log('get_om_relations');
2503 
2504     -- get the ib trackable parent
2505     get_ib_trackable_parent(
2506       p_source_line_rec    => p_source_line_rec,
2507       x_parent_found       => l_parent_found,
2508       x_parent_line_rec    => l_parent_line_rec,
2509       x_return_status      => l_return_status);
2510 
2511     IF l_return_status <> fnd_api.g_ret_sts_success THEN
2512       RAISE fnd_api.g_exc_error;
2513     END IF;
2514 
2515     IF l_parent_found THEN
2516 
2517       get_instances_for_source(
2518         p_source_line_rec  => l_parent_line_rec,
2519         x_instance_tbl     => l_parent_instance_tbl,
2520         x_return_status    => l_return_status);
2521 
2522       IF l_return_status <> fnd_api.g_ret_sts_success THEN
2523         RAISE fnd_api.g_exc_error;
2524       END IF;
2525 
2526       IF l_parent_instance_tbl.count > 0 THEN
2527         null;
2528         --build_parent_relation
2529       END IF;
2530 
2531     END IF;
2532 
2533     -- get the ib trackable children
2534     -- for each of the child check if the om line has come as instances
2535     -- if yes put them as non source and try building a component-of relation
2536     -- take the appropriate ratios in consideration
2537 
2538     --if not then do not worry about building relations
2539 
2540 
2541   EXCEPTION
2542     WHEN fnd_api.g_exc_error THEN
2543       x_return_status := fnd_api.g_ret_sts_error;
2544   END get_om_relations;
2545 
2546 
2547   /* this routine takes the source line info and the current entered source txn
2548      line detail info and builds the non source relation based on the source table
2549      information
2550 
2551        . if it is for the config line then it would read the config txn detail to read
2552          the relationship and builds them to the corresponding source line detail
2553          entered in the order line level
2554 
2555        . if it is for the fulfillment/shipment then it reads the parent and child
2556          information from the order line and builds the parent and the child relation
2557          for the current order line being processed
2558 
2559    */
2560 
2561   PROCEDURE get_relations(
2562     p_source_id            IN  number,
2563     p_source_table         IN  varchar2,
2564     p_source_header_rec    IN  source_header_rec,
2565     p_source_line_rec      IN  source_line_rec,
2566     px_txn_line_rec        IN OUT NOCOPY csi_t_datastructures_grp.txn_line_rec,
2567     px_txn_line_dtl_tbl    IN OUT NOCOPY csi_t_datastructures_grp.txn_line_detail_tbl,
2568     x_txn_ii_rltns_tbl     OUT NOCOPY csi_t_datastructures_grp.txn_ii_rltns_tbl,
2569     x_txn_eav_tbl          OUT NOCOPY csi_t_datastructures_grp.txn_ext_attrib_vals_tbl,
2570     x_return_status        OUT NOCOPY varchar2)
2571   IS
2572 
2573     l_txn_line_dtl_tbl     csi_t_datastructures_grp.txn_line_detail_tbl;
2574     l_txn_ii_rltns_tbl     csi_t_datastructures_grp.txn_ii_rltns_tbl;
2575 
2576     l_return_status        varchar2(1);
2577     l_msg_count            number;
2578     l_msg_data             varchar2(2000);
2579 
2580   BEGIN
2581 
2582     x_return_status := fnd_api.g_ret_sts_success;
2583     api_log('get_relations');
2584 
2585     -- change to an appropriate condition
2586     IF p_source_line_rec.config_header_id is not null THEN
2587 
2588       /* this routine gives the txn line details entered by the configurator
2589          1 source line is mandatory which will have the instance key corresponding to
2590          the processed order line.
2591          stamp the source instance key
2592          may have relations and extended attributes
2593       */
2594 
2595       get_cz_relations(
2596         p_source_header_rec    => p_source_header_rec,
2597         p_source_line_rec      => p_source_line_rec,
2598         px_txn_line_rec        => px_txn_line_rec,
2599         px_txn_line_dtl_tbl    => px_txn_line_dtl_tbl,
2600         x_txn_ii_rltns_tbl     => l_txn_ii_rltns_tbl,
2601         x_txn_eav_tbl          => x_txn_eav_tbl,
2602         x_return_status        => l_return_status);
2603 
2604       IF l_return_status <> fnd_api.g_ret_sts_success THEN
2605         RAISE fnd_api.g_exc_error;
2606       END IF;
2607 
2608     ELSE
2609 
2610       get_om_relations(
2611         p_source_line_rec      => p_source_line_rec,
2612         px_txn_line_dtl_tbl    => px_txn_line_dtl_tbl,
2613         x_txn_ii_rltns_tbl     => l_txn_ii_rltns_tbl,
2614         x_return_status        => l_return_status);
2615 
2616       IF l_return_status <> fnd_api.g_ret_sts_success THEN
2617         RAISE fnd_api.g_exc_error;
2618       END IF;
2619 
2620     END IF;
2621 
2622     x_txn_ii_rltns_tbl := l_txn_ii_rltns_tbl;
2623 
2624   EXCEPTION
2625     WHEN fnd_api.g_exc_error THEN
2626       x_return_status := fnd_api.g_ret_sts_error;
2627   END get_relations;
2628 
2629   PROCEDURE get_extended_attrib_values(
2630     p_source_id            IN  number,
2631     p_source_table         IN  varchar2,
2632     p_source_header_rec    IN  source_header_rec,
2633     p_source_line_rec      IN  source_line_rec,
2634     px_txn_line_dtl_tbl    IN OUT NOCOPY csi_t_datastructures_grp.txn_line_detail_tbl,
2635     x_txn_eav_tbl          OUT NOCOPY csi_t_datastructures_grp.txn_ext_attrib_vals_tbl,
2636     x_return_status        OUT NOCOPY varchar2)
2637   IS
2638   BEGIN
2639     x_return_status := fnd_api.g_ret_sts_success;
2640     api_log('get_extended_attrib_values');
2641   EXCEPTION
2642     WHEN fnd_api.g_exc_error THEN
2643       x_return_status := fnd_api.g_ret_sts_error;
2644   END get_extended_attrib_values;
2645 
2646   PROCEDURE get_order_line_source_info(
2647     p_order_line_id      IN  number,
2648     x_source_header_rec  OUT NOCOPY source_header_rec,
2649     x_source_line_rec    OUT NOCOPY source_line_rec,
2650     x_return_status      OUT NOCOPY varchar2)
2651   IS
2652 
2653     l_line_rec  oe_order_lines_all%rowtype;
2654     l_hdr_rec   oe_order_headers_all%rowtype;
2655 
2656     -- For partner prdering
2657     l_partner_rec             oe_install_base_util.partner_order_rec;
2658     l_ib_owner                VARCHAR2(60);
2659     l_end_customer_id         NUMBER;
2660     l_partner_ib_owner        VARCHAR2(60);
2661 
2662     l_drop_ship_txn_type_id number := 30;
2663 
2664 
2665   BEGIN
2666     x_return_status := fnd_api.g_ret_sts_success;
2667     api_log('get_order_line_source_info');
2668 
2669     BEGIN
2670       SELECT * INTO l_line_rec
2671       FROM   oe_order_lines_all
2672       WHERE  line_id = p_order_line_id;
2673 
2674       SELECT * INTO l_hdr_rec
2675       FROM   oe_order_headers_all
2676       WHERE  header_id = l_line_rec.header_id;
2677 
2678       -- assign values to the x_source_header_rec
2679       -- assign values to the x_source_line_rec
2680 
2681     EXCEPTION
2682       WHEN no_data_found THEN
2683         -- stack error message
2684         RAISE fnd_api.g_exc_error;
2685     END;
2686 
2687     x_source_header_rec.source_header_id       := l_hdr_rec.header_id;
2688     x_source_header_rec.source_header_ref      := l_hdr_rec.order_number;
2689     x_source_header_rec.org_id                 := l_hdr_rec.org_id;
2690     x_source_header_rec.sold_from_org_id       := l_hdr_rec.sold_from_org_id;
2691     x_source_header_rec.owner_party_account_id := l_hdr_rec.sold_to_org_id;
2692     x_source_header_rec.sold_to_org_id         := l_hdr_rec.sold_to_org_id;
2693     x_source_header_rec.agreement_id           := l_hdr_rec.agreement_id;
2694     x_source_header_rec.ship_to_address_id     := l_hdr_rec.ship_to_org_id;
2695     x_source_header_rec.bill_to_address_id     := l_hdr_rec.invoice_to_org_id;
2696     x_source_header_rec.ship_to_contact_id     := l_hdr_rec.ship_to_contact_id;
2697     x_source_header_rec.bill_to_contact_id     := l_hdr_rec.invoice_to_contact_id;
2698     x_source_header_rec.cust_po_number         := l_hdr_rec.cust_po_number;
2699     x_source_header_rec.deliver_to_org_id      := l_hdr_rec.deliver_to_org_id;
2700 
2701     x_source_line_rec.source_line_id         := l_line_rec.line_id;
2702     x_source_line_rec.source_line_ref        := l_line_rec.line_number||'.'||
2703                                                 l_line_rec.shipment_number||'.'||
2704                                                 l_line_rec.option_number;
2705 
2706     x_source_line_rec.org_id                 := l_line_rec.org_id;
2707     x_source_line_rec.sold_from_org_id       := nvl(l_line_rec.sold_from_org_id, l_hdr_rec.sold_from_org_id);
2708     x_source_line_rec.inventory_item_id      := l_line_rec.inventory_item_id;
2709     x_source_line_rec.organization_id        := nvl(l_line_rec.ship_from_org_id, l_hdr_rec.ship_from_org_id);
2710     x_source_line_rec.item_revision          := l_line_rec.item_revision;
2711     x_source_line_rec.uom_code               := l_line_rec.order_quantity_uom;
2712     x_source_line_rec.source_quantity        := l_line_rec.ordered_quantity;
2713     x_source_line_rec.shipped_quantity       := l_line_rec.shipped_quantity;
2714     x_source_line_rec.fulfilled_quantity     := l_line_rec.fulfilled_quantity;
2715     x_source_line_rec.owner_party_account_id := nvl(l_line_rec.sold_to_org_id, l_hdr_rec.sold_to_org_id);
2716     x_source_line_rec.ship_to_address_id     := nvl(l_line_rec.ship_to_org_id, l_hdr_rec.ship_to_org_id);
2717     x_source_line_rec.bill_to_address_id     := nvl(l_line_rec.invoice_to_org_id, l_hdr_rec.invoice_to_org_id);
2718     x_source_line_rec.deliver_to_org_id      := nvl(l_line_rec.deliver_to_org_id, l_hdr_rec.deliver_to_org_id);
2719     x_source_line_rec.sold_to_org_id         := nvl(l_line_rec.sold_to_org_id, l_hdr_rec.sold_to_org_id);
2720     x_source_line_rec.agreement_id           := nvl(l_line_rec.agreement_id, l_hdr_rec.agreement_id);
2721     x_source_line_rec.ship_to_contact_id     := nvl(l_line_rec.ship_to_contact_id, l_hdr_rec.ship_to_contact_id);
2722     x_source_line_rec.bill_to_contact_id     := nvl(l_line_rec.invoice_to_contact_id, l_hdr_rec.invoice_to_contact_id);
2723     x_source_line_rec.link_to_line_id        := l_line_rec.link_to_line_id;
2724     x_source_line_rec.top_model_line_id      := l_line_rec.top_model_line_id;
2725     x_source_line_rec.ato_line_id            := l_line_rec.ato_line_id;
2726     x_source_line_rec.item_type_code         := l_line_rec.item_type_code;
2727     x_source_line_rec.cust_po_number         := nvl(l_line_rec.cust_po_number, l_hdr_rec.cust_po_number);
2728     IF l_line_rec.fulfillment_date is not null THEN
2729       x_source_line_rec.fulfilled_date         := l_line_rec.fulfillment_date;
2730     ELSE
2731       -- bug 5256104 - for drop shipments of TSO equipment, shipment happen before the fulfill activity
2732       -- so fulfillment date remains as null. derive the transaction date of the logical shipment instead
2733       IF l_line_rec.source_type_code = 'EXTERNAL' THEN
2734         BEGIN
2735           SELECT transaction_date
2736           INTO   x_source_line_rec.fulfilled_date
2737           FROM   mtl_material_transactions
2738           WHERE  transaction_type_id = l_drop_ship_txn_type_id
2739           AND    trx_source_line_id  = l_line_rec.line_id
2740           AND    rownum              = 1;
2741         EXCEPTION
2742           WHEN no_data_found THEN
2743             x_source_line_rec.fulfilled_date := sysdate;
2744         END;
2745       ELSE
2746         x_source_line_rec.fulfilled_date := sysdate;
2747       END IF;
2748     END IF;
2749     x_source_line_rec.shipped_date           := l_line_rec.actual_shipment_date;
2750 
2751     x_source_line_rec.config_header_id       := l_line_rec.config_header_id;
2752     x_source_line_rec.config_rev_num         := l_line_rec.config_rev_nbr;
2753     x_source_line_rec.config_item_id         := l_line_rec.configuration_id;
2754 
2755     -- for partner ordering
2756     oe_install_base_util.get_partner_ord_rec(
2757       p_order_line_id      => p_order_line_id,
2758       x_partner_order_rec  => l_partner_rec);
2759 
2760     IF l_partner_rec.IB_OWNER = 'END_CUSTOMER' THEN
2761       IF l_partner_rec.END_CUSTOMER_ID is null Then
2762          fnd_message.set_name('CSI','CSI_PARTNER_VAL_MISSING');
2763          fnd_msg_pub.add;
2764          raise fnd_api.g_exc_error;
2765       ELSE
2766          l_ib_owner                               := l_partner_rec.ib_owner;
2767          x_source_line_rec.owner_party_account_id := l_partner_rec.end_customer_id;
2768       END IF;
2769     ELSIF l_partner_rec.IB_OWNER = 'INSTALL_BASE'
2770     THEN
2771          l_ib_owner                               := l_partner_rec.ib_owner;
2772          x_source_line_rec.owner_party_account_id := fnd_api.g_miss_num;
2773     ELSE
2774       x_source_line_rec.owner_party_account_id    := x_source_line_rec.owner_party_account_id;
2775     END IF;
2776 
2777     IF l_partner_rec.IB_INSTALLED_AT_LOCATION is not null
2778     THEN
2779        x_source_line_rec.ib_install_loc   := l_partner_rec.IB_INSTALLED_AT_LOCATION;
2780        IF x_source_line_rec.ib_install_loc = 'END_CUSTOMER'
2781        THEN
2782          IF l_partner_rec.end_customer_site_use_id is null
2783          THEN
2784            fnd_message.set_name('CSI','CSI_PARTNER_VAL_MISSING');
2785            fnd_msg_pub.add;
2786            raise fnd_api.g_exc_error;
2787          ELSE
2788             x_source_line_rec.ib_install_loc_id :=  l_partner_rec.end_customer_site_use_id;
2789          END IF;
2790        ELSIF x_source_line_rec.ib_install_loc = 'SHIP_TO'
2791        THEN
2792          IF x_source_line_rec.ship_to_address_id is null
2793          THEN
2794            fnd_message.set_name('CSI','CSI_PARTNER_VAL_MISSING');
2795            fnd_msg_pub.add;
2796            raise fnd_api.g_exc_error;
2797          ELSE
2798           x_source_line_rec.ib_install_loc_id := x_source_line_rec.ship_to_address_id;
2799          END IF;
2800        ELSIF  x_source_line_rec.ib_install_loc = 'SOLD_TO'
2801        THEN
2802          IF l_partner_rec.SOLD_TO_SITE_USE_ID is null -- 3412544 x_source_line_rec.sold_to_org_id is null
2803          THEN
2804            fnd_message.set_name('CSI','CSI_PARTNER_VAL_MISSING');
2805            fnd_msg_pub.add;
2806            raise fnd_api.g_exc_error;
2807          ELSE
2808           x_source_line_rec.ib_install_loc_id := l_partner_rec.SOLD_TO_SITE_USE_ID; -- 3412544 x_source_line_rec.sold_to_org_id;
2809          END IF;
2810        ELSIF x_source_line_rec.ib_install_loc = 'DELIVER_TO'
2811        THEN
2812           IF  x_source_line_rec.deliver_to_org_id is null
2813           THEN
2814            fnd_message.set_name('CSI','CSI_PARTNER_VAL_MISSING');
2815            fnd_msg_pub.add;
2816            raise fnd_api.g_exc_error;
2817           ELSE
2818            x_source_line_rec.ib_install_loc_id := x_source_line_rec.deliver_to_org_id;
2819           END IF;
2820        ELSIF x_source_line_rec.ib_install_loc = 'BILL_TO'
2821        THEN
2822          IF x_source_line_rec.bill_to_address_id is null
2823          THEN
2824            fnd_message.set_name('CSI','CSI_PARTNER_VAL_MISSING');
2825            fnd_msg_pub.add;
2826            raise fnd_api.g_exc_error;
2827          ELSE
2828           x_source_line_rec.ib_install_loc_id := x_source_line_rec.bill_to_address_id;
2829          END IF;
2830        ELSIF x_source_line_rec.ib_install_loc = 'INSTALL_BASE'
2831        THEN
2832              x_source_line_rec.ib_install_loc_id := fnd_api.g_miss_num;
2833        END IF;
2834     ELSE
2835          x_source_line_rec.ib_install_loc_id := x_source_line_rec.ship_to_address_id;
2836     END IF;
2837 
2838     IF l_partner_rec.IB_CURRENT_LOCATION is not null
2839     THEN
2840        x_source_line_rec.ib_current_loc   := l_partner_rec.IB_CURRENT_LOCATION;
2841        IF x_source_line_rec.ib_current_loc = 'END_CUSTOMER'
2842        THEN
2843          IF l_partner_rec.end_customer_site_use_id is null
2844          THEN
2845            fnd_message.set_name('CSI','CSI_PARTNER_VAL_MISSING');
2846            fnd_msg_pub.add;
2847            raise fnd_api.g_exc_error;
2848          ELSE
2849             x_source_line_rec.ib_current_loc_id :=  l_partner_rec.end_customer_site_use_id;
2850          END IF;
2851        ELSIF x_source_line_rec.ib_current_loc = 'SHIP_TO'
2852        THEN
2853          IF x_source_line_rec.ship_to_address_id is null
2854          THEN
2855            fnd_message.set_name('CSI','CSI_PARTNER_VAL_MISSING');
2856            fnd_msg_pub.add;
2857            raise fnd_api.g_exc_error;
2858          ELSE
2859           x_source_line_rec.ib_current_loc_id := x_source_line_rec.ship_to_address_id;
2860          END IF;
2861        ELSIF  x_source_line_rec.ib_current_loc = 'SOLD_TO'
2862        THEN
2863          IF l_partner_rec.SOLD_TO_SITE_USE_ID is null -- 3412544 x_source_line_rec.sold_to_org_id is null
2864          THEN
2865            fnd_message.set_name('CSI','CSI_PARTNER_VAL_MISSING');
2866            fnd_msg_pub.add;
2867            raise fnd_api.g_exc_error;
2868          ELSE
2869           x_source_line_rec.ib_current_loc_id := l_partner_rec.SOLD_TO_SITE_USE_ID; -- 3412544 x_source_line_rec.sold_to_org_id;
2870          END IF;
2871        ELSIF x_source_line_rec.ib_current_loc = 'DELIVER_TO'
2872        THEN
2873           IF  x_source_line_rec.deliver_to_org_id is null
2874           THEN
2875            fnd_message.set_name('CSI','CSI_PARTNER_VAL_MISSING');
2876            fnd_msg_pub.add;
2877            raise fnd_api.g_exc_error;
2878           ELSE
2879            x_source_line_rec.ib_current_loc_id := x_source_line_rec.deliver_to_org_id;
2880           END IF;
2881        ELSIF x_source_line_rec.ib_current_loc = 'BILL_TO'
2882        THEN
2883          IF x_source_line_rec.bill_to_address_id is null
2884          THEN
2885            fnd_message.set_name('CSI','CSI_PARTNER_VAL_MISSING');
2886            fnd_msg_pub.add;
2887            raise fnd_api.g_exc_error;
2888          ELSE
2889           x_source_line_rec.ib_current_loc_id := x_source_line_rec.bill_to_address_id;
2890          END IF;
2891        ELSIF x_source_line_rec.ib_current_loc = 'INSTALL_BASE'
2892        THEN
2893              x_source_line_rec.ib_current_loc_id := fnd_api.g_miss_num;
2894        END IF;
2895     ELSE
2896          x_source_line_rec.ib_current_loc_id := x_source_line_rec.ship_to_address_id;
2897     END IF;
2898 
2899     -- Added the AND condition for Bug 3443175.
2900     IF x_source_line_rec.owner_party_account_id is not null
2901       AND
2902        nvl(l_partner_rec.ib_owner,'!@#') <> 'INSTALL_BASE'
2903     THEN
2904       SELECT party_id
2905       INTO   x_source_line_rec.owner_party_id
2906       FROM   hz_cust_accounts
2907       WHERE  cust_account_id = x_source_line_rec.owner_party_account_id;
2908     END IF;
2909 
2910 
2911     -- IF x_source_line_rec.ship_to_address_id is not null THEN
2912     -- Added the AND condition for Bug 3443175.
2913     IF x_source_line_rec.ib_current_loc_id is not null
2914       AND
2915        nvl(x_source_line_rec.ib_current_loc,'!@#') <> 'INSTALL_BASE'
2916     THEN
2917       SELECT hcas.party_site_id
2918       INTO   x_source_line_rec.ship_to_party_site_id
2919       FROM   hz_cust_site_uses_all  hcsu,
2920              hz_cust_acct_sites_all hcas
2921       WHERE  hcsu.site_use_id       = x_source_line_rec.ib_current_loc_id -- ship_to_address_id
2922       AND    hcas.cust_acct_site_id = hcsu.cust_acct_site_id;
2923     END IF;
2924 
2925     -- Added the AND condition for Bug 3443175.
2926     IF x_source_line_rec.ib_install_loc_id is not null
2927       AND
2928        nvl(x_source_line_rec.ib_install_loc,'!@#') <> 'INSTALL_BASE'
2929     THEN
2930       SELECT hcas.party_site_id
2931       INTO   x_source_line_rec.install_to_party_site_id
2932       FROM   hz_cust_site_uses_all  hcsu,
2933              hz_cust_acct_sites_all hcas
2934       WHERE  hcsu.site_use_id       = x_source_line_rec.ib_install_loc_id
2935       AND    hcas.cust_acct_site_id = hcsu.cust_acct_site_id;
2936     END IF;
2937 
2938     IF x_source_line_rec.ship_to_contact_id is not null THEN
2939       SELECT hzr.subject_id
2940       INTO   x_source_line_rec.ship_to_contact_party_id
2941       FROM   hz_relationships       hzr,
2942              hz_cust_account_roles  hzar
2943       WHERE  hzar.cust_account_role_id  = x_source_line_rec.ship_to_contact_id
2944       AND    hzr.party_id               = hzar.party_id
2945       AND    hzr.subject_table_name     = 'HZ_PARTIES'
2946       AND    hzr.object_table_name      = 'HZ_PARTIES'
2947       AND    hzr.directional_flag       = 'F';
2948     END IF;
2949 
2950     IF x_source_line_rec.bill_to_contact_id is not null THEN
2951       SELECT hzr.subject_id
2952       INTO   x_source_line_rec.bill_to_contact_party_id
2953       FROM   hz_relationships       hzr,
2954              hz_cust_account_roles  hzar
2955       WHERE  hzar.cust_account_role_id  = x_source_line_rec.bill_to_contact_id
2956       AND    hzr.party_id               = hzar.party_id
2957       AND    hzr.subject_table_name     = 'HZ_PARTIES'
2958       AND    hzr.object_table_name      = 'HZ_PARTIES'
2959       AND    hzr.directional_flag       = 'F';
2960     END IF;
2961   EXCEPTION
2962     WHEN fnd_api.g_exc_error THEN
2963       x_return_status := fnd_api.g_ret_sts_error;
2964   END get_order_line_source_info;
2965 
2966 
2967   PROCEDURE get_wsh_source_info(
2968     p_source_line_id     IN  number,
2969     x_source_header_rec  OUT NOCOPY source_header_rec,
2970     x_source_line_rec    OUT NOCOPY source_line_rec,
2971     x_return_status      OUT NOCOPY varchar2)
2972   IS
2973 
2974     CURSOR oke_cur_tmp(p_dlv_id IN number) IS
2975       SELECT *
2976       FROM   oke_k_deliverables_vl
2977       WHERE  deliverable_id = p_dlv_id;
2978 
2979     CURSOR wsh_cur(p_src_line_id IN number) IS
2980       SELECT source_header_id,
2981              source_line_id,
2982              source_line_number,
2983              org_id,
2984              organization_id,
2985              customer_id,
2986              ship_to_site_use_id,
2987              ship_to_contact_id,
2988              cust_po_number,
2989              inventory_item_id,
2990              revision,
2991              src_requested_quantity,
2992              src_requested_quantity_uom,
2993              date_scheduled,
2994              top_model_line_id,
2995              ato_line_id
2996       FROM   wsh_delivery_details_ob_grp_v
2997       WHERE  delivery_detail_id = p_src_line_id;
2998 
2999   BEGIN
3000     x_return_status := fnd_api.g_ret_sts_success;
3001     api_log('get_wsh_source_info');
3002 
3003     FOR wsh_rec IN wsh_cur (p_source_line_id)
3004     LOOP
3005 
3006       IF wsh_cur%rowcount = 1 THEN
3007 
3008         mo_global.set_policy_context('S', wsh_rec.org_id);
3009 
3010         x_source_header_rec.source_header_id       := wsh_rec.source_header_id;
3011 
3012         SELECT contract_number
3013         INTO   x_source_header_rec.source_header_ref
3014         FROM   okc_k_headers_all_b  --fix for bug5358612
3015         WHERE  id = wsh_rec.source_header_id;
3016 
3017         x_source_header_rec.owner_party_account_id := wsh_rec.customer_id;
3018       END IF;
3019 
3020       -- assign line_rec
3021       x_source_line_rec.source_line_id         := wsh_rec.source_line_id;
3022       x_source_line_rec.source_line_ref        := wsh_rec.source_line_number;
3023       x_source_line_rec.org_id                 := wsh_rec.org_id;
3024       x_source_line_rec.sold_from_org_id       := wsh_rec.org_id;
3025       x_source_line_rec.ship_to_address_id     := wsh_rec.ship_to_site_use_id;
3026       x_source_line_rec.ship_to_contact_id     := wsh_rec.ship_to_contact_id;
3027       x_source_line_rec.cust_po_number         := wsh_rec.cust_po_number;
3028       x_source_line_rec.inventory_item_id      := wsh_rec.inventory_item_id;
3029       x_source_line_rec.organization_id        := wsh_rec.organization_id;
3030       x_source_line_rec.item_revision          := wsh_rec.revision;
3031       x_source_line_rec.source_quantity        := wsh_rec.src_requested_quantity;
3032       x_source_line_rec.uom_code               := wsh_rec.src_requested_quantity_uom;
3033       x_source_line_rec.owner_party_account_id := wsh_rec.customer_id;
3034       x_source_line_rec.shipped_date           := wsh_rec.date_scheduled;
3035 
3036       IF x_source_line_rec.owner_party_account_id is not null THEN
3037         SELECT party_id
3038         INTO   x_source_line_rec.owner_party_id
3039         FROM   hz_cust_accounts
3040         WHERE  cust_account_id = x_source_line_rec.owner_party_account_id;
3041       END IF;
3042 
3043 
3044       IF x_source_line_rec.ship_to_address_id is not null THEN
3045         SELECT hcas.party_site_id
3046         INTO   x_source_line_rec.ship_to_party_site_id
3047         FROM   hz_cust_site_uses_all  hcsu,
3048                hz_cust_acct_sites_all hcas
3049         WHERE  hcsu.site_use_id       = x_source_line_rec.ship_to_address_id
3050         AND    hcas.cust_acct_site_id = hcsu.cust_acct_site_id;
3051       END IF;
3052 
3053       IF x_source_line_rec.ship_to_contact_id is not null THEN
3054         SELECT hzr.subject_id
3055         INTO   x_source_line_rec.ship_to_contact_party_id
3056         FROM   hz_relationships       hzr,
3057                hz_cust_account_roles  hzar
3058         WHERE  hzar.cust_account_role_id  = x_source_line_rec.ship_to_contact_id
3059         AND    hzr.party_id               = hzar.party_id
3060         AND    hzr.subject_table_name     = 'HZ_PARTIES'
3061         AND    hzr.object_table_name      = 'HZ_PARTIES'
3062         AND    hzr.directional_flag       = 'F';
3063       END IF;
3064 
3065     END LOOP;
3066 
3067     debug('  contract_number       : '||x_source_header_rec.source_header_ref);
3068     debug('  contract_header_id    : '||x_source_header_rec.source_header_id);
3069     debug('  source_line_number    : '||x_source_line_rec.source_line_ref);
3070     debug('  source_line_id        : '||x_source_line_rec.source_line_id);
3071     debug('  owner_account_id      : '||x_source_line_rec.owner_party_account_id);
3072     debug('  owner_party_id        : '||x_source_line_rec.owner_party_id);
3073 
3074   EXCEPTION
3075     WHEN fnd_api.g_exc_error THEN
3076       x_return_status := fnd_api.g_ret_sts_error;
3077   END get_wsh_source_info;
3078 
3079   --
3080   --
3081   --
3082   PROCEDURE get_source_info(
3083     p_source_table         IN  varchar2,
3084     p_source_id            IN  number,
3085     x_source_header_rec    OUT NOCOPY source_header_rec,
3086     x_source_line_rec      OUT NOCOPY source_line_rec,
3087     x_return_status        OUT NOCOPY varchar)
3088   IS
3089 
3090     l_return_status        varchar2(1) := fnd_api.g_ret_sts_success;
3091     l_source_header_rec    source_header_rec;
3092     l_source_line_rec      source_line_rec;
3093 
3094   BEGIN
3095 
3096     x_return_status := fnd_api.g_ret_sts_success;
3097     api_log('get_source_info');
3098 
3099     IF p_source_table = g_om_source_table THEN
3100 
3101       get_order_line_source_info(
3102         p_order_line_id      => p_source_id,
3103         x_source_header_rec  => l_source_header_rec,
3104         x_source_line_rec    => l_source_line_rec,
3105         x_return_status      => l_return_status);
3106 
3107       IF l_return_status <> fnd_api.g_ret_sts_success THEN
3108         RAISE fnd_api.g_exc_error;
3109       END IF;
3110 
3111       l_source_line_rec.source_table := g_om_source_table;
3112 
3113     ELSIF p_source_table = g_oke_source_table THEN -- project contracts
3114 
3115       get_wsh_source_info(
3116         p_source_line_id     => p_source_id,
3117         x_source_header_rec  => l_source_header_rec,
3118         x_source_line_rec    => l_source_line_rec,
3119         x_return_status      => l_return_status);
3120 
3121       IF l_return_status <> fnd_api.g_ret_sts_success THEN
3122         RAISE fnd_api.g_exc_error;
3123       END IF;
3124 
3125       l_source_line_rec.source_table := g_oke_source_table;
3126 
3127     END IF;
3128 
3129     x_source_header_rec := l_source_header_rec;
3130     x_source_line_rec   := l_source_line_rec;
3131 
3132   EXCEPTION
3133     WHEN fnd_api.g_exc_error THEN
3134       x_return_status := fnd_api.g_ret_sts_error;
3135   END get_source_info;
3136 
3137   /* This routine derives the location information for a NETWORK_LINK */
3138   /* A partner is identified from the connected to relationship info  */
3139   /* and derive the location from the partner. Assuming that a network*/
3140   /* link is not connected to a network link                          */
3141 
3142   PROCEDURE get_network_link_location(
3143     p_instance_key         IN  csi_utility_grp.config_instance_key,
3144     x_location_type_code   OUT NOCOPY varchar2,
3145     x_location_id          OUT NOCOPY number,
3146     x_return_status        OUT NOCOPY varchar2)
3147   IS
3148     cursor partner_cur IS
3149       SELECT obj_config_inst_hdr_id  inst_hdr_id,
3150              obj_config_inst_item_id inst_item_id,
3151              obj_config_inst_rev_num inst_rev_num
3152       FROM   csi_t_ii_relationships
3153       WHERE  sub_config_inst_hdr_id  = p_instance_key.inst_hdr_id
3154       AND    sub_config_inst_item_id = p_instance_key.inst_item_id
3155       AND    sub_config_inst_rev_num = p_instance_key.inst_rev_num
3156       UNION
3157       SELECT sub_config_inst_hdr_id  inst_hdr_id,
3158              sub_config_inst_item_id inst_item_id,
3159              sub_config_inst_rev_num inst_rev_num
3160       FROM   csi_t_ii_relationships
3161       WHERE  obj_config_inst_hdr_id  = p_instance_key.inst_hdr_id
3162       AND    obj_config_inst_item_id = p_instance_key.inst_item_id
3163       AND    obj_config_inst_rev_num = p_instance_key.inst_rev_num;
3164 
3165     l_partner_location_found boolean := FALSE;
3166     l_location_id            number  := null;
3167     l_location_type_code     varchar2(30);
3168 
3169   BEGIN
3170     x_return_status := fnd_api.g_ret_sts_success;
3171     api_log('get_network_link_location');
3172 
3173     FOR partner_rec IN partner_cur
3174     LOOP
3175       BEGIN
3176 
3177         SELECT location_id,
3178                location_type_code
3179         INTO   l_location_id,
3180                l_location_type_code
3181         FROM   csi_t_txn_line_details
3182         WHERE  config_inst_hdr_id  = partner_rec.inst_hdr_id
3183         AND    config_inst_item_id = partner_rec.inst_item_id
3184         AND    config_inst_rev_num = partner_rec.inst_rev_num;
3185 
3186         l_partner_location_found := TRUE;
3187         exit;
3188       EXCEPTION
3189         WHEN no_data_found THEN
3190 
3191           BEGIN
3192 
3193             SELECT location_id ,
3194                    location_type_code
3195             INTO   l_location_id,
3196                    l_location_type_code
3197             FROM   csi_item_instances
3198             WHERE  config_inst_hdr_id  = partner_rec.inst_hdr_id
3199             AND    config_inst_item_id = partner_rec.inst_item_id;
3200 
3201             l_partner_location_found := TRUE;
3202             exit;
3203 
3204           EXCEPTION
3205             WHEN no_data_found THEN
3206               l_partner_location_found := FALSE;
3207           END;
3208       END;
3209     END LOOP;
3210 
3211     IF NOT(l_partner_location_found) THEN
3212       fnd_message.set_name('CSI', 'CSI_NETWORK_PARTNER_NOT_FOUND');
3213       fnd_message.set_token('INST_HDR_ID', p_instance_key.inst_hdr_id);
3214       fnd_message.set_token('INST_ITEM_ID', p_instance_key.inst_item_id);
3215       fnd_message.set_token('INST_REV_NUM', p_instance_key.inst_rev_num);
3216       fnd_msg_pub.add;
3217       RAISE fnd_api.g_exc_error;
3218     END IF;
3219 
3220     debug('  location_type_code :'||l_location_type_code);
3221     debug('  location_id        :'||l_location_id);
3222 
3223     x_location_type_code := l_location_type_code;
3224     x_location_id        := l_location_id;
3225 
3226   EXCEPTION
3227     WHEN fnd_api.g_exc_error THEN
3228       x_return_status := fnd_api.g_ret_sts_error;
3229   END get_network_link_location;
3230 
3231 
3232   --
3233   -- based on the pl/sql index only
3234   --
3235   PROCEDURE build_instance_set(
3236     p_index                IN     binary_integer,
3237     p_source_line_rec      IN     csi_interface_pkg.source_line_rec,
3238     p_item_attrib_rec      IN     item_attributes_rec,
3239 	p_csi_txn_rec          IN     csi_datastructures_pub.transaction_rec,
3240     p_txn_line_dtl_rec     IN     csi_t_datastructures_grp.txn_line_detail_rec,
3241     p_txn_party_tbl        IN OUT NOCOPY csi_t_datastructures_grp.txn_party_detail_tbl,
3242     p_txn_party_acct_tbl   IN     csi_t_datastructures_grp.txn_pty_acct_detail_tbl,
3243     p_txn_org_assgn_tbl    IN     csi_t_datastructures_grp.txn_org_assgn_tbl,
3244     p_txn_eav_tbl          IN     csi_t_datastructures_grp.txn_ext_attrib_vals_tbl,
3245     px_pricing_tbl         IN OUT NOCOPY csi_datastructures_pub.pricing_attribs_tbl,
3246     x_instance_rec            OUT NOCOPY csi_datastructures_pub.instance_rec,
3247     x_party_tbl               OUT NOCOPY csi_datastructures_pub.party_tbl,
3248     x_party_acct_tbl          OUT NOCOPY csi_datastructures_pub.party_account_tbl,
3249     x_eav_tbl                 OUT NOCOPY csi_datastructures_pub.extend_attrib_values_tbl,
3250     x_org_units_tbl           OUT NOCOPY csi_datastructures_pub.organization_units_tbl,
3251     x_return_status           OUT NOCOPY varchar2)
3252   IS
3253     l_i_rec            csi_datastructures_pub.instance_rec;
3254     l_p_tbl            csi_datastructures_pub.party_tbl;
3255     l_pa_tbl           csi_datastructures_pub.party_account_tbl;
3256     l_eav_tbl          csi_datastructures_pub.extend_attrib_values_tbl;
3257     l_ou_tbl           csi_datastructures_pub.organization_units_tbl;
3258 
3259     l_instance_key     csi_utility_grp.config_instance_key;
3260 
3261     p_ind              binary_integer := 0;
3262     pa_ind             binary_integer := 0;
3263     eav_ind            binary_integer := 0;
3264     ou_ind             binary_integer := 0;
3265 
3266     l_return_status    varchar2(1) := fnd_api.g_ret_sts_success;
3267 
3268     -- Added as part of fix for Bug 2960049
3269     l_instance_usage_code  varchar2(30);
3270     l_vld_organization_id  number;
3271     l_inv_master_organization_id  number;
3272 
3273   BEGIN
3274     api_log('build_instance_set');
3275 
3276     x_return_status := fnd_api.g_ret_sts_success;
3277 
3278     IF p_index is not null THEN
3279 
3280 		/*
3281 		-- Added for bug 9900096 to set the vld_org_id correctly, instead of to g_miss_num by default (HYONLEE)
3282         BEGIN
3283           SELECT LAST_VLD_ORGANIZATION_ID
3284           INTO   l_vld_organization_id
3285           FROM   csi_item_instances
3286           WHERE  instance_id = p_txn_line_dtl_rec.instance_id;
3287 
3288         EXCEPTION
3289           WHEN no_data_found THEN
3290             l_vld_organization_id    := fnd_api.g_miss_num;
3291         END;
3292         BEGIN
3293           SELECT inv_master_organization_id
3294           INTO   l_inv_master_organization_id
3295           FROM   csi_item_instances
3296           WHERE  instance_id = p_txn_line_dtl_rec.instance_id;
3297 
3298         EXCEPTION
3299           WHEN no_data_found THEN
3300             l_inv_master_organization_id    := p_txn_line_dtl_rec.inv_organization_id;
3301         END;
3302         -- End bug fix for 9900096 (HYONLEE)
3303 		*/
3304 
3305       -- Added the nvl, fnd_api g_miss values to the p_txn_line_dtl_rec for Bug 3783088
3306       l_i_rec.instance_id             := p_txn_line_dtl_rec.instance_id;
3307       l_i_rec.instance_number         := fnd_api.g_miss_char;
3308       l_i_rec.external_reference      := nvl(p_txn_line_dtl_rec.external_reference,fnd_api.g_miss_char);
3309       l_i_rec.inventory_item_id       := p_txn_line_dtl_rec.inventory_item_id;
3310       l_i_rec.inventory_revision      := nvl(p_txn_line_dtl_rec.inventory_revision,fnd_api.g_miss_char);
3311 	  -- Bug 9900096
3312 	  -- Only for configuratior use inv_organization_id in l_i_rec.inv_master_organization_id parameter
3313 	  -- Other wise use pre existing code(before bug 8811152)
3314 	  IF ( p_csi_txn_rec.transaction_type_id=401 and p_csi_txn_rec.txn_sub_type_id=101 and p_source_line_rec.fulfilled_date is null) THEN
3315 
3316 		l_i_rec.vld_organization_id     := fnd_api.g_miss_num;  -- Bug 8811152-Inv org ID passed by Configurator is Master org ID
3317 		l_i_rec.inv_master_organization_id := p_txn_line_dtl_rec.inv_organization_id; -- Bug 8811152-Inv org ID passed by Configurator is Master org ID
3318 
3319 	  ELSE
3320 
3321 		l_i_rec.vld_organization_id     := p_txn_line_dtl_rec.inv_organization_id;  -- Bug 8811152-Inv org ID passed by Configurator is Master org ID; EDITED: Bug 9900096 (no longer set to g_miss_num)
3322 		l_i_rec.inv_master_organization_id := fnd_api.g_miss_num; -- Bug 8811152-Inv org ID passed by Configurator is Master org ID; EDITED: Bug 9900096 (queries value)
3323 
3324 	  END IF;
3325 
3326       l_i_rec.serial_number           := p_txn_line_dtl_rec.serial_number;
3327       l_i_rec.mfg_serial_number_flag  := nvl(p_txn_line_dtl_rec.mfg_serial_number_flag,fnd_api.g_miss_char);
3328       l_i_rec.lot_number              := nvl(p_txn_line_dtl_rec.lot_number,fnd_api.g_miss_char);
3329       l_i_rec.quantity                := p_txn_line_dtl_rec.quantity;
3330       l_i_rec.unit_of_measure         := p_txn_line_dtl_rec.unit_of_measure;
3331       l_i_rec.accounting_class_code   := 'CUST_PROD';
3332       l_i_rec.instance_condition_id   := nvl(p_txn_line_dtl_rec.item_condition_id,fnd_api.g_miss_num);
3333       l_i_rec.customer_view_flag      := 'Y';
3334       l_i_rec.merchant_view_flag      := 'Y';
3335       l_i_rec.sellable_flag           := nvl(p_txn_line_dtl_rec.sellable_flag,fnd_api.g_miss_char);
3336       l_i_rec.system_id               := nvl(p_txn_line_dtl_rec.csi_system_id,fnd_api.g_miss_num);
3337       l_i_rec.instance_type_code      := nvl(p_txn_line_dtl_rec.instance_type_code,fnd_api.g_miss_char);
3338       l_i_rec.active_start_date       := nvl(p_txn_line_dtl_rec.active_start_date,fnd_api.g_miss_date);
3339       l_i_rec.active_end_date         := nvl(p_txn_line_dtl_rec.active_end_date,fnd_api.g_miss_date);
3340 	  --Start - added for bug 8586745  FP for 8490723
3341       IF(l_i_rec.active_start_date=fnd_api.g_miss_date AND l_i_rec.active_end_date<>fnd_api.g_miss_date) THEN
3342           IF(to_date(l_i_rec.active_end_date,'DD-MM-YY HH24:MI')<to_date(SYSDATE,'DD-MM-YY HH24:MI'))then
3343             l_i_rec.active_end_date:=SYSDATE;
3344           END IF;
3345       l_i_rec.active_start_date :=l_i_rec.active_end_date;
3346       end IF;
3347       --End - added for bug 8586745  FP for 8490723
3348       l_i_rec.location_type_code      := nvl(p_txn_line_dtl_rec.location_type_code,fnd_api.g_miss_char);
3349       l_i_rec.location_id             := nvl(p_txn_line_dtl_rec.location_id,fnd_api.g_miss_num);
3350       -- Added for partner ordering
3351       l_i_rec.install_location_type_code      := nvl(p_txn_line_dtl_rec.install_location_type_code,fnd_api.g_miss_char);
3352       l_i_rec.install_location_id             := nvl(p_txn_line_dtl_rec.install_location_id,fnd_api.g_miss_num);
3353 
3354       IF p_source_line_rec.source_table = g_om_source_table THEN
3355         l_i_rec.last_oe_order_line_id   := p_source_line_rec.source_line_id;
3356       ELSIF p_source_line_rec.source_table = 'CONFIGURATOR' THEN
3357         IF p_source_line_rec.batch_validate_flag = 'N' THEN
3358           l_i_rec.call_batch_validation := fnd_api.g_false;
3359         END IF;
3360 
3361       END IF;
3362 
3363       l_i_rec.last_txn_line_detail_id := p_txn_line_dtl_rec.txn_line_detail_id;
3364       l_i_rec.install_date            := nvl(p_txn_line_dtl_rec.active_start_date,fnd_api.g_miss_date);
3365       l_i_rec.manually_created_flag   := 'N';
3366       l_i_rec.return_by_date          := nvl(p_txn_line_dtl_rec.return_by_date,fnd_api.g_miss_date);
3367       l_i_rec.creation_complete_flag  := fnd_api.g_miss_char;
3368       l_i_rec.completeness_flag       := fnd_api.g_miss_char;
3369       l_i_rec.instance_usage_code     := 'OUT_OF_ENTERPRISE';
3370 
3371       -- Begin Fix for Bug 2960049
3372       IF nvl(l_i_rec.instance_id,fnd_api.g_miss_num) <> fnd_api.g_miss_num THEN
3373         BEGIN
3374           SELECT instance_usage_code
3375           INTO   l_instance_usage_code
3376           FROM   csi_item_instances
3377           WHERE  instance_id = l_i_rec.instance_id;
3378 
3379         EXCEPTION
3380           WHEN no_data_found THEN
3381             l_i_rec.instance_id    := fnd_api.g_miss_num;
3382         END;
3383         IF  l_instance_usage_code = 'IN_RELATIONSHIP' THEN
3384           l_i_rec.instance_usage_code  := l_instance_usage_code;
3385         END IF;
3386       END IF;
3387       -- End Fix for Bug 2960049
3388 
3389       l_i_rec.last_oe_agreement_id    := p_source_line_rec.agreement_id;
3390       l_i_rec.config_inst_hdr_id      := p_txn_line_dtl_rec.config_inst_hdr_id;
3391       l_i_rec.config_inst_rev_num     := p_txn_line_dtl_rec.config_inst_rev_num;
3392       l_i_rec.config_inst_item_id     := p_txn_line_dtl_rec.config_inst_item_id;
3393       l_i_rec.instance_description    := nvl(p_txn_line_dtl_rec.instance_description,fnd_api.g_miss_char);
3394       l_i_rec.last_txn_line_detail_id := p_txn_line_dtl_rec.source_txn_line_detail_id;
3395 
3396       IF p_item_attrib_rec.ib_item_instance_class = 'LINK' THEN
3397 
3398         l_i_rec.install_location_type_code := null;
3399         l_i_rec.install_location_id        := null;
3400 
3401         l_instance_key.inst_hdr_id  := l_i_rec.config_inst_hdr_id;
3402         l_instance_key.inst_item_id := l_i_rec.config_inst_item_id;
3403         l_instance_key.inst_rev_num := l_i_rec.config_inst_rev_num;
3404 
3405         get_network_link_location(
3406           p_instance_key         => l_instance_key,
3407           x_location_type_code   => l_i_rec.location_type_code,
3408           x_location_id          => l_i_rec.location_id,
3409           x_return_status        => l_return_status);
3410 
3411 -- Bug 9023449 if the instance is in relationship then Location change is not allowed
3412          IF nvl(l_i_rec.instance_id,fnd_api.g_miss_num) <> fnd_api.g_miss_num
3413 		AND NVL(l_i_rec.instance_usage_code, fnd_api.g_miss_char) = 'IN_RELATIONSHIP' THEN
3414            debug('instance_usage_code - ' || l_i_rec.instance_usage_code);
3415            l_i_rec.install_location_type_code := nvl(l_i_rec.install_location_type_code,fnd_api.g_miss_char);
3416            l_i_rec.install_location_id        := nvl(l_i_rec.install_location_id,fnd_api.g_miss_num);
3417            l_i_rec.location_type_code         := nvl(l_i_rec.location_type_code,fnd_api.g_miss_char);
3418            l_i_rec.location_id                := nvl(l_i_rec.location_id,fnd_api.g_miss_num);
3419         END IF;
3420 
3421       ELSE
3422         l_i_rec.install_location_type_code := nvl(p_txn_line_dtl_rec.location_type_code,fnd_api.g_miss_char);
3423         l_i_rec.install_location_id        := nvl(p_txn_line_dtl_rec.location_id,fnd_api.g_miss_num);
3424       END IF;
3425 
3426       -- contact switch parse
3427       IF p_txn_party_tbl.COUNT > 0 THEN
3428         FOR l_p_ind IN p_txn_party_tbl.FIRST .. p_txn_party_tbl.LAST
3429         LOOP
3430           IF p_txn_party_tbl(l_p_ind).txn_line_details_index = p_index THEN
3431 
3432             p_ind := p_ind + 1;
3433 
3434             /*
3435             if there is a party contact with l_p_ind as the contact_oparty id then
3436             switch that with p_ind
3437             */
3438             FOR l_pc_ind IN p_txn_party_tbl.FIRST .. p_txn_party_tbl.LAST
3439             LOOP
3440               IF p_txn_party_tbl(l_pc_ind).contact_flag = 'Y'
3441                    AND
3442                  p_txn_party_tbl(l_pc_ind).contact_party_id = l_p_ind
3443               THEN
3444                 --p_txn_party_tbl(l_pc_ind).contact_party_id := p_ind;
3445                 -- commented the above statement and added the below IF for bug 4945025
3446                 IF nvl(l_i_rec.instance_id,fnd_api.g_miss_num) <> fnd_api.g_miss_num Then
3447                   BEGIN
3448                     SELECT instance_party_id
3449                     INTO   p_txn_party_tbl(l_pc_ind).contact_party_id
3450                     FROM   csi_i_parties
3451                     WHERE  instance_id = l_i_rec.instance_id
3452                     AND    relationship_type_code = p_txn_party_tbl(l_p_ind).relationship_type_code
3453                     AND   ((active_end_date is null ) OR
3454                            (active_end_date > sysdate));
3455                   EXCEPTION
3456                     WHEN no_data_found THEN
3457                       fnd_message.set_name('CSI','CSI_INT_INV_INSTA_PTY_ID');
3458                       fnd_message.set_token('INSTANCE_ID',l_i_rec.instance_id);
3459                       fnd_message.set_token('RELATIONSHIP_TYPE_CODE',p_txn_party_tbl(l_p_ind).relationship_type_code);
3460                       fnd_msg_pub.add;
3461                       IF p_txn_party_tbl(l_p_ind).relationship_type_code = 'OWNER' THEN
3462                          x_return_status := fnd_api.g_ret_sts_error;
3463                          raise fnd_api.g_exc_error;
3464                       ELSE
3465                         p_txn_party_tbl(l_pc_ind).contact_party_id := p_ind;
3466                         debug('relationship_type_code :'||p_txn_party_tbl(l_p_ind).relationship_type_code);
3467                       END IF;
3468                     WHEN too_many_rows THEN
3469                       fnd_message.set_name('CSI','CSI_INT_MANY_INSTA_PTY_FOUND');
3470                       fnd_message.set_token('INSTANCE_ID',l_i_rec.instance_id);
3471                       fnd_message.set_token('RELATIONSHIP_TYPE_CODE',p_txn_party_tbl(l_p_ind).relationship_type_code);
3472                       fnd_msg_pub.add;
3473                       x_return_status := fnd_api.g_ret_sts_error;
3474                       raise fnd_api.g_exc_error;
3475                   END;
3476                 ELSE
3477                   p_txn_party_tbl(l_pc_ind).contact_party_id := p_ind;
3478                 END IF;
3479               END IF;
3480             END LOOP;
3481           END IF;
3482         END LOOP;
3483       END IF;
3484 
3485       p_ind := 0;
3486 
3487       IF p_txn_party_tbl.COUNT > 0 THEN
3488         FOR l_p_ind IN p_txn_party_tbl.FIRST .. p_txn_party_tbl.LAST
3489         LOOP
3490           IF p_txn_party_tbl(l_p_ind).txn_line_details_index = p_index THEN
3491 
3492             p_ind := p_ind + 1;
3493 
3494             l_p_tbl(p_ind).instance_party_id := p_txn_party_tbl(l_p_ind).instance_party_id;
3495             l_p_tbl(p_ind).instance_id       := l_i_rec.instance_id;
3496             l_p_tbl(p_ind).party_id          := p_txn_party_tbl(l_p_ind).party_source_id;
3497             l_p_tbl(p_ind).party_source_table := p_txn_party_tbl(l_p_ind).party_source_table;
3498             l_p_tbl(p_ind).relationship_type_code:= p_txn_party_tbl(l_p_ind).relationship_type_code;
3499             l_p_tbl(p_ind).contact_flag      := p_txn_party_tbl(l_p_ind).contact_flag;
3500 
3501             IF p_txn_party_tbl(l_p_ind).contact_flag = 'Y' THEN
3502                --l_p_tbl(p_ind).contact_parent_tbl_index := p_txn_party_tbl(l_p_ind).contact_party_id;
3503                -- commented the above statement and added the below statement for bug 4945025
3504                l_p_tbl(p_ind).contact_ip_id := p_txn_party_tbl(l_p_ind).contact_party_id;
3505             END IF;
3506             --l_p_tbl(p_ind).contact_ip_id     := p_txn_party_tbl(l_p_ind).contact_ip_id;
3507             l_p_tbl(p_ind).active_end_date   := p_txn_party_tbl(l_p_ind).active_start_date;
3508 
3509             /*
3510             l_p_tbl(p_ind).context           :=
3511             l_p_tbl(p_ind).attribute1        :=
3512             l_p_tbl(p_ind).attribute2        :=
3513             l_p_tbl(p_ind).attribute3        :=
3514             l_p_tbl(p_ind).attribute4        :=
3515             l_p_tbl(p_ind).attribute5        :=
3516             l_p_tbl(p_ind).attribute6        :=
3517             l_p_tbl(p_ind).attribute7        :=
3518             l_p_tbl(p_ind).attribute8        :=
3519             l_p_tbl(p_ind).attribute9        :=
3520             l_p_tbl(p_ind).attribute10       :=
3521             l_p_tbl(p_ind).attribute11       :=
3522             l_p_tbl(p_ind).attribute12       :=
3523             l_p_tbl(p_ind).attribute13       :=
3524             l_p_tbl(p_ind).attribute14       :=
3525             l_p_tbl(p_ind).attribute15       :=
3526             */
3527 
3528             IF p_txn_party_acct_tbl.COUNT > 0 THEN
3529               FOR l_pa_ind IN p_txn_party_acct_tbl.FIRST .. p_txn_party_acct_tbl.LAST
3530               LOOP
3531                 IF p_txn_party_acct_tbl(l_pa_ind).txn_party_details_index = l_p_ind THEN
3532 
3533                   pa_ind := pa_ind + 1;
3534 
3535                   l_pa_tbl(pa_ind).parent_tbl_index := p_ind;
3536                   l_pa_tbl(pa_ind).ip_account_id    := p_txn_party_acct_tbl(l_pa_ind).ip_account_id;
3537                   l_pa_tbl(pa_ind).party_account_id := p_txn_party_acct_tbl(l_pa_ind).account_id;
3538                   l_pa_tbl(pa_ind).relationship_type_code := p_txn_party_acct_tbl(l_pa_ind).relationship_type_code;
3539                   l_pa_tbl(pa_ind).bill_to_address := p_txn_party_acct_tbl(l_pa_ind).bill_to_address_id;
3540                   l_pa_tbl(pa_ind).ship_to_address := p_txn_party_acct_tbl(l_pa_ind).ship_to_address_id;
3541                   l_pa_tbl(pa_ind).instance_party_id := l_p_tbl(p_ind).instance_party_id;
3542                   l_pa_tbl(pa_ind).active_start_date := p_txn_party_acct_tbl(l_pa_ind).active_start_date;
3543                   /*
3544                   l_pa_tbl(pa_ind).active_end_date :=
3545                   l_pa_tbl(pa_ind).context    :=
3546                   l_pa_tbl(pa_ind).attribute1 :=
3547                   l_pa_tbl(pa_ind).attribute2 :=
3548                   l_pa_tbl(pa_ind).attribute3 :=
3549                   l_pa_tbl(pa_ind).attribute4 :=
3550                   l_pa_tbl(pa_ind).attribute5 :=
3551                   l_pa_tbl(pa_ind).attribute6 :=
3552                   l_pa_tbl(pa_ind).attribute7 :=
3553                   l_pa_tbl(pa_ind).attribute8 :=
3554                   l_pa_tbl(pa_ind).attribute9 :=
3555                   l_pa_tbl(pa_ind).attribute10 :=
3556                   l_pa_tbl(pa_ind).attribute11 :=
3557                   l_pa_tbl(pa_ind).attribute12 :=
3558                   l_pa_tbl(pa_ind).attribute13 :=
3559                   l_pa_tbl(pa_ind).attribute14 :=
3560                   l_pa_tbl(pa_ind).attribute15 :=
3561                   l_pa_tbl(pa_ind).object_version_number :=
3562                   */
3563                 END IF;
3564               END LOOP; -- party account loop
3565             END IF; -- patry account count > 0
3566           END IF;
3567         END LOOP; -- party loop
3568       END IF; -- party table count > 0
3569 
3570       -- org assignments
3571       IF p_txn_org_assgn_tbl.COUNT > 0 THEN
3572         FOR l_oa_ind IN p_txn_org_assgn_tbl.FIRST .. p_txn_org_assgn_tbl.LAST
3573         LOOP
3574           IF p_txn_org_assgn_tbl(l_oa_ind).txn_line_details_index = p_index THEN
3575 
3576             ou_ind := ou_ind + 1;
3577 
3578             l_ou_tbl(ou_ind).instance_ou_id    := p_txn_org_assgn_tbl(l_oa_ind).instance_ou_id;
3579             l_ou_tbl(ou_ind).operating_unit_id := p_txn_org_assgn_tbl(l_oa_ind).operating_unit_id;
3580             l_ou_tbl(ou_ind).instance_id       := l_i_rec.instance_id;
3581             l_ou_tbl(ou_ind).relationship_type_code :=  p_txn_org_assgn_tbl(l_oa_ind).relationship_type_code;
3582             l_ou_tbl(ou_ind).active_start_date := p_txn_org_assgn_tbl(l_oa_ind).active_start_date;
3583             l_ou_tbl(ou_ind).active_end_date   := p_txn_org_assgn_tbl(l_oa_ind).active_end_date;
3584             l_ou_tbl(ou_ind).object_version_number := 1.0;
3585             /*
3586             l_ou_tbl(ou_ind).context          :=
3587             l_ou_tbl(ou_ind).attribute1       :=
3588             l_ou_tbl(ou_ind).attribute2       :=
3589             l_ou_tbl(ou_ind).attribute3       :=
3590             l_ou_tbl(ou_ind).attribute4       :=
3591             l_ou_tbl(ou_ind).attribute5       :=
3592             l_ou_tbl(ou_ind).attribute6       :=
3593             l_ou_tbl(ou_ind).attribute7       :=
3594             l_ou_tbl(ou_ind).attribute8       :=
3595             l_ou_tbl(ou_ind).attribute9       :=
3596             l_ou_tbl(ou_ind).attribute10      :=
3597             l_ou_tbl(ou_ind).attribute11      :=
3598             l_ou_tbl(ou_ind).attribute12      :=
3599             l_ou_tbl(ou_ind).attribute13      :=
3600             l_ou_tbl(ou_ind).attribute14      :=
3601             l_ou_tbl(ou_ind).attribute15      :=
3602             */
3603 
3604           END IF;
3605         END LOOP; -- org assignments loop
3606       END IF; -- org assignments count > 0
3607 
3608       -- extended attribs
3609       IF p_txn_eav_tbl.COUNT > 0 THEN
3610         FOR l_eav_ind IN p_txn_eav_tbl.FIRST .. p_txn_eav_tbl.LAST
3611         LOOP
3612           IF p_txn_eav_tbl(l_eav_ind).txn_line_details_index = p_index THEN
3613 
3614             -- csi_t_gen_utility_Pvt.dump_txn_eav_rec(p_txn_eav_tbl(l_eav_ind));
3615 
3616             eav_ind := eav_ind + 1;
3617 
3618             l_eav_tbl(eav_ind).instance_id      := l_i_rec.instance_id;
3619             l_eav_tbl(eav_ind).attribute_value  := p_txn_eav_tbl(l_eav_ind).attribute_value;
3620 
3621             IF p_txn_eav_tbl(l_eav_ind).attrib_source_table = 'CSI_IEA_VALUES' THEN
3622               l_eav_tbl(eav_ind).attribute_value_id := p_txn_eav_tbl(l_eav_ind).attribute_source_id;
3623             ELSIF p_txn_eav_tbl(l_eav_ind).attrib_source_table = 'CSI_I_EXTENDED_ATTRIBS' THEN
3624               l_eav_tbl(eav_ind).attribute_id   := p_txn_eav_tbl(l_eav_ind).attribute_source_id;
3625               IF l_i_rec.instance_id = fnd_api.g_miss_num THEN
3626                 l_eav_tbl(eav_ind).attribute_value_id := fnd_api.g_miss_num;
3627               ELSE
3628                 BEGIN
3629                   SELECT attribute_value_id
3630                   INTO   l_eav_tbl(eav_ind).attribute_value_id
3631                   FROM   csi_iea_values
3632                   WHERE  attribute_id = p_txn_eav_tbl(l_eav_ind).attribute_source_id
3633                   AND    instance_id  = l_i_rec.instance_id;
3634                 EXCEPTION
3635                   WHEN no_data_found THEN
3636                     l_eav_tbl(eav_ind).attribute_value_id := fnd_api.g_miss_num;
3637                 END;
3638               END IF;
3639             END IF;
3640 
3641             --l_eav_tbl(eav_ind).active_start_date := p_txn_eav_tbl(l_eav_ind).active_start_date;
3642             --l_eav_tbl(eav_ind).active_end_date  := p_txn_eav_tbl(l_eav_ind).active_end_date;
3643             l_eav_tbl(eav_ind).object_version_number  := 1.0;
3644             /*
3645             l_eav_tbl(eav_ind).context          :=
3646             l_eav_tbl(eav_ind).attribute1       :=
3647             l_eav_tbl(eav_ind).attribute2       :=
3648             l_eav_tbl(eav_ind).attribute3       :=
3649             l_eav_tbl(eav_ind).attribute4       :=
3650             l_eav_tbl(eav_ind).attribute5       :=
3651             l_eav_tbl(eav_ind).attribute6       :=
3652             l_eav_tbl(eav_ind).attribute7       :=
3653             l_eav_tbl(eav_ind).attribute8       :=
3654             l_eav_tbl(eav_ind).attribute9       :=
3655             l_eav_tbl(eav_ind).attribute10      :=
3656             l_eav_tbl(eav_ind).attribute11      :=
3657             l_eav_tbl(eav_ind).attribute12      :=
3658             l_eav_tbl(eav_ind).attribute13      :=
3659             l_eav_tbl(eav_ind).attribute14      :=
3660             l_eav_tbl(eav_ind).attribute15      :=
3661             */
3662           END IF;
3663         END LOOP; -- extended attribs loop
3664       END IF; -- extended attribs count > 0
3665 
3666       -- pricing attribs
3667       IF px_pricing_tbl.COUNT > 0 THEN
3668         FOR l_pr_ind IN px_pricing_tbl.FIRST .. px_pricing_tbl.LAST
3669         LOOP
3670            IF px_pricing_tbl(l_pr_ind).parent_tbl_index = p_index
3671               AND px_pricing_tbl(l_pr_ind).instance_id = fnd_api.g_miss_num
3672             THEN
3673                px_pricing_tbl(l_pr_ind).instance_id := l_i_rec.instance_id; -- bug 5093707
3674            END IF;
3675         END LOOP; -- pricing attribs loop
3676       END IF; -- pricing attribs count > 0
3677 
3678       x_instance_rec    := l_i_rec;
3679       x_party_tbl       := l_p_tbl;
3680       x_party_acct_tbl  := l_pa_tbl;
3681       x_org_units_tbl   := l_ou_tbl;
3682       x_eav_tbl         := l_eav_tbl;
3683 
3684     END IF; -- p_index is not null
3685 
3686   EXCEPTION
3687     WHEN fnd_api.g_exc_error THEN
3688       x_return_status := fnd_api.g_ret_sts_error;
3689   END build_instance_set;
3690 
3691   PROCEDURE sub_type_specific_vldns(
3692     p_source_flag          IN     varchar2,
3693     p_sub_type_rec         IN     csi_txn_sub_types%rowtype,
3694     p_instance_rec         IN     csi_datastructures_pub.instance_rec,
3695     p_party_tbl            IN     csi_datastructures_pub.party_tbl,
3696     p_party_acct_tbl       IN     csi_datastructures_pub.party_account_tbl,
3697     p_org_units_tbl        IN     csi_datastructures_pub.organization_units_tbl,
3698     p_eav_tbl              IN     csi_datastructures_pub.extend_attrib_values_tbl,
3699     p_pricing_tbl          IN     csi_datastructures_pub.pricing_attribs_tbl,
3700     x_return_status           OUT NOCOPY varchar2)
3701   IS
3702     l_csi_param_rec        csi_install_parameters%rowtype;
3703   BEGIN
3704 
3705     x_return_status := fnd_api.g_ret_sts_success;
3706 
3707     api_log('sub_type_specific_vldns');
3708 /* commenting this for bug 4028827 . since we do not seem to have any usage currently for this Query
3709     SELECT * INTO l_csi_param_rec
3710     FROM   csi_install_parameters;
3711 */
3712     debug('Instance Status ID :'||p_instance_rec.instance_status_id);
3713 
3714     -- check if an owner/account is passed if src_change_owner = 'E'
3715     --   and make sure that the owner party id is not the internal party
3716     -- if owner change is not set then clear the owner party passed.
3717     -- check for multiple owner error
3718     -- for non source check if an instance ref is specified
3719 
3720   EXCEPTION
3721     WHEN fnd_api.g_exc_error THEN
3722       x_return_status := fnd_api.g_ret_sts_error;
3723   END sub_type_specific_vldns;
3724 
3725 
3726   --
3727   --
3728   --
3729   PROCEDURE validate_and_derive_ids(
3730     px_instance_rec        IN OUT NOCOPY csi_datastructures_pub.instance_rec,
3731     px_party_tbl           IN OUT NOCOPY csi_datastructures_pub.party_tbl,
3732     px_party_acct_tbl      IN OUT NOCOPY csi_datastructures_pub.party_account_tbl,
3733     px_org_units_tbl       IN OUT NOCOPY csi_datastructures_pub.organization_units_tbl,
3734     px_eav_tbl             IN OUT NOCOPY csi_datastructures_pub.extend_attrib_values_tbl,
3735     px_pricing_tbl         IN OUT NOCOPY csi_datastructures_pub.pricing_attribs_tbl,
3736     x_return_status           OUT NOCOPY varchar2)
3737   IS
3738     l_active_end_date      date;
3739   BEGIN
3740     x_return_status := fnd_api.g_ret_sts_success;
3741     api_log('validate_and_derive_ids');
3742 
3743     -- srramakr TSO with equipment. During DISCONNECT of Tangible item instance, we need to remove the config keys.
3744     -- In order to identify whether the item is tangible or not, we use the serial number of the item instance.
3745     -- Only tangible items can be shipped and possess a serial number. Non-tangible can only be fulfilled where
3746     -- there will not be any serial number.
3747     --
3748     SELECT object_version_number,
3749            serial_number ,
3750            active_end_date
3751     INTO   px_instance_rec.object_version_number,
3752            px_instance_rec.serial_number,
3753            l_active_end_date
3754     FROM   csi_item_instances
3755     WHERE  instance_id = px_instance_rec.instance_id;
3756 
3757     px_instance_rec.active_start_date := fnd_api.g_miss_date;
3758 
3759     -- 4946227 okeship of srlsoi returned for good fails
3760     IF nvl(l_active_end_date, fnd_api.g_miss_date) <> fnd_api.g_miss_date THEN
3761       IF px_instance_rec.active_end_date = fnd_api.g_miss_date THEN
3762         px_instance_rec.active_end_date := null;
3763       END IF;
3764     END IF;
3765 
3766     IF px_party_tbl.COUNT > 0 THEN
3767       FOR l_p_ind IN px_party_tbl.FIRST .. px_party_tbl.LAST
3768       LOOP
3769 
3770         px_party_tbl(l_p_ind).instance_id       := px_instance_rec.instance_id;
3771         px_party_tbl(l_p_ind).active_start_date := fnd_api.g_miss_date;
3772 
3773         IF nvl(px_party_tbl(l_p_ind).instance_party_id, fnd_api.g_miss_num) = fnd_api.g_miss_num THEN
3774           BEGIN
3775             SELECT instance_party_id,
3776                    object_version_number
3777             INTO   px_party_tbl(l_p_ind).instance_party_id,
3778                    px_party_tbl(l_p_ind).object_version_number
3779             FROM   csi_i_parties
3780             WHERE  instance_id = px_instance_rec.instance_id
3781             AND    party_source_table = px_party_tbl(l_p_ind).party_source_table
3782             AND    relationship_type_code = px_party_tbl(l_p_ind).relationship_type_code;
3783           EXCEPTION
3784             WHEN no_data_found THEN
3785               px_party_tbl(l_p_ind).instance_party_id := fnd_api.g_miss_num;
3786               px_party_tbl(l_p_ind).object_version_number := 1.0;
3787             WHEN too_many_rows THEN
3788               BEGIN
3789                 SELECT instance_party_id,
3790                        object_version_number
3791                 INTO   px_party_tbl(l_p_ind).instance_party_id,
3792                        px_party_tbl(l_p_ind).object_version_number
3793                 FROM   csi_i_parties
3794                 WHERE  instance_id = px_instance_rec.instance_id
3795                 AND    party_id = px_party_tbl(l_p_ind).party_id
3796                 AND    party_source_table = px_party_tbl(l_p_ind).party_source_table
3797                 AND    relationship_type_code = px_party_tbl(l_p_ind).relationship_type_code;
3798               EXCEPTION
3799                 WHEN no_data_found THEN
3800                   px_party_tbl(l_p_ind).instance_party_id := fnd_api.g_miss_num;
3801                   px_party_tbl(l_p_ind).object_version_number := 1.0;
3802               END;
3803           END;
3804 
3805           -- party account
3806           IF px_party_acct_tbl.count > 0 THEN
3807             FOR l_pa_ind IN px_party_acct_tbl.FIRST .. px_party_acct_tbl.LAST
3808             LOOP
3809               IF px_party_acct_tbl(l_pa_ind).parent_tbl_index = l_p_ind THEN
3810                 px_party_acct_tbl(l_pa_ind).instance_party_id := px_party_tbl(l_p_ind).instance_party_id;
3811                 px_party_acct_tbl(l_pa_ind).active_start_date := fnd_api.g_miss_date;
3812 
3813                 IF nvl(px_party_acct_tbl(l_pa_ind).ip_account_id , fnd_api.g_miss_num) = fnd_api.g_miss_num
3814                 THEN
3815                   BEGIN
3816 
3817                     SELECT ip_account_id,
3818                            object_version_number
3819                     INTO   px_party_acct_tbl(l_pa_ind).ip_account_id,
3820                            px_party_acct_tbl(l_pa_ind).object_version_number
3821                     FROM   csi_ip_accounts
3822                     WHERE  instance_party_id      = px_party_acct_tbl(l_pa_ind).instance_party_id
3823                     AND    relationship_type_code = px_party_acct_tbl(l_pa_ind).relationship_type_code;
3824 
3825                   EXCEPTION
3826                     WHEN no_data_found THEN
3827                       px_party_acct_tbl(l_pa_ind).ip_account_id := fnd_api.g_miss_num;
3828                       px_party_acct_tbl(l_pa_ind).object_version_number := 1.0;
3829                     WHEN too_many_rows THEN
3830                       BEGIN
3831                         SELECT ip_account_id,
3832                                object_version_number
3833                         INTO   px_party_acct_tbl(l_pa_ind).ip_account_id,
3834                                px_party_acct_tbl(l_pa_ind).object_version_number
3835                         FROM   csi_ip_accounts
3836                         WHERE  instance_party_id      = px_party_acct_tbl(l_pa_ind).instance_party_id
3837                         AND    party_account_id       = px_party_acct_tbl(l_pa_ind).party_account_id
3838                         AND    relationship_type_code = px_party_acct_tbl(l_pa_ind).relationship_type_code;
3839                       EXCEPTION
3840                         WHEN no_data_found THEN
3841                           px_party_acct_tbl(l_pa_ind).ip_account_id := fnd_api.g_miss_num;
3842                           px_party_acct_tbl(l_pa_ind).object_version_number := 1.0;
3843                       END;
3844                   END;
3845                 ELSE
3846                   SELECT object_version_number
3847                   INTO   px_party_acct_tbl(l_pa_ind).object_version_number
3848                   FROM   csi_ip_accounts
3849                   WHERE  ip_account_id = px_party_acct_tbl(l_pa_ind).ip_account_id;
3850                 END IF;
3851               END IF;
3852             END LOOP;
3853           ELSE
3854             SELECT object_version_number
3855             INTO   px_party_tbl(l_p_ind).object_version_number
3856             FROM   csi_i_parties
3857             WHERE instance_party_id = px_party_tbl(l_p_ind).instance_party_id;
3858           END IF;
3859 
3860         END IF;
3861       END LOOP;
3862     END IF;
3863 
3864     -- org units
3865 
3866     IF px_org_units_tbl.COUNT > 0 THEN
3867       FOR l_ind IN px_org_units_tbl.FIRST .. px_org_units_tbl.LAST
3868       LOOP
3869         px_org_units_tbl(l_ind).instance_id := px_instance_rec.instance_id;
3870         px_org_units_tbl(l_ind).active_start_date := fnd_api.g_miss_date;
3871         IF nvl(px_org_units_tbl(l_ind).instance_ou_id,fnd_api.g_miss_num) = fnd_api.g_miss_num THEN
3872           BEGIN
3873             SELECT instance_ou_id,
3874                    object_version_number
3875             INTO   px_org_units_tbl(l_ind).instance_ou_id,
3876                    px_org_units_tbl(l_ind).object_version_number
3877             FROM   csi_i_org_assignments
3878             WHERE  instance_id = px_org_units_tbl(l_ind).instance_id
3879             AND    operating_unit_id = px_org_units_tbl(l_ind).operating_unit_id
3880             AND    relationship_type_code = px_org_units_tbl(l_ind).relationship_type_code;
3881           EXCEPTION
3882             WHEN no_data_found THEN
3883               px_org_units_tbl(l_ind).instance_ou_id := fnd_api.g_miss_num;
3884               px_org_units_tbl(l_ind).object_version_number := 1.0;
3885           END;
3886         ELSE
3887           SELECT object_version_number
3888           INTO   px_org_units_tbl(l_ind).instance_ou_id
3889           FROM   csi_i_org_assignments
3890           WHERE  instance_ou_id = px_org_units_tbl(l_ind).instance_ou_id;
3891         END IF;
3892       END LOOP;
3893     END IF;
3894 
3895     -- extended attribs
3896     IF px_eav_tbl.COUNT > 0 THEN
3897       FOR l_ind IN px_eav_tbl.FIRST .. px_eav_tbl.LAST
3898       LOOP
3899         px_eav_tbl(l_ind).instance_id := px_instance_rec.instance_id;
3900         IF nvl(px_eav_tbl(l_ind).attribute_value_id,fnd_api.g_miss_num) = fnd_api.g_miss_num THEN
3901           BEGIN
3902             null;
3903           EXCEPTION
3904             WHEN no_data_found THEN
3905               px_eav_tbl(l_ind).object_version_number := 1.0;
3906           END;
3907         ELSE
3908           SELECT object_version_number
3909           INTO   px_eav_tbl(l_ind).object_version_number
3910           FROM   csi_iea_values
3911           WHERE  attribute_value_id = px_eav_tbl(l_ind).attribute_value_id;
3912         END IF;
3913       END LOOP;
3914     END IF;
3915 
3916     -- pricing attribs
3917     -- Added for bug 5093707
3918     IF px_pricing_tbl.COUNT > 0 THEN
3919       FOR l_ind IN px_pricing_tbl.FIRST .. px_pricing_tbl.LAST
3920       LOOP
3921         px_pricing_tbl(l_ind).instance_id := px_instance_rec.instance_id;
3922         IF nvl(px_pricing_tbl(l_ind).pricing_attribute_id,fnd_api.g_miss_num) = fnd_api.g_miss_num THEN
3923 
3924     BEGIN
3925                 SELECT pricing_attribute_id ,
3926                        object_version_number
3927                 INTO   px_pricing_tbl(l_ind).pricing_attribute_id ,
3928                        px_pricing_tbl(l_ind).object_version_number
3929                 FROM   csi_i_pricing_attribs
3930                 WHERE  instance_id       = px_instance_rec.instance_id
3931                 AND    pricing_context   = px_pricing_tbl(l_ind).pricing_context ;
3932 
3933            EXCEPTION
3934      WHEN NO_DATA_FOUND THEN
3935               px_pricing_tbl(l_ind).object_version_number := 1.0;
3936            END;
3937 
3938         ELSE
3939           SELECT object_version_number
3940           INTO   px_pricing_tbl(l_ind).object_version_number
3941           FROM   csi_i_pricing_attribs
3942           WHERE  pricing_attribute_id = px_pricing_tbl(l_ind).pricing_attribute_id;
3943         END IF;
3944       END LOOP;
3945     END IF;
3946     -- End Added for bug 5093707
3947     -- end pricing attribs
3948 
3949 
3950   EXCEPTION
3951     WHEN fnd_api.g_exc_error THEN
3952       x_return_status := fnd_api.g_ret_sts_error;
3953   END validate_and_derive_ids;
3954 
3955   PROCEDURE build_relationship_tbl(
3956     p_txn_ii_rltns_tbl  IN    csi_t_datastructures_grp.txn_ii_rltns_tbl,
3957     p_txn_line_dtl_tbl  IN    csi_t_datastructures_grp.txn_line_detail_tbl,
3958     x_c_ii_rltns_tbl    OUT NOCOPY   csi_datastructures_pub.ii_relationship_tbl,
3959     x_u_ii_rltns_tbl    OUT NOCOPY   csi_datastructures_pub.ii_relationship_tbl,
3960     x_return_status     OUT NOCOPY   varchar2)
3961   IS
3962 
3963     l_r_tbl             csi_t_datastructures_grp.txn_ii_rltns_tbl;
3964     l_td_tbl            csi_t_datastructures_grp.txn_line_detail_tbl;
3965 
3966     l_sub_instance_id   number;
3967     l_obj_instance_id   number;
3968     l_rel_end_date      date;
3969 
3970     --Fix for bug 5956280
3971     l_obj_end_date      date;
3972     l_sub_end_date      date;
3973 
3974 
3975     l_c_ind             binary_integer := 0;
3976     l_u_ind             binary_integer := 0;
3977 
3978     skip_the_relation   exception;
3979 
3980   BEGIN
3981     x_return_status := fnd_api.g_ret_sts_success;
3982     api_log('build_relationship_tbl');
3983 
3984     debug('  ii_rltns_tbl    :'||p_txn_ii_rltns_tbl.count);
3985 
3986     l_r_tbl  := p_txn_ii_rltns_tbl;
3987     l_td_tbl := p_txn_line_dtl_tbl;
3988 
3989     IF l_r_tbl.COUNT > 0 THEN
3990       FOR l_ii_ind IN l_r_tbl.FIRST .. l_r_tbl.LAST
3991       LOOP
3992         l_rel_end_date := NULL;
3993         l_obj_end_date := NULL;
3994         l_sub_end_date := NULL;
3995         BEGIN
3996 
3997           debug('    sub_config_inst_hdr_id  :'||l_r_tbl(l_ii_ind).sub_config_inst_hdr_id);
3998           debug('    sub_config_inst_rev_num :'||l_r_tbl(l_ii_ind).sub_config_inst_rev_num);
3999           debug('    sub_config_inst_item_id :'||l_r_tbl(l_ii_ind).sub_config_inst_item_id);
4000           debug(' ');
4001           debug('    obj_config_inst_hdr_id  :'||l_r_tbl(l_ii_ind).obj_config_inst_hdr_id);
4002           debug('    obj_config_inst_rev_num :'||l_r_tbl(l_ii_ind).obj_config_inst_rev_num);
4003           debug('    obj_config_inst_item_id :'||l_r_tbl(l_ii_ind).obj_config_inst_item_id);
4004 
4005           IF l_r_tbl(l_ii_ind).subject_type = 'I' THEN
4006              l_sub_instance_id := l_r_tbl(l_ii_ind).subject_id;
4007           ELSE
4008              BEGIN
4009                SELECT instance_id,active_end_date
4010                INTO   l_sub_instance_id,l_sub_end_date --Fix for bug 5956280
4011                FROM   csi_item_instances
4012                WHERE  config_inst_hdr_id  = l_r_tbl(l_ii_ind).sub_config_inst_hdr_id
4013                --AND    config_inst_rev_num = l_r_tbl(l_ii_ind).sub_config_inst_rev_num
4014                AND    config_inst_item_id = l_r_tbl(l_ii_ind).sub_config_inst_item_id;
4015              EXCEPTION
4016                WHEN no_data_found THEN
4017                   BEGIN
4018                      SELECT instance_id,active_end_date
4019                      INTO   l_sub_instance_id,l_sub_end_date --Fix for bug 5956280
4020                      FROM CSI_T_TXN_LINE_DETAILS
4021                      WHERE txn_line_detail_id = l_r_tbl(l_ii_ind).subject_id;
4022                   EXCEPTION
4023                      WHEN NO_DATA_FOUND THEN
4024                         raise skip_the_relation;
4025                   END;
4026              END;
4027           END IF;
4028 
4029           IF l_r_tbl(l_ii_ind).object_type = 'I' THEN
4030              l_obj_instance_id := l_r_tbl(l_ii_ind).object_id;
4031           ELSE
4032              BEGIN
4033                SELECT instance_id,active_end_date
4034                INTO   l_obj_instance_id,l_obj_end_date --Fix for bug 5956280
4035                FROM   csi_item_instances
4036                WHERE  config_inst_hdr_id  = l_r_tbl(l_ii_ind).obj_config_inst_hdr_id
4037                --AND    config_inst_rev_num = l_r_tbl(l_ii_ind).obj_config_inst_rev_num
4038                AND    config_inst_item_id = l_r_tbl(l_ii_ind).obj_config_inst_item_id;
4039              EXCEPTION
4040                WHEN no_data_found THEN
4041                   BEGIN
4042                      SELECT instance_id,active_end_date
4043                      INTO   l_obj_instance_id,l_obj_end_date --Fix for bug 5956280
4044                      FROM CSI_T_TXN_LINE_DETAILS
4045                      WHERE txn_line_detail_id = l_r_tbl(l_ii_ind).object_id;
4046                   EXCEPTION
4047                      WHEN NO_DATA_FOUND THEN
4048                         raise skip_the_relation;
4049                   END;
4050              END;
4051           END IF;
4052 
4053           BEGIN
4054             SELECT relationship_id,
4055                    object_version_number,
4056                    active_end_date
4057             INTO   l_r_tbl(l_ii_ind).csi_inst_relationship_id,
4058                    l_r_tbl(l_ii_ind).object_version_number,
4059                    l_rel_end_date
4060             FROM   csi_ii_relationships
4061             WHERE  subject_id = l_sub_instance_id
4062             AND    object_id  = l_obj_instance_id;
4063           EXCEPTION
4064             WHEN no_data_found THEN
4065               l_r_tbl(l_ii_ind).csi_inst_relationship_id := fnd_api.g_miss_num;
4066           END;
4067 
4068           IF nvl(l_r_tbl(l_ii_ind).csi_inst_relationship_id,fnd_api.g_miss_num) = fnd_api.g_miss_num THEN
4069             IF  l_r_tbl(l_ii_ind).active_end_date IS NULL AND l_obj_end_date IS NULL --Fix for bug 5956280
4070             AND l_sub_end_date IS NULL THEN
4071 		l_c_ind := l_c_ind + 1;
4072 		x_c_ii_rltns_tbl(l_c_ind).relationship_id := fnd_api.g_miss_num;
4073 		x_c_ii_rltns_tbl(l_c_ind).subject_id      := l_sub_instance_id;
4074 		x_c_ii_rltns_tbl(l_c_ind).relationship_type_code := l_r_tbl(l_ii_ind).relationship_type_code;
4075 		x_c_ii_rltns_tbl(l_c_ind).object_id       := l_obj_instance_id;
4076 		x_c_ii_rltns_tbl(l_c_ind).display_order   := l_r_tbl(l_ii_ind).display_order;
4077 		x_c_ii_rltns_tbl(l_c_ind).position_reference  := l_r_tbl(l_ii_ind).position_reference;
4078 	    END IF;
4079           ELSE
4080 
4081             /* if the relationship is not already end dated then take it for processing */
4082           --  IF l_rel_end_date is null THEN
4083               l_u_ind := l_u_ind + 1;
4084               x_u_ii_rltns_tbl(l_u_ind).relationship_id := l_r_tbl(l_ii_ind).csi_inst_relationship_id;
4085               x_u_ii_rltns_tbl(l_u_ind).subject_id      := l_sub_instance_id;
4086               x_u_ii_rltns_tbl(l_u_ind).relationship_type_code := l_r_tbl(l_ii_ind).relationship_type_code;
4087               x_u_ii_rltns_tbl(l_u_ind).object_id       := l_obj_instance_id;
4088               x_u_ii_rltns_tbl(l_u_ind).display_order   := l_r_tbl(l_ii_ind).display_order;
4089               x_u_ii_rltns_tbl(l_u_ind).position_reference  := l_r_tbl(l_ii_ind).position_reference;
4090 	      --Modified for bug5928619
4091               IF l_rel_end_date is null THEN
4092                   x_u_ii_rltns_tbl(l_u_ind).active_end_date := l_r_tbl(l_ii_ind).active_end_date;
4093                   debug('l_rel_end_date is null '||l_rel_end_date);
4094               ELSE
4095                   x_u_ii_rltns_tbl(l_u_ind).active_end_date := null; --Added for bug5928619
4096                   debug('l_rel_end_date is not null '||l_rel_end_date);
4097               END IF;
4098 
4099               x_u_ii_rltns_tbl(l_u_ind).object_version_number := l_r_tbl(l_ii_ind).object_version_number;
4100         --    END IF;
4101 
4102           END IF;
4103 
4104         EXCEPTION
4105           WHEN skip_the_relation THEN
4106             null;
4107         END;
4108       END LOOP;
4109     END IF;
4110 
4111     debug('  create_ii_rltns :'||x_c_ii_rltns_tbl.count);
4112     debug('  update_ii_rltns :'||x_u_ii_rltns_tbl.count);
4113 
4114   EXCEPTION
4115     WHEN fnd_api.g_exc_error THEN
4116       x_return_status := fnd_api.g_ret_sts_success;
4117   END build_relationship_tbl;
4118 
4119   PROCEDURE update_td_status(
4120     p_txn_line_rec         IN     csi_t_datastructures_grp.txn_line_rec,
4121     p_txn_line_dtl_tbl     IN     csi_t_datastructures_grp.txn_line_detail_tbl,
4122     p_processing_status    IN     varchar2,
4123     x_return_status        OUT NOCOPY    varchar2)
4124   IS
4125 
4126     l_tl_rec               csi_t_datastructures_grp.txn_line_rec;
4127     l_td_tbl               csi_t_datastructures_grp.txn_line_detail_tbl;
4128     l_pd_tbl               csi_t_datastructures_grp.txn_party_detail_tbl;
4129     l_pa_tbl               csi_t_datastructures_grp.txn_pty_acct_detail_tbl;
4130     l_oa_tbl               csi_t_datastructures_grp.txn_org_assgn_tbl;
4131     l_ea_tbl               csi_t_datastructures_grp.txn_ext_attrib_vals_tbl;
4132     l_ir_tbl               csi_t_datastructures_grp.txn_ii_rltns_tbl;
4133 
4134     l_return_status        varchar2(1) := fnd_api.g_ret_sts_success;
4135     l_msg_count            number;
4136     l_msg_data             varchar2(2000);
4137 
4138   BEGIN
4139     x_return_status := fnd_api.g_ret_sts_success;
4140     api_log('update_td_status');
4141 
4142     --l_tl_rec := p_txn_line_rec;
4143     IF nvl(p_txn_line_rec.transaction_line_id,fnd_api.g_miss_num) <> fnd_api.g_miss_num THEN
4144       l_tl_rec.transaction_line_id := p_txn_line_rec.transaction_line_id;
4145       l_tl_rec.processing_status   := p_processing_status;
4146       l_tl_rec.api_caller_identity := 'CONFIG';
4147 
4148       IF p_txn_line_dtl_tbl.COUNT > 0 THEN
4149         FOR l_ind IN p_txn_line_dtl_tbl.FIRST .. p_txn_line_dtl_tbl.LAST
4150         LOOP
4151           l_td_tbl(l_ind).txn_line_detail_id := p_txn_line_dtl_tbl(l_ind).source_txn_line_detail_id;
4152           l_td_tbl(l_ind).processing_status  := p_processing_status;
4153           l_td_tbl(l_ind).api_caller_identity := 'CONFIG';
4154 
4155           IF p_processing_status = 'ERROR' THEN
4156             l_td_tbl(l_ind).error_explanation := p_txn_line_dtl_tbl(l_ind).error_explanation;
4157           END IF;
4158 
4159         END LOOP;
4160       END IF;
4161 
4162       csi_t_txn_details_grp.update_txn_line_dtls(
4163         p_api_version              => 1.0,
4164         p_commit                   => fnd_api.g_false,
4165         p_init_msg_list            => fnd_api.g_true,
4166         p_validation_level         => fnd_api.g_valid_level_full,
4167         p_txn_line_rec             => l_tl_rec,
4168         p_txn_line_detail_tbl      => l_td_tbl,
4169         px_txn_party_detail_tbl    => l_pd_tbl,
4170         px_txn_pty_acct_detail_tbl => l_pa_tbl,
4171         px_txn_org_assgn_tbl       => l_oa_tbl,
4172         px_txn_ext_attrib_vals_tbl => l_ea_tbl,
4173         px_txn_ii_rltns_tbl        => l_ir_tbl,
4174         x_return_status            => l_return_status,
4175         x_msg_count                => l_msg_count,
4176         x_msg_data                 => l_msg_data);
4177 
4178       IF l_return_status <> fnd_api.g_ret_sts_success THEN
4179         RAISE fnd_api.g_exc_error;
4180       END IF;
4181     END IF;
4182 
4183   EXCEPTION
4184     WHEN fnd_api.g_exc_error THEN
4185       x_return_status := fnd_api.g_ret_sts_error;
4186   END update_td_status;
4187   --
4188   --
4189   --
4190   PROCEDURE interface_ib(
4191     p_source_header_rec    IN     csi_interface_pkg.source_header_rec,
4192     p_source_line_rec      IN     csi_interface_pkg.source_line_rec,
4193     px_csi_txn_rec         IN OUT NOCOPY csi_datastructures_pub.transaction_rec,
4194     px_txn_line_rec        IN OUT NOCOPY csi_t_datastructures_grp.txn_line_rec,
4195     px_txn_line_dtl_tbl    IN OUT NOCOPY csi_t_datastructures_grp.txn_line_detail_tbl,
4196     px_txn_party_tbl       IN OUT NOCOPY csi_t_datastructures_grp.txn_party_detail_tbl,
4197     px_txn_party_acct_tbl  IN OUT NOCOPY csi_t_datastructures_grp.txn_pty_acct_detail_tbl,
4198     px_txn_org_assgn_tbl   IN OUT NOCOPY csi_t_datastructures_grp.txn_org_assgn_tbl,
4199     px_txn_eav_tbl         IN OUT NOCOPY csi_t_datastructures_grp.txn_ext_attrib_vals_tbl,
4200     px_txn_ii_rltns_tbl    IN OUT NOCOPY csi_t_datastructures_grp.txn_ii_rltns_tbl,
4201     px_pricing_attribs_tbl IN OUT NOCOPY csi_datastructures_pub.pricing_attribs_tbl,
4202     x_return_status           OUT NOCOPY varchar2,
4203     x_return_message          OUT NOCOPY varchar2)
4204   IS
4205 
4206     l_instance_rec               csi_datastructures_pub.instance_rec;
4207     l_party_tbl                  csi_datastructures_pub.party_tbl;
4208     l_party_acct_tbl             csi_datastructures_pub.party_account_tbl;
4209     l_eav_tbl                    csi_datastructures_pub.extend_attrib_values_tbl;
4210     l_pricing_tbl                csi_datastructures_pub.pricing_attribs_tbl;
4211     l_org_units_tbl              csi_datastructures_pub.organization_units_tbl;
4212 
4213     l_sub_type_rec               csi_txn_sub_types%rowtype;
4214     l_item_attrib_rec            item_attributes_rec;
4215 
4216     l_csi_txn_rec                csi_datastructures_pub.transaction_rec;
4217 
4218     l_c_instance_rec             csi_datastructures_pub.instance_rec;
4219     l_c_party_tbl                csi_datastructures_pub.party_tbl;
4220     l_c_party_acct_tbl           csi_datastructures_pub.party_account_tbl;
4221     l_c_org_units_tbl            csi_datastructures_pub.organization_units_tbl;
4222     l_c_eav_tbl                  csi_datastructures_pub.extend_attrib_values_tbl;
4223     l_c_pricing_tbl              csi_datastructures_pub.pricing_attribs_tbl;
4224     l_c_inst_asset_tbl           csi_datastructures_pub.instance_asset_tbl;
4225 
4226     l_u_end_date                 date := null;
4227 
4228     l_u_instance_rec             csi_datastructures_pub.instance_rec;
4229     l_u_party_tbl                csi_datastructures_pub.party_tbl;
4230     l_u_party_acct_tbl           csi_datastructures_pub.party_account_tbl;
4231     l_u_org_units_tbl            csi_datastructures_pub.organization_units_tbl;
4232     l_u_eav_tbl                  csi_datastructures_pub.extend_attrib_values_tbl;
4233     l_u_pricing_tbl              csi_datastructures_pub.pricing_attribs_tbl;
4234     l_u_inst_asset_tbl           csi_datastructures_pub.instance_asset_tbl;
4235     l_u_inst_id_tbl              csi_datastructures_pub.id_tbl;
4236 
4237     l_c_ii_rltns_tbl             csi_datastructures_pub.ii_relationship_tbl;
4238     l_u_ii_rltns_tbl             csi_datastructures_pub.ii_relationship_tbl;
4239 
4240     l_txn_line_rec               csi_t_datastructures_grp.txn_line_rec;
4241     l_txn_line_query_rec         csi_t_datastructures_grp.txn_line_query_rec;
4242 
4243     -- explode bom variables
4244     l_bom_std_item_rec           csi_datastructures_pub.instance_rec;
4245     l_comp_instance_tbl          csi_datastructures_pub.instance_tbl;
4246     l_comp_relation_tbl          csi_datastructures_pub.ii_relationship_tbl;
4247     l_bom_explode_flag           BOOLEAN := FALSE;
4248 
4249     l_create_flag                boolean     := FALSE;
4250     l_call_contracts             varchar2(1) := fnd_api.g_true;
4251 
4252      --4327207
4253     l_fulfilled_date             date        := fnd_api.g_miss_date;
4254     l_rlt_active_end_date        date        := fnd_api.g_miss_date;
4255     l_parent_line_rec            oe_order_pub.line_rec_type;
4256     om_vld_org_id                NUMBER;
4257     l_csi_order_line_rec         csi_order_ship_pub.order_line_rec;
4258     l_child_line_tbl             oe_order_pub.line_tbl_type;
4259     l_inst_query_rec             csi_datastructures_pub.instance_query_rec;
4260     l_party_query_rec            csi_datastructures_pub.party_query_rec;
4261     l_pty_acct_query_rec         csi_datastructures_pub.party_account_query_rec;
4262 
4263     l_instance_hdr_tbl           csi_datastructures_pub.instance_header_tbl;
4264     l_rel_ctr                    NUMBER;
4265 
4266     l_active_end_date            date        := fnd_api.g_miss_date;
4267     l_return_status              varchar2(1) := fnd_api.g_ret_sts_success;
4268     l_rel_type_code              varchar2(30) := 'COMPONENT-OF';
4269     l_msg_count                  number;
4270     l_msg_data                   varchar2(2000);
4271 
4272 		-- Added for FP of bug 6755897 - Reconcilation changes
4273  	  l_item_instance_expired      varchar2(1);
4274   BEGIN
4275 
4276     api_log('interface_ib');
4277 
4278     x_return_status := fnd_api.g_ret_sts_success;
4279 
4280     debug('  input record count for interface_ib :-');
4281     debug('    txn_line_dtl_tbl    :'||px_txn_line_dtl_tbl.count);
4282     debug('    txn_party_tbl       :'||px_txn_party_tbl.count);
4283     debug('    txn_party_acct_tbl  :'||px_txn_party_acct_tbl.count);
4284     debug('    txn_org_assgn_tbl   :'||px_txn_org_assgn_tbl.count);
4285     debug('    txn_eav_tbl         :'||px_txn_eav_tbl.count);
4286     debug('    txn_ii_rltns_tbl    :'||px_txn_ii_rltns_tbl.count);
4287     debug('    pricing_attribs_tbl :'||px_pricing_attribs_tbl.count);
4288 
4289      --4327207
4290     l_fulfilled_date := nvl(p_source_line_rec.fulfilled_date,fnd_api.g_miss_date);
4291 
4292     -- get_item_attributes
4293     get_item_attributes(
4294       p_transaction_id       => px_csi_txn_rec.inv_material_transaction_id, --Added for bug# 14835893
4295       p_inventory_item_id    => p_source_line_rec.inventory_item_id,
4296       p_organization_id      => p_source_line_rec.organization_id,
4297       x_item_attrib_rec      => l_item_attrib_rec,
4298       x_return_status        => l_return_status);
4299 
4300     IF l_return_status <> fnd_api.g_ret_sts_success THEN
4301       RAISE fnd_api.g_exc_error;
4302     END IF;
4303 
4304     IF p_source_line_rec.org_id is not null THEN
4305       om_vld_org_id := oe_sys_parameters.value(
4306                          param_name => 'MASTER_ORGANIZATION_ID',
4307                          p_org_id   => p_source_line_rec.org_id);
4308     END IF;
4309 
4310 
4311     IF px_txn_line_dtl_tbl.COUNT > 0 THEN
4312       FOR l_td_ind IN px_txn_line_dtl_tbl.FIRST .. px_txn_line_dtl_tbl.LAST
4313       LOOP
4314 
4315         debug('Transaction Type ID:'||px_txn_line_rec.source_transaction_type_id);
4316         debug('Sub Type ID        :'||px_txn_line_dtl_tbl(l_td_ind).sub_type_id);
4317         debug('Instance ID        :'||px_txn_line_dtl_tbl(l_td_ind).instance_id);
4318 
4319         --4327207
4320 
4321         --Added code for bug 7517240
4322         l_pricing_tbl := px_pricing_attribs_tbl; --Added for bug 7239142
4323         IF l_pricing_tbl.COUNT > 0 THEN
4324           FOR l_pricing_index IN l_pricing_tbl.FIRST..l_pricing_tbl.LAST LOOP
4325             debug('Pricing Attributes Table Record #  :'||l_pricing_index);
4326             debug('pricing_attribute_id        :'||l_pricing_tbl(l_pricing_index).pricing_attribute_id);
4327             debug('instance_id                 :'||l_pricing_tbl(l_pricing_index).instance_id);
4328             debug('active_start_date           :'||l_pricing_tbl(l_pricing_index).active_start_date);
4329             debug('active_end_date             :'||l_pricing_tbl(l_pricing_index).active_end_date);
4330             debug('pricing_context             :'||l_pricing_tbl(l_pricing_index).pricing_context);
4331           END LOOP;
4332         END IF;
4333         --End added code for bug 7517240
4334 
4335 	l_create_flag :=FALSE; --5702851
4336         IF px_txn_line_rec.source_transaction_type_id = 401
4337            AND
4338            px_txn_line_rec.config_session_hdr_id IS NOT NULL
4339            AND
4340            px_txn_line_dtl_tbl(l_td_ind).active_end_date IS NOT NULL
4341         THEN
4342           IF p_source_line_rec.link_to_line_id IS NOT NULL THEN
4343             BEGIN
4344               -- Begin fix for bug 6964595, FP of bug 6916021
4345               -- If there are multiple relationships where
4346               -- the same item instance is the subject, get the active_end_date
4347               -- for the last one
4348               SELECT active_end_date
4349               INTO l_rlt_active_end_date
4350               FROM csi_ii_relationships
4351               WHERE relationship_id=
4352               (SELECT max(relationship_id)
4353               FROM csi_ii_relationships
4354               WHERE subject_id = px_txn_line_dtl_tbl(l_td_ind).instance_id
4355               AND relationship_type_code = l_rel_type_code);  -- srramakr added
4356               -- End fix for bug 6964595, FP of bug 6916021
4357             EXCEPTION
4358               WHEN no_data_found THEN
4359                 debug('No relationship exists');
4360             END;
4361 
4362             IF l_rlt_active_end_date IS NOT NULL THEN
4363               csi_order_fulfill_pub.get_ib_trackable_parent(
4364                 p_current_line_id   => p_source_line_rec.source_line_id,
4365                 p_om_vld_org_id     => om_vld_org_id,
4366                 x_parent_line_rec   => l_parent_line_rec,
4367                 x_return_status     => l_return_status);
4368 
4369               IF l_return_status <> fnd_api.g_ret_sts_success THEN
4370                 RAISE fnd_api.g_exc_error;
4371               END IF;
4372 
4373               IF l_parent_line_rec.fulfillment_date IS NOT NULL
4374                  AND
4375                  l_parent_line_rec.fulfillment_date > p_source_line_rec.fulfilled_date
4376               THEN
4377                 l_fulfilled_date := l_parent_line_rec.fulfillment_date;
4378               END IF;
4379               debug('l_parent_fulfill_date_time..'||to_char(l_parent_line_rec.fulfillment_date,'dd-mon-yyyy hh:mi:ss'));
4380               debug('p_source_fulfill_date time..'||to_char(p_source_line_rec.fulfilled_date,'dd-mon-yyyy hh:mi:ss'));
4381 
4382             END IF;
4383 
4384           END IF;--end of link_to_line_id
4385         END IF;--end of disconnect fulfill date swap
4386         -- 4327207
4387 
4388         -- get sub_type rec
4389         BEGIN
4390           SELECT *
4391           INTO   l_sub_type_rec
4392           FROM   csi_txn_sub_types
4393           WHERE  transaction_type_id = px_txn_line_rec.source_transaction_type_id
4394           AND    sub_type_id         = px_txn_line_dtl_tbl(l_td_ind).sub_type_id;
4395         EXCEPTION
4396           WHEN no_data_found THEN
4397             fnd_message.set_name('CSI', 'CSI_INT_SUB_TYPE_REC_MISSING');
4398             fnd_message.set_token('SUB_TYPE_ID', px_txn_line_dtl_tbl(l_td_ind).sub_type_id);
4399             fnd_message.set_token('TRANSACTION_TYPE_ID',px_txn_line_rec.source_transaction_type_id);
4400             fnd_msg_pub.add;
4401             RAISE fnd_api.g_exc_error;
4402         END;
4403 
4404         debug('src_status_id      :'||l_sub_type_rec.src_status_id);
4405 
4406         IF nvl(px_csi_txn_rec.transaction_id, fnd_api.g_miss_num) <> fnd_api.g_miss_num THEN
4407           l_csi_txn_rec  := px_csi_txn_rec;
4408         ELSE
4409           l_csi_txn_rec.transaction_id          := fnd_api.g_miss_num;
4410           l_csi_txn_rec.transaction_type_id     := px_txn_line_rec.source_transaction_type_id;
4411           l_csi_txn_rec.txn_sub_type_id         := px_txn_line_dtl_tbl(l_td_ind).sub_type_id;
4412           l_csi_txn_rec.transaction_date        := sysdate;
4413           l_csi_txn_rec.source_header_ref_id    := p_source_header_rec.source_header_id;
4414           l_csi_txn_rec.source_header_ref       := p_source_header_rec.source_header_ref;
4415           l_csi_txn_rec.source_line_ref_id      := p_source_line_rec.source_line_id;
4416           l_csi_txn_rec.source_line_ref         := p_source_line_rec.source_line_ref;
4417           l_csi_txn_rec.source_transaction_date := l_fulfilled_date;
4418         END IF;
4419 
4420         debug('Txn line end date     :'||px_txn_line_dtl_tbl(l_td_ind).active_end_date);
4421         debug('Top model line id     :'||p_source_line_rec.top_model_line_id);
4422         debug('Link to line id       :'||p_source_line_rec.link_to_line_id);
4423         debug('l_fulfilled_date      :'||l_fulfilled_date);
4424         debug('Order fullfill date   :'||p_source_line_rec.fulfilled_date);
4425         debug('Relationship end date :'||l_rlt_active_end_date);
4426 
4427         -- adding this condition to make sure that the relationship processing
4428         -- happens once and only once within the interface_ib session
4429         IF l_td_ind = 1 THEN
4430 
4431           /* moved this update_relationship set above to address the issue with
4432              expire the relationship first before processing the children. The
4433              core API while expiring the parent instance automatically end dates
4434              the child instances. We are stopping that by expiring the relationsip
4435              first thus by hiding the shildren from the API.
4436           */
4437 
4438           IF px_txn_ii_rltns_tbl.COUNT > 0 THEN
4439 
4440             build_relationship_tbl(
4441               p_txn_ii_rltns_tbl    => px_txn_ii_rltns_tbl,
4442               p_txn_line_dtl_tbl    => px_txn_line_dtl_tbl,
4443               x_c_ii_rltns_tbl      => l_c_ii_rltns_tbl,
4444               x_u_ii_rltns_tbl      => l_u_ii_rltns_tbl,
4445               x_return_status       => l_return_status);
4446 
4447             IF l_return_status <> fnd_api.g_ret_sts_success THEN
4448               RAISE fnd_api.g_exc_error;
4449             END IF;
4450 
4451             /* update the existing relationships */
4452             IF l_u_ii_rltns_tbl.COUNT > 0 THEN
4453 
4454               /* to stamp the source transaction date as end date */
4455               FOR l_ind IN l_u_ii_rltns_tbl.FIRST .. l_u_ii_rltns_tbl.LAST
4456               LOOP
4457                 debug(' Relationship_ID      :'|| l_u_ii_rltns_tbl(l_ind).relationship_id);
4458                 debug(' Relationship_End_Date:'|| l_u_ii_rltns_tbl(l_ind).active_end_date);
4459                 IF nvl(l_u_ii_rltns_tbl(l_ind).active_end_date, fnd_api.g_miss_date) <> fnd_api.g_miss_date
4460                 THEN
4461                   l_u_ii_rltns_tbl(l_ind).active_end_date := l_csi_txn_rec.source_transaction_date;
4462                 END IF;
4463                 debug(' Source_txn_date      :'|| l_u_ii_rltns_tbl(l_ind).active_end_date);
4464               END LOOP;
4465 
4466               record_time('Start');
4467 
4468               csi_t_gen_utility_pvt.dump_api_info(
4469                 p_pkg_name => 'csi_ii_relationships_pub',
4470                 p_api_name => 'update_relationship');
4471 
4472               csi_ii_relationships_pub.update_relationship(
4473                 p_api_version        => 1.0,
4474                 p_commit             => fnd_api.g_false,
4475                 p_init_msg_list      => fnd_api.g_true,
4476                 p_validation_level   => fnd_api.g_valid_level_full,
4477                 p_relationship_tbl   => l_u_ii_rltns_tbl,
4478                 p_txn_rec            => l_csi_txn_rec,
4479                 x_return_status      => l_return_status,
4480                 x_msg_count          => l_msg_count,
4481                 x_msg_data           => l_msg_data);
4482 
4483               IF l_return_status <> fnd_api.g_ret_sts_success THEN
4484                 RAISE fnd_api.g_exc_error;
4485               END IF;
4486 
4487               record_time('End');
4488 
4489             END IF;
4490           END IF;
4491         END IF;
4492 
4493         -- build temporary instance set
4494         build_instance_set(
4495           p_index                => l_td_ind,
4496           p_source_line_rec      => p_source_line_rec,
4497           p_item_attrib_rec      => l_item_attrib_rec,
4498 		  p_csi_txn_rec          => l_csi_txn_rec,
4499           p_txn_line_dtl_rec     => px_txn_line_dtl_tbl(l_td_ind),
4500           p_txn_party_tbl        => px_txn_party_tbl,
4501           p_txn_party_acct_tbl   => px_txn_party_acct_tbl,
4502           p_txn_org_assgn_tbl    => px_txn_org_assgn_tbl,
4503           p_txn_eav_tbl          => px_txn_eav_tbl,
4504           px_pricing_tbl         => l_pricing_tbl,
4505           x_instance_rec         => l_instance_rec,
4506           x_party_tbl            => l_party_tbl,
4507           x_party_acct_tbl       => l_party_acct_tbl,
4508           x_org_units_tbl        => l_org_units_tbl,
4509           x_eav_tbl              => l_eav_tbl,
4510           x_return_status        => l_return_status);
4511 
4512         IF x_return_status <> fnd_api.g_ret_sts_success THEN
4513           RAISE fnd_api.g_exc_error;
4514         END IF;
4515 
4516         debug('source_transaction_flag :'||px_txn_line_dtl_tbl(l_td_ind).source_transaction_flag);
4517         IF px_txn_line_dtl_tbl(l_td_ind).source_transaction_flag = 'Y' THEN
4518           l_instance_rec.instance_status_id := nvl(l_sub_type_rec.src_status_id, fnd_api.g_miss_num);
4519         ELSE
4520           l_instance_rec.instance_status_id := nvl(l_sub_type_rec.non_src_status_id, fnd_api.g_miss_num);
4521         END IF;
4522 
4523         debug('  processing record count for instance :-');
4524         debug('    instance_id         :'||l_instance_rec.instance_id);
4525         debug('    party_tbl           :'||l_party_tbl.count);
4526         debug('    party_acct_tbl      :'||l_party_acct_tbl.count);
4527         debug('    org_units_tbl       :'||l_org_units_tbl.count);
4528         debug('    eav_tbl             :'||l_eav_tbl.count);
4529         debug('    pricing_tbl         :'||l_pricing_tbl.count);
4530 
4531 
4532         -- do sub type specific validations
4533 
4534         sub_type_specific_vldns(
4535           p_source_flag          => px_txn_line_dtl_tbl(l_td_ind).source_transaction_flag,
4536           p_sub_type_rec         => l_sub_type_rec,
4537           p_instance_rec         => l_instance_rec,
4538           p_party_tbl            => l_party_tbl,
4539           p_party_acct_tbl       => l_party_acct_tbl,
4540           p_eav_tbl              => l_eav_tbl,
4541           p_org_units_tbl        => l_org_units_tbl,
4542           p_pricing_tbl          => l_pricing_tbl,
4543           x_return_status        => l_return_status);
4544 
4545         IF l_return_status <> fnd_api.g_ret_sts_success THEN
4546           RAISE fnd_api.g_exc_error;
4547         END IF;
4548 
4549         IF nvl(l_instance_rec.instance_id, fnd_api.g_miss_num) = fnd_api.g_miss_num THEN
4550           l_create_flag := TRUE;
4551         END IF;
4552 
4553         IF l_create_flag THEN
4554           -- check if the instance created is in replacement for a non source ref
4555              -- then disable the new contracts call
4556           -- build create_instance
4557           l_c_instance_rec    := l_instance_rec;
4558           l_c_party_tbl       := l_party_tbl;
4559           l_c_party_acct_tbl  := l_party_acct_tbl;
4560           l_c_org_units_tbl   := l_org_units_tbl;
4561           l_c_eav_tbl         := l_eav_tbl;
4562           l_c_pricing_tbl     := l_pricing_tbl;
4563 
4564           csi_t_gen_utility_pvt.dump_csi_instance_rec(l_c_instance_rec);
4565 
4566           IF csi_t_gen_utility_pvt.g_debug_level >= 15 THEN
4567             csi_t_gen_utility_pvt.dump_csi_party_tbl(l_c_party_tbl);
4568             csi_t_gen_utility_pvt.dump_csi_account_tbl(l_c_party_acct_tbl);
4569             csi_t_gen_utility_pvt.dump_eav_tbl(l_c_eav_tbl);
4570           END IF;
4571 
4572           record_time('Start');
4573 
4574           csi_t_gen_utility_pvt.dump_api_info(
4575             p_pkg_name => 'csi_item_instance_pub',
4576             p_api_name => 'create_item_instance');
4577 
4578           csi_item_instance_pub.create_item_instance(
4579             p_api_version           => 1.0,
4580             p_commit                => fnd_api.g_false,
4581             p_init_msg_list         => fnd_api.g_true,
4582             p_validation_level      => fnd_api.g_valid_level_full,
4583             p_txn_rec               => l_csi_txn_rec,
4584             p_instance_rec          => l_c_instance_rec,
4585             p_party_tbl             => l_c_party_tbl,
4586             p_account_tbl           => l_c_party_acct_tbl,
4587             p_org_assignments_tbl   => l_c_org_units_tbl,
4588             p_ext_attrib_values_tbl => l_c_eav_tbl,
4589             p_pricing_attrib_tbl    => l_c_pricing_tbl,
4590             p_asset_assignment_tbl  => l_c_inst_asset_tbl,
4591             x_return_status         => l_return_status,
4592             x_msg_count             => l_msg_count,
4593             x_msg_data              => l_msg_data  );
4594 
4595           -- For Bug 4057183
4596           -- IF l_return_status <> fnd_api.g_ret_sts_success THEN
4597           IF l_return_status not in (fnd_api.g_ret_sts_success,'W') THEN
4598             raise fnd_api.g_exc_error;
4599           END IF;
4600 
4601           record_time('End');
4602 
4603           px_txn_line_dtl_tbl(l_td_ind).instance_id := l_c_instance_rec.instance_id;
4604 
4605           debug('Customer Product ID : '||l_c_instance_rec.instance_id);
4606 
4607           /* Setting values for Explode BOM in CREATE */
4608 
4609           IF l_c_instance_rec.quantity = 1 THEN
4610             l_bom_std_item_rec.instance_id         := l_c_instance_rec.instance_id ;
4611             l_bom_std_item_rec.inventory_item_id   := px_txn_line_dtl_tbl(l_td_ind).inventory_item_id ;
4612             l_bom_std_item_rec.vld_organization_id := px_txn_line_dtl_tbl(l_td_ind).inv_organization_id ;
4613             l_bom_std_item_rec.quantity            := 1;
4614           END IF;
4615 
4616           -- check auto split profile and split
4617         ELSE -- instance id reference is specified
4618 
4619           --validate and derive ids
4620 
4621           validate_and_derive_ids(
4622             px_instance_rec        => l_instance_rec,
4623             px_party_tbl           => l_party_tbl,
4624             px_party_acct_tbl      => l_party_acct_tbl,
4625             px_org_units_tbl       => l_org_units_tbl,
4626             px_eav_tbl             => l_eav_tbl,
4627             px_pricing_tbl         => l_pricing_tbl,
4628             x_return_status        => l_return_status);
4629 
4630           IF l_return_status <> fnd_api.g_ret_sts_success THEN
4631             RAISE fnd_api.g_exc_error;
4632           END IF;
4633 
4634           -- validations based on the baseline rev num ##
4635 
4636           -- TSO with equipment
4637           -- For Tangible item, since DISCONNECT is the only possible operation, we need to remove the config keys.
4638           -- Hence nullifying them.
4639           --
4640           IF l_instance_rec.serial_number IS NOT NULL AND
4641              l_instance_rec.serial_number <> FND_API.G_MISS_CHAR THEN
4642              l_instance_rec.config_inst_hdr_id := NULL;
4643              l_instance_rec.config_inst_rev_num := NULL;
4644              l_instance_rec.config_inst_item_id := NULL;
4645           END IF;
4646           l_u_instance_rec    := l_instance_rec;
4647           l_u_party_tbl       := l_party_tbl;
4648           l_u_party_acct_tbl  := l_party_acct_tbl;
4649           l_u_org_units_tbl   := l_org_units_tbl;
4650           l_u_eav_tbl         := l_eav_tbl;
4651           l_u_pricing_tbl     := l_pricing_tbl;
4652 
4653           csi_t_gen_utility_pvt.dump_csi_instance_rec(l_u_instance_rec);
4654           csi_t_gen_utility_pvt.dump_csi_party_tbl(l_u_party_tbl);
4655           csi_t_gen_utility_pvt.dump_csi_account_tbl(l_u_party_acct_tbl);
4656           csi_t_gen_utility_pvt.dump_eav_tbl(l_u_eav_tbl);
4657 
4658 
4659           IF nvl(l_u_instance_rec.active_end_date, fnd_api.g_miss_date) <> fnd_api.g_miss_date
4660           THEN
4661             l_u_instance_rec.active_end_date := l_csi_txn_rec.source_transaction_date;
4662           END IF;
4663 
4664 					-- Start adding code for FP of bug 6755897 - Reconcilation changes
4665  	        BEGIN
4666  	          SELECT 'N'
4667  	          INTO l_item_instance_expired
4668  	          FROM csi_item_instances
4669  	          WHERE instance_id = l_u_instance_rec.instance_id
4670  	          AND ((active_end_date IS NULL) OR (active_end_date >= SYSDATE));
4671  	        EXCEPTION
4672  	          WHEN NO_DATA_FOUND THEN
4673  	            l_item_instance_expired := 'Y';
4674  	        END;
4675 
4676  	        IF l_item_instance_expired = 'Y' AND
4677  	          (nvl(l_u_instance_rec.active_end_date, fnd_api.g_miss_date) <> fnd_api.g_miss_date) THEN
4678  	          debug('Item instance ('||l_u_instance_rec.instance_id||') already expired, no need to expire again.');
4679  	        ELSE
4680  	        -- End adding code for FP of bug 6755897 - Reconcilation changes
4681 						record_time('Start');
4682 
4683 	          csi_t_gen_utility_pvt.dump_api_info(
4684 	            p_pkg_name => 'csi_item_instance_pub',
4685 	            p_api_name => 'update_item_instance');
4686 
4687 	          csi_item_instance_pub.update_item_instance(
4688 	            p_api_version           => 1.0,
4689 	            p_commit                => fnd_api.g_false,
4690 	            p_init_msg_list         => fnd_api.g_true,
4691 	            p_validation_level      => fnd_api.g_valid_level_full,
4692 	            p_txn_rec               => l_csi_txn_rec,
4693 	            p_instance_rec          => l_u_instance_rec,
4694 	            p_party_tbl             => l_u_party_tbl,
4695 	            p_account_tbl           => l_u_party_acct_tbl,
4696 	            p_org_assignments_tbl   => l_u_org_units_tbl,
4697 	            p_ext_attrib_values_tbl => l_u_eav_tbl,
4698 	            p_pricing_attrib_tbl    => l_u_pricing_tbl,
4699 	            p_asset_assignment_tbl  => l_u_inst_asset_tbl,
4700 	            x_instance_id_lst       => l_u_inst_id_tbl,
4701 	            x_return_status         => l_return_status,
4702 	            x_msg_count             => l_msg_count,
4703 	            x_msg_data              => l_msg_data );
4704 
4705 	          record_time('End');
4706 
4707 	          -- For Bug 4057183
4708 	          -- IF l_return_status <> fnd_api.g_ret_sts_success THEN
4709 	          IF l_return_status not in (fnd_api.g_ret_sts_success,'W') THEN
4710 	            RAISE fnd_api.g_exc_error;
4711 	          END IF;
4712 					END IF; -- Added for FP of bug 6755897 - Reconcilation changes
4713 
4714           px_txn_line_dtl_tbl(l_td_ind).instance_id := l_u_instance_rec.instance_id;
4715 
4716           debug('Customer Product ID : '||l_u_instance_rec.instance_id);
4717 
4718           /* Setting values for Explode BOM in UPDATE */
4719 
4720           IF l_u_instance_rec.quantity = 1 THEN
4721             l_bom_std_item_rec.instance_id         := l_u_instance_rec.instance_id ;
4722             l_bom_std_item_rec.inventory_item_id   := px_txn_line_dtl_tbl(l_td_ind).inventory_item_id ;
4723             l_bom_std_item_rec.vld_organization_id := px_txn_line_dtl_tbl(l_td_ind).inv_organization_id ;
4724             l_bom_std_item_rec.quantity            := 1;
4725           END IF;
4726 
4727 
4728         END IF;
4729 
4730         /* Checking for BOM eligibility and Exploding */
4731         --
4732         -- srramakr check_standard_bom_pc will be called only for Project Contracts Shipments.
4733         -- For other transaction types we need to call Check_Standard_Bom routine.
4734         --
4735         IF l_csi_txn_rec.transaction_type_id = 326 THEN
4736 
4737            l_bom_explode_flag := check_standard_bom_pc(
4738                p_instance_id    =>  l_bom_std_item_rec.instance_id,
4739                p_std_item_rec   =>  l_bom_std_item_rec,
4740                p_bom_item_type  =>  l_item_attrib_rec.bom_item_type );
4741         ELSE
4742            l_bom_explode_flag := csi_item_instance_vld_pvt.Is_Config_Exploded
4743                                     (p_instance_id        =>  l_bom_std_item_rec.instance_id,
4744                                      p_stack_err_msg      =>  FALSE );
4745            --
4746            IF l_bom_explode_flag THEN -- Config Already Exploded. So set this to FALSE
4747               l_bom_explode_flag := FALSE;
4748            ELSE -- Not yet exploded. Check for eligibility
4749               l_csi_order_line_rec.header_id := p_source_header_rec.source_header_id;
4750               l_csi_order_line_rec.order_line_id := p_source_line_rec.source_line_id;
4751               l_csi_order_line_rec.inv_item_id := p_source_line_rec.inventory_item_id;
4752               l_csi_order_line_rec.inv_org_id := p_source_line_rec.organization_id;
4753               l_csi_order_line_rec.bom_item_type := l_item_attrib_rec.bom_item_type;
4754               l_csi_order_line_rec.item_type_code := p_source_line_rec.item_type_code;
4755               --
4756               l_bom_explode_flag := csi_utl_pkg.check_standard_bom
4757                                        (p_order_line_rec => l_csi_order_line_rec );
4758            END IF;
4759         END IF;
4760 
4761         IF l_bom_explode_flag THEN
4762 
4763          debug('This shipment from Project Contracts qualifies for BOM Explosion');
4764          debug('  instance_id :'||l_bom_std_item_rec.instance_id);
4765          debug('  inv_item_id :'||l_bom_std_item_rec.inventory_item_id);
4766          debug('  inv_org_id  :'||l_bom_std_item_rec.vld_organization_id);
4767          debug('  quantity    :'||l_bom_std_item_rec.quantity);
4768 
4769          record_time('Start');
4770 
4771          -- call the API for BOM Explosion
4772          csi_t_gen_utility_pvt.dump_api_info(
4773            p_pkg_name => 'csi_item_instance_pvt',
4774            p_api_name => 'explode_bom');
4775 
4776          csi_item_instance_pvt.explode_bom(
4777            p_api_version         => 1.0,
4778            p_commit              => fnd_api.g_false,
4779            p_init_msg_list       => fnd_api.g_true,
4780            p_validation_level    => fnd_api.g_valid_level_full,
4781            p_source_instance_rec => l_bom_std_item_rec,
4782            p_explosion_level     => fnd_api.g_miss_num,
4783            p_item_tbl            => l_comp_instance_tbl,
4784            p_item_relation_tbl   => l_comp_relation_tbl,
4785            p_create_instance     => fnd_api.g_true,
4786            p_txn_rec             => l_csi_txn_rec,
4787            x_return_status       => l_return_status,
4788            x_msg_count           => l_msg_count,
4789            x_msg_data            => l_msg_data);
4790 
4791          record_time('End');
4792 
4793          IF l_return_status <> fnd_api.g_ret_sts_success THEN
4794            debug('Failed csi_item_instance_pvt.explode_bom');
4795            RAISE fnd_api.g_exc_error;
4796          END IF;
4797 
4798          debug('  Trackable components       :'||l_comp_instance_tbl.count);
4799          debug('  Component-Of Relationships :'||l_comp_relation_tbl.count);
4800 
4801        END IF; -- End BOM Explosion
4802 
4803       END LOOP;
4804     END IF; -- px_txn_line_dtl_tbl.count > 0
4805 
4806     IF px_txn_ii_rltns_tbl.COUNT > 0 THEN
4807 
4808       build_relationship_tbl(
4809         p_txn_ii_rltns_tbl    => px_txn_ii_rltns_tbl,
4810         p_txn_line_dtl_tbl    => px_txn_line_dtl_tbl,
4811         x_c_ii_rltns_tbl      => l_c_ii_rltns_tbl,
4812         x_u_ii_rltns_tbl      => l_u_ii_rltns_tbl,
4813         x_return_status       => l_return_status);
4814 
4815       IF l_return_status <> fnd_api.g_ret_sts_success THEN
4816         RAISE fnd_api.g_exc_error;
4817       END IF;
4818     END IF; -- px_txn_ii_rltns_tbl.COUNT check
4819     --
4820     -- srramakr TSO with Equipment
4821     -- As a part of MACD flow if we fulfill a KIT(having config keys)i
4822     -- and ship the included items (not having config keys).
4823     -- We need to build the relationship between KIT and its included items. Since CZ would not have
4824     -- written relationships for these, we use the traditional get_ib_trackable children using the
4825     -- order line and finally get the item instances.
4826     --
4827     IF p_source_line_rec.item_type_code = 'KIT' AND
4828        l_bom_std_item_rec.instance_id IS NOT NULL AND -- Ensure that KIT Qty = 1
4829        l_bom_std_item_rec.instance_id <> FND_API.G_MISS_NUM THEN
4830        csi_order_fulfill_pub.get_ib_trackable_children
4831            ( p_current_line_id    => p_source_line_rec.source_line_id,
4832              p_om_vld_org_id      => om_vld_org_id,
4833              x_trackable_line_tbl => l_child_line_tbl,
4834              x_return_status      => l_return_status);
4835 
4836        IF l_return_status <> fnd_api.g_ret_sts_success THEN
4837           debug('Failed csi_order_fulfill_pub.get_ib_trackable_children');
4838           RAISE fnd_api.g_exc_error;
4839        END IF;
4840     END IF;
4841     --
4842     IF l_child_line_tbl.count > 0 THEN
4843        FOR l_ind in l_child_line_tbl.FIRST..l_child_line_tbl.LAST LOOP
4844    -- check if instance exists
4845    l_inst_query_rec.inventory_item_id     := l_child_line_tbl(l_ind).inventory_item_id;
4846    l_inst_query_rec.last_oe_order_line_id := l_child_line_tbl(l_ind).line_id;
4847 
4848    debug('query criteria for get_item_instances:');
4849    debug('  item id      : '||l_inst_query_rec.inventory_item_id);
4850    debug('  line id      : '||l_inst_query_rec.last_oe_order_line_id);
4851 
4852    csi_t_gen_utility_pvt.dump_api_info(
4853        p_api_name => 'get_item_instances',
4854        p_pkg_name => 'csi_item_instance_pub');
4855 
4856    csi_item_instance_pub.get_item_instances(
4857        p_api_version          => 1.0,
4858        p_commit               => fnd_api.g_false,
4859        p_init_msg_list        => fnd_api.g_true,
4860        p_validation_level     => fnd_api.g_valid_level_full,
4861        p_instance_query_rec   => l_inst_query_rec,
4862        p_party_query_rec      => l_party_query_rec,
4863        p_account_query_rec    => l_pty_acct_query_rec,
4864        p_transaction_id       => null,
4865        p_resolve_id_columns   => fnd_api.g_false,
4866        /* Modified the next line for bug 4865052*/
4867 	   p_active_instance_only => fnd_api.g_false,
4868        x_instance_header_tbl  => l_instance_hdr_tbl,
4869        x_return_status        => l_return_status,
4870        x_msg_count            => l_msg_count,
4871        x_msg_data             => l_msg_data);
4872 
4873    IF l_return_status <> fnd_api.g_ret_sts_success THEN
4874       RAISE fnd_api.g_exc_error;
4875    END IF;
4876           --
4877           IF l_instance_hdr_tbl.count > 0 THEN
4878              FOR inst_hdr IN l_instance_hdr_tbl.FIRST .. l_instance_hdr_tbl.LAST LOOP
4879                 IF l_instance_hdr_tbl.EXISTS(inst_hdr) THEN
4880                    l_rel_ctr := l_c_ii_rltns_tbl.COUNT + 1;
4881                    l_c_ii_rltns_tbl(l_rel_ctr).subject_id := l_instance_hdr_tbl(inst_hdr).instance_id;
4882                    l_c_ii_rltns_tbl(l_rel_ctr).object_id := l_bom_std_item_rec.instance_id;
4883                    l_c_ii_rltns_tbl(l_rel_ctr).relationship_type_code := 'COMPONENT-OF';
4884                 END IF;
4885              END LOOP;
4886           END IF;
4887        END LOOP;
4888     END IF; -- l_child_line_tbl.count check
4889     --
4890     IF l_c_ii_rltns_tbl.COUNT > 0 THEN
4891 
4892        record_time('Start');
4893        csi_t_gen_utility_pvt.dump_api_info(
4894           p_pkg_name => 'csi_ii_relationships_pub',
4895           p_api_name => 'create_relationship');
4896 
4897        -- create relationship
4898        csi_ii_relationships_pub.create_relationship(
4899           p_api_version      => 1.0,
4900           p_commit           => fnd_api.g_false,
4901           p_init_msg_list    => fnd_api.g_true,
4902           p_validation_level => fnd_api.g_valid_level_full,
4903           p_relationship_tbl => l_c_ii_rltns_tbl,
4904           p_txn_rec          => l_csi_txn_rec,
4905           x_return_status    => l_return_status,
4906           x_msg_count        => l_msg_count,
4907           x_msg_data         => l_msg_data);
4908 
4909        IF l_return_status <> fnd_api.g_ret_sts_success THEN
4910           RAISE fnd_api.g_exc_error;
4911        END IF;
4912        record_time('End');
4913 
4914        FOR l_ind IN l_c_ii_rltns_tbl.FIRST .. l_c_ii_rltns_tbl.LAST
4915        LOOP
4916 
4917           debug('  '||l_c_ii_rltns_tbl(l_ind).subject_id ||' '||
4918                  l_c_ii_rltns_tbl(l_ind).relationship_type_code||' '||
4919                  l_c_ii_rltns_tbl(l_ind).object_id);
4920 
4921           IF l_c_ii_rltns_tbl(l_ind).relationship_type_code
4922              IN ('REPLACED-BY', 'REPLACEMENT-FOR', 'UPGRADED-FROM') THEN
4923             -- make call to swap the contracts
4924             null;
4925           END IF;
4926 
4927        END LOOP;
4928     END IF; -- l_c_ii_rltns_tbl.count check
4929 
4930     -- switch the processing status in transaction detail to PROCESSED
4931     update_td_status(
4932       p_txn_line_rec      => px_txn_line_rec,
4933       p_txn_line_dtl_tbl  => px_txn_line_dtl_tbl,
4934       p_processing_status => 'PROCESSED',
4935       x_return_status     => l_return_status);
4936 
4937     IF l_return_status <> fnd_api.g_ret_sts_success THEN
4938       RAISE fnd_api.g_exc_error;
4939     END IF;
4940 
4941     debug('Transaction details interfaced to IB successfully.');
4942 
4943   EXCEPTION
4944 
4945     WHEN fnd_api.g_exc_error THEN
4946       x_return_status  := fnd_api.g_ret_sts_error ;
4947       x_return_message := csi_t_gen_utility_pvt.dump_error_stack;
4948       debug('Error in Interface_IB: '||x_return_message);
4949     WHEN others THEN
4950 
4951       fnd_message.set_name('FND', 'FND_GENERIC_MESSAGE');
4952       fnd_message.set_token('MESSAGE', substr(sqlerrm, 1, 240));
4953       fnd_msg_pub.add;
4954 
4955       x_return_status  := fnd_api.g_ret_sts_unexp_error ;
4956       x_return_message := csi_t_gen_utility_pvt.dump_error_stack;
4957       debug('Error in Interface_IB: '||x_return_message);
4958 
4959   END interface_ib;
4960 
4961   --
4962   --
4963   --
4964   FUNCTION check_MACD_processing(
4965     p_config_session_key      IN csi_utility_grp.config_session_key,
4966     x_return_status           OUT NOCOPY varchar2)
4967   RETURN boolean
4968   IS
4969 
4970     l_td_found                varchar2(1) := 'N';
4971     l_configurator_enabled    varchar2(80) := null;
4972     l_mdl_instantiation_type  varchar2(1);
4973 
4974     l_MACD_processing         boolean := TRUE;
4975 
4976   BEGIN
4977 
4978     x_return_status := fnd_api.g_ret_sts_success;
4979 
4980     IF p_config_session_key.session_hdr_id  is not null
4981          AND
4982        p_config_session_key.session_rev_num is not null
4983          AND
4984        p_config_session_key.session_item_id is not null
4985     THEN
4986 
4987       l_configurator_enabled := fnd_profile.value('CSI_CONFIGURATOR_ENABLED');
4988 
4989       -- check for config txn details
4990       BEGIN
4991         SELECT 'Y' INTO l_td_found
4992         FROM   csi_t_transaction_lines
4993         WHERE  source_transaction_table = 'CONFIGURATOR'
4994         AND    config_session_hdr_id    = p_config_session_key.session_hdr_id
4995         AND    config_session_rev_num   = p_config_session_key.session_rev_num
4996         AND    config_session_item_id   = p_config_session_key.session_item_id;
4997       EXCEPTION
4998         WHEN no_data_found THEN
4999           l_td_found := 'N';
5000       END;
5001 
5002 
5003       IF l_td_found = 'Y' THEN
5004         -- check for the profile CSI_CONFIGURATOR_ENABLED
5005         IF l_configurator_enabled = 'NETWORK' THEN
5006 
5007           -- make sure the item is network model otherwise do the
5008           SELECT model_instantiation_type
5009           INTO   l_mdl_instantiation_type
5010           FROM   cz_config_items_v
5011           WHERE  config_hdr_id  = p_config_session_key.session_hdr_id
5012           AND    config_rev_nbr = p_config_session_key.session_rev_num
5013           AND    config_item_id = p_config_session_key.session_item_id;
5014 
5015           IF l_mdl_instantiation_type <> 'N' THEN
5016             -- regular processing
5017             l_MACD_processing := FALSE;
5018           END IF;
5019         ELSIF l_configurator_enabled = 'ALWAYS' THEN
5020           null;
5021         ELSIF nvl(l_configurator_enabled, 'NEVER') = 'NEVER' THEN
5022           l_MACD_processing := FALSE;
5023         END IF;
5024 
5025       ELSE
5026         l_MACD_processing := FALSE;
5027       END IF;
5028 
5029     ELSE
5030       l_MACD_processing := FALSE;
5031     END IF;
5032 
5033     RETURN l_MACD_processing;
5034 
5035   EXCEPTION
5036     WHEN fnd_api.g_exc_error THEN
5037       x_return_status := fnd_api.g_ret_sts_error;
5038   END check_MACD_processing;
5039 
5040   --
5041   --
5042   --
5043   /* This function specifies whether the instance qualifies for BOM Explosion or not */
5044 
5045   FUNCTION check_standard_bom_pc(
5046     p_instance_id   IN NUMBER,
5047     p_std_item_rec  IN csi_datastructures_pub.instance_rec,
5048     p_bom_item_type IN NUMBER)
5049   RETURN boolean
5050   IS
5051 
5052     l_bom_found    VARCHAR2(1);
5053     l_explode_flag VARCHAR2(1);
5054     l_found_child  VARCHAR2(1);
5055     no_explosion   EXCEPTION;
5056 
5057   BEGIN
5058 
5059     debug('check_standard_bom for Project Contracts');
5060 
5061     /* look at the explode_yes_no profile AND go FROM there */
5062 
5063     l_explode_flag := nvl(fnd_profile.value('CSI_EXPLODE_BOM'),'N');
5064     debug('Explode BOM Profile Option :'||l_explode_flag);
5065 
5066     IF l_explode_flag <> 'Y' THEN
5067        debug('Explode BOM Profile option is not set. ');
5068        RAISE no_explosion;
5069     END IF;
5070 
5071     /* check if this item is a standard item */
5072 
5073     IF p_bom_item_type <> 4  THEN
5074        debug('This inventory item is not a STANDARD item, so no explosion');
5075        RAISE no_explosion;
5076     END IF;
5077 
5078     /* check if BOM exists */
5079 
5080     BEGIN
5081       SELECT 'Y'
5082       INTO   l_bom_found
5083       FROM   bom_bill_of_materials
5084       WHERE  assembly_item_id = p_std_item_rec.inventory_item_id
5085       AND    organization_id  = p_std_item_rec.vld_organization_id
5086       AND    alternate_bom_designator is NULL;   -- added for bug 2443204. Checking only primary bom when multiple could have been defined.
5087 
5088     EXCEPTION
5089       WHEN no_data_found THEN
5090         debug('BOM not found. So, no explosion');
5091         RAISE no_explosion;
5092     END;
5093 
5094     /* logic to check if this instance already has any children */
5095 
5096     BEGIN
5097       SELECT 'Y'
5098       INTO   l_found_child
5099       FROM   csi_ii_relationships
5100       WHERE  object_id = p_instance_id
5101       AND    relationship_type_code = 'COMPONENT-OF';
5102 
5103       debug(' This instance already has a child with COMPONENT-OF relation.');
5104       RAISE no_explosion;
5105 
5106     EXCEPTION
5107       WHEN no_data_found THEN
5108         l_found_child := 'N';
5109       WHEN others THEN
5110         debug(' This instance already has children with COMPONENT-OF relation.');
5111         RAISE no_explosion;
5112     END;
5113 
5114     RETURN TRUE;
5115 
5116   EXCEPTION
5117     WHEN no_explosion THEN
5118       RETURN FALSE;
5119     WHEN fnd_api.g_exc_error THEN
5120       RETURN FALSE;
5121 
5122   END check_standard_bom_pc;
5123 
5124 
5125   PROCEDURE get_mtl_txn_tbl(
5126     p_mtl_txn_id    IN  number,
5127     x_mtl_txn_tbl   OUT NOCOPY mtl_txn_tbl,
5128     x_return_status OUT NOCOPY varchar2)
5129   IS
5130 
5131     l_mtl_rec       mtl_txn_rec;
5132     l_mtl_tbl       mtl_txn_tbl;
5133 
5134     CURSOR mtl_txn_cur(p_txn_id IN NUMBER) IS
5135       SELECT mmt.trx_source_line_id         trx_source_line_id,
5136              mmt.inventory_item_id          inventory_item_id,
5137              mmt.organization_id            organization_id,
5138              mmt.revision                   revision,
5139              mmt.subinventory_code          subinventory_code,
5140              mmt.locator_id                 locator_id,
5141              null                           lot_number,
5142              mut.serial_number              serial_number,
5143              abs(mmt.transaction_quantity)  transaction_quantity,
5144              mmt.transaction_uom            transaction_uom,
5145              mmt.transaction_date           transaction_date,
5146              msi.lot_control_code           lot_control_code,
5147              msi.serial_number_control_code serial_control_code,
5148              msi.primary_uom_code           primary_uom,
5149              abs(mmt.primary_quantity)      primary_quantity,
5150              mmt.transaction_type_id        transaction_type_id,
5151              mmt.transaction_action_id      transaction_action_id
5152       FROM   mtl_system_items               msi,
5153              mtl_unit_transactions          mut,
5154              mtl_material_transactions      mmt
5155       WHERE  mmt.transaction_id       = p_txn_id
5156       AND    mmt.transaction_id       = mut.transaction_id(+)
5157       AND    msi.organization_id      = mmt.organization_id
5158       AND    msi.inventory_item_id    = mmt.inventory_item_id
5159       AND    msi.lot_control_code     = 1   -- no lot case
5160       UNION
5161       SELECT mmt.trx_source_line_id         trx_source_line_id,
5162              mmt.inventory_item_id          inventory_item_id,
5163              mmt.organization_id            organization_id,
5164              mmt.revision                   revision,
5165              mmt.subinventory_code          subinventory_code,
5166              mmt.locator_id                 locator_id,
5167              mtln.lot_number                lot_number,
5168              mut.serial_number              serial_number,
5169              abs(mtln.transaction_quantity) transaction_quantity,
5170              mmt.transaction_uom            transaction_uom,
5171              mmt.transaction_date           transaction_date,
5172              msi.lot_control_code           lot_control_code,
5173              msi.serial_number_control_code serial_control_code,
5174              msi.primary_uom_code           primary_uom,
5175              abs(mtln.primary_quantity)     primary_quantity,
5176              mmt.transaction_type_id        transaction_type_id,
5177              mmt.transaction_action_id      transaction_action_id
5178       FROM   mtl_system_items               msi,
5179              mtl_unit_transactions          mut,
5180              mtl_transaction_lot_numbers    mtln,
5181              mtl_material_transactions      mmt
5182       WHERE  mmt.transaction_id         = p_txn_id
5183       AND    mmt.transaction_id         = mtln.transaction_id(+)
5184       AND    mtln.serial_transaction_id = mut.transaction_id(+)
5185       AND    msi.organization_id        = mmt.organization_id
5186       AND    msi.inventory_item_id      = mmt.inventory_item_id
5187       AND    msi.lot_control_code       = 2;   -- lot control case
5188   BEGIN
5189 
5190     x_return_status := fnd_api.g_ret_sts_success;
5191 
5192     FOR mtl_txn_rec IN mtl_txn_cur(p_mtl_txn_id)
5193     LOOP
5194 
5195       l_mtl_rec.trx_source_line_id    := mtl_txn_rec.trx_source_line_id;
5196       l_mtl_rec.inventory_item_id     := mtl_txn_rec.inventory_item_id;
5197       l_mtl_rec.organization_id       := mtl_txn_rec.organization_id;
5198       l_mtl_rec.revision              := nvl(mtl_txn_rec.revision,fnd_api.g_miss_char);
5199       l_mtl_rec.subinventory_code     := mtl_txn_rec.subinventory_code;
5200       l_mtl_rec.locator_id            := mtl_txn_rec.locator_id;
5201       l_mtl_rec.lot_number            := nvl(mtl_txn_rec.lot_number,fnd_api.g_miss_char);
5202       l_mtl_rec.serial_number         := nvl(mtl_txn_rec.serial_number,fnd_api.g_miss_char);
5203       l_mtl_rec.transaction_quantity  := mtl_txn_rec.transaction_quantity;
5204       l_mtl_rec.transaction_uom       := mtl_txn_rec.transaction_uom;
5205       l_mtl_rec.transaction_date      := mtl_txn_rec.transaction_date;
5206       l_mtl_rec.lot_control_code      := mtl_txn_rec.lot_control_code;
5207       l_mtl_rec.serial_control_code   := mtl_txn_rec.serial_control_code;
5208       l_mtl_rec.primary_uom           := mtl_txn_rec.primary_uom;
5209       l_mtl_rec.primary_quantity      := mtl_txn_rec.primary_quantity;
5210       l_mtl_rec.transaction_type_id   := mtl_txn_rec.transaction_type_id;
5211       l_mtl_rec.transaction_action_id := mtl_txn_rec.transaction_action_id;
5212 
5213       l_mtl_tbl(mtl_txn_cur%rowcount) := l_mtl_rec;
5214 
5215     END LOOP;
5216 
5217     x_mtl_txn_tbl := l_mtl_tbl;
5218 
5219   EXCEPTION
5220     WHEN fnd_api.g_exc_error THEN
5221       x_return_status := fnd_api.g_ret_sts_error;
5222   END get_mtl_txn_tbl;
5223 
5224   PROCEDURE get_inventory_instances(
5225     p_item_attrib_rec IN     item_attributes_rec,
5226     px_mtl_txn_tbl    IN OUT NOCOPY mtl_txn_tbl,
5227     x_return_status      OUT NOCOPY varchar2)
5228   IS
5229 
5230     l_mtl_tbl               mtl_txn_tbl;
5231 
5232     l_inst_query_rec        csi_datastructures_pub.instance_query_rec;
5233     l_party_query_rec       csi_datastructures_pub.party_query_rec;
5234     l_pty_acct_query_rec    csi_datastructures_pub.party_account_query_rec;
5235     l_inst_hdr_tbl          csi_datastructures_pub.instance_header_tbl;
5236 
5237     l_return_status         varchar2(1) := fnd_api.g_ret_sts_success;
5238     l_msg_count             number;
5239     l_msg_data              varchar2(2000);
5240 
5241   BEGIN
5242 
5243     x_return_status := fnd_api.g_ret_sts_success;
5244 
5245     api_log('get_inventory_instances');
5246 
5247     l_mtl_tbl := px_mtl_txn_tbl;
5248 
5249     IF l_mtl_tbl.COUNT > 0 THEN
5250       FOR l_ind IN l_mtl_tbl.FIRST .. l_mtl_tbl.LAST
5251       LOOP
5252 
5253         l_inst_query_rec.location_type_code    := 'INVENTORY';
5254         l_inst_query_rec.instance_usage_code   := 'IN_INVENTORY';
5255 
5256         l_inst_query_rec.inventory_item_id     := l_mtl_tbl(l_ind).inventory_item_id;
5257         l_inst_query_rec.inv_organization_id   := l_mtl_tbl(l_ind).organization_id;
5258         l_inst_query_rec.inv_subinventory_name := l_mtl_tbl(l_ind).subinventory_code;
5259         l_inst_query_rec.inv_locator_id        := l_mtl_tbl(l_ind).locator_id;
5260         l_inst_query_rec.serial_number         := l_mtl_tbl(l_ind).serial_number;
5261         l_inst_query_rec.lot_number            := l_mtl_tbl(l_ind).lot_number;
5262 
5263         IF p_item_attrib_rec.serial_control_code = 6 THEN
5264 
5265           l_inst_query_rec.serial_number := null;
5266 
5267           IF l_ind > 1 THEN
5268 
5269             l_mtl_tbl(l_ind).instance_id            := l_mtl_tbl(1).instance_id;
5270             l_mtl_tbl(l_ind).object_version_num     := l_mtl_tbl(1).object_version_num;
5271             l_mtl_tbl(l_ind).negative_instance_flag := l_mtl_tbl(1).negative_instance_flag;
5272 
5273             goto skip_gii;
5274           END IF;
5275 
5276         END IF;
5277 
5278         csi_t_gen_utility_pvt.dump_instance_query_rec(
5279           p_instance_query_rec => l_inst_query_rec);
5280 
5281         csi_t_gen_utility_pvt.dump_api_info(
5282           p_pkg_name => 'csi_item_instance_pub',
5283           p_api_name => 'get_item_instances');
5284 
5285         csi_item_instance_pub.get_item_instances(
5286           p_api_version          => 1.0,
5287           p_commit               => fnd_api.g_false,
5288           p_init_msg_list        => fnd_api.g_true,
5289           p_validation_level     => fnd_api.g_valid_level_full,
5290           p_instance_query_rec   => l_inst_query_rec,
5291           p_party_query_rec      => l_party_query_rec,
5292           p_account_query_rec    => l_pty_acct_query_rec,
5293           p_transaction_id       => null,
5294           p_resolve_id_columns   => fnd_api.g_false,
5295           p_active_instance_only => fnd_api.g_false,
5296           x_instance_header_tbl  => l_inst_hdr_tbl,
5297           x_return_status        => l_return_status,
5298           x_msg_count            => l_msg_count,
5299           x_msg_data             => l_msg_data);
5300 
5301         IF l_return_status <> fnd_api.g_ret_sts_success THEN
5302           RAISE fnd_api.g_exc_error;
5303         END IF;
5304 
5305         IF l_inst_hdr_tbl.count = 0 THEN
5306 
5307           IF p_item_attrib_rec.serial_control_code IN (1, 6)
5308              AND
5309              p_item_attrib_rec.negative_balances_code = 1
5310           THEN
5311             debug('non serial and negative balances allowed.');
5312             l_mtl_tbl(l_ind).negative_instance_flag := 'Y';
5313             l_mtl_tbl(l_ind).instance_id            := null;
5314             l_mtl_tbl(l_ind).object_version_num     := null;
5315           ELSE
5316             fnd_message.set_name('CSI','CSI_INT_INV_INST_NOT_FOUND');
5317             fnd_message.set_token('INV_ITEM_ID',l_mtl_tbl(l_ind).inventory_item_id);
5318             fnd_message.set_token('INV_ORG_ID', l_mtl_tbl(l_ind).organization_id);
5319             fnd_message.set_token('SUBINV',     l_mtl_tbl(l_ind).subinventory_code);
5320             fnd_message.set_token('LOCATOR',    l_mtl_tbl(l_ind).locator_id);
5321             fnd_msg_pub.add;
5322             RAISE fnd_api.g_exc_error;
5323           END IF;
5324         ELSE
5325           IF l_inst_hdr_tbl.count = 1 THEN
5326             l_mtl_tbl(l_ind).instance_id        := l_inst_hdr_tbl(1).instance_id;
5327             l_mtl_tbl(l_ind).object_version_num := l_inst_hdr_tbl(1).object_version_number;
5328             debug('  instance_id       : '||l_mtl_tbl(l_ind).instance_id);
5329             debug('  instance_ovn      : '||l_mtl_tbl(l_ind).object_version_num);
5330           ELSE
5331             fnd_message.set_name('CSI','CSI_TXN_MULT_INST_FOUND');
5332             fnd_message.set_token('INV_ITEM_ID',l_mtl_tbl(l_ind).inventory_item_id);
5333             fnd_message.set_token('INV_ORG_ID', l_mtl_tbl(l_ind).organization_id);
5334             fnd_message.set_token('SUBINV',     l_mtl_tbl(l_ind).subinventory_code);
5335             fnd_message.set_token('LOCATOR',    l_mtl_tbl(l_ind).locator_id);
5336             fnd_msg_pub.add;
5337             RAISE fnd_api.g_exc_error;
5338           END IF;
5339         END IF;
5340 
5341         <<skip_gii>>
5342         null;
5343 
5344       END LOOP;
5345     END IF;
5346 
5347     px_mtl_txn_tbl := l_mtl_tbl;
5348 
5349   EXCEPTION
5350     WHEN fnd_api.g_exc_error THEN
5351       x_return_status := fnd_api.g_ret_sts_error;
5352   END get_inventory_instances;
5353 
5354   PROCEDURE pre_process_mtl_txn_tbl(
5355     p_item_attrib_rec IN     item_attributes_rec,
5356     px_mtl_txn_tbl    IN OUT NOCOPY mtl_txn_tbl,
5357     x_return_status      OUT NOCOPY varchar2)
5358   IS
5359     l_src_serial_flag        varchar2(1);
5360     l_dest_serial_flag       varchar2(1);
5361     l_create_update_flag     varchar2(1);
5362   BEGIN
5363 
5364     x_return_status := fnd_api.g_ret_sts_success;
5365     api_log('pre_process_mtl_txn_tbl');
5366 
5367     IF p_item_attrib_rec.serial_control_code in (2,5) THEN
5368       l_src_serial_flag  := 'Y';
5369       l_dest_serial_flag := 'Y';
5370     ELSE
5371       l_src_serial_flag := 'N';
5372       IF p_item_attrib_rec.serial_control_code = 6 THEN
5373         l_dest_serial_flag := 'Y';
5374       ELSE
5375         l_dest_serial_flag := 'N';
5376       END IF;
5377     END IF;
5378 
5379     IF l_src_serial_flag = 'Y' AND l_dest_serial_flag = 'Y' THEN
5380       l_create_update_flag := 'U';
5381     ELSE
5382       l_create_update_flag := 'C';
5383     END IF;
5384 
5385     IF px_mtl_txn_tbl.count > 0 THEN
5386       FOR l_ind IN px_mtl_txn_tbl.FIRST .. px_mtl_txn_tbl.LAST
5387       LOOP
5388         px_mtl_txn_tbl(l_ind).src_serial_flag    := l_src_serial_flag;
5389         px_mtl_txn_tbl(l_ind).dest_serial_flag   := l_dest_serial_flag;
5390         px_mtl_txn_tbl(l_ind).create_update_flag := l_create_update_flag;
5391       END LOOP;
5392     END IF;
5393 
5394   EXCEPTION
5395     WHEN fnd_api.g_exc_error THEN
5396       x_return_status := fnd_api.g_ret_sts_error;
5397   END pre_process_mtl_txn_tbl;
5398 
5399 
5400   PROCEDURE get_dflt_inv_location(
5401     p_subinventory_code IN  varchar2,
5402     p_organization_id   IN  number,
5403     x_location_id       OUT NOCOPY number,
5404     x_return_status     OUT NOCOPY varchar2)
5405   IS
5406     l_location_id  number;
5407   BEGIN
5408 
5409     BEGIN
5410       SELECT location_id
5411       INTO   l_location_id
5412       FROM   mtl_secondary_inventories
5413       WHERE  organization_id = p_organization_id
5414       AND    secondary_inventory_name = p_subinventory_code;
5415     EXCEPTION
5416       WHEN no_data_found THEN
5417         fnd_message.set_name('CSI','CSI_INT_DEST_SUBINV_INVALID');
5418         fnd_message.set_token('INV_ORG_ID',p_organization_id);
5419         fnd_message.set_token('SUBINV_ID',p_subinventory_code);
5420         fnd_msg_pub.add;
5421         RAISE fnd_api.g_exc_error;
5422     END;
5423 
5424     IF l_location_id is null THEN
5425       BEGIN
5426         SELECT location_id
5427         INTO   l_location_id
5428         FROM   hr_organization_units
5429         WHERE  organization_id = p_organization_id;
5430       EXCEPTION
5431         WHEN no_data_found THEN
5432           fnd_message.set_name('CSI','CSI_INT_DEST_ORG_ID_INVALID');
5433           fnd_message.set_token('INV_ORG_ID',p_organization_id);
5434           fnd_msg_pub.add;
5435           RAISE fnd_api.g_exc_error;
5436       END;
5437     END IF;
5438 
5439     x_location_id := l_location_id;
5440 
5441   EXCEPTION
5442     WHEN fnd_api.g_exc_error THEN
5443       x_return_status := fnd_api.g_ret_sts_error;
5444   END get_dflt_inv_location;
5445 
5446   PROCEDURE create_inv_negative_instance(
5447     px_mtl_txn_rec   IN OUT NOCOPY mtl_txn_rec,
5448     p_quantity       IN     number,
5449     px_txn_rec       IN OUT NOCOPY csi_datastructures_pub.transaction_rec,
5450     x_return_status     OUT NOCOPY varchar2)
5451   IS
5452     l_instance_rec      csi_datastructures_pub.instance_rec;
5453     l_parties_tbl       csi_datastructures_pub.party_tbl;
5454     l_pty_accts_tbl     csi_datastructures_pub.party_account_tbl;
5455     l_org_units_tbl     csi_datastructures_pub.organization_units_tbl;
5456     l_ea_values_tbl     csi_datastructures_pub.extend_attrib_values_tbl;
5457     l_pricing_tbl       csi_datastructures_pub.pricing_attribs_tbl;
5458     l_assets_tbl        csi_datastructures_pub.instance_asset_tbl;
5459 
5460     l_internal_party_id number;
5461 
5462     l_return_status     varchar2(1) := fnd_api.g_ret_sts_success;
5463     l_msg_count         number;
5464     l_msg_data          varchar2(2000);
5465 
5466   BEGIN
5467 
5468     x_return_status := fnd_api.g_ret_sts_success;
5469 
5470     api_log('create_inv_negative_instance');
5471 
5472     l_internal_party_id := csi_datastructures_pub.g_install_param_rec.internal_party_id;
5473 
5474     l_instance_rec.inventory_item_id      := px_mtl_txn_rec.inventory_item_id;
5475     l_instance_rec.inventory_revision     := px_mtl_txn_rec.revision;
5476     l_instance_rec.inv_subinventory_name  := px_mtl_txn_rec.subinventory_code;
5477     -- this is always a non serial instance
5478     l_instance_rec.serial_number          := fnd_api.g_miss_char;
5479     l_instance_rec.lot_number             := px_mtl_txn_rec.lot_number;
5480     l_instance_rec.quantity               := p_quantity;
5481     l_instance_rec.active_start_date      := sysdate;
5482     l_instance_rec.active_end_date        := null;
5483     l_instance_rec.unit_of_measure        := px_mtl_txn_rec.primary_uom;
5484     l_instance_rec.location_type_code     := 'INVENTORY';
5485     get_dflt_inv_location(
5486       p_subinventory_code => px_mtl_txn_rec.subinventory_code,
5487       p_organization_id   => px_mtl_txn_rec.organization_id,
5488       x_location_id       => l_instance_rec.location_id,
5489       x_return_status     => l_return_status);
5490     l_instance_rec.instance_usage_code    := 'IN_INVENTORY';
5491     l_instance_rec.inv_organization_id    := px_mtl_txn_rec.organization_id;
5492     l_instance_rec.vld_organization_id    := px_mtl_txn_rec.organization_id;
5493     l_instance_rec.inv_locator_id         := px_mtl_txn_rec.locator_id;
5494     l_instance_rec.customer_view_flag     := 'N';
5495     l_instance_rec.merchant_view_flag     := 'Y';
5496     l_instance_rec.object_version_number  := 1;
5497 
5498     l_parties_tbl(1).party_source_table    := 'HZ_PARTIES';
5499     l_parties_tbl(1).party_id              := l_internal_party_id;
5500     l_parties_tbl(1).relationship_type_code:= 'OWNER';
5501     l_parties_tbl(1).contact_flag          := 'N';
5502 
5503     csi_t_gen_utility_pvt.dump_csi_instance_rec(l_instance_rec);
5504 
5505     csi_t_gen_utility_pvt.dump_api_info(
5506       p_pkg_name => 'csi_item_instance_pub',
5507       p_api_name => 'create_item_instance');
5508 
5509     -- creation of negative quantity inventory instance
5510     csi_item_instance_pub.create_item_instance(
5511       p_api_version           => 1.0,
5512       p_commit                => fnd_api.g_false,
5513       p_init_msg_list         => fnd_api.g_true,
5514       p_validation_level      => fnd_api.g_valid_level_full,
5515       p_instance_rec          => l_instance_rec,
5516       p_party_tbl             => l_parties_tbl,
5517       p_account_tbl           => l_pty_accts_tbl,
5518       p_org_assignments_tbl   => l_org_units_tbl,
5519       p_ext_attrib_values_tbl => l_ea_values_tbl,
5520       p_pricing_attrib_tbl    => l_pricing_tbl,
5521       p_asset_assignment_tbl  => l_assets_tbl,
5522       p_txn_rec               => px_txn_rec,
5523       x_return_status         => l_return_status,
5524       x_msg_count             => l_msg_count,
5525       x_msg_data              => l_msg_data );
5526 
5527     IF l_return_status not in (fnd_api.g_ret_sts_success,'W') THEN
5528       raise fnd_api.g_exc_error;
5529     END IF;
5530 
5531     px_mtl_txn_rec.instance_id        := l_instance_rec.instance_id;
5532     px_mtl_txn_rec.object_version_num := l_instance_rec.object_version_number;
5533 
5534   EXCEPTION
5535     WHEN fnd_api.g_exc_error THEN
5536       x_return_status := fnd_api.g_ret_sts_error;
5537   END create_inv_negative_instance;
5538 
5539 
5540   PROCEDURE decrement_inventory_instnace(
5541     p_instance_id    IN     number,
5542     p_quantity       IN     number,
5543     px_txn_rec       IN OUT NOCOPY csi_datastructures_pub.transaction_rec,
5544     x_return_status     OUT NOCOPY varchar2)
5545   IS
5546 
5547     l_instance_rec        csi_datastructures_pub.instance_rec;
5548     l_party_tbl           csi_datastructures_pub.party_tbl;
5549     l_party_acct_tbl      csi_datastructures_pub.party_account_tbl;
5550     l_inst_asset_tbl      csi_datastructures_pub.instance_asset_tbl;
5551     l_ext_attrib_val_tbl  csi_datastructures_pub.extend_attrib_values_tbl;
5552     l_pricing_attribs_tbl csi_datastructures_pub.pricing_attribs_tbl;
5553     l_org_units_tbl       csi_datastructures_pub.organization_units_tbl;
5554     l_inst_id_lst         csi_datastructures_pub.id_tbl;
5555 
5556     l_return_status       varchar2(1) := fnd_api.g_ret_sts_success;
5557     l_msg_count           number;
5558     l_msg_data            varchar2(2000);
5559 
5560   BEGIN
5561 
5562     x_return_status       := fnd_api.g_ret_sts_success;
5563 
5564     api_log('decrement_inventory_instnace');
5565 
5566     l_instance_rec.instance_id := p_instance_id;
5567 
5568     /*Code modified/added START for bug 4865052*/
5569 
5570     SELECT object_version_number,
5571            quantity - p_quantity,
5572            active_end_date
5573     INTO   l_instance_rec.object_version_number,
5574            l_instance_rec.quantity,
5575            l_instance_rec.active_end_date
5576     FROM   csi_item_instances
5577     WHERE  instance_id = l_instance_rec.instance_id;
5578 
5579     IF l_instance_rec.active_end_date is not null  THEN
5580       l_instance_rec.active_end_date := null;
5581       BEGIN
5582         SELECT instance_status_id
5583         INTO   l_instance_rec.instance_status_id
5584         FROM   csi_instance_statuses
5585         WHERE  name = fnd_profile.value('csi_default_instance_status');
5586       EXCEPTION
5587         WHEN no_data_found THEN
5588           l_instance_rec.instance_status_id := 510;
5589       END;
5590     END IF;
5591     /*Code modified/added END for bug 4865052*/
5592 
5593     csi_t_gen_utility_pvt.dump_csi_instance_rec(
5594       p_csi_instance_rec => l_instance_rec);
5595 
5596     record_time('Start');
5597 
5598     csi_t_gen_utility_pvt.dump_api_info(
5599       p_api_name => 'update_item_instance',
5600       p_pkg_name => 'csi_item_instance_pub');
5601 
5602     /* decrement the inventory source instance */
5603     csi_item_instance_pub.update_item_instance(
5604       p_api_version           => 1.0,
5605       p_commit                => fnd_api.g_false,
5606       p_init_msg_list         => fnd_api.g_true,
5607       p_validation_level      => fnd_api.g_valid_level_full,
5608       p_instance_rec          => l_instance_rec,
5609       p_ext_attrib_values_tbl => l_ext_attrib_val_tbl,
5610       p_party_tbl             => l_party_tbl,
5611       p_account_tbl           => l_party_acct_tbl,
5612       p_pricing_attrib_tbl    => l_pricing_attribs_tbl,
5613       p_org_assignments_tbl   => l_org_units_tbl,
5614       p_txn_rec               => px_txn_rec,
5615       p_asset_assignment_tbl  => l_inst_asset_tbl,
5616       x_instance_id_lst       => l_inst_id_lst,
5617       x_return_status         => l_return_status,
5618       x_msg_count             => l_msg_count,
5619       x_msg_data              => l_msg_data);
5620 
5621     -- For Bug 4057183
5622     -- IF l_return_status <> fnd_api.g_ret_sts_success THEN
5623     IF l_return_status not in (fnd_api.g_ret_sts_success,'W') THEN
5624       raise fnd_api.g_exc_error;
5625     END IF;
5626 
5627     record_time('End');
5628 
5629   EXCEPTION
5630     WHEN fnd_api.g_exc_error THEN
5631       x_return_status := fnd_api.g_ret_sts_error;
5632   END decrement_inventory_instnace;
5633 
5634   PROCEDURE decrement_inventory_instances(
5635     p_item_attrib_rec IN     item_attributes_rec,
5636     p_mtl_txn_tbl     IN OUT NOCOPY mtl_txn_tbl,
5637     px_txn_rec        IN OUT NOCOPY csi_datastructures_pub.transaction_rec,
5638     x_return_status      OUT NOCOPY varchar2)
5639   IS
5640     l_return_status        varchar2(1) := fnd_api.g_ret_sts_success;
5641   BEGIN
5642     x_return_status := fnd_api.g_ret_sts_success;
5643     api_log('decrement_inventory_instances');
5644 
5645     IF p_mtl_txn_tbl.count > 0 THEN
5646 
5647       IF p_item_attrib_rec.serial_control_code = 6 THEN
5648 
5649         IF nvl(p_mtl_txn_tbl(1).instance_id, fnd_api.g_miss_num) <> fnd_api.g_miss_num THEN
5650           decrement_inventory_instnace(
5651             p_instance_id    => p_mtl_txn_tbl(1).instance_id,
5652             p_quantity       => px_txn_rec.transaction_quantity,
5653             px_txn_rec       => px_txn_rec,
5654             x_return_status  => l_return_status);
5655           IF l_return_status <> fnd_api.g_ret_sts_success THEN
5656             raise fnd_api.g_exc_error;
5657           END IF;
5658         ELSE
5659           IF p_mtl_txn_tbl(1).negative_instance_flag = 'Y' THEN
5660 
5661             create_inv_negative_instance(
5662               px_mtl_txn_rec   => p_mtl_txn_tbl(1),
5663               p_quantity       => (-1)*(px_txn_rec.transaction_quantity),
5664               px_txn_rec       => px_txn_rec,
5665               x_return_status  => l_return_status);
5666 
5667             IF l_return_status <> fnd_api.g_ret_sts_success THEN
5668               RAISE fnd_api.g_exc_error;
5669             END IF;
5670 
5671           END IF;
5672         END IF;
5673 
5674       ELSE
5675         FOR l_ind IN p_mtl_txn_tbl.FIRST .. p_mtl_txn_tbl.LAST
5676         LOOP
5677           IF p_mtl_txn_tbl(l_ind).create_update_flag = 'C' THEN
5678 
5679             IF nvl(p_mtl_txn_tbl(l_ind).instance_id, fnd_api.g_miss_num) <> fnd_api.g_miss_num THEN
5680               decrement_inventory_instnace(
5681                 p_instance_id    => p_mtl_txn_tbl(l_ind).instance_id,
5682                 p_quantity       => p_mtl_txn_tbl(l_ind).primary_quantity,
5683                 px_txn_rec       => px_txn_rec,
5684                 x_return_status  => l_return_status);
5685 
5686               IF l_return_status <> fnd_api.g_ret_sts_success THEN
5687                 RAISE fnd_api.g_exc_error;
5688               END IF;
5689             ELSE
5690               IF p_mtl_txn_tbl(1).negative_instance_flag = 'Y' THEN
5691 
5692                 create_inv_negative_instance(
5693                   px_mtl_txn_rec   => p_mtl_txn_tbl(l_ind),
5694                   p_quantity       => (-1)*(p_mtl_txn_tbl(l_ind).primary_quantity),
5695                   px_txn_rec       => px_txn_rec,
5696                   x_return_status  => l_return_status);
5697 
5698                 IF l_return_status <> fnd_api.g_ret_sts_success THEN
5699                   RAISE fnd_api.g_exc_error;
5700                 END IF;
5701 
5702               END IF;
5703             END IF;
5704 
5705           END IF;
5706         END LOOP;
5707       END IF;
5708     END IF;
5709 
5710   EXCEPTION
5711     WHEN fnd_api.g_exc_error THEN
5712       x_return_status := fnd_api.g_ret_sts_error;
5713   END decrement_inventory_instances;
5714 
5715   PROCEDURE initialize_txn_details(
5716     px_txn_line_rec        IN OUT NOCOPY csi_t_datastructures_grp.txn_line_rec,
5717     px_txn_line_dtl_tbl    IN OUT NOCOPY csi_t_datastructures_grp.txn_line_detail_tbl,
5718     px_txn_party_tbl       IN OUT NOCOPY csi_t_datastructures_grp.txn_party_detail_tbl,
5719     px_txn_party_acct_tbl  IN OUT NOCOPY csi_t_datastructures_grp.txn_pty_acct_detail_tbl,
5720     px_txn_org_assgn_tbl   IN OUT NOCOPY csi_t_datastructures_grp.txn_org_assgn_tbl,
5721     px_txn_eav_tbl         IN OUT NOCOPY csi_t_datastructures_grp.txn_ext_attrib_vals_tbl,
5722     px_txn_ii_rltns_tbl    IN OUT NOCOPY csi_t_datastructures_grp.txn_ii_rltns_tbl)
5723   IS
5724     l_txn_line_rec         csi_t_datastructures_grp.txn_line_rec;
5725     l_txn_line_dtl_tbl     csi_t_datastructures_grp.txn_line_detail_tbl;
5726     l_txn_party_tbl        csi_t_datastructures_grp.txn_party_detail_tbl;
5727     l_txn_party_acct_tbl   csi_t_datastructures_grp.txn_pty_acct_detail_tbl;
5728     l_txn_org_assgn_tbl    csi_t_datastructures_grp.txn_org_assgn_tbl;
5729     l_txn_eav_tbl          csi_t_datastructures_grp.txn_ext_attrib_vals_tbl;
5730     l_txn_ii_rltns_tbl     csi_t_datastructures_grp.txn_ii_rltns_tbl;
5731   BEGIN
5732     api_log('initialize_txn_details');
5733     px_txn_line_rec       := l_txn_line_rec;
5734     px_txn_line_dtl_tbl   := l_txn_line_dtl_tbl;
5735     px_txn_party_tbl      := l_txn_party_tbl;
5736     px_txn_party_acct_tbl := l_txn_party_acct_tbl;
5737     px_txn_org_assgn_tbl  := l_txn_org_assgn_tbl;
5738     px_txn_eav_tbl        := l_txn_eav_tbl;
5739     px_txn_ii_rltns_tbl   := l_txn_ii_rltns_tbl;
5740   END initialize_txn_details;
5741 
5742 
5743   PROCEDURE pre_process_txn_line_dtl(
5744     px_txn_line_dtl_tbl   IN OUT NOCOPY csi_t_datastructures_grp.txn_line_detail_tbl,
5745     p_item_attrib_rec     IN     item_attributes_rec,
5746     x_return_status          OUT NOCOPY varchar2)
5747   IS
5748     l_tld_tbl             csi_t_datastructures_grp.txn_line_detail_tbl;
5749   BEGIN
5750     x_return_status := fnd_api.g_ret_sts_success;
5751     api_log('pre_process_txn_line_dtl');
5752     l_tld_tbl := px_txn_line_dtl_tbl;
5753 
5754     IF l_tld_tbl.COUNT > 0 THEN
5755       FOR l_ind IN l_tld_tbl.FIRST .. l_tld_tbl.LAST
5756       LOOP
5757         -- init error code with 'N' -- used as a matched_flag in this case
5758         l_tld_tbl(l_ind).error_code := 'N';
5759 
5760         -- source_txn_line_details -- to match with the children
5761         l_tld_tbl(l_ind).source_txn_line_detail_id := l_ind;
5762 
5763         IF nvl(l_tld_tbl(l_ind).instance_id,fnd_api.g_miss_num) <> fnd_api.g_miss_num THEN
5764           -- derive all the information (serial, lot, locator, rev etc ).
5765           null;
5766         ELSE
5767           IF nvl(l_tld_tbl(l_ind).serial_number, fnd_api.g_miss_char) <> fnd_api.g_miss_char THEN
5768             -- get the instance_id for the item serial comb
5769             null;
5770           END IF;
5771         END IF;
5772       END LOOP;
5773     END IF;
5774 
5775     px_txn_line_dtl_tbl := l_tld_tbl;
5776 
5777   EXCEPTION
5778     WHEN fnd_api.g_exc_error THEN
5779       x_return_status := fnd_api.g_ret_sts_error;
5780   END pre_process_txn_line_dtl;
5781 
5782   PROCEDURE split_tld_one_each(
5783     px_txn_line_dtl_tbl   IN OUT NOCOPY csi_t_datastructures_grp.txn_line_detail_tbl,
5784     px_txn_party_dtl_tbl  IN OUT NOCOPY csi_t_datastructures_grp.txn_party_detail_tbl,
5785     px_txn_party_acct_tbl IN OUT NOCOPY csi_t_datastructures_grp.txn_pty_acct_detail_tbl,
5786     px_txn_org_assgn_tbl  IN OUT NOCOPY csi_t_datastructures_grp.txn_org_assgn_tbl,
5787     px_txn_eav_tbl        IN OUT NOCOPY csi_t_datastructures_grp.txn_ext_attrib_vals_tbl,
5788     px_txn_ii_rltns_tbl   IN OUT NOCOPY csi_t_datastructures_grp.txn_ii_rltns_tbl,
5789     x_return_status          OUT NOCOPY varchar2)
5790   IS
5791     l_tld_tbl             csi_t_datastructures_grp.txn_line_detail_tbl;
5792     l_pd_tbl              csi_t_datastructures_grp.txn_party_detail_tbl;
5793     l_pa_tbl              csi_t_datastructures_grp.txn_pty_acct_detail_tbl;
5794     l_oa_tbl              csi_t_datastructures_grp.txn_org_assgn_tbl;
5795     l_eav_tbl             csi_t_datastructures_grp.txn_ext_attrib_vals_tbl;
5796     l_iir_tbl             csi_t_datastructures_grp.txn_ii_rltns_tbl;
5797 
5798     s_tld_tbl             csi_t_datastructures_grp.txn_line_detail_tbl;
5799     s_pd_tbl              csi_t_datastructures_grp.txn_party_detail_tbl;
5800     s_pa_tbl              csi_t_datastructures_grp.txn_pty_acct_detail_tbl;
5801     s_oa_tbl              csi_t_datastructures_grp.txn_org_assgn_tbl;
5802     s_eav_tbl             csi_t_datastructures_grp.txn_ext_attrib_vals_tbl;
5803     s_iir_tbl             csi_t_datastructures_grp.txn_ii_rltns_tbl;
5804 
5805     l_tld_ind             binary_integer := 0; -- new index
5806     l_pd_ind              binary_integer := 0;
5807     l_pa_ind              binary_integer := 0;
5808     l_oa_ind              binary_integer := 0;
5809     l_eav_ind             binary_integer := 0;
5810     l_iir_ind             binary_integer := 0;
5811 
5812   BEGIN
5813     x_return_status := fnd_api.g_ret_sts_success;
5814     api_log('split_tld_one_each');
5815 
5816     l_tld_tbl := px_txn_line_dtl_tbl;
5817     l_pd_tbl  := px_txn_party_dtl_tbl;
5818     l_pa_tbl  := px_txn_party_acct_tbl;
5819     l_oa_tbl  := px_txn_org_assgn_tbl;
5820     l_eav_tbl := px_txn_eav_tbl;
5821     l_iir_tbl := px_txn_ii_rltns_tbl;
5822 
5823     IF l_tld_tbl.COUNT > 0 THEN
5824       FOR tld_ind IN l_tld_tbl.FIRST .. l_tld_tbl.LAST
5825       LOOP
5826         IF l_tld_tbl(tld_ind).quantity > 1 THEN
5827           FOR i IN 1..(l_tld_tbl(tld_ind).quantity - 1)
5828           LOOP
5829             -- create new tld record with qty
5830             l_tld_ind := l_tld_tbl.COUNT + 1;
5831             l_tld_tbl(l_tld_ind) := l_tld_tbl(tld_ind);
5832             l_tld_tbl(l_tld_ind).quantity := 1;
5833 
5834             -- create party records
5835             IF l_pd_tbl.COUNT > 0 THEN
5836               FOR pd_ind IN l_pd_tbl.FIRST .. l_pd_tbl.LAST
5837               LOOP
5838                 IF l_pd_tbl(pd_ind).txn_line_details_index = tld_ind THEN
5839                   l_pd_ind := l_pd_tbl.COUNT + 1;
5840                   l_pd_tbl(l_pd_ind) := l_pd_tbl(pd_ind);
5841                   l_pd_tbl(pd_ind).txn_line_details_index := l_tld_ind;
5842 
5843                   -- create party account
5844                   IF l_pa_tbl.COUNT > 0 THEN
5845                     FOR pa_ind IN l_pa_tbl.FIRST .. l_pa_tbl.LAST
5846                     LOOP
5847                       IF l_pa_tbl(pa_ind).txn_party_details_index = pd_ind THEN
5848                         l_pa_ind := l_pa_tbl.COUNT + 1;
5849                         l_pa_tbl(l_pa_ind) := l_pa_tbl(pa_ind);
5850                         l_pa_tbl(l_pa_ind).txn_party_details_index := l_pd_ind;
5851                       END IF;
5852                     END LOOP; -- pa_tbl loop
5853                   END IF;
5854 
5855                 END IF;
5856               END LOOP; -- pd_tbl loop
5857             END IF;
5858           END LOOP; -- 1..(qty-1) loop
5859           l_tld_tbl(tld_ind).quantity := 1;
5860         END IF;
5861       END LOOP; -- tld_tbl loop
5862     END IF;
5863 
5864   EXCEPTION
5865     WHEN fnd_api.g_exc_error THEN
5866       x_return_status := fnd_api.g_ret_sts_error;
5867   END split_tld_one_each;
5868 
5869   PROCEDURE sync_serials(
5870     p_mtl_txn_tbl         IN     mtl_txn_tbl,
5871     px_txn_line_dtl_tbl   IN OUT NOCOPY csi_t_datastructures_grp.txn_line_detail_tbl,
5872     x_return_status          OUT NOCOPY varchar2)
5873   IS
5874     l_mtl_tbl             mtl_txn_tbl;
5875     l_tld_tbl             csi_t_datastructures_grp.txn_line_detail_tbl;
5876     l_m_tld_tbl           csi_t_datastructures_grp.txn_line_detail_tbl;
5877     l_m_ind               binary_integer := 0;
5878   BEGIN
5879     x_return_status := fnd_api.g_ret_sts_success;
5880     api_log('sync_serials');
5881 
5882     l_mtl_tbl := p_mtl_txn_tbl;
5883     l_tld_tbl := px_txn_line_dtl_tbl;
5884 
5885     debug('Parse I  - eliminate cases where serials match');
5886     IF l_tld_tbl.COUNT > 0 THEN
5887       FOR t_ind IN l_tld_tbl.FIRST .. l_tld_tbl.LAST
5888       LOOP
5889         IF l_tld_tbl(t_ind).error_code = 'N' THEN
5890           IF l_mtl_tbl.COUNT > 0 THEN
5891             FOR m_ind IN l_mtl_tbl.FIRST .. l_mtl_tbl.LAST
5892             LOOP
5893               debug('  TLD ID :'||l_tld_tbl(t_ind).source_txn_line_detail_id||
5894                     '  Serial :'||l_mtl_tbl(m_ind).serial_number||
5895                     '  Instance :'||l_mtl_tbl(m_ind).instance_id);
5896               IF l_mtl_tbl(m_ind).match_flag = 'N' THEN
5897                 IF (l_tld_tbl(t_ind).serial_number = l_mtl_tbl(m_ind).serial_number)
5898                     OR
5899                    (l_tld_tbl(t_ind).instance_id = l_mtl_tbl(m_ind).instance_id)
5900                 THEN
5901                   /* using this error_code column as a marked flag */
5902                   l_tld_tbl(t_ind).error_code := 'Y';
5903                   l_mtl_tbl(m_ind).match_flag := 'Y';
5904 
5905                   l_tld_tbl(t_ind).serial_number := l_mtl_tbl(m_ind).serial_number;
5906                   l_tld_tbl(t_ind).instance_id   := l_mtl_tbl(m_ind).instance_id;
5907 
5908                   --
5909                   debug('    Match');
5910                   exit;
5911                 ELSE
5912                   debug('    NO Match');
5913                 END IF;
5914               END IF;
5915             END LOOP;
5916           END IF;
5917         END IF; -- error_flag = 'N' -- unmatched tld
5918       END LOOP;
5919     END IF;
5920 
5921     /* the following logic assumes that the tld table is in quantity each */
5922     debug('Parse II - match based on quantity');
5923     IF l_tld_tbl.COUNT > 0 THEN
5924       FOR t_ind IN l_tld_tbl.FIRST .. l_tld_tbl.LAST
5925       LOOP
5926         IF l_tld_tbl(t_ind).error_code = 'N' THEN
5927           IF l_mtl_tbl.COUNT > 0 THEN
5928             FOR m_ind IN l_mtl_tbl.FIRST .. l_mtl_tbl.LAST
5929             LOOP
5930 
5931               debug('  TLD ID :'||l_tld_tbl(t_ind).source_txn_line_detail_id||
5932                     '  Serial :'||l_mtl_tbl(m_ind).serial_number||
5933                     '  Instance :'||l_mtl_tbl(m_ind).instance_id);
5934               IF l_mtl_tbl(m_ind).match_flag = 'N' THEN
5935                 l_tld_tbl(t_ind).error_code := 'Y';
5936                 l_mtl_tbl(m_ind).match_flag := 'Y';
5937 
5938                 l_tld_tbl(t_ind).mfg_serial_number_flag := 'Y';
5939                 l_tld_tbl(t_ind).serial_number := l_mtl_tbl(m_ind).serial_number;
5940                 l_tld_tbl(t_ind).instance_id   := l_mtl_tbl(m_ind).instance_id;
5941                 l_tld_tbl(t_ind).lot_number    := l_mtl_tbl(m_ind).lot_number;
5942 
5943                 debug('    Match');
5944                 exit;
5945               END IF;
5946 
5947             END LOOP; -- mtl table loop
5948           END IF;
5949         END IF;
5950       END LOOP; -- tld loop
5951     END IF;
5952 
5953     --rebuild the tld_tbl
5954     IF l_tld_tbl.COUNT > 0 THEN
5955       FOR l_ind IN l_tld_tbl.FIRST .. l_tld_tbl.LAST
5956       LOOP
5957         IF l_tld_tbl(l_ind).error_code = 'Y' THEN
5958 
5959           l_m_ind := l_m_ind + 1;
5960           l_m_tld_tbl(l_m_ind) := l_tld_tbl(l_ind);
5961 
5962           debug('Instance_ID :'||l_m_tld_tbl(l_m_ind).instance_id);
5963 
5964         END IF;
5965       END LOOP;
5966     END IF;
5967 
5968     px_txn_line_dtl_tbl := l_m_tld_tbl;
5969 
5970   EXCEPTION
5971     WHEN fnd_api.g_exc_error THEN
5972       x_return_status := fnd_api.g_ret_sts_error;
5973   END sync_serials;
5974 
5975   PROCEDURE sync_lots(
5976     p_mtl_txn_tbl         IN     mtl_txn_tbl,
5977     px_txn_line_dtl_tbl   IN OUT NOCOPY csi_t_datastructures_grp.txn_line_detail_tbl,
5978     x_return_status          OUT NOCOPY varchar2)
5979   IS
5980     l_mtl_tbl             mtl_txn_tbl;
5981     l_tld_tbl             csi_t_datastructures_grp.txn_line_detail_tbl;
5982     l_m_tld_tbl           csi_t_datastructures_grp.txn_line_detail_tbl;
5983     l_m_ind               binary_integer := 0;
5984 
5985     t_n_ind               binary_integer := 0;
5986     l_remain_qty          number         := 0;
5987 
5988   BEGIN
5989     x_return_status := fnd_api.g_ret_sts_success;
5990     api_log('sync_lots');
5991 
5992     l_mtl_tbl := p_mtl_txn_tbl;
5993     l_tld_tbl := px_txn_line_dtl_tbl;
5994 
5995     debug('Parse I - Match by the lot number.');
5996 
5997     IF l_tld_tbl.COUNT > 0 THEN
5998       FOR t_ind IN l_tld_tbl.FIRST .. l_tld_tbl.LAST
5999       LOOP
6000         -- unmatched tld
6001         IF l_tld_tbl(t_ind).error_code = 'N' THEN
6002           IF l_mtl_tbl.COUNT > 0 THEN
6003             FOR m_ind IN l_mtl_tbl.FIRST .. l_mtl_tbl.LAST
6004             LOOP
6005               debug('  TLD ID :'||l_tld_tbl(t_ind).source_txn_line_detail_id||
6006                     '  Lot :'||l_mtl_tbl(m_ind).lot_number||
6007                     '  Instance :'||l_mtl_tbl(m_ind).instance_id);
6008               -- unmatched mtl
6009               IF l_mtl_tbl(m_ind).match_flag = 'N' THEN
6010                 IF (l_tld_tbl(t_ind).lot_number = l_mtl_tbl(m_ind).lot_number)
6011                     OR
6012                    (l_tld_tbl(t_ind).instance_id = l_mtl_tbl(m_ind).instance_id)
6013                 THEN
6014 
6015                   /* this functionality will be used when there is a user entered */
6016                   /* txn detail for this source line                              */
6017                   /* code needs to be expanded                                    */
6018 
6019                   null;
6020                 ELSE
6021                   debug('    No Match');
6022                 END IF;
6023               END IF;
6024             END LOOP; --mtl_tbl loop
6025           END IF;
6026         END IF;
6027       END LOOP; --tld_tbl loop;
6028     END IF;
6029 
6030     debug('Parse II - Match by the lot quantity.');
6031     IF l_mtl_tbl.COUNT > 0 THEN
6032       FOR m_ind IN l_mtl_tbl.FIRST .. l_mtl_tbl.LAST
6033       LOOP
6034         -- unmatched mtl
6035         IF l_mtl_tbl(m_ind).match_flag = 'N' THEN
6036 
6037           IF l_tld_tbl.COUNT > 0 THEN
6038             FOR t_ind IN l_tld_tbl.FIRST .. l_tld_tbl.LAST
6039             LOOP
6040               debug('  TLD ID :'||l_tld_tbl(t_ind).source_txn_line_detail_id||
6041                     '  Lot :'||l_mtl_tbl(m_ind).lot_number||
6042                     '  Instance :'||l_mtl_tbl(m_ind).instance_id);
6043 
6044               -- unmatched tld
6045               IF l_tld_tbl(t_ind).error_code = 'N' THEN
6046 
6047                 IF (l_tld_tbl(t_ind).quantity = l_mtl_tbl(m_ind).primary_quantity)
6048                 THEN
6049                   debug('    Match');
6050 
6051                   l_tld_tbl(t_ind).error_code  := 'Y';
6052                   l_mtl_tbl(m_ind).match_flag  := 'Y';
6053                   l_tld_tbl(t_ind).lot_number  := l_mtl_tbl(m_ind).lot_number;
6054                   l_tld_tbl(t_ind).instance_id := fnd_api.g_miss_num;
6055                   l_tld_tbl(t_ind).instance_exists_flag := 'N';
6056 
6057                   exit;
6058 
6059                 ELSE
6060                   debug('    No Match');
6061                   -- split it to primary_qty and the rest.
6062 
6063                   l_remain_qty := l_tld_tbl(t_ind).quantity - l_mtl_tbl(m_ind).primary_quantity;
6064 
6065                   -- create a new tld with the remain qty
6066                   t_n_ind := l_tld_tbl.COUNT + 1;
6067 
6068                   l_tld_tbl(t_n_ind) := l_tld_tbl(t_ind);
6069                   l_tld_tbl(t_ind).error_code  := 'N';
6070                   l_tld_tbl(t_n_ind).quantity  := l_remain_qty;
6071                   l_tld_tbl(t_n_ind).source_txn_line_detail_id := l_tld_tbl(t_ind).txn_line_detail_id;
6072 
6073                   -- mark the current tld as matched
6074                   l_tld_tbl(t_ind).error_code  := 'Y';
6075                   l_mtl_tbl(m_ind).match_flag  := 'Y';
6076                   l_tld_tbl(t_ind).lot_number  := l_mtl_tbl(m_ind).lot_number;
6077                   l_tld_tbl(t_ind).quantity    := l_mtl_tbl(m_ind).primary_quantity;
6078                   l_tld_tbl(t_ind).instance_id := fnd_api.g_miss_num;
6079                   l_tld_tbl(t_ind).instance_exists_flag := 'N';
6080 
6081                   exit;
6082 
6083                 END IF;
6084               END IF;
6085             END LOOP; --tld_tbl loop
6086           END IF;
6087         END IF;
6088       END LOOP; --mtl_tbl loop;
6089     END IF;
6090 
6091     --rebuild the tld_tbl
6092     IF l_tld_tbl.COUNT > 0 THEN
6093       FOR l_ind IN l_tld_tbl.FIRST .. l_tld_tbl.LAST
6094       LOOP
6095         IF l_tld_tbl(l_ind).error_code = 'Y' THEN
6096 
6097           l_m_ind := l_m_ind + 1;
6098           l_m_tld_tbl(l_m_ind) := l_tld_tbl(l_ind);
6099 
6100           debug('Instance_ID :'||l_m_tld_tbl(l_m_ind).instance_id);
6101 
6102         END IF;
6103       END LOOP;
6104     END IF;
6105 
6106     px_txn_line_dtl_tbl := l_m_tld_tbl;
6107 
6108 
6109   EXCEPTION
6110     WHEN fnd_api.g_exc_error THEN
6111       x_return_status := fnd_api.g_ret_sts_error;
6112   END sync_lots;
6113 
6114   PROCEDURE sync_txn_dtl_and_mtl_txn(
6115     p_mtl_txn_tbl         IN     mtl_txn_tbl,
6116     p_item_attrib_rec     IN     item_attributes_rec,
6117     px_txn_line_dtl_tbl   IN OUT NOCOPY csi_t_datastructures_grp.txn_line_detail_tbl,
6118     px_txn_party_dtl_tbl  IN OUT NOCOPY csi_t_datastructures_grp.txn_party_detail_tbl,
6119     px_txn_party_acct_tbl IN OUT NOCOPY csi_t_datastructures_grp.txn_pty_acct_detail_tbl,
6120     px_txn_org_assgn_tbl  IN OUT NOCOPY csi_t_datastructures_grp.txn_org_assgn_tbl,
6121     px_txn_eav_tbl        IN OUT NOCOPY csi_t_datastructures_grp.txn_ext_attrib_vals_tbl,
6122     px_txn_ii_rltns_tbl   IN OUT NOCOPY csi_t_datastructures_grp.txn_ii_rltns_tbl,
6123     x_return_status          OUT NOCOPY varchar2)
6124   IS
6125     l_tld_tbl             csi_t_datastructures_grp.txn_line_detail_tbl;
6126     l_pd_tbl              csi_t_datastructures_grp.txn_party_detail_tbl;
6127     l_pa_tbl              csi_t_datastructures_grp.txn_pty_acct_detail_tbl;
6128     l_oa_tbl              csi_t_datastructures_grp.txn_org_assgn_tbl;
6129     l_eav_tbl             csi_t_datastructures_grp.txn_ext_attrib_vals_tbl;
6130     l_iir_tbl             csi_t_datastructures_grp.txn_ii_rltns_tbl;
6131     l_return_status       varchar2(1) := fnd_api.g_ret_sts_success;
6132   BEGIN
6133     x_return_status := fnd_api.g_ret_sts_success;
6134     api_log('sync_txn_dtl_and_mtl_txn');
6135 
6136     l_tld_tbl := px_txn_line_dtl_tbl;
6137     l_pd_tbl  := px_txn_party_dtl_tbl;
6138     l_pa_tbl  := px_txn_party_acct_tbl;
6139     l_oa_tbl  := px_txn_org_assgn_tbl;
6140     l_eav_tbl := px_txn_eav_tbl;
6141     l_iir_tbl := px_txn_ii_rltns_tbl;
6142 
6143     pre_process_txn_line_dtl(
6144       px_txn_line_dtl_tbl   => l_tld_tbl,
6145       p_item_attrib_rec     => p_item_attrib_rec,
6146       x_return_status       => l_return_status);
6147 
6148     IF l_return_status <> fnd_api.g_ret_sts_success THEN
6149       RAISE fnd_api.g_exc_error;
6150     END IF;
6151 
6152     IF p_mtl_txn_tbl.COUNT > 0 THEN
6153 
6154       -- if serialized match by serial/inst combination
6155       IF p_item_attrib_rec.serial_control_code in (2, 5, 6) THEN
6156         -- we need to stamp the serial attribute in the instance creation
6157         -- sync serials
6158 
6159         sync_serials(
6160           p_mtl_txn_tbl         => p_mtl_txn_tbl,
6161           px_txn_line_dtl_tbl   => l_tld_tbl,
6162           x_return_status       => l_return_status);
6163 
6164       ELSE
6165         IF p_item_attrib_rec.lot_control_code = 2 THEN
6166           -- we need to group and stamp the lot attribute in instnace creation
6167           -- sync_lots
6168 
6169           sync_lots(
6170             p_mtl_txn_tbl         => p_mtl_txn_tbl,
6171             px_txn_line_dtl_tbl   => l_tld_tbl,
6172             x_return_status       => l_return_status);
6173 
6174         ELSE
6175           null;
6176           -- just verify that the quantity that is in sync with the mtl txn qty
6177           -- sync_quantity
6178         END IF;
6179       END IF;
6180 
6181       -- if lot match by lot/inst
6182 
6183       -- if locator match by locator
6184 
6185       -- by qty
6186 
6187       -- split tld to match the mtl tbl (most frequent case) make sure it works
6188     END IF;
6189 
6190     px_txn_line_dtl_tbl   := l_tld_tbl;
6191     px_txn_party_dtl_tbl  := l_pd_tbl;
6192     px_txn_party_acct_tbl := l_pa_tbl;
6193     px_txn_org_assgn_tbl  := l_oa_tbl;
6194     px_txn_eav_tbl        := l_eav_tbl;
6195     px_txn_ii_rltns_tbl   := l_iir_tbl;
6196 
6197   EXCEPTION
6198     WHEN fnd_api.g_exc_error THEN
6199       x_return_status := fnd_api.g_ret_sts_error;
6200   END sync_txn_dtl_and_mtl_txn;
6201 
6202 
6203   PROCEDURE default_owner_pty_and_acct(
6204     p_instance_id         IN     number,
6205     px_txn_line_dtl_tbl   IN OUT NOCOPY csi_t_datastructures_grp.txn_line_detail_tbl,
6206     px_txn_party_dtl_tbl  IN OUT NOCOPY csi_t_datastructures_grp.txn_party_detail_tbl,
6207     px_txn_party_acct_tbl IN OUT NOCOPY csi_t_datastructures_grp.txn_pty_acct_detail_tbl,
6208     x_return_status          OUT NOCOPY varchar2)
6209   IS
6210     l_owner_party_acct_id  number;
6211     l_owner_party_id       number;
6212     l_party_source_table   varchar2(80);
6213 
6214     l_pt_ind               binary_integer := 0;
6215     l_pa_ind               binary_integer := 0;
6216 
6217   BEGIN
6218 
6219     api_log('default_owner_pty_and_acct');
6220     x_return_status := fnd_api.g_ret_sts_success;
6221 
6222     IF px_txn_line_dtl_tbl.COUNT > 0 THEN
6223 
6224       SELECT owner_party_account_id,
6225              owner_party_id
6226       INTO   l_owner_party_acct_id,
6227              l_owner_party_id
6228       FROM   csi_item_instances
6229       WHERE  instance_id = p_instance_id;
6230 
6231 
6232       IF l_owner_party_id is not null THEN
6233 
6234         SELECT party_source_table
6235         INTO   l_party_source_table
6236         FROM   csi_i_parties
6237         WHERE  instance_id = p_instance_id
6238         AND    relationship_type_code = 'OWNER';
6239 
6240         FOR l_ind IN px_txn_line_dtl_tbl.FIRST .. px_txn_line_dtl_tbl.LAST
6241         LOOP
6242 
6243           -- check if owner is there
6244           l_pt_ind := px_txn_party_dtl_tbl.COUNT + 1;
6245 
6246           px_txn_party_dtl_tbl(l_pt_ind).txn_party_detail_id := fnd_api.g_miss_num;
6247           px_txn_party_dtl_tbl(l_pt_ind).txn_line_detail_id  := fnd_api.g_miss_num;
6248           px_txn_party_dtl_tbl(l_pt_ind).party_source_table  := l_party_source_table;
6249           px_txn_party_dtl_tbl(l_pt_ind).party_source_id     := l_owner_party_id;
6250           px_txn_party_dtl_tbl(l_pt_ind).relationship_type_code := 'OWNER';
6251           px_txn_party_dtl_tbl(l_pt_ind).contact_flag        := 'N';
6252           px_txn_party_dtl_tbl(l_pt_ind).txn_line_details_index := l_ind;
6253 
6254           IF l_owner_party_acct_id IS NOT null THEN
6255 
6256             l_pa_ind := px_txn_party_acct_tbl.COUNT + 1;
6257 
6258             px_txn_party_acct_tbl(l_pa_ind).txn_account_detail_id   := fnd_api.g_miss_num;
6259             px_txn_party_acct_tbl(l_pa_ind).txn_party_detail_id     := fnd_api.g_miss_num;
6260             px_txn_party_acct_tbl(l_pa_ind).account_id              := l_owner_party_acct_id;
6261             px_txn_party_acct_tbl(l_pa_ind).relationship_type_code  := 'OWNER';
6262             px_txn_party_acct_tbl(l_pa_ind).txn_party_details_index := l_pt_ind;
6263 
6264           END IF;
6265 
6266         END LOOP;
6267       END IF;
6268     END IF;
6269 
6270   EXCEPTION
6271     WHEN fnd_api.g_exc_error THEN
6272       x_return_status := fnd_api.g_ret_sts_error;
6273   END default_owner_pty_and_acct;
6274 
6275   --
6276   --
6277   --
6278   PROCEDURE process_cz_txn_details(
6279     p_config_session_keys  IN  csi_utility_grp.config_session_keys,
6280     p_instance_id          IN  number,
6281     x_instance_tbl         OUT NOCOPY csi_datastructures_pub.instance_tbl,
6282     x_return_status        OUT NOCOPY varchar2)
6283   IS
6284 
6285     l_source_hdr_rec       source_header_rec;
6286     l_source_line_rec      source_line_rec;
6287     l_src_instance_key     csi_utility_grp.config_instance_key;
6288 
6289     l_csi_txn_rec          csi_datastructures_pub.transaction_rec;
6290 
6291     l_tl_rec               csi_t_datastructures_grp.txn_line_rec;
6292     l_td_tbl               csi_t_datastructures_grp.txn_line_detail_tbl;
6293     l_pd_tbl               csi_t_datastructures_grp.txn_party_detail_tbl;
6294     l_pa_tbl               csi_t_datastructures_grp.txn_pty_acct_detail_tbl;
6295     l_oa_tbl               csi_t_datastructures_grp.txn_org_assgn_tbl;
6296     l_ea_tbl               csi_t_datastructures_grp.txn_ext_attrib_vals_tbl;
6297     l_ir_tbl               csi_t_datastructures_grp.txn_ii_rltns_tbl;
6298     l_pr_tbl               csi_datastructures_pub.pricing_attribs_tbl;
6299     l_sy_tbl               csi_t_datastructures_grp.txn_systems_tbl;
6300 
6301     l_return_status        varchar2(1) := fnd_api.g_ret_sts_success;
6302     l_return_message       varchar2(2000);
6303 
6304   BEGIN
6305     x_return_status := fnd_api.g_ret_sts_success;
6306 
6307     api_log('process_cz_txn_details');
6308 
6309     IF p_config_session_keys.COUNT > 0 THEN
6310       FOR l_ind IN p_config_session_keys.FIRST .. p_config_session_keys.LAST
6311       LOOP
6312 
6313         -- initialize txn detail set
6314         initialize_txn_details(
6315           px_txn_line_rec        => l_tl_rec,
6316           px_txn_line_dtl_tbl    => l_td_tbl,
6317           px_txn_party_tbl       => l_pd_tbl,
6318           px_txn_party_acct_tbl  => l_pa_tbl,
6319           px_txn_org_assgn_tbl   => l_oa_tbl,
6320           px_txn_eav_tbl         => l_ea_tbl,
6321           px_txn_ii_rltns_tbl    => l_ir_tbl);
6322 
6323         get_cz_txn_details(
6324           p_config_session_key   => p_config_session_keys(l_ind),
6325           x_txn_line_rec         => l_tl_rec,
6326           x_txn_line_dtl_tbl     => l_td_tbl,
6327           x_txn_party_tbl        => l_pd_tbl,
6328           x_txn_party_acct_tbl   => l_pa_tbl,
6329           x_txn_org_assgn_tbl    => l_oa_tbl,
6330           x_txn_eav_tbl          => l_ea_tbl,
6331           x_txn_ii_rltns_tbl     => l_ir_tbl,
6332           x_return_status        => l_return_status);
6333 
6334         IF l_return_status <> fnd_api.g_ret_sts_success THEN
6335           RAISE fnd_api.g_exc_error;
6336         END IF;
6337 
6338         IF l_td_tbl.COUNT > 0 THEN
6339 
6340           -- get the source instance key
6341           FOR l_td_ind IN l_td_tbl.FIRST .. l_td_tbl.LAST
6342           LOOP
6343             IF l_td_tbl(l_td_ind).source_transaction_flag = 'Y' THEN
6344 
6345               l_src_instance_key.inst_hdr_id  := l_td_tbl(l_td_ind).config_inst_hdr_id;
6346               l_src_instance_key.inst_rev_num := l_td_tbl(l_td_ind).config_inst_rev_num;
6347               l_src_instance_key.inst_item_id := l_td_tbl(l_td_ind).config_inst_item_id;
6348               l_src_instance_key.inst_baseline_rev_num := l_td_tbl(l_td_ind).config_inst_baseline_rev_num;
6349 
6350               -- to get the item attributes I need to pass this
6351               l_source_line_rec.inventory_item_id := l_td_tbl(l_td_ind).inventory_item_id;
6352               l_source_line_rec.organization_id := l_td_tbl(l_td_ind).inv_organization_id;
6353 
6354             END IF;
6355 
6356               /* Moved this code from IF clause above after all the assignments as part of
6357                  fix for Bug 2730573 */
6358 
6359               /* moved this code out from interface IB */
6360               BEGIN
6361                 SELECT instance_id
6362                 INTO   l_td_tbl(l_td_ind).instance_id
6363                 FROM   csi_item_instances
6364                 WHERE  config_inst_hdr_id = l_td_tbl(l_td_ind).config_inst_hdr_id
6365                 AND    config_inst_item_id = l_td_tbl(l_td_ind).config_inst_item_id;
6366 
6367                 l_td_tbl(l_td_ind).instance_exists_flag := 'Y';
6368 
6369               EXCEPTION
6370                 WHEN no_data_found THEN
6371                   l_td_tbl(l_td_ind).instance_id          := fnd_api.g_miss_num;
6372                   l_td_tbl(l_td_ind).instance_exists_flag := 'N';
6373               END;
6374              /* End of fix for Bug  2730573 */
6375 
6376           END LOOP;
6377 
6378           -- filter relations
6379 
6380           filter_relations(
6381             p_instance_key         => l_src_instance_key,
6382             p_transaction_line_id  => l_tl_rec.transaction_line_id,
6383             px_txn_ii_rltns_tbl    => l_ir_tbl,
6384             x_return_status        => l_return_status);
6385 
6386           IF l_return_status <> fnd_api.g_ret_sts_success THEN
6387             RAISE fnd_api.g_exc_error;
6388           END IF;
6389 
6390            csi_t_utilities_pvt.convert_ids_to_index(
6391              px_line_dtl_tbl      => l_td_tbl,
6392              px_pty_dtl_tbl       => l_pd_tbl,
6393              px_pty_acct_tbl      => l_pa_tbl,
6394              px_ii_rltns_tbl      => l_ir_tbl,
6395              px_org_assgn_tbl     => l_oa_tbl,
6396              px_ext_attrib_tbl    => l_ea_tbl,
6397              px_txn_systems_tbl   => l_sy_tbl);
6398 
6399           --default owner party and account
6400           default_owner_pty_and_acct(
6401             p_instance_id         => p_instance_id,
6402             px_txn_line_dtl_tbl   => l_td_tbl,
6403             px_txn_party_dtl_tbl  => l_pd_tbl,
6404             px_txn_party_acct_tbl => l_pa_tbl,
6405             x_return_status       => l_return_status);
6406 
6407           IF l_return_status <> fnd_api.g_ret_sts_success THEN
6408             RAISE fnd_api.g_exc_error;
6409           END IF;
6410 
6411           l_source_line_rec.fulfilled_date      := sysdate;
6412           l_source_hdr_rec.source_header_id     := l_src_instance_key.inst_hdr_id;
6413           l_source_hdr_rec.source_header_ref    := l_src_instance_key.inst_rev_num;
6414           l_source_line_rec.source_line_id      := l_src_instance_key.inst_item_id;
6415           l_source_line_rec.source_line_ref     := null;
6416           l_source_line_rec.source_table        := 'CONFIGURATOR';
6417           l_source_line_rec.batch_validate_flag := 'N';
6418 
6419           interface_ib(
6420             p_source_header_rec    => l_source_hdr_rec,
6421             p_source_line_rec      => l_source_line_rec,
6422             px_csi_txn_rec         => l_csi_txn_rec,
6423             px_txn_line_rec        => l_tl_rec,
6424             px_txn_line_dtl_tbl    => l_td_tbl,
6425             px_txn_party_tbl       => l_pd_tbl,
6426             px_txn_party_acct_tbl  => l_pa_tbl,
6427             px_txn_org_assgn_tbl   => l_oa_tbl,
6428             px_txn_eav_tbl         => l_ea_tbl,
6429             px_txn_ii_rltns_tbl    => l_ir_tbl,
6430             px_pricing_attribs_tbl => l_pr_tbl,
6431             x_return_status        => l_return_status,
6432             x_return_message       => l_return_message);
6433 
6434           IF l_return_status <> fnd_api.g_ret_sts_success THEN
6435             RAISE fnd_api.g_exc_error;
6436           END IF;
6437 
6438         END IF;
6439 
6440       END LOOP;
6441     END IF;
6442 
6443   EXCEPTION
6444     WHEN fnd_api.g_exc_error THEN
6445       x_return_status := fnd_api.g_ret_sts_error;
6446   END process_cz_txn_details;
6447 END csi_interface_pkg;