DBA Data[Home] [Help]

PACKAGE BODY: APPS.CSI_INTERFACE_PKG

Source


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