DBA Data[Home] [Help]

PACKAGE BODY: APPS.OE_BLKT_RELEASE_UTIL

Source


1 PACKAGE BODY OE_Blkt_Release_Util AS
2 /* $Header: OEXUBRLB.pls 120.8.12020000.3 2013/02/20 13:13:41 vmachett ship $ */
3 
4 --  Global constant holding the package name
5 
6 G_PKG_NAME                    CONSTANT VARCHAR2(30) := 'OE_Blkt_Release_Util';
7 G_BINARY_LIMIT CONSTANT NUMBER := OE_GLOBALS.G_BINARY_LIMIT; --bug8465849
8 
9 ---------------------------------------------------------------------------
10 -- LOCAL FUNCTION Get_Line_Number
11 -- Used to set line_number token in error messages
12 ---------------------------------------------------------------------------
13 FUNCTION Get_Line_Number
14   (p_line_id              IN NUMBER
15   ) RETURN NUMBER
16 IS
17   l_line_number       NUMBER;
18 BEGIN
19 
20   SELECT LINE_NUMBER
21     INTO l_line_number
22     FROM OE_ORDER_LINES
23    WHERE LINE_ID = p_line_id;
24 
25   RETURN l_line_number;
26 
27 EXCEPTION
28   WHEN OTHERS THEN
29     IF OE_MSG_PUB.Check_Msg_Level(OE_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
30     THEN
31       OE_MSG_PUB.Add_Exc_Msg
32            (G_PKG_NAME
33             ,'Get_Line_Number'
34             );
35     END IF;
36     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
37 END Get_Line_Number;
38 
39 ---------------------------------------------------------------------------
40 -- LOCAL FUNCTION Get_Shipment_Number
41 -- Used to set shipment_number token in error messages
42 ---------------------------------------------------------------------------
43 FUNCTION Get_Shipment_Number
44   (p_line_id              IN NUMBER
45   ) RETURN NUMBER
46 IS
47   l_shipment_number       NUMBER;
48 BEGIN
49 
50   SELECT SHIPMENT_NUMBER
51     INTO l_shipment_number
52     FROM OE_ORDER_LINES
53    WHERE LINE_ID = p_line_id;
54 
55   RETURN l_shipment_number;
56 
57 EXCEPTION
58   WHEN OTHERS THEN
59     IF OE_MSG_PUB.Check_Msg_Level(OE_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
60     THEN
61       OE_MSG_PUB.Add_Exc_Msg
62            (G_PKG_NAME
63             ,'Get_Shipment_Number'
64             );
65     END IF;
66     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
67 END Get_Shipment_Number;
68 
69 ---------------------------------------------------------------------------
70 -- PUBLIC FUNCTION Convert_Amount
71 -- Also called from OEXVFULB.pls
72 -- Converts amounts from one currency to another
73 -- If there is no direct conversion rate available between the FROM and
74 -- TO currencies, currency triangulation approach is used =>
75 --    First, converts from FROM currency to Set of Books (SOB) currency
76 --    Next, converts above converted amount from SOB currency to TO currency
77 ---------------------------------------------------------------------------
78 FUNCTION Convert_Amount
79   (p_from_currency       IN VARCHAR2
80   ,p_to_currency         IN VARCHAR2
81   ,p_conversion_date     IN DATE
82   ,p_conversion_type     IN VARCHAR2
83   ,p_amount              IN NUMBER
84   ) RETURN NUMBER
85 IS
86   l_amount       NUMBER;
87   No_Conversion_Rate       EXCEPTION;
88 --
89 l_debug_level CONSTANT NUMBER := oe_debug_pub.g_debug_level;
90 --
91 BEGIN
92 
93      BEGIN
94        if l_debug_level > 0 then
95        OE_DEBUG_PUB.ADD('Convert from '||p_from_currency||
96                          ' to '||p_to_currency||' Amount :'||p_amount);
97        end if;
98        l_amount := gl_currency_api.convert_closest_amount_sql
99           (x_from_currency     => p_from_currency
100           ,x_to_currency       => p_to_currency
101           ,x_conversion_date   => p_conversion_date
102           ,x_conversion_type   => p_conversion_type
103           ,x_user_rate         => NULL
104           ,x_amount            => p_amount
105           ,x_max_roll_days     => -1
106           );
107        if l_debug_level > 0 then
108        OE_DEBUG_PUB.ADD('Converted amount 1 :'||l_amount);
109        end if;
110 
111        IF l_amount < 0 THEN
112           RAISE No_Conversion_Rate;
113        END IF;
114 
115      EXCEPTION
116        WHEN No_Conversion_Rate THEN
117          DECLARE
118            l_sob_rec                OE_Order_Cache.Set_Of_Books_Rec_Type;
119          BEGIN
120 
121            l_sob_rec := OE_Order_Cache.Load_Set_Of_Books;
122 
123            if l_debug_level > 0 then
124            OE_DEBUG_PUB.ADD('SOB Currency :'||l_sob_rec.currency_code);
125            end if;
126 
127            IF l_sob_rec.currency_code <> p_to_currency THEN
128 
129            l_amount := gl_currency_api.convert_closest_amount_sql
130                (x_from_currency     => p_from_currency
131                ,x_to_currency       => l_sob_rec.currency_code
132                ,x_conversion_date   => p_conversion_date
133                ,x_conversion_type   => p_conversion_type
134                ,x_user_rate         => NULL
135                ,x_amount            => p_amount
136                ,x_max_roll_days     => -1
137                );
138            if l_debug_level > 0 then
139              OE_DEBUG_PUB.ADD('Converted amount 2 :'||l_amount);
140            end if;
141 
142            IF l_amount < 0 THEN
143               RAISE No_Conversion_Rate;
144            END IF;
145 
146            l_amount := gl_currency_api.convert_closest_amount_sql
147                (x_from_currency     => l_sob_rec.currency_code
148                ,x_to_currency       => p_to_currency
149                ,x_conversion_date   => p_conversion_date
150                ,x_conversion_type   => p_conversion_type
151                ,x_user_rate         => NULL
152                ,x_amount            => l_amount
153                ,x_max_roll_days     => -1
154                );
155            if l_debug_level > 0 then
156              OE_DEBUG_PUB.ADD('Converted amount 3 :'||l_amount);
157            end if;
158 
159            IF l_amount < 0 THEN
160               RAISE No_Conversion_Rate;
161            END IF;
162 
163            ELSE
164 
165               RAISE No_Conversion_Rate;
166 
167            END IF; -- Convert to SOB currency, if <> blanket currency
168 
169          END;
170      END;
171 
172      RETURN l_amount;
173 
174 EXCEPTION
175   WHEN No_Conversion_Rate THEN
176     if l_debug_level > 0 then
177        oe_debug_pub.add('no rate found in either blanket or sob currency');
178     end if;
179     FND_MESSAGE.SET_NAME('ONT','OE_BL_MISSING_CONV_RATE');
180     FND_MESSAGE.SET_TOKEN('BLANKET_CURRENCY',p_to_currency);
181     OE_MSG_PUB.ADD;
182     RAISE FND_API.G_EXC_ERROR;
183   WHEN OTHERS THEN
184     IF OE_MSG_PUB.Check_Msg_Level(OE_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
185     THEN
186       OE_MSG_PUB.Add_Exc_Msg
187            (G_PKG_NAME
188             ,'Convert_Amount'
189             );
190     END IF;
191     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
192 END Convert_Amount;
193 
194 ---------------------------------------------------------------------------
195 -- LOCAL PROCEDURE Cache_Blanket
196 ---------------------------------------------------------------------------
197 PROCEDURE Cache_Blanket
198   (p_blanket_number            IN NUMBER
199   ,p_blanket_line_number       IN NUMBER
200   ,p_lock                      IN VARCHAR2 DEFAULT 'Y'
201   ,x_blanket_line_id           IN OUT NOCOPY NUMBER
202   ,x_blanket_header_id         IN OUT NOCOPY NUMBER
203   )
204 IS
205 
206   CURSOR c_blanket_line  (p_blanket_line_id NUMBER) IS
207   SELECT  L.HEADER_ID
208 	 ,L.LINE_ID
209          ,BL.OVERRIDE_BLANKET_CONTROLS_FLAG
210          ,BL.OVERRIDE_RELEASE_CONTROLS_FLAG
211          ,nvl(BL.RELEASED_AMOUNT,0)
212          ,BL.MIN_RELEASE_AMOUNT
213          ,BL.MAX_RELEASE_AMOUNT
214          ,BL.BLANKET_LINE_MAX_AMOUNT
215          ,BL.BLANKET_MAX_QUANTITY
216          ,BL.RELEASED_QUANTITY
217          ,BL.FULFILLED_QUANTITY
218          ,BL.FULFILLED_AMOUNT
219          ,BL.MIN_RELEASE_QUANTITY
220          ,BL.MAX_RELEASE_QUANTITY
221          ,L.ORDER_QUANTITY_UOM
222          ,nvl(BL.RETURNED_QUANTITY,0)
223          ,nvl(BL.RETURNED_AMOUNT,0)
224          ,'N' -- locked_flag
225     FROM OE_BLANKET_LINES L,OE_BLANKET_LINES_EXT BL
226    WHERE L.LINE_ID = p_blanket_line_id
227      AND L.LINE_ID = BL.LINE_ID
228      AND L.SALES_DOCUMENT_TYPE_CODE = 'B';
229 
230   CURSOR c_blanket_header (p_blanket_header_id NUMBER)IS
231   SELECT  H.HEADER_ID
232 	 ,BH.OVERRIDE_AMOUNT_FLAG
233          ,nvl(BH.RELEASED_AMOUNT,0)
234          ,nvl(BH.RETURNED_AMOUNT,0)
235          ,nvl(BH.FULFILLED_AMOUNT,0)
236          ,BH.BLANKET_MAX_AMOUNT
237          ,H.TRANSACTIONAL_CURR_CODE
238          ,H.CONVERSION_TYPE_CODE
239          ,'N' -- locked_flag
240     FROM OE_BLANKET_HEADERS H,OE_BLANKET_HEADERS_EXT BH
241    WHERE H.HEADER_ID = p_blanket_header_id
242      AND H.ORDER_NUMBER = BH.ORDER_NUMBER
243      AND H.SALES_DOCUMENT_TYPE_CODE = 'B';
244 
245 l_blanket_header_id   NUMBER;
246 l_blanket_line_id   NUMBER;
247 
248 --
249 l_debug_level CONSTANT NUMBER := oe_debug_pub.g_debug_level;
250 --
251 BEGIN
252 
253   if l_debug_level > 0 then
254     oe_debug_pub.add('Enter cache blanket');
255     oe_debug_pub.add('lock :'||p_lock);
256     oe_debug_pub.add('blanket number :'||p_blanket_number);
257     oe_debug_pub.add('blanket number :'||p_blanket_line_number);
258   end if;
259 
260   SELECT line_id
261     INTO x_blanket_line_id
262     FROM OE_BLANKET_LINES_EXT BL
263    WHERE BL.ORDER_NUMBER = p_blanket_number
264      AND BL.LINE_NUMBER  = p_blanket_line_number;
265 
266  l_blanket_line_id := x_blanket_line_id;
267  x_blanket_line_id := MOD(x_blanket_line_id , G_BINARY_LIMIT); --bug8465849
268 
269 
270   if l_debug_level > 0 then
271      oe_debug_pub.add('blanket line id :'||x_blanket_line_id);
272      if g_blkt_line_tbl.exists(x_blanket_line_id) then
273         oe_debug_pub.add('locked flag :'|| g_blkt_line_tbl(x_blanket_line_id).locked_flag);
274      end if;
275   end if;
276 
277   --------------------------------------------------------------------
278   -- CACHE BLANKET LINE
279   --------------------------------------------------------------------
280 
281   IF    ( NOT g_blkt_line_tbl.EXISTS(x_blanket_line_id) )
282          -- re-query if blanket is to be locked and it was not locked before
283      OR (p_lock = 'Y'
284          AND nvl(g_blkt_line_tbl(x_blanket_line_id).locked_flag,'N') = 'N'
285          )
286   THEN
287 
288      if l_debug_level > 0 then
289         oe_debug_pub.add('query blanket line');
290      end if;
291 
292      OPEN c_blanket_line(l_blanket_line_id);--bug8465849
293      FETCH c_blanket_line INTO
294          g_blkt_line_tbl(x_blanket_line_id).header_id
295 	,g_blkt_line_tbl(x_blanket_line_id).line_id
296         ,g_blkt_line_tbl(x_blanket_line_id).override_blanket_controls_flag
297         ,g_blkt_line_tbl(x_blanket_line_id).override_release_controls_flag
298         ,g_blkt_line_tbl(x_blanket_line_id).released_amount
299         ,g_blkt_line_tbl(x_blanket_line_id).min_release_amount
300         ,g_blkt_line_tbl(x_blanket_line_id).max_release_amount
301         ,g_blkt_line_tbl(x_blanket_line_id).blanket_line_max_amount
302         ,g_blkt_line_tbl(x_blanket_line_id).blanket_max_quantity
303         ,g_blkt_line_tbl(x_blanket_line_id).released_quantity
304         ,g_blkt_line_tbl(x_blanket_line_id).fulfilled_quantity
305         ,g_blkt_line_tbl(x_blanket_line_id).fulfilled_amount
306         ,g_blkt_line_tbl(x_blanket_line_id).min_release_quantity
307         ,g_blkt_line_tbl(x_blanket_line_id).max_release_quantity
308         ,g_blkt_line_tbl(x_blanket_line_id).uom
309         ,g_blkt_line_tbl(x_blanket_line_id).returned_quantity
310         ,g_blkt_line_tbl(x_blanket_line_id).returned_amount
311         ,g_blkt_line_tbl(x_blanket_line_id).locked_flag
312         ;
313      CLOSE c_blanket_line;
314 
315   END IF;
316 
317   IF p_lock = 'Y'
318      AND g_blkt_line_tbl(x_blanket_line_id).locked_flag = 'N'
319   THEN
320      if l_debug_level > 0 then
321         oe_debug_pub.add('lock blanket line');
322      end if;
323         SELECT 'Y'
324          INTO g_blkt_line_tbl(x_blanket_line_id).locked_flag
325          FROM oe_blanket_lines_all
326         WHERE line_id = l_blanket_line_id --bug8465849
327           FOR UPDATE NOWAIT;
328   END IF;
329 
330   --------------------------------------------------------------------
331   -- CACHE BLANKET HEADER
332   --------------------------------------------------------------------
333 
334   l_blanket_header_id := g_blkt_line_tbl(x_blanket_line_id).header_id;
335   x_blanket_header_id := MOD(l_blanket_header_id , G_BINARY_LIMIT); --bug8465849
336 
337   IF    ( NOT g_blkt_hdr_tbl.EXISTS(x_blanket_header_id) )
338          -- re-query if blanket is to be locked and it was not locked before
339      OR (p_lock = 'Y'
340          AND nvl(g_blkt_hdr_tbl(x_blanket_header_id).locked_flag,'N') = 'N'
341          )
342   THEN
343 
344      if l_debug_level > 0 then
345         oe_debug_pub.add('query blanket header');
346      end if;
347 
348      OPEN c_blanket_header(l_blanket_header_id);
349      FETCH c_blanket_header INTO
350          g_blkt_hdr_tbl(x_blanket_header_id).header_id
351         ,g_blkt_hdr_tbl(x_blanket_header_id).override_amount_flag
352         ,g_blkt_hdr_tbl(x_blanket_header_id).released_amount
353         ,g_blkt_hdr_tbl(x_blanket_header_id).returned_amount
354         ,g_blkt_hdr_tbl(x_blanket_header_id).fulfilled_amount
355         ,g_blkt_hdr_tbl(x_blanket_header_id).blanket_max_amount
356         ,g_blkt_hdr_tbl(x_blanket_header_id).currency_code
360      CLOSE c_blanket_header;
357         ,g_blkt_hdr_tbl(x_blanket_header_id).conversion_type_code
358         ,g_blkt_hdr_tbl(x_blanket_header_id).locked_flag
359         ;
361 
362   END IF;
363 
364   IF p_lock = 'Y'
365      AND g_blkt_hdr_tbl(x_blanket_header_id).locked_flag = 'N'
366   THEN
367      if l_debug_level > 0 then
368         oe_debug_pub.add('lock blanket header');
369      end if;
370         SELECT 'Y'
371          INTO g_blkt_hdr_tbl(x_blanket_header_id).locked_flag
372          FROM oe_blanket_headers_all
373         WHERE header_id = l_blanket_header_id --bug8465849
374           FOR UPDATE NOWAIT;
375   END IF;
376 
377   if l_debug_level > 0 then
378     oe_debug_pub.add('Exit cache blanket');
379   end if;
380 
381 EXCEPTION
382   WHEN APP_EXCEPTIONS.RECORD_LOCK_EXCEPTION THEN
383     FND_MESSAGE.Set_Name('ONT','OE_BL_LOCKED');
384     FND_MESSAGE.Set_Token('BLANKET_NUMBER',p_blanket_number);
385     OE_MSG_PUB.Add;
386     RAISE FND_API.G_EXC_ERROR;
387   WHEN OTHERS THEN
388     IF OE_MSG_PUB.Check_Msg_Level(OE_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
389     THEN
390       OE_MSG_PUB.Add_Exc_Msg
391            (G_PKG_NAME
392             ,'Cache_Blanket'
393             );
394     END IF;
395     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
396 END Cache_Blanket;
397 
398 
399 ---------------------------------------------------------------------------
400 -- PROCEDURE Update_Released_Qty_Amount
401 ---------------------------------------------------------------------------
402 PROCEDURE Update_Released_Qty_Amount
403   (p_line_id                   IN NUMBER
404   ,p_line_set_id               IN NUMBER
405   ,p_blanket_number            IN NUMBER
406   ,p_blanket_line_number       IN NUMBER
407   ,p_old_quantity              IN NUMBER
408   ,p_quantity                  IN NUMBER
409   ,p_old_order_qty_uom         IN VARCHAR2
410   ,p_order_qty_uom             IN VARCHAR2
411   ,p_old_unit_selling_price    IN NUMBER
412   ,p_unit_selling_price        IN NUMBER
413   ,p_old_inv_item_id           IN NUMBER
414   ,p_inv_item_id               IN NUMBER
415   ,p_currency_code             IN VARCHAR2
416   ,p_fulfilled_flag            IN VARCHAR2
417   ,x_return_status             OUT NOCOPY VARCHAR2
418   )
419 IS
420 
421   l_blanket_line_id          NUMBER;
422   l_blanket_header_id        NUMBER;
423 
424   l_quantity                 NUMBER := 0;
425   l_old_quantity             NUMBER := 0;
426   l_amount                   NUMBER := 0;
427   l_old_amount               NUMBER := 0;
428   l_released_amount          NUMBER := 0;
429   l_hdr_released_amount      NUMBER := 0;
430   l_released_quantity        NUMBER := 0;
431 
432 --
433 l_debug_level CONSTANT NUMBER := oe_debug_pub.g_debug_level;
434 --
435 BEGIN
436 
437   x_return_status := FND_API.G_RET_STS_SUCCESS;
438 
439   Cache_Blanket(p_blanket_number
440               ,p_blanket_line_number
441               ,'Y' -- p_lock
442               ,l_blanket_line_id
443               ,l_blanket_header_id
444               );
445 
446   --------------------------------------------------------------------
447   -- COMPUTE RELEASE QUANTITY IF Blanket UOM Exists
448   --------------------------------------------------------------------
449 
450   if l_debug_level > 0 then
451      oe_debug_pub.add('Blanket UOM:'||g_blkt_line_tbl(l_blanket_line_id).uom);
452      oe_debug_pub.add('INITIAL blkt line released qty: '||
453                     g_blkt_line_tbl(l_blanket_line_id).released_quantity);
454      oe_debug_pub.add('INITIAL blkt line released amt: '||
455                     g_blkt_line_tbl(l_blanket_line_id).released_amount);
456      oe_debug_pub.add('INITIAL blkt hdr released amt: '||
457                     g_blkt_hdr_tbl(l_blanket_header_id).released_amount);
458      oe_debug_pub.add('new qty :'||p_quantity);
459      oe_debug_pub.add('old qty :'||p_old_quantity);
460      oe_debug_pub.add('new SP :'||p_unit_selling_price);
461      oe_debug_pub.add('old SP :'||p_old_unit_selling_price);
462      oe_debug_pub.add('from uom :'||p_order_qty_uom);
463      oe_debug_pub.add('inv item :'||p_inv_item_id);
464   end if;
465 
466   IF p_order_qty_uom IS NULL THEN
467      l_quantity := 0;
468   ELSE
469      l_quantity := nvl(p_quantity,0);
470   END IF;
471 
472   IF p_old_order_qty_uom IS NULL THEN
473      l_old_quantity := 0;
474   ELSE
475      l_old_quantity := nvl(p_old_quantity,0);
476   END IF;
477 
478  l_blanket_line_id   := MOD(l_blanket_line_id,G_BINARY_LIMIT);  --bug8465849
479  l_blanket_header_id := MOD(l_blanket_header_id,G_BINARY_LIMIT); --bug8465849
480 
481   IF g_blkt_line_tbl(l_blanket_line_id).uom IS NOT NULL THEN
482 
483     IF l_quantity > 0
484       AND p_order_qty_uom <> g_blkt_line_tbl(l_blanket_line_id).uom
485     THEN
486          l_quantity := OE_Order_Misc_Util.Convert_UOM
487              (p_item_id          => p_inv_item_id
488              ,p_from_uom_code    => p_order_qty_uom
489              ,p_to_uom_code      => g_blkt_line_tbl(l_blanket_line_id).uom
490              ,p_from_qty         => l_quantity
491              );
492          if l_debug_level > 0 then
493             oe_debug_pub.add('conv new qty :'||l_quantity);
494          end if;
495          IF l_quantity < 0 THEN
496            FND_MESSAGE.SET_NAME('ONT','OE_BL_UOM_CONV_FAILED');
497            FND_MESSAGE.SET_TOKEN('LINE_NUMBER',Get_Line_Number(p_line_id));
498            FND_MESSAGE.SET_TOKEN('BLANKET_UOM',
499                                   g_blkt_line_tbl(l_blanket_line_id).uom);
500            OE_MSG_PUB.ADD;
501            RAISE FND_API.G_EXC_ERROR;
502          END IF;
503     END IF;
507     THEN
504 
505     IF l_old_quantity > 0
506       AND p_old_order_qty_uom <> g_blkt_line_tbl(l_blanket_line_id).uom
508          l_old_quantity := OE_Order_Misc_Util.Convert_UOM
509              (p_item_id          => p_old_inv_item_id
510              ,p_from_uom_code    => p_old_order_qty_uom
511              ,p_to_uom_code      => g_blkt_line_tbl(l_blanket_line_id).uom
512              ,p_from_qty         => l_old_quantity
513              );
514          if l_debug_level > 0 then
515             oe_debug_pub.add('conv old qty :'||l_quantity);
516          end if;
517          IF l_old_quantity < 0 THEN
518            FND_MESSAGE.SET_NAME('ONT','OE_BL_UOM_CONV_FAILED');
519            FND_MESSAGE.SET_TOKEN('LINE_NUMBER',Get_Line_Number(p_line_id));
520            FND_MESSAGE.SET_TOKEN('BLANKET_UOM',
521                                   g_blkt_line_tbl(l_blanket_line_id).uom);
522            OE_MSG_PUB.ADD;
523            RAISE FND_API.G_EXC_ERROR;
524          END IF;
525     END IF;
526 
527     -- INCREMENT Cumulative Released Quantity
528 
529     l_released_quantity := nvl(g_blkt_line_tbl(l_blanket_line_id).released_quantity,0)
530                         + (l_quantity - l_old_quantity);
531 
532   END IF; -- End if blanket uom is not null
533 
534 
535   --------------------------------------------------------------------
536   -- COMPUTE RELEASE AMOUNT
537   --------------------------------------------------------------------
538 
539   l_amount := nvl(p_quantity,0) * nvl(p_unit_selling_price,0);
540   l_old_amount := nvl(p_old_quantity,0) * nvl(p_old_unit_selling_price,0);
541 
542   IF p_currency_code
543      <> g_blkt_hdr_tbl(l_blanket_header_id).currency_code
544   THEN
545 
546      IF g_blkt_hdr_tbl(l_blanket_header_id).conversion_type_code IS NULL THEN
547         FND_MESSAGE.SET_NAME('ONT','OE_BL_MISS_CONVERSION_TYPE');
548         FND_MESSAGE.SET_TOKEN('BLANKET_NUMBER',p_blanket_number);
549         oe_msg_pub.add;
550         RAISE FND_API.G_EXC_ERROR;
551      END IF;
552 
553      IF l_amount <> 0 THEN
554         l_amount := Convert_Amount
555           (p_from_currency     => p_currency_code
556           ,p_to_currency       =>
557                   g_blkt_hdr_tbl(l_blanket_header_id).currency_code
558           ,p_conversion_date   => sysdate
559           ,p_conversion_type   =>
560                   g_blkt_hdr_tbl(l_blanket_header_id).conversion_type_code
561           ,p_amount            => l_amount
562           );
563      END IF;
564 
565      IF l_old_amount <> 0 THEN
566        l_old_amount := Convert_Amount
567           (p_from_currency     => p_currency_code
568           ,p_to_currency       =>
569                   g_blkt_hdr_tbl(l_blanket_header_id).currency_code
570           ,p_conversion_date   => sysdate
571           ,p_conversion_type   =>
572                   g_blkt_hdr_tbl(l_blanket_header_id).conversion_type_code
573           ,p_amount            => l_old_amount
574           );
575      END IF;
576 
577   END IF;
578 
579   -- INCREMENT Released Amounts
580 
581   l_released_amount := g_blkt_line_tbl(l_blanket_line_id).released_amount
582                                  + (l_amount - l_old_amount);
583   l_hdr_released_amount := g_blkt_hdr_tbl(l_blanket_header_id).released_amount
584                      + (l_amount - l_old_amount);
585 
586   if l_debug_level > 0 then
587      oe_debug_pub.add('curr line amt :'||l_amount);
588      oe_debug_pub.add('bl line released qty :'||l_released_quantity);
589      oe_debug_pub.add('bl line released amt :'||l_released_amount);
590      oe_debug_pub.add('hdr released amt :'||l_hdr_released_amount);
591   end if;
592 
593   --------------------------------------------------------------------
594   -- VALIDATE MIN/MAX IF OVERRIDE NOT ALLOWED
595   --------------------------------------------------------------------
596 
597   -- (1) Blanket line min/max qty and amount checks
598   -- Check not needed for 0 qtys or full cancellations
599 
600   IF l_quantity <> 0 THEN
601 
602      -- (1a) Check Individual Release Qty/Amount Validations
603      --ER 6526974
604      --IF g_blkt_line_tbl(l_blanket_line_id).OVERRIDE_RELEASE_CONTROLS_FLAG = 'N'
605      --THEN
606 
607        -- Qty checks only needed if blanket UOM is not null
608        IF g_blkt_line_tbl(l_blanket_line_id).uom IS NOT NULL
609           AND (l_quantity <
610                nvl(g_blkt_line_tbl(l_blanket_line_id).min_release_quantity,0)
611                OR l_quantity >
612                nvl(g_blkt_line_tbl(l_blanket_line_id).max_release_quantity
613                     ,l_quantity)
614                )
615        THEN
616          -- If shipment line, only a warning is issued. Error status is not set.
617          IF p_line_set_id IS NOT NULL THEN
618 	       IF g_blkt_line_tbl(l_blanket_line_id).OVERRIDE_RELEASE_CONTROLS_FLAG = 'N' THEN
619 			    FND_MESSAGE.SET_NAME('ONT','OE_BL_MIN_MAX_SHIPMENT_QTY');
620 			    FND_MESSAGE.SET_TOKEN('LINE_NUMBER',Get_Line_Number(p_line_id));
621 			    FND_MESSAGE.SET_TOKEN('SHIPMENT_NUMBER'
622 						 ,Get_Shipment_Number(p_line_id));
623 			    FND_MESSAGE.SET_TOKEN('BLANKET_UOM',
624 				g_blkt_line_tbl(l_blanket_line_id).uom);
625 			    FND_MESSAGE.SET_TOKEN('MINIMUM',
626 				g_blkt_line_tbl(l_blanket_line_id).min_release_quantity);
627 			    FND_MESSAGE.SET_TOKEN('MAXIMUM',
628 				g_blkt_line_tbl(l_blanket_line_id).max_release_quantity);
629 			    oe_msg_pub.add;
630 		ELSE
631 			IF NVL(FND_PROFILE.VALUE('ONT_BSA_MIN_MAX_VIOLATION'),'N') = 'Y' THEN
632 			    FND_MESSAGE.SET_NAME('ONT','OE_BL_MIN_MAX_SHIPMENT_QTY');
633 			    FND_MESSAGE.SET_TOKEN('LINE_NUMBER',Get_Line_Number(p_line_id));
634 			    FND_MESSAGE.SET_TOKEN('SHIPMENT_NUMBER'
635 						 ,Get_Shipment_Number(p_line_id));
639 				g_blkt_line_tbl(l_blanket_line_id).min_release_quantity);
636 			    FND_MESSAGE.SET_TOKEN('BLANKET_UOM',
637 				g_blkt_line_tbl(l_blanket_line_id).uom);
638 			    FND_MESSAGE.SET_TOKEN('MINIMUM',
640 			    FND_MESSAGE.SET_TOKEN('MAXIMUM',
641 				g_blkt_line_tbl(l_blanket_line_id).max_release_quantity);
642 			    oe_msg_pub.add;
643 			END IF;
644 		 END IF;
645 
646          -- For regular lines, raise error.
647          ELSE
648             IF g_blkt_line_tbl(l_blanket_line_id).OVERRIDE_RELEASE_CONTROLS_FLAG = 'N' THEN
649 		    FND_MESSAGE.SET_NAME('ONT','OE_BL_MIN_MAX_REL_QTY');
650 		    FND_MESSAGE.SET_TOKEN('LINE_NUMBER',Get_Line_Number(p_line_id));
651 		    FND_MESSAGE.SET_TOKEN('BLANKET_UOM',
652 			g_blkt_line_tbl(l_blanket_line_id).uom);
653 		    FND_MESSAGE.SET_TOKEN('MINIMUM',
654 			g_blkt_line_tbl(l_blanket_line_id).min_release_quantity);
655 		    FND_MESSAGE.SET_TOKEN('MAXIMUM',
656 			g_blkt_line_tbl(l_blanket_line_id).max_release_quantity);
657 		    oe_msg_pub.add;
658 		    x_return_status := FND_API.G_RET_STS_ERROR;
659 
660 	    ELSE
661 		IF NVL(FND_PROFILE.VALUE('ONT_BSA_MIN_MAX_VIOLATION'),'N') = 'Y' THEN
662 		    FND_MESSAGE.SET_NAME('ONT','OE_BL_MIN_MAX_REL_QTY');
663 		    FND_MESSAGE.SET_TOKEN('LINE_NUMBER',Get_Line_Number(p_line_id));
664 		    FND_MESSAGE.SET_TOKEN('BLANKET_UOM',
665 			g_blkt_line_tbl(l_blanket_line_id).uom);
666 		    FND_MESSAGE.SET_TOKEN('MINIMUM',
667 			g_blkt_line_tbl(l_blanket_line_id).min_release_quantity);
668 		    FND_MESSAGE.SET_TOKEN('MAXIMUM',
669 			g_blkt_line_tbl(l_blanket_line_id).max_release_quantity);
670 		    oe_msg_pub.add;
671 		END IF;
672 
673 	    END IF;
674 
675 
676          END IF;
677        END IF;
678 
679        /* Added this new condition, to check the max and min amount only if the values for
680           actual min and max amounts defined as a part of the Sales Agreement only. We need to
681           check the condition if the release amount is greater then or not?
682           To address this condition, introduced a new condition to check if the Actual MAX/MIN amount
683           of a BSA has some value other then Zero. Then only the below condition logic will be
684           allowed to trigger. Added based on the bug #4697134. */
685 
686      IF nvl(g_blkt_line_tbl(l_blanket_line_id).min_release_amount,0) > 0 or
687         nvl(g_blkt_line_tbl(l_blanket_line_id).max_release_amount,l_amount) > 0
688      THEN
689 
690 
691        IF (l_amount <
692            nvl(g_blkt_line_tbl(l_blanket_line_id).min_release_amount,0)
693            OR l_amount >
694            nvl(g_blkt_line_tbl(l_blanket_line_id).max_release_amount,l_amount)
695             )
696        THEN
697          -- If shipment line, only a warning is issued. Error status is not set.
698          IF p_line_set_id IS NOT NULL THEN
699            IF g_blkt_line_tbl(l_blanket_line_id).OVERRIDE_RELEASE_CONTROLS_FLAG = 'N' THEN
700 		    FND_MESSAGE.SET_NAME('ONT','OE_BL_MIN_MAX_SHIPMENT_AMT');
701 		    FND_MESSAGE.SET_TOKEN('LINE_NUMBER',Get_Line_Number(p_line_id));
702 		    FND_MESSAGE.SET_TOKEN('SHIPMENT_NUMBER'
703 					 ,Get_Shipment_Number(p_line_id));
704 		    FND_MESSAGE.SET_TOKEN('BLANKET_CURRENCY',
705 			g_blkt_hdr_tbl(l_blanket_header_id).currency_code);
706 		    FND_MESSAGE.SET_TOKEN('MINIMUM',
707 			g_blkt_line_tbl(l_blanket_line_id).min_release_amount);
708 		    FND_MESSAGE.SET_TOKEN('MAXIMUM',
709 			g_blkt_line_tbl(l_blanket_line_id).max_release_amount);
710 		    oe_msg_pub.add;
711 	    ELSE
712 		IF NVL(FND_PROFILE.VALUE('ONT_BSA_MIN_MAX_VIOLATION'),'N') = 'Y' THEN
713 		    FND_MESSAGE.SET_NAME('ONT','OE_BL_MIN_MAX_SHIPMENT_AMT');
714 		    FND_MESSAGE.SET_TOKEN('LINE_NUMBER',Get_Line_Number(p_line_id));
715 		    FND_MESSAGE.SET_TOKEN('SHIPMENT_NUMBER'
716 					 ,Get_Shipment_Number(p_line_id));
717 		    FND_MESSAGE.SET_TOKEN('BLANKET_CURRENCY',
718 			g_blkt_hdr_tbl(l_blanket_header_id).currency_code);
719 		    FND_MESSAGE.SET_TOKEN('MINIMUM',
720 			g_blkt_line_tbl(l_blanket_line_id).min_release_amount);
721 		    FND_MESSAGE.SET_TOKEN('MAXIMUM',
722 			g_blkt_line_tbl(l_blanket_line_id).max_release_amount);
723 		    oe_msg_pub.add;
724 		END IF;
725 
726 	    END IF;
727 
728          -- For regular lines, raise error.
729          ELSE
730              IF g_blkt_line_tbl(l_blanket_line_id).OVERRIDE_RELEASE_CONTROLS_FLAG = 'N' THEN
731 		    FND_MESSAGE.SET_NAME('ONT','OE_BL_MIN_MAX_REL_AMT');
732 		    FND_MESSAGE.SET_TOKEN('LINE_NUMBER',Get_Line_Number(p_line_id));
733 		    FND_MESSAGE.SET_TOKEN('BLANKET_CURRENCY',
734 			g_blkt_hdr_tbl(l_blanket_header_id).currency_code);
735 		    FND_MESSAGE.SET_TOKEN('MINIMUM',
736 			g_blkt_line_tbl(l_blanket_line_id).min_release_amount);
737 		    FND_MESSAGE.SET_TOKEN('MAXIMUM',
738 			g_blkt_line_tbl(l_blanket_line_id).max_release_amount);
739 		    oe_msg_pub.add;
740 		    x_return_status := FND_API.G_RET_STS_ERROR;
741 
742 	    ELSE
743 		IF NVL(FND_PROFILE.VALUE('ONT_BSA_MIN_MAX_VIOLATION'),'N') = 'Y' THEN
744 		   FND_MESSAGE.SET_NAME('ONT','OE_BL_MIN_MAX_REL_AMT');
745 		    FND_MESSAGE.SET_TOKEN('LINE_NUMBER',Get_Line_Number(p_line_id));
746 		    FND_MESSAGE.SET_TOKEN('BLANKET_CURRENCY',
747 			g_blkt_hdr_tbl(l_blanket_header_id).currency_code);
748 		    FND_MESSAGE.SET_TOKEN('MINIMUM',
749 			g_blkt_line_tbl(l_blanket_line_id).min_release_amount);
750 		    FND_MESSAGE.SET_TOKEN('MAXIMUM',
751 			g_blkt_line_tbl(l_blanket_line_id).max_release_amount);
752 		    oe_msg_pub.add;
753 		END IF;
754 
755 	    END IF;
756 
757          END IF;
758        END IF;
759      END IF;
760 
761     --END IF; -- IF blanket line override release control = 'N'
762 
763      -- (1b) Check Blanket Qty/Amount (Sum of Released Qty/Amount) Validations
764      -- ER 6526974
768        -- Qty checks only needed if blanket UOM is not null
765      --IF g_blkt_line_tbl(l_blanket_line_id).OVERRIDE_BLANKET_CONTROLS_FLAG = 'N'
766      --THEN
767 
769        IF g_blkt_line_tbl(l_blanket_line_id).uom IS NOT NULL
770           AND l_released_quantity >
771           (g_blkt_line_tbl(l_blanket_line_id).blanket_max_quantity
772             + g_blkt_line_tbl(l_blanket_line_id).returned_quantity)
773        THEN
774           IF g_blkt_line_tbl(l_blanket_line_id).OVERRIDE_BLANKET_CONTROLS_FLAG = 'N' THEN
775 		  FND_MESSAGE.SET_NAME('ONT','OE_BL_LIN_MAX_QTY_EXCEEDED');
776 		  FND_MESSAGE.SET_TOKEN('BLANKET_NUMBER',p_blanket_number);
777 		  FND_MESSAGE.SET_TOKEN('BLANKET_LINE_NUMBER',p_blanket_line_number);
778 		  FND_MESSAGE.SET_TOKEN('BLANKET_UOM',
779 		      g_blkt_line_tbl(l_blanket_line_id).uom);
780 		  FND_MESSAGE.SET_TOKEN('MAXIMUM',
781 		      g_blkt_line_tbl(l_blanket_line_id).blanket_max_quantity);
782 		  oe_msg_pub.add;
783 		  x_return_status := FND_API.G_RET_STS_ERROR;
784 	  ELSE
785 		IF NVL(FND_PROFILE.VALUE('ONT_BSA_MIN_MAX_VIOLATION'),'N') = 'Y' THEN
786 		  FND_MESSAGE.SET_NAME('ONT','OE_BL_LIN_MAX_QTY_EXCEEDED');
787 		  FND_MESSAGE.SET_TOKEN('BLANKET_NUMBER',p_blanket_number);
788 		  FND_MESSAGE.SET_TOKEN('BLANKET_LINE_NUMBER',p_blanket_line_number);
789 		  FND_MESSAGE.SET_TOKEN('BLANKET_UOM',
790 		      g_blkt_line_tbl(l_blanket_line_id).uom);
791 		  FND_MESSAGE.SET_TOKEN('MAXIMUM',
792 		      g_blkt_line_tbl(l_blanket_line_id).blanket_max_quantity);
793 		  oe_msg_pub.add;
794 		END IF;
795 
796 	  END IF;
797 
798        END IF;
799 
800        IF l_released_amount >
801           (g_blkt_line_tbl(l_blanket_line_id).blanket_line_max_amount
802            + g_blkt_line_tbl(l_blanket_line_id).returned_amount)
803        THEN
804           IF g_blkt_line_tbl(l_blanket_line_id).OVERRIDE_BLANKET_CONTROLS_FLAG = 'N' THEN
805 		  FND_MESSAGE.SET_NAME('ONT','OE_BL_LIN_MAX_AMT_EXCEEDED');
806 		  FND_MESSAGE.SET_TOKEN('BLANKET_NUMBER',p_blanket_number);
807 		  FND_MESSAGE.SET_TOKEN('BLANKET_LINE_NUMBER',p_blanket_line_number);
808 		  FND_MESSAGE.SET_TOKEN('BLANKET_CURRENCY',
809 		      g_blkt_hdr_tbl(l_blanket_header_id).currency_code);
810 		  FND_MESSAGE.SET_TOKEN('MAXIMUM',
811 		      g_blkt_line_tbl(l_blanket_line_id).blanket_line_max_amount);
812 		  oe_msg_pub.add;
813 		  x_return_status := FND_API.G_RET_STS_ERROR;
814 	  ELSE
815 		IF NVL(FND_PROFILE.VALUE('ONT_BSA_MIN_MAX_VIOLATION'),'N') = 'Y' THEN
816 		  FND_MESSAGE.SET_NAME('ONT','OE_BL_LIN_MAX_AMT_EXCEEDED');
817 		  FND_MESSAGE.SET_TOKEN('BLANKET_NUMBER',p_blanket_number);
818 		  FND_MESSAGE.SET_TOKEN('BLANKET_LINE_NUMBER',p_blanket_line_number);
819 		  FND_MESSAGE.SET_TOKEN('BLANKET_CURRENCY',
820 		      g_blkt_hdr_tbl(l_blanket_header_id).currency_code);
821 		  FND_MESSAGE.SET_TOKEN('MAXIMUM',
822 		      g_blkt_line_tbl(l_blanket_line_id).blanket_line_max_amount);
823 		  oe_msg_pub.add;
824 		END IF;
825 
826 	  END IF;
827 
828        END IF;
829 
830  -- END IF;  -- IF override blanket control = 'N'
831 
832   END IF; -- End of blanket line checks
833 
834   -- (2) Blanket header max amount check
835 
836   -- ER 6526974
837   --IF g_blkt_hdr_tbl(l_blanket_header_id).override_amount_flag = 'N'
838      -- Check not needed for 0 amount or full cancellations
839   --   AND
840   IF l_amount <> 0
841   THEN
842 
843        IF l_hdr_released_amount >
844            (g_blkt_hdr_tbl(l_blanket_header_id).blanket_max_amount
845              + g_blkt_hdr_tbl(l_blanket_header_id).returned_amount)
846        THEN
847 	  IF g_blkt_hdr_tbl(l_blanket_header_id).override_amount_flag = 'N' THEN
848 		  FND_MESSAGE.SET_NAME('ONT','OE_BL_HDR_MAX_AMT_EXCEEDED');
849 		  FND_MESSAGE.SET_TOKEN('BLANKET_NUMBER',p_blanket_number);
850 		  FND_MESSAGE.SET_TOKEN('BLANKET_CURRENCY',
851 		      g_blkt_hdr_tbl(l_blanket_header_id).currency_code);
852 		  FND_MESSAGE.SET_TOKEN('MAXIMUM',
853 		      g_blkt_hdr_tbl(l_blanket_header_id).blanket_max_amount);
854 		  oe_msg_pub.add;
855 		  x_return_status := FND_API.G_RET_STS_ERROR;
856 	  ELSE
857 		IF NVL(FND_PROFILE.VALUE('ONT_BSA_MIN_MAX_VIOLATION'),'N') = 'Y' THEN
858 		  FND_MESSAGE.SET_NAME('ONT','OE_BL_HDR_MAX_AMT_EXCEEDED');
859 		  FND_MESSAGE.SET_TOKEN('BLANKET_NUMBER',p_blanket_number);
860 		  FND_MESSAGE.SET_TOKEN('BLANKET_CURRENCY',
861 		      g_blkt_hdr_tbl(l_blanket_header_id).currency_code);
862 		  FND_MESSAGE.SET_TOKEN('MAXIMUM',
863 		      g_blkt_hdr_tbl(l_blanket_header_id).blanket_max_amount);
864 		  oe_msg_pub.add;
865 		END IF;
866 
867 	  END IF;
868 
869        END IF;
870 
871   END IF; -- IF blanket header override amount control = 'N'
872 
873   IF x_return_status = FND_API.G_RET_STS_SUCCESS THEN
874 
875      -- Update quantity fields on cached blanket records
876      IF g_blkt_line_tbl(l_blanket_line_id).uom IS NOT NULL THEN
877         g_blkt_line_tbl(l_blanket_line_id).released_quantity
878               := l_released_quantity;
879         IF p_fulfilled_flag = 'Y' THEN
880            g_blkt_line_tbl(l_blanket_line_id).fulfilled_quantity
881                := nvl(g_blkt_line_tbl(l_blanket_line_id).fulfilled_quantity,0)
882                      + (l_quantity - l_old_quantity);
883         END IF;
884      END IF;
885 
886      -- Update amount fields on cached blanket records
887      g_blkt_line_tbl(l_blanket_line_id).released_amount
888                      := l_released_amount;
889      g_blkt_hdr_tbl(l_blanket_header_id).released_amount
890                      := l_hdr_released_amount;
891      IF p_fulfilled_flag = 'Y' THEN
892         g_blkt_line_tbl(l_blanket_line_id).fulfilled_amount
893             := g_blkt_line_tbl(l_blanket_line_id).fulfilled_amount
894                      + (l_amount - l_old_amount);
898      END IF;
895         g_blkt_hdr_tbl(l_blanket_header_id).fulfilled_amount
896             := g_blkt_hdr_tbl(l_blanket_header_id).fulfilled_amount
897                      + (l_amount - l_old_amount);
899 
900   END IF;
901 
902   if l_debug_level > 0 then
903      oe_debug_pub.add('Final blkt line released qty: '||
904                     g_blkt_line_tbl(l_blanket_line_id).released_quantity);
905      oe_debug_pub.add('Final blkt line released amt: '||
906                     g_blkt_line_tbl(l_blanket_line_id).released_amount);
907      oe_debug_pub.add('Final blkt hdr released amt: '||
908                     g_blkt_hdr_tbl(l_blanket_header_id).released_amount);
909   end if;
910 
911   -- End of min-max checks
912 
913 EXCEPTION
914   WHEN FND_API.G_EXC_ERROR THEN
915     x_return_status := FND_API.G_RET_STS_ERROR;
916   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
917     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
918   WHEN OTHERS THEN
919     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
920     IF OE_MSG_PUB.Check_Msg_Level(OE_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
921     THEN
922       OE_MSG_PUB.Add_Exc_Msg
923            (G_PKG_NAME
924             ,'Update_Released_Qty_Amount'
925             );
926     END IF;
927 END Update_Released_Qty_Amount;
928 
929 
930 ---------------------------------------------------------------------------
931 -- PROCEDURE Update_Blankets
932 ---------------------------------------------------------------------------
933 PROCEDURE Update_Blankets
934   (x_return_status    OUT NOCOPY VARCHAR2
935   )
936 IS
937   l_index            NUMBER;
938 BEGIN
939 
940 oe_debug_pub.add('Inside update blanket');
941 
942   l_index := g_blkt_hdr_tbl.FIRST;
943   WHILE l_index IS NOT NULL LOOP
944 
945       UPDATE OE_BLANKET_HEADERS_EXT
946          SET RELEASED_AMOUNT = g_blkt_hdr_tbl(l_index).released_amount
947              ,FULFILLED_AMOUNT = g_blkt_hdr_tbl(l_index).fulfilled_amount
948        WHERE ORDER_NUMBER IN (SELECT H.ORDER_NUMBER
949                                  FROM OE_BLANKET_HEADERS H
950                                  WHERE  H.HEADER_ID = g_blkt_hdr_tbl(l_index).header_id);
951 
952       UPDATE OE_BLANKET_HEADERS
953          SET LOCK_CONTROL    = LOCK_CONTROL + 1
954        WHERE HEADER_ID = g_blkt_hdr_tbl(l_index).header_id;--bug8465849
955 
956       l_index :=  g_blkt_hdr_tbl.NEXT(l_index);
957 
958 
959 
960   END LOOP;
961 
962   l_index := g_blkt_line_tbl.FIRST;
963   WHILE l_index IS NOT NULL LOOP
964 
965       UPDATE OE_BLANKET_LINES_EXT
966          SET RELEASED_AMOUNT = g_blkt_line_tbl(l_index).released_amount
967              ,RELEASED_QUANTITY = g_blkt_line_tbl(l_index).released_quantity
968              ,FULFILLED_AMOUNT = g_blkt_line_tbl(l_index).fulfilled_amount
969              ,FULFILLED_QUANTITY = g_blkt_line_tbl(l_index).fulfilled_quantity
970          WHERE  LINE_ID = g_blkt_line_tbl(l_index).line_id;
971 
972       UPDATE OE_BLANKET_LINES
973          SET LOCK_CONTROL = LOCK_CONTROL + 1
974        WHERE LINE_ID =  g_blkt_line_tbl(l_index).line_id;--bug8465849
975 
976       l_index :=  g_blkt_line_tbl.NEXT(l_index);
977 
978 
979 
980 
981   END LOOP;
982 
983 oe_debug_pub.add('Leaving update blanket');
984 
985 EXCEPTION
986   WHEN OTHERS THEN
987     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
988     IF OE_MSG_PUB.Check_Msg_Level(OE_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
989     THEN
990       OE_MSG_PUB.Add_Exc_Msg
991            (G_PKG_NAME
992             ,'Update_Blankets'
993             );
994     END IF;
995 END Update_Blankets;
996 
997 
998 ---------------------------------------------------------------------------
999 -- PROCEDURE Validate_Release_Shipments
1000 -- Validates that sum of quantities/amounts across all shipments that
1001 -- reference the same blanket are within min/max release qty/amount
1002 -- limits on the blanket line.
1003 ---------------------------------------------------------------------------
1004 PROCEDURE Validate_Release_Shipments
1005   (p_line_set_id               IN NUMBER
1006   ,p_blanket_number            IN NUMBER
1007   ,p_blanket_line_number       IN NUMBER
1008   ,p_currency_code             IN VARCHAR2
1009   ,x_return_status             OUT NOCOPY VARCHAR2
1010   )
1011 IS
1012 
1013   l_blanket_line_id          NUMBER;
1014   l_blanket_header_id        NUMBER;
1015 
1016   l_set_quantity             NUMBER := 0;
1017   l_set_amount               NUMBER := 0;
1018   l_uom                      VARCHAR2(3);
1019   l_inv_item_id              NUMBER;
1020   l_set_line_number          NUMBER;
1021 --
1022 l_debug_level CONSTANT NUMBER := oe_debug_pub.g_debug_level;
1023 --
1024 
1025   FUNCTION Get_Set_Line_Number RETURN NUMBER IS
1026   BEGIN
1027 
1028     SELECT line_number
1029       INTO l_set_line_number
1030       FROM OE_ORDER_LINES
1031      WHERE LINE_SET_ID = p_line_set_id
1032        AND ROWNUM = 1;
1033 
1034     RETURN l_set_line_number;
1035 
1036   END Get_Set_Line_Number;
1037 
1038 
1039 BEGIN
1040 
1041   x_return_status := FND_API.G_RET_STS_SUCCESS;
1042 
1043   Cache_Blanket(p_blanket_number
1044               ,p_blanket_line_number
1045               ,'Y' -- p_lock
1046               ,l_blanket_line_id
1047               ,l_blanket_header_id
1048               );
1049 
1050  l_blanket_line_id := MOD(l_blanket_line_id,G_BINARY_LIMIT);
1051  l_blanket_header_id := MOD(l_blanket_header_id,G_BINARY_LIMIT);
1052 --ER 6526974
1053 -- NO Min/Max Validations need, return
1057      RETURN;
1054 /*  IF nvl(g_blkt_line_tbl(l_blanket_line_id).OVERRIDE_RELEASE_CONTROLS_FLAG
1055            ,'Y') = 'Y'
1056   THEN
1058   END IF;*/
1059 
1060   SELECT ordered_quantity_uom, inventory_item_id
1061     INTO l_uom, l_inv_item_id
1062     FROM OE_SETS
1063    WHERE set_id = p_line_set_id;
1064 
1065   SELECT SUM(nvl(ordered_quantity,0))
1066          ,SUM(nvl(ordered_quantity,0) * nvl(unit_selling_price,0))
1067     INTO l_set_quantity
1068          ,l_set_amount
1069     FROM OE_ORDER_LINES
1070    WHERE line_set_id = p_line_set_id
1071      AND blanket_number = p_blanket_number
1072      AND blanket_line_number = p_blanket_line_number;
1073 
1074   if l_debug_level > 0 then
1075      oe_debug_pub.add('Set Qty :'||l_set_quantity);
1076      oe_debug_pub.add('Set Amt :'||l_set_amount);
1077   end if;
1078 
1079   -- Min/Max Qty Validations only if UOM exists on blanket line
1080   IF g_blkt_line_tbl(l_blanket_line_id).uom IS NOT NULL
1081      AND l_set_quantity > 0
1082   THEN
1083 
1084      IF NOT OE_GLOBALS.EQUAL(l_uom,
1085               g_blkt_line_tbl(l_blanket_line_id).uom)
1086      THEN
1087 
1088        oe_debug_pub.add('convert uom');
1089        l_set_quantity := OE_Order_Misc_Util.Convert_UOM
1090              (p_item_id          => l_inv_item_id
1091              ,p_from_uom_code    => l_uom
1092              ,p_to_uom_code      => g_blkt_line_tbl(l_blanket_line_id).uom
1093              ,p_from_qty         => l_set_quantity
1094              );
1095        IF l_set_quantity < 0 THEN
1096         FND_MESSAGE.SET_NAME('ONT','OE_BL_UOM_CONV_FAILED');
1097         FND_MESSAGE.SET_TOKEN('LINE_NUMBER',Get_Set_Line_Number);
1098         FND_MESSAGE.SET_TOKEN('BLANKET_UOM',
1099                                g_blkt_line_tbl(l_blanket_line_id).uom);
1100         OE_MSG_PUB.ADD;
1101         RAISE FND_API.G_EXC_ERROR;
1102        END IF;
1103 
1104      END IF;
1105 
1106      IF l_set_quantity <
1107             nvl(g_blkt_line_tbl(l_blanket_line_id).min_release_quantity,0)
1108           OR l_set_quantity >
1109              nvl(g_blkt_line_tbl(l_blanket_line_id).max_release_quantity
1110                                         ,l_set_quantity)
1111      THEN
1112        IF g_blkt_line_tbl(l_blanket_line_id).OVERRIDE_RELEASE_CONTROLS_FLAG = 'N' THEN
1113 	       FND_MESSAGE.SET_NAME('ONT','OE_BL_SUM_SPLIT_MIN_MAX_QTY');
1114 	       FND_MESSAGE.SET_TOKEN('LINE_NUMBER',Get_Set_Line_Number);
1115 	       FND_MESSAGE.SET_TOKEN('BLANKET_UOM',
1116 		   g_blkt_line_tbl(l_blanket_line_id).uom);
1117 	       FND_MESSAGE.SET_TOKEN('MINIMUM',
1118 		   g_blkt_line_tbl(l_blanket_line_id).min_release_quantity);
1119 	       FND_MESSAGE.SET_TOKEN('MAXIMUM',
1120 		   g_blkt_line_tbl(l_blanket_line_id).max_release_quantity);
1121 	       oe_msg_pub.add;
1122 	       x_return_status := FND_API.G_RET_STS_ERROR;
1123 	ELSE
1124 		IF  NVL(FND_PROFILE.VALUE('ONT_BSA_MIN_MAX_VIOLATION'),'N') = 'Y' THEN
1125 			FND_MESSAGE.SET_NAME('ONT','OE_BL_SUM_SPLIT_MIN_MAX_QTY');
1126 			FND_MESSAGE.SET_TOKEN('LINE_NUMBER',Get_Set_Line_Number);
1127 			FND_MESSAGE.SET_TOKEN('BLANKET_UOM',
1128 			  g_blkt_line_tbl(l_blanket_line_id).uom);
1129 			FND_MESSAGE.SET_TOKEN('MINIMUM',
1130 				g_blkt_line_tbl(l_blanket_line_id).min_release_quantity);
1131 			FND_MESSAGE.SET_TOKEN('MAXIMUM',
1132 				  g_blkt_line_tbl(l_blanket_line_id).max_release_quantity);
1133 			oe_msg_pub.add;
1134 		END IF;
1135 
1136 	END IF;
1137 
1138      END IF;
1139 
1140   END IF;
1141 
1142   oe_debug_pub.add('Amt Checks');
1143   -- Min/Max Amount Validations
1144   IF l_set_amount <> 0 THEN
1145 
1146      IF p_currency_code
1147        <> g_blkt_hdr_tbl(l_blanket_header_id).currency_code
1148      THEN
1149 
1150        IF g_blkt_hdr_tbl(l_blanket_header_id).conversion_type_code IS NULL THEN
1151           FND_MESSAGE.SET_NAME('ONT','OE_BL_MISS_CONVERSION_TYPE');
1152           FND_MESSAGE.SET_TOKEN('BLANKET_NUMBER',p_blanket_number);
1153           oe_msg_pub.add;
1154           RAISE FND_API.G_EXC_ERROR;
1155        END IF;
1156 
1157        l_set_amount := Convert_Amount
1158           (p_from_currency     => p_currency_code
1159           ,p_to_currency       =>
1160                   g_blkt_hdr_tbl(l_blanket_header_id).currency_code
1161           ,p_conversion_date   => sysdate
1162           ,p_conversion_type   =>
1163                   g_blkt_hdr_tbl(l_blanket_header_id).conversion_type_code
1164           ,p_amount            => l_set_amount
1165           );
1166 
1167      END IF;
1168 
1169      IF (l_set_amount < nvl(g_blkt_line_tbl(l_blanket_line_id).min_release_amount,0)
1170        OR l_set_amount > nvl(g_blkt_line_tbl(l_blanket_line_id).max_release_amount
1171                       ,l_set_amount)
1172        )
1173      THEN
1174       IF g_blkt_line_tbl(l_blanket_line_id).OVERRIDE_RELEASE_CONTROLS_FLAG = 'N' THEN
1175 			FND_MESSAGE.SET_NAME('ONT','OE_BL_SUM_SPLIT_MIN_MAX_AMT');
1176 			FND_MESSAGE.SET_TOKEN('LINE_NUMBER',Get_Set_Line_Number);
1177 			FND_MESSAGE.SET_TOKEN('BLANKET_CURRENCY',
1178 			g_blkt_hdr_tbl(l_blanket_header_id).currency_code);
1179 			FND_MESSAGE.SET_TOKEN('MINIMUM',
1180 			 g_blkt_line_tbl(l_blanket_line_id).min_release_amount);
1181 			FND_MESSAGE.SET_TOKEN('MAXIMUM',
1182 			    g_blkt_line_tbl(l_blanket_line_id).max_release_amount);
1183 			oe_msg_pub.add;
1184 			x_return_status := FND_API.G_RET_STS_ERROR;
1185        ELSE
1186 		IF  NVL(FND_PROFILE.VALUE('ONT_BSA_MIN_MAX_VIOLATION'),'N') = 'Y' THEN
1187 			FND_MESSAGE.SET_NAME('ONT','OE_BL_SUM_SPLIT_MIN_MAX_AMT');
1188 			FND_MESSAGE.SET_TOKEN('LINE_NUMBER',Get_Set_Line_Number);
1189 			FND_MESSAGE.SET_TOKEN('BLANKET_CURRENCY',
1190 			g_blkt_hdr_tbl(l_blanket_header_id).currency_code);
1191 			FND_MESSAGE.SET_TOKEN('MINIMUM',
1192 			 g_blkt_line_tbl(l_blanket_line_id).min_release_amount);
1196 		END IF;
1193 			FND_MESSAGE.SET_TOKEN('MAXIMUM',
1194 			    g_blkt_line_tbl(l_blanket_line_id).max_release_amount);
1195 			oe_msg_pub.add;
1197      END IF;
1198 
1199      END IF;
1200 
1201   END IF;
1202 
1203 
1204 EXCEPTION
1205   WHEN FND_API.G_EXC_ERROR THEN
1206     x_return_status := FND_API.G_RET_STS_ERROR;
1207   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1208     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1209   WHEN OTHERS THEN
1210     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1211     IF OE_MSG_PUB.Check_Msg_Level(OE_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
1212     THEN
1213       OE_MSG_PUB.Add_Exc_Msg
1214            (G_PKG_NAME
1215             ,'Validate_Release_Shipments'
1216             );
1217     END IF;
1218 END Validate_Release_Shipments;
1219 
1220 ---------------------------------------------------------------------------
1221 -- PROCEDURE Process_Releases
1222 -- This is the main procedure for release validations against controls
1223 -- defined on the blanket orders.
1224 -- 1. First, requests of the type - VALIDATE_RELEASE_SHIPMENTS - are
1225 --    executed. This would validate that sum of quantities/amounts
1226 --    across shipments are within the min/max release qty/amount.
1227 --    NOTE: If there is an error here, the procedure returns with
1228 --    a status of error. No further validations are executed.
1229 -- 2. Next, requests of type - PROCESS_RELEASE - are executed. This
1230 --    would validate that individual order lines are within the min
1231 --    /max release qty/amount. If line is a shipment, only a warning
1232 --    is issued else an error is raised.
1233 --    Also, cumulative qties/amounts across releases for a blanket
1234 --    are also validated that it is within min/max blanket amounts. If
1235 --    there is a validation failure here, an error is raised.
1236 --    Cumulative qties/amounts are updated on cached blanket records:
1237 --    g_blkt_line_tbl,g_blkt_hdr_tbl.
1238 -- 3. If there is a failure in 2, all requests of type PROCESS_RELEASE
1239 --    are re-set to error. The reason being that the accumulation logic
1240 --    should be re-executed for all lines as it would not be known
1241 --    which line caused it to go over the limits.
1242 -- 4. If 2 is successful (all lines pass all blanket validations),
1243 --    Update Blanket Tables with the new cumulative released qties/
1244 --    amounts.
1245 ---------------------------------------------------------------------------
1246 PROCEDURE Process_Releases
1247   (p_request_tbl      IN OUT NOCOPY OE_ORDER_PUB.Request_Tbl_Type
1248   ,x_return_status    OUT NOCOPY VARCHAR2
1249   )
1250 IS
1251  I                       NUMBER;
1252  J                       NUMBER;
1253  l_return_status         VARCHAR2(3);
1254  l_header_id             NUMBER;
1255  l_qty                   NUMBER;
1256  l_currency_code         VARCHAR2(15);
1257  l_hdr_id                NUMBER;
1258  p_request_tbl_temp      OE_ORDER_PUB.Request_Tbl_Type;
1259 --
1260 l_debug_level CONSTANT NUMBER := oe_debug_pub.g_debug_level;
1261 --
1262 BEGIN
1263 
1264   if l_debug_level > 0 then
1265      oe_debug_pub.add('ENTER OE_Blanket_Util.Process_Releases, Num Requests :'
1266                             || p_request_tbl.COUNT);
1267   end if;
1268 
1269   g_blkt_line_tbl.delete;
1270   g_blkt_hdr_tbl.delete;
1271 
1272   x_return_status := FND_API.G_RET_STS_SUCCESS;
1273 
1274   I := p_request_tbl.FIRST;
1275   WHILE I IS NOT NULL LOOP
1276 
1277      -- Bug 3007584 - skip requests with null request type
1278      IF p_request_tbl(I).request_type IS NULL
1279         OR p_request_tbl(I).request_type <> 'VALIDATE_RELEASE_SHIPMENTS' THEN
1280         GOTO end_of_loop;
1281      END IF;
1282 
1283      if l_debug_level > 0 then
1284         oe_debug_pub.add('VALIDATE_RELEASE_SHIPMENTS, line set id: '
1285                                ||p_request_tbl(I).entity_id);
1286      end if;
1287 
1288      Validate_Release_Shipments
1289             (p_line_set_id         => p_request_tbl(I).entity_id
1290             ,p_blanket_number      => p_request_tbl(I).request_unique_key1
1291             ,p_blanket_line_number => p_request_tbl(I).request_unique_key2
1292             ,p_currency_code       => p_request_tbl(I).param1
1293             ,x_return_status       => l_return_status
1294             );
1295 
1296      IF l_return_status = FND_API.G_RET_STS_ERROR THEN
1297         oe_debug_pub.add('ret sts of error');
1298         x_return_status := FND_API.G_RET_STS_ERROR;
1299         RETURN;
1300      ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
1301         oe_debug_pub.add('ret sts of unexp error');
1302         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1303         RETURN;
1304      END IF;
1305 
1306      p_request_tbl(I).processed := 'Y';
1307 
1308      <<end_of_loop>>
1309 
1310      I := p_request_tbl.NEXT(I);
1311 
1312   END LOOP;
1313 
1314  -- Bug 8745183 Start   Inserting data of p_request_tbl into p_request_tbl_temp whose index is entity_id
1315   I := p_request_tbl.FIRST;
1316 
1317   WHILE I IS NOT NULL LOOP
1318 	----Bug 14276608 Start (IF condition to copy requests of type 'PROCESS_RELEASE' only)
1319 	IF p_request_tbl(I).request_type = 'PROCESS_RELEASE' THEN
1320 	----Bug 14276608 End
1321 	  p_request_tbl_temp(MOD(p_request_tbl(I).entity_id,G_BINARY_LIMIT))  := p_request_tbl(I);
1322 	----Bug 14276608 Start
1323 	END IF;
1324 	----Bug 14276608 End
1325 	  I := p_request_tbl.NEXT(I);
1326 
1327   END LOOP;
1328 
1329   -- For the process release code, we will use this p_request_tbl_temp instead of p_request_tbl.
1330   -- The temp table has requested sorted in ascending order of entity id which will make sure that
1331   -- requests with request_type = PROCESS RELEASE will get execute in ascending order of their entity id.
1335 
1332   -- Replaced p_request_tbl with p_request_tbl_temp for the following code.
1333   -- Bug 8745183 End
1334 
1336   I := p_request_tbl_temp.FIRST;
1337   WHILE I IS NOT NULL LOOP
1338 
1339      -- Bug 3007584 - skip requests with null request type
1340      IF p_request_tbl_temp(I).request_type IS NULL
1341 	 	----Bug 14276608 Start
1342         --OR p_request_tbl_temp(I).request_type <> 'PROCESS_RELEASE'
1343 		----Bug 14276608 End
1344 	  THEN
1345         GOTO end_of_loop;
1346      END IF;
1347 
1348      oe_debug_pub.add('PROCESS_RELEASE, line id: '||p_request_tbl_temp(I).entity_id);
1349 
1350    begin
1351 	     select header_id
1352 	     into l_hdr_id
1353 	     from oe_order_lines
1354 	     where line_id = p_request_tbl_temp(I).entity_id;
1355 
1356 
1357      --ER6795052
1358      OE_MSG_PUB.Set_Msg_Context(
1359             p_entity_code          => 'LINE'
1360           , p_entity_id            => p_request_tbl_temp(I).entity_id
1361 	  , p_header_id            => l_hdr_id
1362 	  , p_line_id              => p_request_tbl_temp(I).entity_id );
1363 
1364      --Start of bug# 16167166
1365      IF NOT OE_GLOBALS.G_UI_FLAG  THEN
1366         OE_MSG_PUB.Update_Msg_Context(
1367             p_order_source_id       => OE_Order_Cache.g_header_rec.order_source_id
1368           , p_orig_sys_document_ref => OE_Order_Cache.g_header_rec.orig_sys_document_ref );
1369      END IF;    --End of bug# 16167166
1370 
1371    Exception
1372 	when others then
1373 	NULL;
1374     End;
1375      -- BUG 2746595, currency code is in request_unique_key1 parameter.
1376      -- This is required as 2 distinct requests need to be logged for
1377      -- currency updates.
1378 
1379      l_currency_code := p_request_tbl_temp(I).request_unique_key1;
1380 
1381      if l_debug_level > 0 then
1382         oe_debug_pub.add('header currency :'||l_currency_code);
1383         oe_debug_pub.add('old blanket num :'||p_request_tbl_temp(I).param1);
1384         oe_debug_pub.add('new blanket num:'||p_request_tbl_temp(I).param11);
1385         oe_debug_pub.add('old blanket line num:'||p_request_tbl_temp(I).param2);
1386         oe_debug_pub.add('new blanket line num:'||p_request_tbl_temp(I).param12);
1387      end if;
1388 
1389      -- Blanket line remained same but some other field affecting
1390      -- qty or price was updated
1391      IF p_request_tbl_temp(I).param1 = p_request_tbl_temp(I).param11
1392         AND p_request_tbl_temp(I).param2 =  p_request_tbl_temp(I).param12
1393      THEN
1394 
1395      if l_debug_level > 0 then
1396         oe_debug_pub.add('Update qty/amt for existing blanket num :'
1397                           ||p_request_tbl_temp(I).param11);
1398      end if;
1399 
1400         Update_Released_Qty_Amount
1401             (p_line_id             => p_request_tbl_temp(I).entity_id
1402             ,p_blanket_number      => p_request_tbl_temp(I).param11
1403             ,p_blanket_line_number => p_request_tbl_temp(I).param12
1404             ,p_old_quantity        => p_request_tbl_temp(I).param3
1405             ,p_quantity            => p_request_tbl_temp(I).param13
1406             ,p_old_order_qty_uom   => p_request_tbl_temp(I).param4
1407             ,p_order_qty_uom       => p_request_tbl_temp(I).param14
1408             ,p_old_unit_selling_price => p_request_tbl_temp(I).param5
1409             ,p_unit_selling_price  => p_request_tbl_temp(I).param15
1410             ,p_old_inv_item_id     => p_request_tbl_temp(I).param6
1411             ,p_inv_item_id         => p_request_tbl_temp(I).param16
1412             ,p_currency_code       => l_currency_code
1413             ,p_fulfilled_flag      => p_request_tbl_temp(I).param8
1414             ,p_line_set_id         => p_request_tbl_temp(I).param9
1415             ,x_return_status       => l_return_status
1416             );
1417 
1418         IF l_return_status = FND_API.G_RET_STS_ERROR THEN
1419            oe_debug_pub.add('1. ret sts of error');
1420            x_return_status := FND_API.G_RET_STS_ERROR;
1421         ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
1422            oe_debug_pub.add('1. ret sts of unexp error');
1423            RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1424         END IF;
1425 
1426      ELSE
1427 
1428         -- Increment qty/amount for new blanket line
1429         IF p_request_tbl_temp(I).param11 IS NOT NULL THEN
1430 
1431         if l_debug_level > 0 then
1432           oe_debug_pub.add('Increment qty/amt for new blanket num :'
1433                           ||p_request_tbl_temp(I).param11);
1434         end if;
1435 
1436           Update_Released_Qty_Amount
1437             (p_line_id             => p_request_tbl_temp(I).entity_id
1438             ,p_blanket_number      => p_request_tbl_temp(I).param11
1439             ,p_blanket_line_number => p_request_tbl_temp(I).param12
1440             ,p_old_quantity        => 0
1441             ,p_quantity            => p_request_tbl_temp(I).param13
1442             ,p_old_order_qty_uom   => null
1443             ,p_order_qty_uom       => p_request_tbl_temp(I).param14
1444             ,p_old_unit_selling_price => 0
1445             ,p_unit_selling_price  => p_request_tbl_temp(I).param15
1446             ,p_old_inv_item_id     => null
1447             ,p_inv_item_id         => p_request_tbl_temp(I).param16
1448             ,p_currency_code       => l_currency_code
1449             ,p_fulfilled_flag      => p_request_tbl_temp(I).param8
1450             ,p_line_set_id         => p_request_tbl_temp(I).param9
1451             ,x_return_status       => l_return_status
1452             );
1453 
1454         END IF;
1455 
1456         IF l_return_status = FND_API.G_RET_STS_ERROR THEN
1457            oe_debug_pub.add('2. ret sts of error');
1458            x_return_status := FND_API.G_RET_STS_ERROR;
1459         ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
1460            oe_debug_pub.add('2. ret sts of unexp error');
1464         -- Decrement qty/amount for old blanket line
1461            RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1462         END IF;
1463 
1465         IF p_request_tbl_temp(I).param1 IS NOT NULL THEN
1466 
1467         if l_debug_level > 0 then
1468            oe_debug_pub.add('Decrement qty/amt for old blanket num :'
1469                           ||p_request_tbl_temp(I).param1);
1470         end if;
1471 
1472           Update_Released_Qty_Amount
1473             (p_line_id             => p_request_tbl_temp(I).entity_id
1474             ,p_blanket_number      => p_request_tbl_temp(I).param1
1475             ,p_blanket_line_number => p_request_tbl_temp(I).param2
1476             ,p_old_quantity        => p_request_tbl_temp(I).param3
1477             ,p_quantity            => 0
1478             ,p_old_order_qty_uom   => p_request_tbl_temp(I).param4
1479             ,p_order_qty_uom       => null
1480             ,p_old_unit_selling_price => p_request_tbl_temp(I).param5
1481             ,p_unit_selling_price  => 0
1482             ,p_old_inv_item_id     => p_request_tbl_temp(I).param6
1483             ,p_inv_item_id         => null
1484             ,p_currency_code       => l_currency_code
1485             ,p_fulfilled_flag      => p_request_tbl_temp(I).param8
1486             ,p_line_set_id         => p_request_tbl_temp(I).param9
1487             ,x_return_status       => l_return_status
1488             );
1489 
1490         END IF;
1491 
1492         IF l_return_status = FND_API.G_RET_STS_ERROR THEN
1493            oe_debug_pub.add('3. ret sts of error');
1494            x_return_status := FND_API.G_RET_STS_ERROR;
1495         ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
1496            oe_debug_pub.add('3. ret sts of unexp error');
1497            RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1498         END IF;
1499 
1500      END IF;
1501 
1502      p_request_tbl_temp(I).processed := 'Y';
1503 
1504 --  Bug 8745183 Start
1505 
1506      J := p_request_tbl.FIRST;
1507 
1508      LOOP
1509 
1510      if p_request_tbl(J).entity_id = I
1511        AND p_request_tbl(J).request_type = 'PROCESS_RELEASE' then
1512 
1513            p_request_tbl(J).processed := 'Y';
1514      END IF;
1515 
1516      J := p_request_tbl.NEXT(J);
1517 
1518      EXIT WHEN J IS NULL;
1519 
1520      END LOOP;
1521 
1522 -- Bug 8745183 End
1523 
1524      <<end_of_loop>>
1525 
1526      I := p_request_tbl_temp.NEXT(I);
1527 
1528 	OE_MSG_PUB.Reset_Msg_Context('LINE');
1529   END LOOP;
1530 
1531 
1532   -- Error during updates, mark the requests as NOT processed
1533   IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1534 
1535       if l_debug_level > 0 then
1536          oe_debug_pub.add('Overall Ret Sts :'||x_return_status);
1537       end if;
1538 
1539       I := p_request_tbl.FIRST;
1540       WHILE I IS NOT NULL LOOP
1541         IF p_request_tbl(I).request_type = 'PROCESS_RELEASE' THEN
1542            if l_debug_level > 0 then
1543               oe_debug_pub.add('Set req to NOT processed at index :'||I);
1544            end if;
1545            p_request_tbl(I).processed := 'N';
1546         END IF;
1547         I := p_request_tbl.NEXT(I);
1548       END LOOP;
1549 
1550   -- Updates of quantity/amounts was successful!
1551   -- Update these values on the DB for blanket headers/lines table.
1552   ELSIF g_blkt_line_tbl.COUNT > 0 THEN
1553 
1554       Update_Blankets(l_return_status);
1555 
1556       -- Only if blankets update is successful,
1557       -- delete the old order released qty/amount also.
1558       IF OE_CODE_CONTROL.CODE_RELEASE_LEVEL >= '110510' THEN
1559 
1560          oe_debug_pub.add('delete cache');
1561          g_bl_order_val_tbl.delete;
1562          g_bh_order_val_tbl.delete;
1563 
1564       END IF;
1565 
1566   END IF;
1567 
1568   if l_debug_level > 0 then
1569      oe_debug_pub.add('EXIT OE_Blanket_Util.Process_Releases');
1570   end if;
1571 
1572 EXCEPTION
1573   WHEN FND_API.G_EXC_ERROR THEN
1574     x_return_status := FND_API.G_RET_STS_ERROR;
1575   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1576     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1577   WHEN OTHERS THEN
1578     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1579     IF OE_MSG_PUB.Check_Msg_Level(OE_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
1580     THEN
1581       OE_MSG_PUB.Add_Exc_Msg
1582            (G_PKG_NAME
1583             ,'Process_Releases'
1584             );
1585     END IF;
1586 END Process_Releases;
1587 
1588 -- Sub-procedure, called twice for both old and new blanket
1589 -- reference on the line.
1590 PROCEDURE Populate_Old_Values
1591 (p_blanket_number              IN NUMBER
1592 ,p_blanket_line_number         IN NUMBER
1593 ,p_line_id                     IN NUMBER
1594 ,p_old_quantity                IN NUMBER DEFAULT NULL
1595 ,p_old_unit_sp                 IN NUMBER DEFAULT NULL
1596 ,p_header_id                   IN NUMBER DEFAULT NULL
1597 )
1598 IS
1599 l_return_status         VARCHAR2(3);
1600 l_header_id                   NUMBER;
1601 l_blanket_header_id           NUMBER;
1602 l_blanket_line_id             NUMBER;
1603 l_old_quantity                NUMBER;
1604 l_old_unit_sp                 NUMBER;
1605 l_old_amount                  NUMBER;
1606 l_rem_bl_line_qty             NUMBER;
1607 l_rem_bl_line_amt             NUMBER;
1608 l_rem_bl_hdr_amt              NUMBER;
1609 l_currency_code         VARCHAR2(15);
1610 --
1611 l_debug_level CONSTANT NUMBER := oe_debug_pub.g_debug_level;
1612 --
1613 BEGIN
1614 
1615     if l_debug_level > 0 then
1616        oe_debug_pub.add('Enter Populate_Old_Values');
1617        oe_debug_pub.add('Blanket Num :'||p_blanket_number);
1621        oe_debug_pub.add('Old Qty :'||p_old_quantity);
1618        oe_debug_pub.add('Blanket Line Num :'||p_blanket_line_number);
1619        oe_debug_pub.add('Line ID :'||p_line_id);
1620        oe_debug_pub.add('Header ID :'||p_header_id);
1622        oe_debug_pub.add('Old Selling Price :'||p_old_unit_sp);
1623     end if;
1624 
1625     -- Do not lock when caching old values
1626     Cache_Blanket
1627         (p_blanket_number => p_blanket_number
1628         ,p_blanket_line_number => p_blanket_line_number
1629         ,p_lock => 'N'
1630         ,x_blanket_header_id => l_blanket_header_id
1631         ,x_blanket_line_id => l_blanket_line_id
1632         );
1633 
1634     l_blanket_header_id := MOD(l_blanket_header_id,G_BINARY_LIMIT);--bug8465849
1635     l_blanket_line_id := MOD(l_blanket_line_id,G_BINARY_LIMIT);--bug8465849
1636 
1637     -- If not cached already, retrieve the old values
1638     IF NOT g_bl_order_val_tbl.exists(l_blanket_line_id)THEN
1639 
1640        IF p_header_id IS NULL
1641           OR p_old_quantity IS NULL
1642        THEN
1643 
1644           BEGIN
1645           SELECT HEADER_ID, ORDERED_QUANTITY, UNIT_SELLING_PRICE
1646             INTO l_header_id, l_old_quantity, l_old_unit_sp
1647             FROM OE_ORDER_LINES_ALL
1648            WHERE LINE_ID = p_line_id;
1649           EXCEPTION
1650             -- If QP sourcing API is called while the line is still not
1651             -- saved e.g. when tabbing out of qty field from the UI, no data
1652             -- found exception will result and it should be handled.
1653             WHEN NO_DATA_FOUND THEN
1654               l_old_quantity := 0;
1655               l_old_unit_sp := 0;
1656           END;
1657 
1658        END IF;
1659 
1660        IF p_old_quantity IS NOT NULL THEN
1661           l_old_quantity := p_old_quantity;
1662        END IF;
1663 
1664        IF p_old_unit_sp IS NOT NULL THEN
1665           l_old_unit_sp := p_old_unit_sp;
1666        END IF;
1667 
1668        IF p_header_id IS NOT NULL THEN
1669           l_header_id := p_header_id;
1670        END IF;
1671 
1672        -- Bug 3390070
1673        -- Use l_old_quantity/unit_sp instead of p_old_quantity/unit_sp
1674        -- Because it was using wrong variables, old amount was not
1675        -- calculated correctly thus resulting in incorrect values for
1676        -- blanket amount and blanket line amount accumulations.
1677        l_old_amount := nvl(l_old_quantity,0) * nvl(l_old_unit_sp,0);
1678 
1679          -- Compute the old qty/amt consumed against this blanket line
1680          -- from other lines on this order
1681          SELECT sum(nvl(ordered_quantity,0)),
1682                 sum(nvl(ordered_quantity,0)*nvl(unit_selling_price,0))
1683            INTO l_rem_bl_line_qty
1684                 ,l_rem_bl_line_amt
1685            FROM OE_ORDER_LINES_ALL
1686           WHERE HEADER_ID = l_header_id
1687             AND BLANKET_NUMBER = p_blanket_number
1688             AND BLANKET_LINE_NUMBER = p_blanket_line_number
1689             AND LINE_ID <> p_line_id;
1690 
1691        -- Update old order values on the blanket line cache
1692        g_bl_order_val_tbl(l_blanket_line_id).order_released_quantity
1693           := nvl(l_rem_bl_line_qty,0) + l_old_quantity;
1694        g_bl_order_val_tbl(l_blanket_line_id).order_released_amount
1695           := nvl(l_rem_bl_line_amt,0) + l_old_amount;
1696 
1697        -- If blanket hdr amt NOT cached already, cache the old values
1698        IF NOT g_bh_order_val_tbl.exists(l_blanket_header_id)THEN
1699 
1700          -- Compute the old qty/amt consumed against this blanket header
1701          -- from other lines on this order
1702          SELECT sum(nvl(ordered_quantity,0)*nvl(unit_selling_price,0))
1703            INTO l_rem_bl_hdr_amt
1704            FROM OE_ORDER_LINES_ALL
1705           WHERE HEADER_ID = l_header_id
1706             AND BLANKET_NUMBER = p_blanket_number
1707             AND LINE_ID <> p_line_id;
1708 
1709           -- Update old order values on the blanket header cache
1710           g_bh_order_val_tbl(l_blanket_header_id).order_released_amount
1711               := nvl(l_rem_bl_hdr_amt,0) + l_old_amount;
1712 
1713        END IF;
1714 
1715        if l_debug_level > 0 then
1716           oe_debug_pub.add('order header id :'||l_header_id);
1717           oe_debug_pub.add('rem bl line qty :'||nvl(l_rem_bl_line_qty,0));
1718           oe_debug_pub.add('rem bl line amt :'||nvl(l_rem_bl_line_amt,0));
1719           oe_debug_pub.add('rem bl hdr amt :'||nvl(l_rem_bl_hdr_amt,0));
1720           oe_debug_pub.add('old qty :'||l_old_quantity);
1721           oe_debug_pub.add('old amt :'||l_old_amount);
1722        end if;
1723 
1724     END IF; -- if not cached
1725 
1726 EXCEPTION
1727   WHEN FND_API.G_EXC_ERROR THEN
1728     RAISE FND_API.G_EXC_ERROR;
1729   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1730     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1731   WHEN OTHERS THEN
1732     IF OE_MSG_PUB.Check_Msg_Level(OE_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
1733     THEN
1734       OE_MSG_PUB.Add_Exc_Msg
1735            (G_PKG_NAME
1736             ,'Populate_Old_Values'
1737             );
1738     END IF;
1739     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1740 END Populate_Old_Values;
1741 
1742 PROCEDURE Cache_Order_Qty_Amt
1743   (p_request_rec      IN OUT NOCOPY OE_ORDER_PUB.Request_Rec_Type
1744   ,x_return_status    OUT NOCOPY VARCHAR2
1745   )
1746 IS
1747  l_return_status         VARCHAR2(3);
1748  l_header_id                   NUMBER;
1749  l_blanket_header_id           NUMBER;
1750  l_blanket_line_id             NUMBER;
1751  l_blanket_number              NUMBER;
1752  l_blanket_line_number         NUMBER;
1753  l_old_line_quantity           NUMBER;
1754  l_rem_lines_quantity          NUMBER;
1755  l_currency_code         VARCHAR2(15);
1756 --
1760 BEGIN
1757 l_debug_level CONSTANT NUMBER := oe_debug_pub.g_debug_level;
1758 --
1759 
1761 
1762   if l_debug_level > 0 then
1763      oe_debug_pub.add('ENTER OE_Blkt_Release_Util.Cache_Order_Qty_Amt');
1764   end if;
1765 
1766   x_return_status := fnd_api.g_ret_sts_success;
1767 
1768   -- Blanket reference not updated, some other attribute on line updated
1769   IF p_request_rec.param1 = p_request_rec.param11
1770      AND p_request_rec.param2 = p_request_rec.param12
1771   THEN
1772 
1773      Populate_Old_Values
1774        (p_blanket_number => p_request_rec.param1
1775        ,p_blanket_line_number => p_request_rec.param2
1776        ,p_line_id => p_request_rec.entity_id
1777        ,p_old_quantity => nvl(p_request_rec.param3,0)
1778        ,p_old_unit_sp => nvl(p_request_rec.param5,0)
1779        );
1780 
1781   ELSE
1782 
1783      -- New reference, hence no values were sourced for this blanket
1784      -- from this line previously.
1785      IF p_request_rec.param11 IS NOT NULL THEN
1786 
1787      Populate_Old_Values
1788        (p_blanket_number => p_request_rec.param11
1789        ,p_blanket_line_number => p_request_rec.param12
1790        ,p_line_id => p_request_rec.entity_id
1791        ,p_old_quantity => 0
1792        ,p_old_unit_sp => 0
1793        );
1794 
1795      END IF;
1796 
1797      -- Cleared an old blanket reference
1798      IF p_request_rec.param1 IS NOT NULL THEN
1799 
1800      Populate_Old_Values
1801        (p_blanket_number => p_request_rec.param1
1802        ,p_blanket_line_number => p_request_rec.param2
1803        ,p_line_id => p_request_rec.entity_id
1804        ,p_old_quantity => nvl(p_request_rec.param3,0)
1805        ,p_old_unit_sp => nvl(p_request_rec.param5,0)
1806        );
1807 
1808      END IF;
1809 
1810   END IF;
1811 
1812   if l_debug_level > 0 then
1813      oe_debug_pub.add('EXIT OE_Blkt_Release_Util.Cache_Order_Qty_Amt');
1814   end if;
1815 
1816 EXCEPTION
1817   WHEN FND_API.G_EXC_ERROR THEN
1818     x_return_status := FND_API.G_RET_STS_ERROR;
1819   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1820     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1821   WHEN OTHERS THEN
1822     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1823     IF OE_MSG_PUB.Check_Msg_Level(OE_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
1824     THEN
1825       OE_MSG_PUB.Add_Exc_Msg
1826            (G_PKG_NAME
1827             ,'Cache_Order_Qty_Amt'
1828             );
1829     END IF;
1830 END Cache_Order_Qty_Amt;
1831 
1832 END;