DBA Data[Home] [Help]

PACKAGE BODY: APPS.POA_DBI_UOM_PKG

Source


1 package body poa_dbi_uom_pkg as
2 /* $Header: poadbiuomb.pls 120.2 2008/01/17 10:53:18 nchava ship $ */
3 
4 
5 function convert_to_item_base_uom(p_item_id number
6                                  ,p_org_id number
7                                  ,p_from_unit_of_measure varchar2
8                                  ,p_item_primary_uom_code VARCHAR2)
9 return number is
10 
11 begin
12 
13   if(p_item_primary_uom_code is null) then
14 
15     if (p_from_unit_of_measure = get_item_base_uom(p_item_id, p_org_id, p_from_unit_of_measure)) then
16       return 1;
17     end if;
18 
19   end if;
20 
21   RETURN convert_to_item_base_uom(
22              p_item_id               => p_item_id
23            , p_org_id                => p_org_id
24            , p_from_unit_of_measure  => p_from_unit_of_measure
25            , p_from_uom_code         => NULL
26            , p_item_primary_uom_code => p_item_primary_uom_code) ;
27 end convert_to_item_base_uom;
28 
29 
30 
31 /* Overloaded function: convert_to_item_base_uom
32    Additional parameters: p_from_uom_code
33 */
34 function convert_to_item_base_uom
35 (  p_item_id               NUMBER
36  , p_org_id                NUMBER
37  , p_from_unit_of_measure  VARCHAR2
38  , p_from_uom_code         VARCHAR2
39  , p_item_primary_uom_code VARCHAR2
40 ) RETURN NUMBER IS
41 
42   l_line_uom_class varchar2(10);
43   l_line_base_uom varchar2(1);
44   l_item_uom_class varchar2(10) := p_item_primary_uom_code;
45   l_item_base_uom varchar2(1);
46   l_item_primary_uom_code varchar2(3);
47 
48   -- standard and intra class conversion using unit_of_measure
49   cursor l_standard_conversion(l_item_id number
50                               ,l_uom_class varchar2
51                               ,l_unit_of_measure varchar2) is
52      select conversion_rate
53        from mtl_uom_conversions
54       where uom_class = l_uom_class
55         and unit_of_measure = l_unit_of_measure
56         and INVENTORY_ITEM_ID in (l_item_id,0)
57      --  to take care of item specific vs standard conversion
58      order by INVENTORY_ITEM_ID desc;
59 
60   l_standard_conversion_rec l_standard_conversion%rowtype;
61 
62 
63   -- standard and intra class conversion using uom_code
64   cursor l_standard_conversion2(l_item_id   NUMBER
65                               ,l_uom_class VARCHAR2
66                               ,l_uom_code  VARCHAR2) is
67      SELECT conversion_rate
68        FROM mtl_uom_conversions
69       WHERE uom_class = l_uom_class
70         AND uom_code  = l_uom_code
71         AND INVENTORY_ITEM_ID in (l_item_id,0)
72      --  to take care of item specific vs standard conversion
73      ORDER BY INVENTORY_ITEM_ID desc ;
74 
75   l_standard_conversion2_rec l_standard_conversion2%rowtype;
76 
77   cursor l_class_conversion(l_item_id number
78                            ,l_from_uom_class varchar2
79                            ,l_to_uom_class varchar2) is
80      select conversion_rate,from_uom_class
81             -- to take care of two way conversions
82        from MTL_UOM_CLASS_CONVERSIONS
83       where inventory_item_id = l_item_id
84         and FROM_UOM_CLASS in (l_from_uom_class,l_to_uom_class)
85 	and TO_UOM_CLASS in (l_from_uom_class,l_to_uom_class)
86      order by decode(FROM_UOM_CLASS,l_from_uom_class,1,2);
87 
88   l_class_conversion_rec l_class_conversion%rowtype;
89 
90   l_from_uom_class varchar2(10);
91 
92   l_conversion NUMBER;
93   l_item_conversion NUMBER;
94   l_class_conv NUMBER;
95 begin
96 -- Given a PO Line, get the uom class and if it is the  base uom
97 
98   if (p_item_id is null) then return 1; end if;
99 
100   begin
101     IF (p_from_uom_code IS NULL) THEN
102       -- Get uom_class and base_uom_flag using unit_of_measure
103       select uom.UOM_CLASS,uom.BASE_UOM_FLAG
104         into l_line_uom_class,l_line_base_uom
105         from mtl_units_of_measure uom
106        where uom.UNIT_OF_MEASURE = p_from_unit_of_measure;
107      ELSE
108         -- Get uom_class and base_uom_flag using uom_code
109         SELECT  uom.uom_class
110               , uom.base_uom_flag
111         INTO l_line_uom_class
112            , l_line_base_uom
113         FROM mtl_units_of_measure uom
114         WHERE uom.uom_code = p_from_uom_code ;
115       END IF ;
116   exception
117     when no_data_found then
118       return -1;
119   end;
120 
121 -- Given a non-one-time item PO Line, get the uom class and if it is
122 -- the base uom for the primary uom of the given item and the
123 -- corresponding fsp.inventory org
124   begin
125       if(p_item_primary_uom_code is null) then
126         select uom.UOM_CLASS, uom.base_uom_flag, item.primary_uom_code
127           into l_item_uom_class, l_item_base_uom, l_item_primary_uom_code
128           from mtl_units_of_measure uom
129               ,mtl_system_items item
130          where uom.UOM_CODE = item.PRIMARY_UOM_CODE
131            and item.inventory_item_id = p_item_id
132            and item.organization_id = p_org_id;
133       else
134         select uom_class, base_uom_flag
135           into l_item_uom_class, l_item_base_uom
136           from mtl_units_of_measure
137          where uom_code = p_item_primary_uom_code;
138       end if;
139   exception
140      when no_data_found then
141        return -2;
142   end;
143 
144   -- to convert to the primary uom of the item if the primary UOM is not the base UOM of that UOM class
145   if(l_item_base_uom = 'Y') then
146      l_item_conversion := 1.0;
147   else
148      open l_standard_conversion2(0, l_item_uom_class, nvl(p_item_primary_uom_code, l_item_primary_uom_code));
149      fetch l_standard_conversion2 INTO l_standard_conversion2_rec ;
150      IF l_standard_conversion2%NOTFOUND then
151           CLOSE l_standard_conversion2 ;
152           RETURN -6 ;
153      ELSE
154           CLOSE l_standard_conversion2 ;
155           l_item_conversion := 1.0/l_standard_conversion2_rec.conversion_rate ;
156      end if ;
157    end if;
158 
159  -- same class
160   if(l_line_uom_class = l_item_uom_class) then
161     if(l_line_base_uom = 'Y') then
162       return 1.0 * l_item_conversion; -- no further conversion required
163     else
164       IF p_from_uom_code IS NULL THEN
165         open l_standard_conversion(p_item_id,l_line_uom_class,p_from_unit_of_measure);
166         fetch l_standard_conversion into l_standard_conversion_rec;
167         if l_standard_conversion%NOTFOUND then
168           close l_standard_conversion;
169           return -3;
170         else
171           close l_standard_conversion;
172           return l_standard_conversion_rec.conversion_rate * l_item_conversion;
173         end if;
174       ELSE
175         -- get conversion based on uom_code
176         OPEN l_standard_conversion2(p_item_id,l_line_uom_class,p_from_uom_code) ;
177         FETCH l_standard_conversion2 INTO l_standard_conversion2_rec ;
178         IF l_standard_conversion2%NOTFOUND then
179           CLOSE l_standard_conversion2 ;
180           RETURN -3 ;
181         ELSE
182           CLOSE l_standard_conversion2 ;
183           RETURN l_standard_conversion2_rec.conversion_rate * l_item_conversion;
184         end if ;
185       end if ;
186     end if;
187   else -- inter class
188     -- lets first get conversion factor for the line uom to line uom class's base uom
189     if(l_line_base_uom = 'Y') then
190       l_conversion := 1.0;
191     else
192       IF p_from_uom_code IS NULL THEN
193         open l_standard_conversion(p_item_id,l_line_uom_class,p_from_unit_of_measure);
194         fetch l_standard_conversion into l_standard_conversion_rec;
195         if l_standard_conversion%NOTFOUND then
196           close l_standard_conversion;
197           return -4;
198         else
199           close l_standard_conversion;
200           l_conversion := l_standard_conversion_rec.conversion_rate;
201         end if;
202       ELSE
203         -- get conversion based on uom_code
204         OPEN l_standard_conversion2(p_item_id,l_line_uom_class,p_from_uom_code);
205         FETCH l_standard_conversion2 into l_standard_conversion2_rec;
206         IF l_standard_conversion2%NOTFOUND then
207           CLOSE l_standard_conversion2;
208           RETURN -4;
209         ELSE
210           CLOSE l_standard_conversion2;
211           l_conversion := l_standard_conversion2_rec.conversion_rate;
212         END IF;
213       END IF ;
214     end if;
215     -- There could be a single conersion or two conversions back and forth
216     -- with different values. We want to start from line uom class if possible
217     open l_class_conversion(p_item_id,l_line_uom_class,l_item_uom_class);
218     fetch l_class_conversion into l_class_conversion_rec;
219     if(l_class_conversion%NOTFOUND) then
220       close l_class_conversion;
221       return -5;
222     else
223       close l_class_conversion;
224       l_class_conv := l_class_conversion_rec.conversion_rate;
225       l_from_uom_class := l_class_conversion_rec.from_uom_class;
226     end if;
227 
228     if(l_from_uom_class = l_line_uom_class) then
229       l_class_conv := 1.0/l_class_conv;
230     end if;
231 
232     return l_conversion * l_class_conv * l_item_conversion;
233   end if;
234 end convert_to_item_base_uom;
235 
236 /*
237   This function is called by the POD Fact Refreshing program for populating
238   the conversion rates between a Negotiation Transaction UOM to that of PO
239   transaction UOM, only when the Item is being looked into is a One Time Item.
240 */
241 FUNCTION convert_neg_to_po_uom( p_from_unit_of_measure  VARCHAR2,
242                                 p_to_unit_of_measure VARCHAR2
243 			      )
244                RETURN NUMBER
245 IS
246   l_conversion_rate number;
247 BEGIN
248  l_conversion_rate := 1;
249 
250 SELECT (from_uom.conversion_rate * (1/to_uom.conversion_rate)) rate into l_conversion_rate
251 FROM
252    (SELECT conversion_rate, uom_class FROM mtl_uom_conversions WHERE unit_of_measure=p_from_unit_of_measure AND inventory_item_id=0) from_uom,
253    (SELECT conversion_rate, uom_class FROM mtl_uom_conversions WHERE unit_of_measure=p_to_unit_of_measure AND inventory_item_id=0) to_uom
254 WHERE
255      from_uom.uom_class=to_uom.uom_class;
256 
257  return l_conversion_rate;
258 END convert_neg_to_po_uom;
259 
260 
261 function get_item_base_uom(p_item_id number
262                            ,p_org_id number
263                            ,p_from_unit_of_measure varchar2)
264                return varchar2
265 is
266 
267 l_base_uom varchar2(25);
268 
269 begin
270 
271   if(p_item_id is not null) then
272     select primary_unit_of_measure
273     into l_base_uom
274     from mtl_system_items
275     where inventory_item_id = p_item_id
276     and organization_id = p_org_id;
277   else
278     l_base_uom := p_from_unit_of_measure;
279   end if;
280 
281   return l_base_uom;
282 
283 exception
284   when others then
285    return '-1';
286 
287 end;
288 
289 end poa_dbi_uom_pkg;