DBA Data[Home] [Help]

PACKAGE BODY: APPS.CSE_FA_TXN_PKG

Source


1 PACKAGE BODY cse_fa_txn_pkg AS
2 /* $Header: CSEASTXB.pls 120.7 2006/06/28 22:56:10 brmanesh noship $   */
3 
4 
5   l_debug varchar2(1) := NVL(fnd_profile.value('cse_debug_option'),'N');
6 
7   PROCEDURE debug( p_message IN varchar2) IS
8   BEGIN
9     IF l_debug = 'Y' THEN
10       cse_debug_pub.add(p_message);
11       IF nvl(fnd_global.conc_request_id, -1) <> -1 THEN
12         fnd_file.put_line(fnd_file.log, p_message);
13       END IF;
14     END IF;
15   EXCEPTION
16     WHEN others THEN
17       null;
18   END debug;
19 
20   PROCEDURE create_inst_asset(
21     px_inst_asset_rec   IN OUT nocopy csi_datastructures_pub.instance_asset_rec,
22     px_csi_txn_rec      IN OUT nocopy csi_datastructures_pub.transaction_rec,
23     x_return_status        OUT nocopy varchar2)
24   IS
25     l_lookup_tbl           csi_asset_pvt.lookup_tbl;
26     l_asset_count_rec      csi_asset_pvt.asset_count_rec;
27     l_asset_id_tbl         csi_asset_pvt.asset_id_tbl;
28     l_asset_loc_tbl        csi_asset_pvt.asset_loc_tbl;
29 
30     l_return_status        varchar2(1) := fnd_api.g_ret_sts_success;
31     l_msg_count            number;
32     l_msg_data             varchar2(2000);
33   BEGIN
34     x_return_status := fnd_api.g_ret_sts_success;
35 
36     px_inst_asset_rec.fa_sync_flag := 'Y';
37 
38     csi_asset_pvt.create_instance_asset(
39       p_api_version        => 1.0 ,
40       p_commit             => fnd_api.g_false,
41       p_init_msg_list      => fnd_api.g_true,
42       p_validation_level   => fnd_api.g_valid_level_full,
43       p_instance_asset_rec => px_inst_asset_rec,
44       p_txn_rec            => px_csi_txn_rec,
45       x_return_status      => l_return_status,
46       x_msg_count          => l_msg_count,
47       x_msg_data           => l_msg_data ,
48       p_lookup_tbl         => l_lookup_tbl,
49       p_asset_count_rec    => l_asset_count_rec,
50       p_asset_id_tbl       => l_asset_id_tbl,
51       p_asset_loc_tbl      => l_asset_loc_tbl);
52 
53     IF l_return_status <> fnd_api.g_ret_sts_success THEN
54       RAISE fnd_api.g_exc_error;
55     END IF;
56 
57   EXCEPTION
58     WHEN fnd_api.g_exc_error THEN
59       x_return_status := fnd_api.g_ret_sts_error;
60   END create_inst_asset;
61 
62   PROCEDURE update_inst_asset(
63     px_inst_asset_rec   IN OUT nocopy csi_datastructures_pub.instance_asset_rec,
64     px_csi_txn_rec      IN OUT nocopy csi_datastructures_pub.transaction_rec,
65     x_return_status        OUT nocopy varchar2)
66   IS
67 
68     l_lookup_tbl           csi_asset_pvt.lookup_tbl;
69     l_asset_count_rec      csi_asset_pvt.asset_count_rec;
70     l_asset_id_tbl         csi_asset_pvt.asset_id_tbl;
71     l_asset_loc_tbl        csi_asset_pvt.asset_loc_tbl;
72 
73     l_return_status        varchar2(1) := fnd_api.g_ret_sts_success;
74     l_msg_count            number;
75     l_msg_data             varchar2(2000);
76   BEGIN
77 
78     x_return_status := fnd_api.g_ret_sts_success;
79 
80     IF nvl(px_inst_asset_rec.instance_asset_id, fnd_api.g_miss_num) <> fnd_api.g_miss_num THEN
81 
82       px_inst_asset_rec.fa_sync_flag := 'Y';
83 
84       SELECT object_version_number
85       INTO   px_inst_asset_rec.object_version_number
86       FROM   csi_i_assets
87       WHERE  instance_asset_id = px_inst_asset_rec.instance_asset_id;
88 
89       csi_asset_pvt.update_instance_asset (
90         p_api_version         => 1.0,
91         p_commit              => fnd_api.g_false,
92         p_init_msg_list       => fnd_api.g_true,
93         p_validation_level    => fnd_api.g_valid_level_full,
94         p_instance_asset_rec  => px_inst_asset_rec,
95         p_txn_rec             => px_csi_txn_rec,
96         x_return_status       => l_return_status,
97         x_msg_count           => l_msg_count,
98         x_msg_data            => l_msg_data,
99         p_lookup_tbl          => l_lookup_tbl,
100         p_asset_count_rec     => l_asset_count_rec,
101         p_asset_id_tbl        => l_asset_id_tbl,
102         p_asset_loc_tbl       => l_asset_loc_tbl);
103 
104       IF l_return_status <> fnd_api.g_ret_sts_success THEN
105         RAISE fnd_api.g_exc_error;
106       END IF;
107 
108     END IF;
109 
110   EXCEPTION
111     WHEN fnd_api.g_exc_error THEN
112       x_return_status := fnd_api.g_ret_sts_error;
113   END update_inst_asset;
114 
115 
116   FUNCTION total_inst_asset_qty(
117     p_inst_asset_tbl    IN      csi_datastructures_pub.instance_asset_header_tbl)
118   RETURN number
119   IS
120     l_total_qty number := 0;
121   BEGIN
122     IF p_inst_asset_tbl.COUNT > 0 THEN
123       FOR l_ind IN p_inst_asset_tbl.FIRST .. p_inst_asset_tbl.LAST
124       LOOP
125         l_total_qty := l_total_qty +  p_inst_asset_tbl(l_ind).asset_quantity;
126       END LOOP;
127     END IF;
128     RETURN l_total_qty;
129   END total_inst_asset_qty;
130 
131 
132   PROCEDURE reinstate_inst_asset(
133     p_inst_asset_rec        IN     csi_datastructures_pub.instance_asset_header_rec,
134     p_units                 IN     number,
135     px_csi_txn_rec          IN OUT nocopy csi_datastructures_pub.transaction_rec,
136     x_return_status            OUT nocopy varchar2)
137   IS
138 
139     l_inst_asset_qry_rec       csi_datastructures_pub.instance_asset_query_rec;
140     l_inst_asset_tbl           csi_datastructures_pub.instance_asset_header_tbl;
141     l_time_stamp               date := null;
142 
143     l_total_inst_asset_qty     number := 0;
144     l_inst_asset_rec           csi_datastructures_pub.instance_asset_rec;
145 
146     l_return_status            varchar2(1) := fnd_api.g_ret_sts_success;
147     l_msg_count                number;
148     l_msg_data                 varchar2(2000);
149 
150   BEGIN
151     x_return_status := fnd_api.g_ret_sts_success;
152 
153     -- check if there is any instance asset record with in_service
154     l_inst_asset_qry_rec.fa_asset_id       := p_inst_asset_rec.fa_asset_id;
155     l_inst_asset_qry_rec.fa_book_type_code := p_inst_asset_rec.fa_book_type_code;
156     l_inst_asset_qry_rec.fa_location_id    := p_inst_asset_rec.fa_location_id;
157     l_inst_asset_qry_rec.update_status     := 'IN_SERVICE';
158 
159     csi_asset_pvt.get_instance_assets(
160       p_api_version              => 1.0,
161       p_commit                   => fnd_api.g_false,
162       p_init_msg_list            => fnd_api.g_true,
163       p_validation_level         => fnd_api.g_valid_level_full,
164       p_instance_asset_query_rec => l_inst_asset_qry_rec,
165       p_resolve_id_columns       => fnd_api.g_false,
166       p_time_stamp               => l_time_stamp,
167       x_instance_asset_tbl       => l_inst_asset_tbl,
168       x_return_status            => l_return_status,
169       x_msg_count                => l_msg_count,
170       x_msg_data                 => l_msg_data);
171 
172     IF l_return_status <> fnd_api.g_ret_sts_success THEN
173       RAISE fnd_api.g_exc_error;
174     END IF;
175 
176     IF l_inst_asset_tbl.COUNT > 0 THEN
177 
178       IF l_inst_asset_tbl.COUNT = 1 THEN
179 
180         l_inst_asset_rec.instance_asset_id := l_inst_asset_tbl(1).instance_asset_id;
181         l_inst_asset_rec.asset_quantity    := l_inst_asset_tbl(1).asset_quantity + p_units;
182 
183         update_inst_asset(
184           px_inst_asset_rec   => l_inst_asset_rec,
185           px_csi_txn_rec      => px_csi_txn_rec,
186           x_return_status     => l_return_status);
187 
188         IF l_return_status <> fnd_api.g_ret_sts_success THEN
189           RAISE fnd_api.g_exc_error;
190         END IF;
191 
192       ELSE
193         null;
194       END IF;
195 
196     ELSE
197 
198       l_inst_asset_rec.instance_asset_id := p_inst_asset_rec.instance_asset_id;
199       l_inst_asset_rec.update_status     := 'IN_SERVICE';
200       l_inst_asset_rec.asset_quantity    := p_units;
201 
202       update_inst_asset(
203         px_inst_asset_rec   => l_inst_asset_rec,
204         px_csi_txn_rec      => px_csi_txn_rec,
205         x_return_status     => l_return_status);
206 
207       IF l_return_status <> fnd_api.g_ret_sts_success THEN
208         RAISE fnd_api.g_exc_error;
209       END IF;
210 
211     END IF;
212 
213   EXCEPTION
214     WHEN fnd_api.g_exc_error THEN
215       x_return_status := fnd_api.g_ret_sts_error;
216   END reinstate_inst_asset;
217 
218   PROCEDURE retire_inst_asset(
219     p_inst_asset_id         IN     number,
220     px_csi_txn_rec          IN OUT nocopy csi_datastructures_pub.transaction_rec,
221     x_return_status            OUT nocopy varchar2)
222   IS
223 
224     l_inst_asset_rec       csi_datastructures_pub.instance_asset_rec;
225     l_return_status        varchar2(1) := fnd_api.g_ret_sts_success;
226 
227   BEGIN
228     x_return_status := fnd_api.g_ret_sts_success;
229 
230     l_inst_asset_rec.instance_asset_id         := p_inst_asset_id;
231     l_inst_asset_rec.update_status             := 'RETIRED';
232     l_inst_asset_rec.active_end_date           := sysdate;
233     l_inst_asset_rec.check_for_instance_expiry := fnd_api.g_false;
234 
235     update_inst_asset(
236       px_inst_asset_rec   => l_inst_asset_rec,
237       px_csi_txn_rec      => px_csi_txn_rec,
238       x_return_status     => l_return_status);
239 
240     IF l_return_status <> fnd_api.g_ret_sts_success THEN
241       RAISE fnd_api.g_exc_error;
242     END IF;
243 
244   EXCEPTION
245     WHEN fnd_api.g_exc_error THEN
246       x_return_status := fnd_api.g_ret_sts_error;
247   END retire_inst_asset;
248 
249   PROCEDURE split_inst_asset(
250     p_inst_asset_rec        IN     csi_datastructures_pub.instance_asset_header_rec,
251     p_quantity              IN     number,
252     px_csi_txn_rec          IN OUT nocopy csi_datastructures_pub.transaction_rec,
253     x_new_inst_asset_id        OUT nocopy number,
254     x_return_status            OUT nocopy varchar2)
255   IS
256     l_old_asset_qty        number;
257     l_inst_asset_rec       csi_datastructures_pub.instance_asset_rec;
258     l_lookup_tbl           csi_asset_pvt.lookup_tbl;
259     l_asset_count_rec      csi_asset_pvt.asset_count_rec;
260     l_asset_id_tbl         csi_asset_pvt.asset_id_tbl;
261     l_asset_loc_tbl        csi_asset_pvt.asset_loc_tbl;
262 
263     l_return_status        varchar2(1) := fnd_api.g_ret_sts_success;
264     l_msg_count            number;
265     l_msg_data             varchar2(2000);
266   BEGIN
267 
268     x_return_status := fnd_api.g_ret_sts_success;
269 
270     l_old_asset_qty := p_inst_asset_rec.asset_quantity - p_quantity;
271 
272     l_inst_asset_rec.instance_asset_id := p_inst_asset_rec.instance_asset_id;
273     l_inst_asset_rec.asset_quantity    := l_old_asset_qty;
274 
275     update_inst_asset(
276       px_inst_asset_rec   => l_inst_asset_rec,
277       px_csi_txn_rec      => px_csi_txn_rec,
278       x_return_status     => l_return_status);
279 
280     IF l_return_status <> fnd_api.g_ret_sts_success THEN
281       RAISE fnd_api.g_exc_error;
282     END IF;
283 
284     l_inst_asset_rec                   := null;
285     l_inst_asset_rec.instance_asset_id := fnd_api.g_miss_num;
286     l_inst_asset_rec.instance_id       := p_inst_asset_rec.instance_id;
287     l_inst_asset_rec.fa_asset_id       := p_inst_asset_rec.fa_asset_id;
288     l_inst_asset_rec.fa_book_type_code := p_inst_asset_rec.fa_book_type_code;
289     l_inst_asset_rec.fa_location_id    := p_inst_asset_rec.fa_location_id;
290     l_inst_asset_rec.asset_quantity    := p_quantity;
291     l_inst_asset_rec.update_status     := 'IN_SERVICE';
292     l_inst_asset_rec.fa_sync_flag      := 'Y';
293 
294     create_inst_asset(
295       px_inst_asset_rec   => l_inst_asset_rec,
296       px_csi_txn_rec      => px_csi_txn_rec,
297       x_return_status     => l_return_status);
298 
299     IF l_return_status <> fnd_api.g_ret_sts_success THEN
300       RAISE fnd_api.g_exc_error;
301     END IF;
302 
303   EXCEPTION
304     WHEN fnd_api.g_exc_error THEN
305       x_return_status := fnd_api.g_ret_sts_error;
306   END split_inst_asset;
307 
308   PROCEDURE asset_retirement(
309     p_instance_id           IN     NUMBER,
310     p_book_type_code        IN     VARCHAR2,
311     p_asset_id              IN     NUMBER,
312     p_units                 IN     NUMBER,
313     p_trans_date            IN     DATE,
314     p_trans_by              IN     NUMBER,
315     px_txn_rec              IN OUT NOCOPY csi_datastructures_pub.transaction_rec,
316     x_return_status            OUT NOCOPY VARCHAR2,
317     x_error_message            OUT NOCOPY VARCHAR2)
318   IS
319 
320     l_inst_asset_qry_rec       csi_datastructures_pub.instance_asset_query_rec;
321     l_inst_asset_tbl           csi_datastructures_pub.instance_asset_header_tbl;
322     l_time_stamp               date := null;
323 
324     l_new_inst_asset_id        number;
325     l_total_inst_asset_qty     number := 0;
326 
327     l_return_status            varchar2(1) := fnd_api.g_ret_sts_success;
328     l_msg_count                number;
329     l_msg_data                 varchar2(2000);
330 
331   BEGIN
332 
333     x_return_status := fnd_api.g_ret_sts_success;
334 
335     debug('inside api cse_fa_txn_pkg.asset_retirement');
336 
337     l_inst_asset_qry_rec.instance_id       := p_instance_id;
338     l_inst_asset_qry_rec.fa_asset_id       := p_asset_id;
339     l_inst_asset_qry_rec.fa_book_type_code := p_book_type_code;
340     l_inst_asset_qry_rec.update_status     := 'IN_SERVICE';
341 
342     csi_asset_pvt.get_instance_assets(
343       p_api_version              => 1.0,
344       p_commit                   => fnd_api.g_false,
345       p_init_msg_list            => fnd_api.g_true,
346       p_validation_level         => fnd_api.g_valid_level_full,
347       p_instance_asset_query_rec => l_inst_asset_qry_rec,
348       p_resolve_id_columns       => fnd_api.g_false,
349       p_time_stamp               => l_time_stamp,
350       x_instance_asset_tbl       => l_inst_asset_tbl,
351       x_return_status            => l_return_status,
352       x_msg_count                => l_msg_count,
353       x_msg_data                 => l_msg_data);
354 
355     IF l_return_status <> fnd_api.g_ret_sts_success THEN
356       RAISE fnd_api.g_exc_error;
357     END IF;
358 
359     IF l_inst_asset_tbl.COUNT > 0 THEN
360 
361       IF nvl(px_txn_rec.transaction_id, fnd_api.g_miss_num) = fnd_api.g_miss_num THEN
362         px_txn_rec.transaction_date        := sysdate;
363         px_txn_rec.source_transaction_date := sysdate;
364         px_txn_rec.transaction_type_id     := 104;
365         px_txn_rec.source_line_ref         := 'ASSET_ID';
366         px_txn_rec.source_line_ref_id      := p_asset_id;
367         px_txn_rec.source_group_ref_id     := fnd_global.conc_request_id;
368         px_txn_rec.transaction_status_code := cse_datastructures_pub.g_complete;
369         px_txn_rec.transaction_quantity    := p_units;
370       END IF;
371 
372       IF l_inst_asset_tbl.COUNT = 1 THEN
373         IF l_inst_asset_tbl(1).asset_quantity > p_units THEN
374 
375           split_inst_asset(
376             p_inst_asset_rec     => l_inst_asset_tbl(1),
377             p_quantity           => p_units,
378             px_csi_txn_rec       => px_txn_rec,
379             x_new_inst_asset_id  => l_new_inst_asset_id,
380             x_return_status      => l_return_status);
381 
382           IF l_return_status <> fnd_api.g_ret_sts_success THEN
383             RAISE fnd_api.g_exc_error;
384           END IF;
385 
386           retire_inst_asset(
387             p_inst_asset_id      => l_new_inst_asset_id,
388             px_csi_txn_rec       => px_txn_rec,
389             x_return_status      => l_return_status);
390 
391           IF l_return_status <> fnd_api.g_ret_sts_success THEN
392             RAISE fnd_api.g_exc_error;
393           END IF;
394 
395         ELSE
396 
397           retire_inst_asset(
398             p_inst_asset_id      => l_inst_asset_tbl(1).instance_asset_id,
399             px_csi_txn_rec       => px_txn_rec,
400             x_return_status      => l_return_status);
401 
402           IF l_return_status <> fnd_api.g_ret_sts_success THEN
403             RAISE fnd_api.g_exc_error;
404           END IF;
405 
406         END IF;
407 
408       ELSE  -- quantity > 1
409         -- try and see if the retirement units match with the total inst asset quantity
410         l_total_inst_asset_qty := total_inst_asset_qty(l_inst_asset_tbl);
411 
412         IF l_total_inst_asset_qty <=  p_units THEN
413           FOR l_ind IN l_inst_asset_tbl.FIRST .. l_inst_asset_tbl.LAST
414           LOOP
415 
416             retire_inst_asset(
417               p_inst_asset_id      => l_inst_asset_tbl(l_ind).instance_asset_id,
418               px_csi_txn_rec       => px_txn_rec,
419               x_return_status      => l_return_status);
420 
421             IF l_return_status <> fnd_api.g_ret_sts_success THEN
422               RAISE fnd_api.g_exc_error;
423             END IF;
424 
425           END LOOP;
426 
427         ELSE
428           null;
429           -- could not figure out which one to retire.
430         END IF;
431 
432       END IF;
433     END IF;
434 
435   EXCEPTION
436     WHEN fnd_api.g_exc_error THEN
437       x_return_status := fnd_api.g_ret_sts_error;
438   END asset_retirement;
439 
440   PROCEDURE asset_reinstatement(
441     p_retirement_id         IN     NUMBER,
442     p_book_type_code        IN     VARCHAR2,
443     p_asset_id              IN     NUMBER,
444     p_units                 IN     NUMBER,
445     p_trans_date            IN     DATE,
446     p_trans_by              IN     NUMBER,
447     x_return_status            OUT NOCOPY VARCHAR2,
448     x_error_message            OUT NOCOPY VARCHAR2)
449   IS
450 
451     l_inst_asset_qry_rec       csi_datastructures_pub.instance_asset_query_rec;
452     l_inst_asset_tbl           csi_datastructures_pub.instance_asset_header_tbl;
453     l_csi_txn_rec              csi_datastructures_pub.transaction_rec;
454     l_time_stamp               date := null;
455     l_new_inst_asset_id        number;
456 
457     l_return_status            varchar2(1) := fnd_api.g_ret_sts_success;
458     l_msg_count                number;
459     l_msg_data                 varchar2(2000);
460 
461     CURSOR dist_cur(p_retirement_id IN number) IS
462       SELECT distribution_id,
463              units_assigned,
464              transaction_units,
465              location_id,
466              assigned_to
467       FROM   fa_distribution_history
468       WHERE  retirement_id = p_retirement_id;
469 
470   BEGIN
471     x_return_status := fnd_api.g_ret_sts_success;
472 
473     FOR dist_rec IN dist_cur(p_retirement_id)
474     LOOP
475 
476       l_inst_asset_qry_rec.fa_asset_id       := p_asset_id;
477       l_inst_asset_qry_rec.fa_book_type_code := p_book_type_code;
478       l_inst_asset_qry_rec.update_status     := 'RETIRED';
479       l_inst_asset_qry_rec.fa_location_id    := dist_rec.location_id;
480 
481       csi_asset_pvt.get_instance_assets(
482         p_api_version              => 1.0,
483         p_commit                   => fnd_api.g_false,
484         p_init_msg_list            => fnd_api.g_true,
485         p_validation_level         => fnd_api.g_valid_level_full,
486         p_instance_asset_query_rec => l_inst_asset_qry_rec,
487         p_resolve_id_columns       => fnd_api.g_false,
488         p_time_stamp               => l_time_stamp,
489         x_instance_asset_tbl       => l_inst_asset_tbl,
490         x_return_status            => l_return_status,
491         x_msg_count                => l_msg_count,
492         x_msg_data                 => l_msg_data);
493 
494       IF l_return_status <> fnd_api.g_ret_sts_success THEN
495         RAISE fnd_api.g_exc_error;
496       END IF;
497 
498       IF l_inst_asset_tbl.COUNT > 0 THEN
499 
500         l_csi_txn_rec.transaction_id          := fnd_api.g_miss_num;
501         l_csi_txn_rec.transaction_date        := sysdate;
502         l_csi_txn_rec.source_transaction_date := sysdate;
503         l_csi_txn_rec.transaction_type_id     := 103;
504         l_csi_txn_rec.source_line_ref         := 'ASSET_ID';
505         l_csi_txn_rec.source_line_ref_id      := p_asset_id;
506         l_csi_txn_rec.transaction_status_code := cse_datastructures_pub.g_complete;
507         l_csi_txn_rec.transaction_quantity    := p_units;
508 
509         IF l_inst_asset_tbl.COUNT = 1 THEN
510 
511           reinstate_inst_asset(
512             p_inst_asset_rec      => l_inst_asset_tbl(1),
513             p_units               => p_units,
514             px_csi_txn_rec        => l_csi_txn_rec,
515             x_return_status       => l_return_status);
516 
517           IF l_return_status <> fnd_api.g_ret_sts_success THEN
518             RAISE fnd_api.g_exc_error;
519           END IF;
520 
521         ELSE
522 
523           -- just reinstate one of the retired instance asset
524           reinstate_inst_asset(
525             p_inst_asset_rec      => l_inst_asset_tbl(1),
526             p_units               => p_units,
527             px_csi_txn_rec        => l_csi_txn_rec,
528             x_return_status       => l_return_status);
529 
530           IF l_return_status <> fnd_api.g_ret_sts_success THEN
531             RAISE fnd_api.g_exc_error;
532           END IF;
533 
534         END IF;
535       END IF;
536 
537     END LOOP;
538 
539   EXCEPTION
540     WHEN fnd_api.g_exc_error THEN
541       x_return_status := fnd_api.g_ret_sts_error;
542   END asset_reinstatement;
543 
544 
545   PROCEDURE populate_retirement_interface(
546     p_csi_txn_id          IN number,
547     p_asset_id            IN number,
548     p_book_type_code      IN varchar2,
549     p_fa_location_id      IN number,
550     p_proceeds_of_sale    IN number,
551     p_cost_of_removal     IN number,
552     p_retirement_units    IN number,
553     p_retirement_date     IN date,
554     x_return_status       OUT nocopy varchar2)
555   IS
556     l_ext_ret_rec            fa_mass_ext_retirements%ROWTYPE;
557     l_batch_name             varchar2(30);
558     l_mass_ext_retire_id     number;
559     l_prorate_convention     varchar2(20);
560 
561     l_return_status          varchar2(1) := fnd_api.g_ret_sts_success;
562     l_error_message          varchar2(2000);
563 
564     CURSOR prorate_conv_cur(p_asset_id number,p_book_type_code varchar2) IS
565       SELECT fcbd.retirement_prorate_convention
566       FROM   fa_category_book_defaults fcbd,
567              fa_books       fb,
568              fa_additions_b fab
569       WHERE  fab.asset_id = p_asset_id
570       AND    fb.asset_id  = fab.asset_id
571       and    fb.book_type_code  = p_book_type_code
572       AND    fb.date_ineffective is null
573       AND    fcbd.book_type_code = fb.book_type_code
574       AND    fcbd.category_id    = fab.asset_category_id;
575 
576     CURSOR fa_dist_cur(p_asset_id number,p_book_type_code varchar2, p_fa_location_id number) IS
577       SELECT distribution_id,
578              assigned_to,
579              units_assigned
580       FROM   fa_distribution_history
581       WHERE  asset_id         = p_asset_id
582       AND    book_type_code   = p_book_type_code
583       AND    location_id      = p_fa_location_id
584       AND    date_ineffective is null;
585 
586     l_units_retired number;
587 
588   BEGIN
589 
590     x_return_status := fnd_api.g_ret_sts_success;
591 
592     debug('inside api cse_asset_txn_pkg.populate_retirement_interface');
593 
594     l_batch_name := 'CSE-'||p_csi_txn_id;
595 
596     debug('  batch_name             : '||l_batch_name);
597 
598     FOR prorate_conv_rec IN prorate_conv_cur(p_asset_id, p_book_type_code)
599     LOOP
600       l_prorate_convention := prorate_conv_rec.retirement_prorate_convention;
601     END LOOP;
602 
603     debug('  prorate_convention     : '||l_prorate_convention);
604 
605     l_units_retired := p_retirement_units;
606 
607     FOR fa_dist_rec IN fa_dist_cur(p_asset_id, p_book_type_code, p_fa_location_id)
608     LOOP
609 
610       l_units_retired := l_units_retired - fa_dist_rec.units_assigned;
611 
612       SELECT fa_mass_ext_retirements_s.nextval
613       INTO   l_mass_ext_retire_id
614       FROM   sys.dual ;
615 
616       debug('  fa_distribution_id     : '||fa_dist_rec.distribution_id);
617       debug('  mass_ext_retire_id     : '||l_mass_ext_retire_id);
618 
619       l_ext_ret_rec.mass_external_retire_id       := l_mass_ext_retire_id;
620       l_ext_ret_rec.retirement_prorate_convention := l_prorate_convention;
621       l_ext_ret_rec.batch_name           := l_batch_name;
622       l_ext_ret_rec.book_type_code       := p_book_type_code;
623       l_ext_ret_rec.review_status        := 'POST';
624       l_ext_ret_rec.retirement_type_code := 'EXTRAORDINARY';
625       l_ext_ret_rec.asset_id             := p_asset_id;
626       l_ext_ret_rec.date_retired         := p_retirement_date;
627       l_ext_ret_rec.date_effective       := p_retirement_date;
628       l_ext_ret_rec.units                := fa_dist_rec.units_assigned;
629       l_ext_ret_rec.cost_of_removal      := p_cost_of_removal;
630       l_ext_ret_rec.proceeds_of_sale     := p_proceeds_of_sale;
631       l_ext_ret_rec.calc_gain_loss_flag  := 'N';
632       l_ext_ret_rec.created_by           := fnd_global.user_id;
633       l_ext_ret_rec.creation_date        := sysdate;
634       l_ext_ret_rec.last_updated_by      := fnd_global.user_id;
635       l_ext_ret_rec.last_update_date     := sysdate;
636       l_ext_ret_rec.last_update_login    := fnd_global.login_id;
637       l_ext_ret_rec.distribution_id      := fa_dist_rec.distribution_id ;
638 
639       cse_asset_adjust_pkg.insert_retirement(
640         p_ext_ret_rec    => l_ext_ret_rec,
641         x_return_status  => l_return_status,
642         x_error_msg      => l_error_message);
643 
644       IF l_return_status <> fnd_api.g_ret_sts_success THEN
645         RAISE fnd_api.g_exc_error;
646       END IF;
647 
648       EXIT when l_units_retired <= 0;
649 
650     END LOOP;
651 
652   EXCEPTION
653     WHEN fnd_api.g_exc_error THEN
654       x_return_status := fnd_api.g_ret_sts_error;
655   END populate_retirement_interface;
656 
657 
658 END cse_fa_txn_pkg;