DBA Data[Home] [Help]

PACKAGE BODY: APPS.INV_RCV_CACHE

Source


1 PACKAGE BODY INV_RCV_CACHE AS
2 /* $Header: INVRCSHB.pls 120.3.12010000.2 2010/05/20 09:40:04 skommine ship $*/
3 
4 PROCEDURE print_debug(p_err_msg VARCHAR2
5 		      ,p_module IN VARCHAR2 := ' '
6 		      ,p_level NUMBER := 4)
7   IS
8      l_debug NUMBER;
9 BEGIN
10    l_debug := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
11    inv_mobile_helper_functions.tracelog
12      (p_err_msg => p_err_msg
13       ,p_module => 'INV_RCV_CACHE.'||p_module
14       ,p_level => p_level);
15 END;
16 
17 FUNCTION convert_qty
18   (p_inventory_item_id   IN NUMBER
19    ,p_from_qty           IN NUMBER
20    ,p_from_uom_code      IN VARCHAR2
21    ,p_to_uom_code        IN VARCHAR2
22    ,p_precision          IN NUMBER DEFAULT NULL
23    , p_organization_id   IN NUMBER DEFAULT NULL --Bug#9570776
24    , p_lot_number        IN VARCHAR2 DEFAULT NULL --Bug#9570776
25    )
26   RETURN NUMBER IS
27      l_conversion_rate          NUMBER;
28      l_to_qty                   NUMBER;
29 
30      l_debug                    NUMBER;
31      l_progress                 VARCHAR2(10);
32      l_module_name              VARCHAR2(30);
33 
34 BEGIN
35 
36    l_debug := NVL(fnd_profile.VALUE('INV_DEBUG_TRACE'), 0);
37    l_progress := '10';
38    l_module_name := 'CONVERT_QTY';
39 
40    IF (l_debug = 1) THEN
41       print_debug('Entering convert_qty...',l_module_name,4);
42       print_debug(' p_inventory_item_id => '||p_inventory_item_id,l_module_name,4);
43       print_debug(' p_from_uom_code     => '||p_from_uom_code,l_module_name,4);
44       print_debug(' p_to_uom_code       => '||p_to_uom_code,l_module_name,4);
45       print_debug(' p_from_qty          => '||p_from_qty,l_module_name,4);
46       print_debug(' p_precision         => '||p_precision,l_module_name,4);
47    END IF;
48 
49    IF (p_inventory_item_id IS NULL) THEN
50       IF (l_debug = 1) THEN
51 	 print_debug(' No caching for cases without item_id',4);
52       END IF;
53 
54       l_to_qty := inv_convert.inv_um_convert
55 	             (item_id           => p_inventory_item_id,
56 		      precision         => Nvl(p_precision,g_conversion_precision),
57 		      from_quantity     => p_from_qty,
58 		      from_unit         => p_from_uom_code,
59 		      to_unit           => p_to_uom_code,
60 		      from_name         => null,
61 		      to_name           => null);
62 
63       IF (l_debug = 1) THEN
64 	 print_debug(' x_to_qty            => '||l_to_qty,l_module_name,4);
65       END IF;
66 
67       RETURN l_to_qty;
68    /*Bug#9570776 Added the below elsif to consider the lot specific conversion
69       when the lot number is not passed */
70    ELSIF (p_inventory_item_id IS NOT NULL) AND (p_lot_number IS NOT NULL) THEN
71       IF (l_debug = 1) THEN
72 	 print_debug(' lot specific conversion ',4);
73       END IF;
74 
75       l_to_qty := inv_convert.inv_um_convert
76 	             (item_id           => p_inventory_item_id,
77                       organization_id    => p_organization_id,
78 		      lot_number         => p_lot_number,
79 		      precision         => Nvl(p_precision,g_conversion_precision),
80 		      from_quantity     => p_from_qty,
81 		      from_unit         => p_from_uom_code,
82 		      to_unit           => p_to_uom_code,
83 		      from_name         => null,
84 		      to_name           => null);
85 
86       IF (l_debug = 1) THEN
87 	 print_debug(' x_to_qty            => '||l_to_qty,l_module_name,4);
88       END IF;
89 
90       RETURN l_to_qty;
91    END IF;
92 
93    IF (g_item_uom_conversion_tb.exists(p_inventory_item_id) AND
94        g_item_uom_conversion_tb(p_inventory_item_id).exists(p_from_uom_code) AND
95        g_item_uom_conversion_tb(p_inventory_item_id)(p_from_uom_code).exists(p_to_uom_code)) THEN
96       l_conversion_rate := g_item_uom_conversion_tb(p_inventory_item_id)(p_from_uom_code)(p_to_uom_code);
97     ELSE
98       inv_convert.inv_um_conversion(from_unit  => p_from_uom_code,
99 				    to_unit    => p_to_uom_code,
100 				    item_id    => p_inventory_item_id,
101 				    uom_rate   => l_conversion_rate);
102 
103       IF (l_conversion_rate < 0) THEN
104 	 RAISE fnd_api.g_exc_error;
105       END IF;
106 
107       g_item_uom_conversion_tb(p_inventory_item_id)(p_from_uom_code)(p_to_uom_code) := l_conversion_rate;
108       g_item_uom_conversion_tb(p_inventory_item_id)(p_to_uom_code)(p_from_uom_code) := 1 / l_conversion_rate;
109 
110    END IF;
111 
112    l_to_qty := Round(l_conversion_rate*p_from_qty,Nvl(p_precision,g_conversion_precision));
113 
114    IF (l_debug = 1) THEN
115       print_debug(' x_to_qty            => '||l_to_qty,l_module_name,4);
116    END IF;
117 
118    RETURN l_to_qty;
119 EXCEPTION
120    WHEN OTHERS THEN
121       IF (l_debug = 1) THEN
122 	 print_debug('Exception occurred inside convert_qty!',l_module_name,4);
123       END IF;
124       RETURN -1;
125 END convert_qty;
126 
127 FUNCTION get_primary_uom_code
128   (p_organization_id     IN NUMBER
129    ,p_inventory_item_id  IN NUMBER
130    ) RETURN VARCHAR2 IS
131       l_debug                    NUMBER;
132       l_progress                 VARCHAR2(10);
133       l_module_name              VARCHAR2(30);
134 BEGIN
135    l_debug := NVL(fnd_profile.VALUE('INV_DEBUG_TRACE'), 0);
136    l_progress := '10';
137    l_module_name := 'GET_PRIMARY_UOM_CODE';
138 
139    IF (l_debug = 1) THEN
140       print_debug('Entering get_primary_uom_code...',l_module_name,4);
141       print_debug(' p_inventory_item_id    => '||p_inventory_item_id,l_module_name,4);
142       print_debug(' p_organization_id      => '||p_organization_id,l_module_name,4);
143    END IF;
144 
145    IF (g_org_item_attrib_tb.exists(p_organization_id) AND
146        g_org_item_attrib_tb(p_organization_id).exists(p_inventory_item_id)) THEN
147       IF (l_debug = 1) THEN
148 	 print_debug(' x_prim_uom_code (Cache) => '||
149 		     g_org_item_attrib_tb(p_organization_id)(p_inventory_item_id).primary_uom_code,l_module_name,4);
150       END IF;
151       RETURN g_org_item_attrib_tb(p_organization_id)(p_inventory_item_id).primary_uom_code;
152     ELSE
153       BEGIN
154 	 SELECT primary_uom_code
155 	   ,    secondary_uom_code
156 	   ,    lot_control_code
157 	   ,    serial_number_control_code
158 	   INTO g_org_item_attrib_tb(p_organization_id)(p_inventory_item_id).primary_uom_code
159 	   ,    g_org_item_attrib_tb(p_organization_id)(p_inventory_item_id).secondary_uom_code
160 	   ,    g_org_item_attrib_tb(p_organization_id)(p_inventory_item_id).lot_control_code
161 	   ,    g_org_item_attrib_tb(p_organization_id)(p_inventory_item_id).serial_number_control_code
162 	   FROM   mtl_system_items
163 	   WHERE  organization_id = p_organization_id
164 	   AND    inventory_item_id = p_inventory_item_id;
165       EXCEPTION
166 	 WHEN OTHERS THEN
167 	    IF (l_debug = 1) THEN
168 	       print_debug('Unable to query from db!',l_module_name,4);
169 	    END IF;
170 	    RAISE fnd_api.g_exc_error;
171       END;
172 
173       IF (l_debug = 1) THEN
174 	 print_debug(' x_prim_uom_code (DB)     => '||
175 		     g_org_item_attrib_tb(p_organization_id)(p_inventory_item_id).primary_uom_code,l_module_name,4);
176       END IF;
177 
178       RETURN g_org_item_attrib_tb(p_organization_id)(p_inventory_item_id).primary_uom_code;
179    END IF;
180 EXCEPTION
181    WHEN OTHERS THEN
182       IF (l_debug = 1) THEN
183 	 print_debug('Exception occurred inside GET_PRIMARY_UOM_CODE!',l_module_name,4);
184       END IF;
185       RETURN NULL;
186 END get_primary_uom_code;
187 
188 FUNCTION get_secondary_uom_code
189   (p_organization_id     IN NUMBER
190    ,p_inventory_item_id  IN NUMBER
191    ) RETURN VARCHAR2 IS
192       l_debug                    NUMBER;
193       l_progress                 VARCHAR2(10);
194       l_module_name              VARCHAR2(30);
195 BEGIN
196    l_debug := NVL(fnd_profile.VALUE('INV_DEBUG_TRACE'), 0);
197    l_progress := '10';
198    l_module_name := 'GET_SECONDARY_UOM_CODE';
199 
200    IF (l_debug = 1) THEN
201       print_debug('Entering get_secondary_uom_code...',l_module_name,4);
202       print_debug(' p_inventory_item_id    => '||p_inventory_item_id,l_module_name,4);
203       print_debug(' p_organization_id      => '||p_organization_id,l_module_name,4);
204    END IF;
205 
206    IF (g_org_item_attrib_tb.exists(p_organization_id) AND
207        g_org_item_attrib_tb(p_organization_id).exists(p_inventory_item_id)) THEN
208       IF (l_debug = 1) THEN
209 	 print_debug(' x_prim_uom_code (Cache) => '||
210 		     g_org_item_attrib_tb(p_organization_id)(p_inventory_item_id).secondary_uom_code,l_module_name,4);
211       END IF;
212       RETURN g_org_item_attrib_tb(p_organization_id)(p_inventory_item_id).secondary_uom_code;
213     ELSE
214       BEGIN
215 	 SELECT primary_uom_code
216 	   ,    secondary_uom_code
217 	   ,    lot_control_code
218 	   ,    serial_number_control_code
219 	   INTO g_org_item_attrib_tb(p_organization_id)(p_inventory_item_id).primary_uom_code
220 	   ,    g_org_item_attrib_tb(p_organization_id)(p_inventory_item_id).secondary_uom_code
221 	   ,    g_org_item_attrib_tb(p_organization_id)(p_inventory_item_id).lot_control_code
222 	   ,    g_org_item_attrib_tb(p_organization_id)(p_inventory_item_id).serial_number_control_code
223 	   FROM   mtl_system_items
224 	   WHERE  organization_id = p_organization_id
225 	   AND    inventory_item_id = p_inventory_item_id;
226       EXCEPTION
227 	 WHEN OTHERS THEN
228 	    IF (l_debug = 1) THEN
229 	       print_debug('Unable to query from db!',l_module_name,4);
230 	    END IF;
231 	    RAISE fnd_api.g_exc_error;
232       END;
233 
234       IF (l_debug = 1) THEN
235 	 print_debug(' x_prim_uom_code (DB)     => '||
236 		     g_org_item_attrib_tb(p_organization_id)(p_inventory_item_id).secondary_uom_code,l_module_name,4);
237       END IF;
238 
239       RETURN g_org_item_attrib_tb(p_organization_id)(p_inventory_item_id).secondary_uom_code;
240    END IF;
241 EXCEPTION
242    WHEN OTHERS THEN
243       IF (l_debug = 1) THEN
244 	 print_debug('Exception occurred inside GET_SECONDARY_UOM_CODE!',l_module_name,4);
245       END IF;
246       RETURN NULL;
247 END get_secondary_uom_code;
248 
249 FUNCTION get_sn_ctrl_code
250   (p_organization_id     IN NUMBER
251    ,p_inventory_item_id  IN NUMBER
252    ) RETURN NUMBER IS
253       l_debug                    NUMBER;
254       l_progress                 VARCHAR2(10);
255       l_module_name              VARCHAR2(30);
256 BEGIN
257    l_debug := NVL(fnd_profile.VALUE('INV_DEBUG_TRACE'), 0);
258    l_progress := '10';
259    l_module_name := 'GET_SN_CTRL_CODE';
260 
261    IF (l_debug = 1) THEN
262       print_debug('Entering get_sn_ctrl_code...',l_module_name,4);
263       print_debug(' p_inventory_item_id    => '||p_inventory_item_id,l_module_name,4);
264       print_debug(' p_organization_id      => '||p_organization_id,l_module_name,4);
265    END IF;
266 
267    IF (g_org_item_attrib_tb.exists(p_organization_id) AND
268        g_org_item_attrib_tb(p_organization_id).exists(p_inventory_item_id)) THEN
269       IF (l_debug = 1) THEN
270 	 print_debug(' x_sn_ctrl_code (Cache) => '||
271 		     g_org_item_attrib_tb(p_organization_id)(p_inventory_item_id).serial_number_control_code,l_module_name,4);
272       END IF;
273       RETURN g_org_item_attrib_tb(p_organization_id)(p_inventory_item_id).serial_number_control_code;
274     ELSE
275       BEGIN
276 	 SELECT primary_uom_code
277 	   ,    secondary_uom_code
278 	   ,    lot_control_code
279 	   ,    serial_number_control_code
280 	   INTO g_org_item_attrib_tb(p_organization_id)(p_inventory_item_id).primary_uom_code
281 	   ,    g_org_item_attrib_tb(p_organization_id)(p_inventory_item_id).secondary_uom_code
282 	   ,    g_org_item_attrib_tb(p_organization_id)(p_inventory_item_id).lot_control_code
283 	   ,    g_org_item_attrib_tb(p_organization_id)(p_inventory_item_id).serial_number_control_code
284 	   FROM   mtl_system_items
285 	   WHERE  organization_id = p_organization_id
286 	   AND    inventory_item_id = p_inventory_item_id;
287       EXCEPTION
288 	 WHEN OTHERS THEN
289 	    IF (l_debug = 1) THEN
290 	       print_debug('Unable to query from db!',l_module_name,4);
291 	    END IF;
292 	    RAISE fnd_api.g_exc_error;
293       END;
294 
295       IF (l_debug = 1) THEN
296 	 print_debug(' x_sn_ctrl_code (DB)     => '||
297 		     g_org_item_attrib_tb(p_organization_id)(p_inventory_item_id).serial_number_control_code,l_module_name,4);
298       END IF;
299 
300       RETURN g_org_item_attrib_tb(p_organization_id)(p_inventory_item_id).serial_number_control_code;
301    END IF;
302 EXCEPTION
303    WHEN OTHERS THEN
304       IF (l_debug = 1) THEN
305 	 print_debug('Exception occurred inside GET_SN_CTRL_CODE!',l_module_name,4);
306       END IF;
307       RETURN NULL;
308 END get_sn_ctrl_code;
309 
310 FUNCTION get_lot_control_code
311   (p_organization_id     IN NUMBER
312    ,p_inventory_item_id  IN NUMBER
313    ) RETURN NUMBER IS
314       l_debug                    NUMBER;
315       l_progress                 VARCHAR2(10);
316       l_module_name              VARCHAR2(30);
317 BEGIN
318    l_debug := NVL(fnd_profile.VALUE('INV_DEBUG_TRACE'), 0);
319    l_progress := '10';
320    l_module_name := 'GET_LOT_CONTROL_CODE';
321 
322    IF (l_debug = 1) THEN
323       print_debug('Entering get_lot_control_code...',l_module_name,4);
324       print_debug(' p_inventory_item_id    => '||p_inventory_item_id,l_module_name,4);
325       print_debug(' p_organization_id      => '||p_organization_id,l_module_name,4);
326    END IF;
327 
328    IF (g_org_item_attrib_tb.exists(p_organization_id) AND
329        g_org_item_attrib_tb(p_organization_id).exists(p_inventory_item_id)) THEN
330       IF (l_debug = 1) THEN
331 	 print_debug(' x_lot_control_code (Cache) => '||
332 		     g_org_item_attrib_tb(p_organization_id)(p_inventory_item_id).lot_control_code,l_module_name,4);
333       END IF;
334       RETURN g_org_item_attrib_tb(p_organization_id)(p_inventory_item_id).lot_control_code;
335     ELSE
336       BEGIN
337 	 SELECT primary_uom_code
338 	   ,    secondary_uom_code
339 	   ,    lot_control_code
340 	   ,    serial_number_control_code
341 	   INTO g_org_item_attrib_tb(p_organization_id)(p_inventory_item_id).primary_uom_code
342 	   ,    g_org_item_attrib_tb(p_organization_id)(p_inventory_item_id).secondary_uom_code
343 	   ,    g_org_item_attrib_tb(p_organization_id)(p_inventory_item_id).lot_control_code
344 	   ,    g_org_item_attrib_tb(p_organization_id)(p_inventory_item_id).serial_number_control_code
345 	   FROM   mtl_system_items
346 	   WHERE  organization_id = p_organization_id
347 	   AND    inventory_item_id = p_inventory_item_id;
348       EXCEPTION
349 	 WHEN OTHERS THEN
350 	    IF (l_debug = 1) THEN
351 	       print_debug('Unable to query from db!',l_module_name,4);
352 	    END IF;
353 	    RAISE fnd_api.g_exc_error;
354       END;
355 
356       IF (l_debug = 1) THEN
357 	 print_debug(' x_lot_control_code (DB)     => '||
358 		     g_org_item_attrib_tb(p_organization_id)(p_inventory_item_id).lot_control_code,l_module_name,4);
359       END IF;
360 
361       RETURN g_org_item_attrib_tb(p_organization_id)(p_inventory_item_id).lot_control_code;
362    END IF;
363 EXCEPTION
364    WHEN OTHERS THEN
365       IF (l_debug = 1) THEN
366 	 print_debug('Exception occurred inside GET_LOT_CONTROL_CODE!',l_module_name,4);
367       END IF;
368       RETURN NULL;
369 END get_lot_control_code;
370 
371 FUNCTION get_conversion_rate
372   (p_inventory_item_id   IN NUMBER
373    ,p_from_uom_code      IN VARCHAR2
374    ,p_to_uom_code        IN VARCHAR2
375    )
376    RETURN NUMBER IS
377 
378      l_conversion_rate          NUMBER;
379 
380      l_debug                    NUMBER;
381      l_progress                 VARCHAR2(10);
382      l_module_name              VARCHAR2(30);
383 BEGIN
384 
385    l_debug := NVL(fnd_profile.VALUE('INV_DEBUG_TRACE'), 0);
386    l_progress := '10';
387    l_module_name := 'GET_CONVERSION_RATE';
388 
389    IF (l_debug = 1) THEN
390       print_debug('Entering convert_qty...',l_module_name,4);
391       print_debug(' p_inventory_item_id => '||p_inventory_item_id,l_module_name,4);
392       print_debug(' p_from_uom_code     => '||p_from_uom_code,l_module_name,4);
393       print_debug(' p_to_uom_code       => '||p_to_uom_code,l_module_name,4);
394    END IF;
395 
396    IF (g_item_uom_conversion_tb.exists(p_inventory_item_id) AND
397        g_item_uom_conversion_tb(p_inventory_item_id).exists(p_from_uom_code) AND
398        g_item_uom_conversion_tb(p_inventory_item_id)(p_from_uom_code).exists(p_to_uom_code)) THEN
399       l_conversion_rate := g_item_uom_conversion_tb(p_inventory_item_id)(p_from_uom_code)(p_to_uom_code);
400     ELSE
401       inv_convert.inv_um_conversion(from_unit  => p_from_uom_code,
402 				    to_unit    => p_to_uom_code,
403 				    item_id    => p_inventory_item_id,
404 				    uom_rate   => l_conversion_rate);
405 
406       IF (l_conversion_rate < 0) THEN
407 	 RAISE fnd_api.g_exc_error;
408       END IF;
409 
410       g_item_uom_conversion_tb(p_inventory_item_id)(p_from_uom_code)(p_to_uom_code) := l_conversion_rate;
411       g_item_uom_conversion_tb(p_inventory_item_id)(p_to_uom_code)(p_from_uom_code) := 1 / l_conversion_rate;
412 
413    END IF;
414 
415    IF (l_debug = 1) THEN
416       print_debug(' x_conversion_rate   => '||l_conversion_rate,l_module_name,4);
417    END IF;
418 
419    RETURN l_conversion_rate;
420 EXCEPTION
421    WHEN OTHERS THEN
422       IF (l_debug = 1) THEN
423 	 print_debug('Exception occurred inside get_conversion_rate!',l_module_name,4);
424       END IF;
425       RETURN -1;
426 END get_conversion_rate;
427 END inv_rcv_cache;
428