DBA Data[Home] [Help]

PACKAGE BODY: APPS.GMI_QUANTITY_PVT

Source


1 PACKAGE BODY GMI_QUANTITY_PVT AS
2 --$Header: GMIVQTYB.pls 115.9 2000/02/03 04:23:58 pkm ship      $
3 -- Body start of comments
4 --+==========================================================================+
5 --|                   Copyright (c) 1998 Oracle Corporation                  |
6 --|                          Redwood Shores, CA, USA                         |
7 --|                            All rights reserved.                          |
8 --+==========================================================================+
9 --| FILE NAME                                                                |
10 --|    GMIVQTYB.pls                                                          |
11 --|                                                                          |
12 --| PACKAGE NAME                                                             |
13 --|    GMI_QUANTITY_PVT                                                      |
14 --|                                                                          |
15 --| DESCRIPTION                                                              |
16 --|                                                                          |
17 --| CONTENTS                                                                 |
18 --|    Validate_Inventory_Posting                                            |
19 --|    Insert_Ic_Jrnl_Mst                                                    |
20 --|    Insert_Ic_Adjs_Mst                                                    |
21 --|    Check_unposted_jnl_lot_status                                         |
22 --|    Check_unposted_jnl_qc_grade                                           |
23 --|                                                                          |
24 --| HISTORY                                                                  |
25 --|    25-FEB-1999  M.Godfrey      Upgrade to R11                            |
26 --|    20/AUG/1999  H.Verdding Bug 951828 Change GMS package Calls to GMA    |
27 --|    27/OCT/1999  H.Verdding Bug 1042739 added l_trans_rec.orgn_code To    |
28 --|                 GMA_VALID_GRP.Validate_doc_no                            |
29 --|                                                                          |
30 --|    02/JAN/2000  Liz Enstone Bug 1159223 Change message names from SY_    |
31 --                  to IC_
32 --+==========================================================================+
33 -- Body end of comments
34 
35 -- Global variables
36 G_PKG_NAME      CONSTANT VARCHAR2(30) := 'GMI_QUANTITY_PVT';
37 IC$DEFAULT_LOT           VARCHAR2(255);
38 IC$DEFAULT_LOCT          VARCHAR2(255);
39 IC$ALLOWNEGINV           VARCHAR2(255);
40 IC$MOVEDIFFSTAT          VARCHAR2(255);
41 
42 --+=========================================================================+
43 --| PROCEDURE NAME                                                          |
44 --|    Validate_Inventory_Posting                                           |
45 --|                                                                         |
46 --| TYPE                                                                    |
47 --|    Public                                                               |
48 --|                                                                         |
49 --| USAGE                                                                   |
50 --|    Perform validation functions for inventory quantities posting        |
51 --|                                                                         |
52 --| DESCRIPTION                                                             |
53 --|    This procedure performs all the validation functions concerned with  |
54 --|    inventory quantity postings.                                         |
55 --|                                                                         |
56 --| PARAMETERS                                                              |
57 --|    p_trans_rec      Record datatype containing all inventory posting    |
58 --|                     data                                                |
59 --|    x_item_id        Surrogate key of the item                           |
60 --|    x_lot_id         Surrogate key of the lot                            |
61 --|    x_old_lot_status Original lot status of item/lot/location            |
62 --|    x_old_qc_grade   Original QC grade of item/lot                       |
63 --|    x_trans_rec      Record datatype containing all inventory posting    |
64 --|                     data                                                |
65 --|    x_return_status  'S'-success, 'E'-error, 'U'-unexpected error        |
66 --|    x_msg_count      Count of messages in message list                   |
67 --|    x_msg_data       Message data                                        |
68 --|                                                                         |
69 --| HISTORY                                                                 |
70 --|    01-OCT-1998      M.Godfrey     Created                               |
71 --|    16-AUG-1999      H.Verdding    Added Fix For B965832 Part 2          |
72 --|                                   Prevent Transactions Against          |
73 --|				      Default Lot.                          |
74 --|    17-AUG-1999      H.Verdding    Added Fix For B959444                 |
75 --|                                   Amended Deviation Logic               |
76 --+=========================================================================+
77 PROCEDURE Validate_Inventory_Posting
78 ( p_trans_rec       IN  GMI_QUANTITY_PUB.trans_rec_typ
79 , x_item_id         OUT ic_item_mst.item_id%TYPE
80 , x_lot_id          OUT ic_lots_mst.lot_id%TYPE
81 , x_old_lot_status  OUT ic_lots_sts.lot_status%TYPE
82 , x_old_qc_grade    OUT qc_grad_mst.qc_grade%TYPE
83 , x_return_status   OUT VARCHAR2
84 , x_msg_count       OUT NUMBER
85 , x_msg_data        OUT VARCHAR2
86 , x_trans_rec       OUT GMI_QUANTITY_PUB.trans_rec_typ
87 )
88 IS
89 l_trans_rec             GMI_QUANTITY_PUB.trans_rec_typ;
90 l_ic_item_mst_rec       ic_item_mst%ROWTYPE;
91 l_ic_item_cpg_rec       ic_item_cpg%ROWTYPE;
92 l_ic_lots_mst_rec       ic_lots_mst%ROWTYPE;
93 l_ic_lots_cpg_rec       ic_lots_cpg%ROWTYPE;
94 l_ic_whse_mst_rec       ic_whse_mst%ROWTYPE;
95 l_ic_loct_inv_rec_from  ic_loct_inv%ROWTYPE;
96 l_ic_loct_inv_rec_to    ic_loct_inv%ROWTYPE;
97 l_sy_reas_cds_rec       sy_reas_cds%ROWTYPE;
98 l_lot_rec               GMI_LOTS_PUB.lot_rec_typ;
99 l_item_id               ic_item_mst.item_id%TYPE;
100 l_lot_id                ic_lots_mst.lot_id%TYPE;
101 l_qty2                  NUMBER;
102 l_lot_onhand            NUMBER  :=0;
103 l_trans_type            NUMBER(2);
104 l_msg_count             NUMBER;
105 l_msg_data              VARCHAR2(2000);
106 l_return_status         VARCHAR2(1);
107 l_return_val            NUMBER;
108 l_neg_qty               NUMBER  :=0;
109 l_user_name             fnd_user.user_name%TYPE;
110 l_user_id               fnd_user.user_id%TYPE;
111 
112 BEGIN
113 
114   l_user_name  := p_trans_rec.user_name;
115 
116 -- Populate WHO columns
117   GMA_GLOBAL_GRP.Get_who( p_user_name  => l_user_name
118                         , x_user_id    => l_user_id
119                         );
120 
121   IF l_user_id = 0
122   THEN
123     FND_MESSAGE.SET_NAME('GMI','IC_API_INVALID_USER_NAME');
124     FND_MESSAGE.SET_TOKEN('USER_NAME',l_user_name);
125     FND_MSG_PUB.Add;
126     RAISE FND_API.G_EXC_ERROR;
127   END IF;
128 
129   -- Get required system constants
130   IC$DEFAULT_LOT  := FND_PROFILE.Value_Specific( name    => 'IC$DEFAULT_LOT'
131                                                , user_id => l_user_id
132                                                );
133   IF (IC$DEFAULT_LOT IS NULL)
134   THEN
135     FND_MESSAGE.SET_NAME('GMI','IC_API_UNABLE_TO_GET_CONSTANT');
136     FND_MESSAGE.SET_TOKEN('CONSTANT_NAME','IC$DEFAULT_LOT');
137     FND_MSG_PUB.Add;
138     RAISE FND_API.G_EXC_ERROR;
139   END IF;
140   IC$DEFAULT_LOCT  := FND_PROFILE.Value_Specific( name    => 'IC$DEFAULT_LOCT'
141                                                 , user_id => l_user_id
142                                                 );
143   IF (IC$DEFAULT_LOCT IS NULL)
144   THEN
145     FND_MESSAGE.SET_NAME('GMI','IC_API_UNABLE_TO_GET_CONSTANT');
146     FND_MESSAGE.SET_TOKEN('CONSTANT_NAME','IC$DEFAULT_LOCT');
147     FND_MSG_PUB.Add;
148     RAISE FND_API.G_EXC_ERROR;
149   END IF;
150   IC$ALLOWNEGINV  := FND_PROFILE.Value_Specific( name    => 'IC$ALLOWNEGINV'
151                                                , user_id => l_user_id
152                                                );
153   IF (IC$ALLOWNEGINV IS NULL)
154   THEN
155     FND_MESSAGE.SET_NAME('GMI','IC_API_UNABLE_TO_GET_CONSTANT');
156     FND_MESSAGE.SET_TOKEN('CONSTANT_NAME','IC$ALLOWNEGINV');
157     FND_MSG_PUB.Add;
158     RAISE FND_API.G_EXC_ERROR;
159   END IF;
160   IC$MOVEDIFFSTAT  := FND_PROFILE.Value_Specific( name    => 'IC$MOVEDIFFSTAT'
161                                                , user_id => l_user_id
162                                                );
163   IF (IC$MOVEDIFFSTAT IS NULL)
164   THEN
165     FND_MESSAGE.SET_NAME('GMI','IC_API_UNABLE_TO_GET_CONSTANT');
166     FND_MESSAGE.SET_TOKEN('CONSTANT_NAME','IC$MOVEDIFFSTAT');
167     FND_MSG_PUB.Add;
168     RAISE FND_API.G_EXC_ERROR;
169   END IF;
170 
171   -- Store transaction locally
172   l_trans_rec     := p_trans_rec;
173   l_trans_type    := p_trans_rec.trans_type;
174 
175   -- Validate transaction type in the range 1 - 5
176   IF NOT GMA_VALID_GRP.NumRangeCheck(1,5,l_trans_type)
177   THEN
178     FND_MESSAGE.SET_NAME('GMI','IC_API_INVALID_TRANS_TYPE');
179     FND_MESSAGE.SET_TOKEN('TRANS_TYPE',l_trans_type);
180     FND_MSG_PUB.Add;
181     RAISE FND_API.G_EXC_ERROR;
182   END IF;
183 
184   -- Check for inappropriate fields being passed for transaction type
185   -- From Warehouse
186   IF (l_trans_rec.from_whse_code <> ' ' AND
187       l_trans_rec.from_whse_code IS NOT NULL) AND
188      (l_trans_type = 5)
189   THEN
190     FND_MESSAGE.SET_NAME('GMI','IC_API_FROM_WHSE_NOT_REQD');
191     FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
192     FND_MESSAGE.SET_TOKEN('TRANS_TYPE', l_trans_type);
193     FND_MSG_PUB.Add;
194     RAISE FND_API.G_EXC_ERROR;
195   END IF;
196   -- To Warehouse
197   IF (l_trans_rec.to_whse_code <> ' ' AND
198       l_trans_rec.to_whse_code IS NOT NULL) AND
199      (l_trans_type <> 3)
200   THEN
201     FND_MESSAGE.SET_NAME('GMI','IC_API_TO_WHSE_NOT_REQD');
202     FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
203     FND_MESSAGE.SET_TOKEN('TRANS_TYPE', l_trans_type);
204     FND_MSG_PUB.Add;
205     RAISE FND_API.G_EXC_ERROR;
206   END IF;
207   -- From Location
208   IF (l_trans_rec.from_location <> ' ' AND
209       l_trans_rec.from_location IS NOT NULL) AND
210      (l_trans_type = 5)
211   THEN
212     FND_MESSAGE.SET_NAME('GMI','IC_API_LOCATION_NOT_REQD');
213     FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
214     FND_MESSAGE.SET_TOKEN('TRANS_TYPE', l_trans_type);
215     FND_MSG_PUB.Add;
216     RAISE FND_API.G_EXC_ERROR;
217   END IF;
218   -- To Location
219   IF (l_trans_rec.to_location <> ' ' AND
220      l_trans_rec.to_location IS NOT NULL AND
221      l_trans_type <> 3)
222   THEN
223     FND_MESSAGE.SET_NAME('GMI','IC_API_LOCATION_NOT_REQD');
224     FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
225     FND_MESSAGE.SET_TOKEN('TRANS_TYPE', l_trans_type);
226     FND_MSG_PUB.Add;
227     RAISE FND_API.G_EXC_ERROR;
228   END IF;
229   -- Primary UOM
230   IF (l_trans_rec.item_um <> ' ' AND
231       l_trans_rec.item_um IS NOT NULL) AND
232      (l_trans_type = 4 OR
233       l_trans_type = 5)
234   THEN
235     FND_MESSAGE.SET_NAME('GMI','IC_API_UOM_NOT_REQD');
236     FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
237     FND_MESSAGE.SET_TOKEN('TRANS_TYPE', l_trans_type);
238     FND_MSG_PUB.Add;
239     RAISE FND_API.G_EXC_ERROR;
240   END IF;
241   -- Secondary UOM
242   IF (l_trans_rec.item_um2 <> ' ' AND
243       l_trans_rec.item_um2 IS NOT NULL) AND
244      (l_trans_type = 4 OR
245       l_trans_type = 5)
246   THEN
247     FND_MESSAGE.SET_NAME('GMI','IC_API_UOM2_NOT_REQD');
248     FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
249     FND_MESSAGE.SET_TOKEN('TRANS_TYPE', l_trans_type);
250     FND_MSG_PUB.Add;
251     RAISE FND_API.G_EXC_ERROR;
252   END IF;
253   -- Primary qty
254   IF (l_trans_rec.trans_qty <> 0 AND
255       l_trans_rec.trans_qty IS NOT NULL) AND
256      (l_trans_type = 4 OR
257       l_trans_type = 5)
258   THEN
259     FND_MESSAGE.SET_NAME('GMI','IC_API_QTY_NOT_REQD');
260     FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
261     FND_MESSAGE.SET_TOKEN('TRANS_TYPE', l_trans_type);
262     FND_MSG_PUB.Add;
263     RAISE FND_API.G_EXC_ERROR;
264   END IF;
265   -- Secondary qty
266   IF (l_trans_rec.trans_qty2 <> 0 AND
267       l_trans_rec.trans_qty2 IS NOT NULL) AND
268      (l_trans_type = 4 OR
269       l_trans_type = 5)
270   THEN
271     FND_MESSAGE.SET_NAME('GMI','IC_API_QTY2_NOT_REQD');
272     FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
273     FND_MESSAGE.SET_TOKEN('TRANS_TYPE', l_trans_type);
274     FND_MSG_PUB.Add;
275     RAISE FND_API.G_EXC_ERROR;
276   END IF;
277   -- QC Grade
278   IF (l_trans_rec.qc_grade <> ' ' AND
279       l_trans_rec.qc_grade IS NOT NULL) AND
280      (l_trans_type <> 5) AND (l_trans_type <>1)
281   THEN
282     FND_MESSAGE.SET_NAME('GMI','IC_API_QC_GRADE_NOT_REQD');
283     FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
284     FND_MESSAGE.SET_TOKEN('TRANS_TYPE', l_trans_type);
285     FND_MSG_PUB.Add;
286     RAISE FND_API.G_EXC_ERROR;
287   END IF;
288   -- Lot Status
289   IF (l_trans_rec.lot_status <> ' ' AND
290       l_trans_rec.lot_status IS NOT NULL) AND
291      (l_trans_type <> 4)
292   THEN
293     FND_MESSAGE.SET_NAME('GMI','IC_API_LOT_STATUS_NOT_REQD');
294     FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
295     FND_MESSAGE.SET_TOKEN('TRANS_TYPE', l_trans_type);
296     FND_MSG_PUB.Add;
297     RAISE FND_API.G_EXC_ERROR;
298   END IF;
299 
300   -- Validate Journal number
301   -- Added orgn_code to function call
302   -- H.Verdding Bug 1042739
303   IF NOT GMA_VALID_GRP.Validate_doc_no('JRNL',l_trans_rec.journal_no
304                                              ,l_trans_rec.orgn_code)
305   THEN
306     FND_MESSAGE.SET_NAME('GMI','IC_API_INVALID_JOURNAL_NO');
307     FND_MESSAGE.SET_TOKEN('JOURNAL_NO',l_trans_rec.journal_no);
308     FND_MSG_PUB.Add;
309     RAISE FND_API.G_EXC_ERROR;
310   ELSE
311     IF (l_trans_rec.journal_no = ' ' OR
312         l_trans_rec.journal_no IS NULL)
313     THEN
314       l_trans_rec.journal_no :=GMA_GLOBAL_GRP.Get_doc_no
315 			       ( 'JRNL'
316                                , l_trans_rec.orgn_code
317                                );
318       IF (l_trans_rec.journal_no = ' ')
319       THEN
320         FND_MESSAGE.SET_NAME('GMI','IC_API_UNABLE_TO_GET_DOC_NO');
321         FND_MESSAGE.SET_TOKEN('DOC_TYPE','JRNL');
322         FND_MESSAGE.SET_TOKEN('ORGN_CODE',l_trans_rec.orgn_code);
323         FND_MSG_PUB.Add;
324         RAISE FND_API.G_EXC_ERROR;
325       END IF;
326     END IF;
327   END IF;
328 
329   -- Validate Reason Code
330   GMA_GLOBAL_GRP.Get_Reason_Code
331 		 ( p_reason_code    => l_trans_rec.reason_code
332                  , x_sy_reas_cds    => l_sy_reas_cds_rec
333 		 );
334   IF (l_sy_reas_cds_rec.reason_code = ' ')
335   THEN
336     FND_MESSAGE.SET_NAME('GMI','IC_API_INVALID_REASON_CODE');
337     FND_MESSAGE.SET_TOKEN('REASON_CODE',l_trans_rec.reason_code);
338     FND_MSG_PUB.Add;
339     RAISE FND_API.G_EXC_ERROR;
340   END IF;
341 
342   -- Get the item details
343   GMI_GLOBAL_GRP.Get_Item (  p_item_no      => l_trans_rec.item_no
344                            , x_ic_item_mst  => l_ic_item_mst_rec
345                            , x_ic_item_cpg  => l_ic_item_cpg_rec
346                          );
347   -- If errors were found then raise exception
348   IF (l_ic_item_mst_rec.item_id < 0)
349   THEN
350     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
351   ELSIF (l_ic_item_mst_rec.item_id = 0) OR
352 	(l_ic_item_mst_rec.delete_mark = 1)
353   THEN
354     FND_MESSAGE.SET_NAME('GMI','IC_API_INVALID_ITEM_NO');
355     FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
356     FND_MSG_PUB.Add;
357     RAISE FND_API.G_EXC_ERROR;
358   ELSIF (l_ic_item_mst_rec.noninv_ind = 1)
359   THEN
360     FND_MESSAGE.SET_NAME('GMI','IC_API_NONINV_ITEM_NO');
361     FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
362     FND_MSG_PUB.Add;
363     RAISE FND_API.G_EXC_ERROR;
364   ELSIF (l_ic_item_mst_rec.inactive_ind = 1)
365   THEN
366     FND_MESSAGE.SET_NAME('GMI','IC_API_INACTIVE_ITEM_NO');
367     FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
368     FND_MSG_PUB.Add;
369     RAISE FND_API.G_EXC_ERROR;
370   END IF;
371 
372   -- Check that transaction type is applicable to item
373   -- QC grade change
374   IF (l_ic_item_mst_rec.grade_ctl = 0 AND l_trans_type = 5)
375   THEN
376     FND_MESSAGE.SET_NAME('GMI','IC_API_INV_TRANS_TYPE_FOR_ITEM');
377     FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
378     FND_MESSAGE.SET_TOKEN('TRANS_TYPE', l_trans_type);
379     FND_MSG_PUB.Add;
380     RAISE FND_API.G_EXC_ERROR;
381   END IF;
382 
383   -- Lot status change
384   IF (l_ic_item_mst_rec.status_ctl = 0 AND l_trans_type = 4)
385   THEN
386     FND_MESSAGE.SET_NAME('GMI','IC_API_INV_TRANS_TYPE_FOR_ITEM');
387     FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
388     FND_MESSAGE.SET_TOKEN('TRANS_TYPE', l_trans_type);
389     FND_MSG_PUB.Add;
390     RAISE FND_API.G_EXC_ERROR;
391   END IF;
392 
393   -- Default unit of measure fields for status and QC grade change
394   IF (l_trans_type > 3)
395   THEN
396     l_trans_rec.item_um   := l_ic_item_mst_rec.item_um;
397     l_trans_rec.item_um2  := l_ic_item_mst_rec.item_um2;
398   END IF;
399 
400   -- Store item_id for return to calling API
401   x_item_id    :=l_ic_item_mst_rec.item_id;
402   l_item_id    :=l_ic_item_mst_rec.item_id;
403 
404   -- Store the default lot_status of the item. This will be
405   -- used as the 'Old' lot_status for QC grade transactions
406   -- In this situation 'Old' and 'New' lot_status is not
407   -- applicable.
408   x_old_lot_status  :=l_ic_item_mst_rec.lot_status;
409 
410   -- If not change lot status then store lot_status
411   IF (l_trans_type <> 4)
412   THEN
413     l_trans_rec.lot_status  :=l_ic_item_mst_rec.lot_status;
414   END IF;
415 
416   -- Check lot parameters
417   IF (l_ic_item_mst_rec.lot_ctl = 0)
418   THEN
419     IF (l_trans_rec.lot_no <>' ' AND
420         l_trans_rec.lot_no IS NOT NULL)
421     THEN
422       FND_MESSAGE.SET_NAME('GMI','IC_API_INVALID_LOT_NO');
423       FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
424       FND_MESSAGE.SET_TOKEN('LOT_NO',l_trans_rec.lot_no);
425       FND_MESSAGE.SET_TOKEN('SUBLOT_NO',l_trans_rec.sublot_no);
426       FND_MSG_PUB.Add;
427       RAISE FND_API.G_EXC_ERROR;
428     END IF;
429   ELSE
430     IF (l_trans_rec.lot_no = ' ' OR
431         l_trans_rec.lot_no IS NULL)
432     THEN
433       FND_MESSAGE.SET_NAME('GMI','IC_API_INVALID_LOT_NO');
434       FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
435       FND_MESSAGE.SET_TOKEN('LOT_NO',l_trans_rec.lot_no);
436       FND_MESSAGE.SET_TOKEN('SUBLOT_NO',l_trans_rec.sublot_no);
437       FND_MSG_PUB.Add;
438       RAISE FND_API.G_EXC_ERROR;
439     END IF;
440   END IF;
441 
442     -- Check sub-lot parameters
443   IF (l_trans_rec.sublot_no IS NULL)
444   THEN
445     l_trans_rec.sublot_no := NULL;
446   END IF;
447 
448   IF (l_ic_item_mst_rec.sublot_ctl = 0)
449   THEN
450     IF (l_trans_rec.sublot_no <>' ')
451     THEN
452       FND_MESSAGE.SET_NAME('GMI','IC_API_SUBLOT_NOT_REQD');
453       FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
454       FND_MSG_PUB.Add;
455       RAISE FND_API.G_EXC_ERROR;
456     END IF;
457   END IF;
458 
459   -- Get existing lot details. If item not lot controlled then
460   -- get the default lot.
461 
462   IF (l_ic_item_mst_rec.sublot_ctl = 0)
463   THEN
464     l_trans_rec.sublot_no  :=NULL;
465   END IF;
466 
467   IF (l_ic_item_mst_rec.lot_ctl = 0)
468   THEN
469     l_trans_rec.lot_no    :=IC$DEFAULT_LOT;
470   ELSE
471 -- Do not Allow Transactions against DEFAULT LOT
472 -- H.Verdding B965832 Part 2
473     IF (l_ic_item_mst_rec.lot_ctl = 1 AND
474         l_trans_rec.lot_no='DEFAULTLOT')
475      THEN
476       FND_MESSAGE.SET_NAME('GMI','IC_DEFAULTLOTERR');
477       FND_MSG_PUB.Add;
478       RAISE FND_API.G_EXC_ERROR;
479     END IF;
480   END IF;
481 
482 
483   GMI_GLOBAL_GRP.Get_Lot (  p_item_id      => l_ic_item_mst_rec.item_id
484                           , p_lot_no       => l_trans_rec.lot_no
485                           , p_sublot_no    => l_trans_rec.sublot_no
486                           , x_ic_lots_mst  => l_ic_lots_mst_rec
487                           , x_ic_lots_cpg  => l_ic_lots_cpg_rec
488                          );
489 -- Check for deleted or inactive lot
490   IF (l_ic_lots_mst_rec.delete_mark = 1) OR
491      (l_ic_lots_mst_rec.inactive_ind = 1)
492   THEN
493     FND_MESSAGE.SET_NAME('GMI','IC_API_INVALID_LOT_NO');
494     FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
495     FND_MESSAGE.SET_TOKEN('LOT_NO',l_trans_rec.lot_no);
496     FND_MESSAGE.SET_TOKEN('SUBLOT_NO',l_trans_rec.sublot_no);
497     FND_MSG_PUB.Add;
498     RAISE FND_API.G_EXC_ERROR;
499   ELSIF (l_ic_lots_mst_rec.lot_id = -2)
500   THEN
501     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
502   END IF;
503 
504   -- If the was lot not found and not creating inventory then error
505   IF (l_trans_type <> 1)
506   THEN
507     IF (l_ic_lots_mst_rec.lot_id = -1)
508     THEN
509       FND_MESSAGE.SET_NAME('GMI','IC_API_INVALID_LOT_NO');
510       FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
511       FND_MESSAGE.SET_TOKEN('LOT_NO',l_trans_rec.lot_no);
512       FND_MESSAGE.SET_TOKEN('SUBLOT_NO',l_trans_rec.sublot_no);
513       FND_MSG_PUB.Add;
514       RAISE FND_API.G_EXC_ERROR;
515     END IF;
516   ELSE
517   -- If the lot was not found when creating inventory then create it
518     IF (l_ic_lots_mst_rec.lot_id = -1)
519     THEN
520   -- Set up PL/SQL record and create the lot
521       l_lot_rec.item_no    :=l_trans_rec.item_no;
522       l_lot_rec.lot_no     :=l_trans_rec.lot_no;
523       l_lot_rec.sublot_no  :=l_trans_rec.sublot_no;
524       l_lot_rec.user_name  :=l_trans_rec.user_name;
525       l_lot_rec.qc_grade   :=l_trans_rec.qc_grade;
526       GMI_LOTS_PUB.Create_Lot (  p_api_version     => 2.0
527                                , x_return_status   => l_return_status
528                                , x_msg_count       => l_msg_count
529                                , x_msg_data        => l_msg_data
530                                , p_lot_rec         => l_lot_rec
531                               );
532   -- If errors were found then raise exception
533       IF (l_return_status = FND_API.G_RET_STS_ERROR)
534       THEN
535         RAISE FND_API.G_EXC_ERROR;
536       ELSIF (l_return_status = FND_API.G_RET_STS_UNEXP_ERROR)
537       THEN
538         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
539       END IF;
540 
541   -- Initialize message list to remove 'Lot created' message
542       FND_MSG_PUB.Initialize;
543 
544   -- Get lot details for lot created
545       GMI_GLOBAL_GRP.Get_Lot (  p_item_id      => l_ic_item_mst_rec.item_id
546                               , p_lot_no       => l_trans_rec.lot_no
547                               , p_sublot_no    => l_trans_rec.sublot_no
548                               , x_ic_lots_mst  => l_ic_lots_mst_rec
549                               , x_ic_lots_cpg  => l_ic_lots_cpg_rec
550                               );
551     END IF;
552   END IF;
553 
554   -- Store the lot_id and original QC grade locally
555   x_lot_id       := l_ic_lots_mst_rec.lot_id;
556   l_lot_id       := l_ic_lots_mst_rec.lot_id;
557   x_old_qc_grade := l_ic_lots_mst_rec.qc_grade;
558 
559   -- If QC grade change then check new QC grade differs from existing
560   -- If not QC grade change then store lot QC grade as new QC grade
561   IF (l_trans_type = 5)
562   THEN
563     IF (l_trans_rec.qc_grade = l_ic_lots_mst_rec.qc_grade)
564     THEN
565       FND_MESSAGE.SET_NAME('GMI','IC_API_SAME_QC_GRADE');
566       FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
567       FND_MESSAGE.SET_TOKEN('LOT_NO',l_trans_rec.lot_no);
568       FND_MESSAGE.SET_TOKEN('SUBLOT_NO',l_trans_rec.sublot_no);
569       FND_MSG_PUB.Add;
570       RAISE FND_API.G_EXC_ERROR;
571     END IF;
572   ELSE
573     l_trans_rec.qc_grade :=l_ic_lots_mst_rec.qc_grade;
574   END IF;
575 
576   -- Validate 'from' warehouse code (not applicable for change QC Grade)
577   IF (l_trans_type <> 5)
578   THEN
579     GMI_GLOBAL_GRP.Get_Warehouse (  p_whse_code   => l_trans_rec.from_whse_code
580                                   , x_ic_whse_mst => l_ic_whse_mst_rec
581                                  );
582     IF (l_ic_whse_mst_rec.whse_code = ' ') OR
583        (l_ic_whse_mst_rec.delete_mark = 1)
584     THEN
585       FND_MESSAGE.SET_NAME('GMI','IC_API_INVALID_WHSE_CODE');
586       FND_MESSAGE.SET_TOKEN('WHSE_CODE', l_trans_rec.from_whse_code);
587       FND_MSG_PUB.Add;
588       RAISE FND_API.G_EXC_ERROR;
589     ELSE
590   -- Check location parameters
591       IF NOT GMI_VALID_GRP.Validate_Location
592 		     (  p_item_loct_ctl  => l_ic_item_mst_rec.loct_ctl
593                       , p_whse_loct_ctl  => l_ic_whse_mst_rec.loct_ctl
594                       , p_whse_code      => l_trans_rec.from_whse_code
595                       , p_location       => l_trans_rec.from_location
596                       )
597       THEN
598         FND_MESSAGE.SET_NAME('GMI','IC_API_INVALID_LOCATION');
599         FND_MESSAGE.SET_TOKEN('ITEM_NO', l_trans_rec.item_no);
600         FND_MESSAGE.SET_TOKEN('WHSE_CODE', l_trans_rec.from_whse_code);
601         FND_MESSAGE.SET_TOKEN('LOCATION',l_trans_rec.from_location);
602         FND_MSG_PUB.Add;
603         RAISE FND_API.G_EXC_ERROR;
604       ELSIF (l_trans_rec.from_location = ' ' OR
605              l_trans_rec.from_location IS NULL)
606       THEN
607         l_trans_rec.from_location := IC$DEFAULT_LOCT;
608       END IF;
609     END IF;
610   ELSE
611   -- For QC Grade changes 'from' warehouse and location are not relevant
612      l_trans_rec.from_whse_code := NULL;
613      l_trans_rec.from_location  := NULL;
614   END IF;
615 
616   -- If move inventory transaction then validate 'to' warehouse code
617   IF (l_trans_type = 3)
618   THEN
619     GMI_GLOBAL_GRP.Get_Warehouse (  p_whse_code   =>l_trans_rec.to_whse_code
620                                   , x_ic_whse_mst => l_ic_whse_mst_rec
621 			         );
622     IF (l_ic_whse_mst_rec.whse_code = ' ') OR
623        (l_ic_whse_mst_rec.delete_mark = 1)
624     THEN
625       FND_MESSAGE.SET_NAME('GMI','IC_API_INVALID_WHSE_CODE');
626       FND_MESSAGE.SET_TOKEN('WHSE_CODE', l_trans_rec.to_whse_code);
627       FND_MSG_PUB.Add;
628       RAISE FND_API.G_EXC_ERROR;
629     ELSE
630   -- Check location parameters
631       IF NOT GMI_VALID_GRP.Validate_Location
632                      (  p_item_loct_ctl => l_ic_item_mst_rec.loct_ctl
633                       , p_whse_loct_ctl => l_ic_whse_mst_rec.loct_ctl
634                       , p_whse_code     => l_trans_rec.to_whse_code
635                       , p_location      => l_trans_rec.to_location
636                      )
637       THEN
638         FND_MESSAGE.SET_NAME('GMI','IC_API_INVALID_LOCATION');
639         FND_MESSAGE.SET_TOKEN('ITEM_NO', l_trans_rec.item_no);
640         FND_MESSAGE.SET_TOKEN('WHSE_CODE', l_trans_rec.to_whse_code);
641         FND_MESSAGE.SET_TOKEN('LOCATION',l_trans_rec.to_location);
642         FND_MSG_PUB.Add;
643         RAISE FND_API.G_EXC_ERROR;
644       ELSE
645         IF (l_trans_rec.to_location = ' '  OR
646             l_trans_rec.to_location IS NULL)
647         THEN
648           l_trans_rec.to_location := IC$DEFAULT_LOCT;
649         END IF;
650       END IF;
651     END IF;
652     -- Check that from warehouse/location differs from to warehouse/location
653     IF (l_trans_rec.from_whse_code = l_trans_rec.to_whse_code) AND
654        (l_trans_rec.from_location  = l_trans_rec.to_location)
655     THEN
656       FND_MESSAGE.SET_NAME('GMI','IC_API_MOVE_SAME_WHSE_LOC');
657       FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
658       FND_MESSAGE.SET_TOKEN('LOT_NO',l_trans_rec.lot_no);
659       FND_MESSAGE.SET_TOKEN('SUBLOT_NO',l_trans_rec.sublot_no);
660       FND_MSG_PUB.Add;
661       RAISE FND_API.G_EXC_ERROR;
662     END IF;
663   -- For Change lot status 'to' warehouse and location are the same as 'from'
664   ELSIF (l_trans_type = 4)
665   THEN
666     l_trans_rec.to_whse_code := l_trans_rec.from_whse_code;
667     l_trans_rec.to_location  := l_trans_rec.from_location;
668   ELSE
669   -- For Create, adjust or QC Grade changes 'to' warehouse and location
670   -- are not relevant
671     l_trans_rec.to_whse_code := NULL;
672     l_trans_rec.to_location  := NULL;
673   END IF;
674 
675   -- If adjusting, moving or changing lot status, check that inventory
676   -- exists at from warehouse / location
677 --LIZ Put this call outside the trans_type condition
678 --  IF (l_trans_type <> 5)
679 --  THEN
680     GMI_GLOBAL_GRP.Get_loct_inv (  p_item_id     =>l_item_id
681                                  , p_whse_code   =>l_trans_rec.from_whse_code
682                                  , p_lot_id      =>l_lot_id
683                                  , p_location    =>l_trans_rec.from_location
684                                  , x_ic_loct_inv =>l_ic_loct_inv_rec_from
685 			        );
686   -- If inventory create then should be no stock at location.
687   -- If inventory adjust then may or may not be stock at location
688   IF (l_trans_type <> 5)
689     THEN
690     IF (l_trans_type = 1 OR l_trans_type = 2) AND
691        (l_ic_loct_inv_rec_from.item_id = 0)
692     THEN
693       l_ic_loct_inv_rec_from.loct_onhand  :=0;
694       l_ic_loct_inv_rec_from.loct_onhand2 :=0;
695       l_trans_rec.lot_status              :=l_ic_item_mst_rec.lot_status;
696     ELSIF (l_trans_type = 1)
697     THEN
698       FND_MESSAGE.SET_NAME('GMI','IC_API_LOCT_ONHAND_EXISTS');
699       FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
700       FND_MESSAGE.SET_TOKEN('LOT_NO',l_trans_rec.lot_no);
701       FND_MESSAGE.SET_TOKEN('SUBLOT_NO',l_trans_rec.sublot_no);
702       FND_MESSAGE.SET_TOKEN('WHSE_CODE',l_trans_rec.from_whse_code);
703       FND_MESSAGE.SET_TOKEN('LOCATION',l_trans_rec.from_location);
704       FND_MSG_PUB.Add;
705       RAISE FND_API.G_EXC_ERROR;
706     ELSIF (l_ic_loct_inv_rec_from.item_id = 0) OR
707          (l_ic_loct_inv_rec_from.loct_onhand = 0 AND l_trans_type =4)
708     THEN
709       FND_MESSAGE.SET_NAME('GMI','IC_API_NO_LOCT_ONHAND');
710       FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
711       FND_MESSAGE.SET_TOKEN('LOT_NO',l_trans_rec.lot_no);
712       FND_MESSAGE.SET_TOKEN('SUBLOT_NO',l_trans_rec.sublot_no);
713       FND_MESSAGE.SET_TOKEN('WHSE_CODE',l_trans_rec.from_whse_code);
714       FND_MESSAGE.SET_TOKEN('LOCATION',l_trans_rec.from_location);
715       FND_MSG_PUB.Add;
716       RAISE FND_API.G_EXC_ERROR;
717     ELSIF (l_trans_type = 2)
718     THEN
719       l_trans_rec.lot_status :=l_ic_loct_inv_rec_from.lot_status;
720   -- If adjust inventory then this will also be new lot status
721     ELSIF (l_trans_type = 4) AND
722 	 (l_trans_rec.lot_status = l_ic_loct_inv_rec_from.lot_status)
723     THEN
724       FND_MESSAGE.SET_NAME('GMI','IC_API_SAME_LOT_STATUS');
725       FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
726       FND_MESSAGE.SET_TOKEN('LOT_NO',l_trans_rec.lot_no);
727       FND_MESSAGE.SET_TOKEN('SUBLOT_NO',l_trans_rec.sublot_no);
728       FND_MSG_PUB.Add;
729       RAISE FND_API.G_EXC_ERROR;
730     ELSE
731   -- Store original lot status
732       x_old_lot_status  :=l_ic_loct_inv_rec_from.lot_status;
733     END IF;
734   -- If changing QC grade then check lot has inventory
735   ELSIF (l_trans_type = 5)
736   THEN
737     GMI_GLOBAL_GRP.Get_lot_inv (  p_item_id     =>l_item_id
738                                 , p_lot_id      =>l_lot_id
739                                 , x_lot_onhand  =>l_lot_onhand
740 			       );
741       x_old_lot_status  :=l_ic_loct_inv_rec_from.lot_status;
742     IF (l_lot_onhand = 0 OR l_lot_onhand IS NULL)
743     THEN
744       FND_MESSAGE.SET_NAME('GMI','IC_API_NO_LOT_ONHAND');
745       FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
746       FND_MESSAGE.SET_TOKEN('LOT_NO',l_trans_rec.lot_no);
747       FND_MESSAGE.SET_TOKEN('SUBLOT_NO',l_trans_rec.sublot_no);
748       FND_MSG_PUB.Add;
749       RAISE FND_API.G_EXC_ERROR;
750     END IF;
751   END IF;
752 
753   -- Check for zero quantity
754   IF (l_trans_type < 4)
755   THEN
756     IF (l_trans_rec.trans_qty =0)
757     THEN
758       FND_MESSAGE.SET_NAME('GMI','IC_API_ZERO_QTY');
759       FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
760       FND_MESSAGE.SET_TOKEN('LOT_NO',l_trans_rec.lot_no);
761       FND_MESSAGE.SET_TOKEN('SUBLOT_NO',l_trans_rec.sublot_no);
762       FND_MSG_PUB.Add;
763       RAISE FND_API.G_EXC_ERROR;
764     END IF;
765     IF (l_trans_rec.trans_qty2 <> 0 AND
766         l_trans_rec.trans_qty2 IS NOT NULL) AND
767        (l_ic_item_mst_rec.dualum_ind = 0 OR
768 	l_ic_item_mst_rec.dualum_ind =1)
769     THEN
770       FND_MESSAGE.SET_NAME('GMI','IC_API_INVALID_QTY2');
771       FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
772       FND_MESSAGE.SET_TOKEN('LOT_NO',l_trans_rec.lot_no);
773       FND_MESSAGE.SET_TOKEN('SUBLOT_NO',l_trans_rec.sublot_no);
774       FND_MSG_PUB.Add;
775       RAISE FND_API.G_EXC_ERROR;
776     END IF;
777   END IF;
778 
779   -- Check Primary UoM
780   IF NOT GMA_VALID_GRP.Validate_um(l_trans_rec.item_um)
781   THEN
782     FND_MESSAGE.SET_NAME('GMI','IC_API_INVALID_UOM');
783     FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
784     FND_MESSAGE.SET_TOKEN('UOM',l_trans_rec.item_um);
785     FND_MSG_PUB.Add;
786     RAISE FND_API.G_EXC_ERROR;
787   END IF;
788 
789   -- Handle Quantities
790   -- If primary Uom differs from item primary UoM then convert
791   -- transaction quantity
792   IF (l_trans_rec.item_um <> l_ic_item_mst_rec.item_um) OR
793      (l_trans_rec.item_um IS NULL)
794   THEN
795     -- If quantity to convert is negative then make positive for conversion
796     IF l_trans_rec.trans_qty < 0
797     THEN
798       l_neg_qty  := 1;
799       l_trans_rec.trans_qty  := 0 - l_trans_rec.trans_qty;
800     END IF;
801     l_trans_rec.trans_qty :=GMICUOM.uom_conversion
802                           ( pitem_id    =>l_item_id
803                           , plot_id     =>l_lot_id
804                           , pcur_qty    =>l_trans_rec.trans_qty
805                           , pcur_uom    =>l_trans_rec.item_um
806                           , pnew_uom    =>l_ic_item_mst_rec.item_um
807                           , patomic     =>0
808                           );
809     -- Negative quantity indicates UoM conversion failure
810     IF (l_trans_rec.trans_qty < 0)
811     THEN
812       FND_MESSAGE.SET_NAME('GMI','IC_API_UOM_CONVERSION_ERROR');
813       FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
814       FND_MESSAGE.SET_TOKEN('FROM_UOM',l_trans_rec.item_um);
815       FND_MESSAGE.SET_TOKEN('TO_UOM',l_ic_item_mst_rec.item_um);
816       FND_MSG_PUB.Add;
817       RAISE FND_API.G_EXC_ERROR;
818     ELSE
819       l_trans_rec.item_um  :=l_ic_item_mst_rec.item_um;
820       -- Reverse quantity sign if reversed above
821       IF l_neg_qty = 1
822       THEN
823         l_neg_qty  := 0;
824         l_trans_rec.trans_qty  := 0 - l_trans_rec.trans_qty;
825       END IF;
826     END IF;
827   END IF;
828 
829   -- If dual unit of measure then convert to item secondary unit of measure
830   IF (l_ic_item_mst_rec.dualum_ind > 0)
831   THEN
832     -- If quantity to convert is negative then make positive for conversion
833     IF l_trans_rec.trans_qty < 0
834     THEN
835       l_neg_qty  := 1;
836       l_trans_rec.trans_qty  := 0 - l_trans_rec.trans_qty;
837     END IF;
838     l_qty2 :=GMICUOM.uom_conversion
839            ( pitem_id    =>l_item_id
840            , plot_id     =>l_lot_id
841            , pcur_qty    =>l_trans_rec.trans_qty
842            , pcur_uom    =>l_ic_item_mst_rec.item_um
843            , pnew_uom    =>l_ic_item_mst_rec.item_um2
844            , patomic     =>0
845            );
846     -- Negative quantity indicates UoM conversion failure
847     IF (l_qty2 < 0)
848     THEN
849       FND_MESSAGE.SET_NAME('GMI','IC_API_UOM_CONVERSION_ERROR');
850       FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
851       FND_MESSAGE.SET_TOKEN('FROM_UOM',l_ic_item_mst_rec.item_um);
852       FND_MESSAGE.SET_TOKEN('TO_UOM',l_ic_item_mst_rec.item_um2);
853       FND_MSG_PUB.Add;
854       RAISE FND_API.G_EXC_ERROR;
855     END IF;
856     -- Reverse quantity sign if reversed above
857     IF l_neg_qty = 1
858     THEN
859       l_neg_qty  := 0;
860       l_trans_rec.trans_qty  := 0 - l_trans_rec.trans_qty;
861       l_qty2                 := 0 - l_qty2;
862     END IF;
863     -- If fixed conversion then converted value is secondary qty
864     IF (l_ic_item_mst_rec.dualum_ind = 1) OR
865        (l_ic_item_mst_rec.dualum_ind =2 AND l_trans_rec.trans_qty2 = 0)
866     THEN
867       l_trans_rec.trans_qty2  :=l_qty2;
868       l_trans_rec.item_um2    :=l_ic_item_mst_rec.item_um2;
869     ELSE
870     -- If secondary Uom differs from item secondary UoM then convert
871     -- transaction quantity
872       IF (l_trans_rec.item_um2 <> l_ic_item_mst_rec.item_um2)
873       THEN
874         -- If quantity to convert is negative then make positive for conversion
875         IF l_trans_rec.trans_qty < 0
876         THEN
877           l_neg_qty  := 1;
878           l_trans_rec.trans_qty2  := 0 - l_trans_rec.trans_qty2;
879         END IF;
880         l_trans_rec.trans_qty2 :=GMICUOM.uom_conversion
881                                ( pitem_id    =>l_item_id
882                                , plot_id     =>l_lot_id
883                                , pcur_qty    =>l_trans_rec.trans_qty2
884                                , pcur_uom    =>l_trans_rec.item_um2
885                                , pnew_uom    =>l_ic_item_mst_rec.item_um2
886                                , patomic     =>0
887                                );
888         -- Negative quantity indicates UoM conversion failure
889         IF (l_trans_rec.trans_qty2 < 0)
890         THEN
891           FND_MESSAGE.SET_NAME('GMI','IC_API_UOM_CONVERSION_ERROR');
892           FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
893           FND_MESSAGE.SET_TOKEN('FROM_UOM',l_trans_rec.item_um2);
894           FND_MESSAGE.SET_TOKEN('TO_UOM',l_ic_item_mst_rec.item_um2);
895           FND_MSG_PUB.Add;
896           RAISE FND_API.G_EXC_ERROR;
897         ELSE
898           l_trans_rec.item_um2  :=l_ic_item_mst_rec.item_um2;
899           -- Reverse quantity sign if reversed above
900           IF l_neg_qty = 1
901           THEN
902             l_neg_qty  := 0;
903             l_trans_rec.trans_qty2  := 0 - l_trans_rec.trans_qty2;
904           END IF;
905         END IF;
906       END IF;
907       -- Check deviation
908       -- H.Verdding B959444 Amended Deviation Logic
909       IF (ABS(l_trans_rec.trans_qty2) >
910 	  ABS(l_qty2) * (1 + l_ic_item_mst_rec.deviation_hi)) OR
911          (ABS(l_trans_rec.trans_qty2) <
912 	  ABS(l_qty2) * (1 - l_ic_item_mst_rec.deviation_lo))
913         THEN
914           FND_MESSAGE.SET_NAME('GMI','IC_API_QTY_TOLERANCE_ERROR');
915           FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
916           FND_MESSAGE.SET_TOKEN('LOT_NO',l_trans_rec.lot_no);
917           FND_MESSAGE.SET_TOKEN('SUBLOT_NO',l_trans_rec.sublot_no);
918           FND_MSG_PUB.Add;
919           RAISE FND_API.G_EXC_ERROR;
920       END IF;
921     END IF;
922   ELSE
923 --LE fix
924   l_trans_rec.item_um2 := NULL;
925   END IF;
926 
927   -- Check quantity is correctly signed
928   IF (l_trans_type = 3 AND l_trans_rec.trans_qty <= 0)
929   THEN
930     FND_MESSAGE.SET_NAME('GMI','IC_API_MOVE_QTY_NOT_NEG');
931     FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
932     FND_MESSAGE.SET_TOKEN('LOT_NO',l_trans_rec.lot_no);
933     FND_MESSAGE.SET_TOKEN('SUBLOT_NO',l_trans_rec.sublot_no);
934     FND_MSG_PUB.Add;
935     RAISE FND_API.G_EXC_ERROR;
936   END IF;
937 
938   -- Check location inventory for becoming negative
939   IF (IC$ALLOWNEGINV = '0')
940   THEN
941     IF ((l_trans_type = 1 OR l_trans_type = 2) AND
942        (l_ic_loct_inv_rec_from.loct_onhand +
943         l_trans_rec.trans_qty) < 0) OR
944        (l_trans_type = 3 AND (l_ic_loct_inv_rec_from.loct_onhand -
945         l_trans_rec.trans_qty) < 0)
946     THEN
947       FND_MESSAGE.SET_NAME('GMI','IC_API_NEG_QTY_NOT_ALLOWED');
948       FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
949       FND_MESSAGE.SET_TOKEN('LOT_NO',l_trans_rec.lot_no);
950       FND_MESSAGE.SET_TOKEN('SUBLOT_NO',l_trans_rec.sublot_no);
951       FND_MESSAGE.SET_TOKEN('WHSE_CODE',l_trans_rec.from_whse_code);
952       FND_MESSAGE.SET_TOKEN('LOCATION',l_trans_rec.from_location);
953       FND_MSG_PUB.Add;
954       RAISE FND_API.G_EXC_ERROR;
955     END IF;
956   END IF;
957 
958   -- Check reason type allows quantity
959   IF (l_trans_type < 4)
960   THEN
961     IF ((l_sy_reas_cds_rec.reason_type = 1) AND
962         (l_trans_rec.trans_qty < 0))
963     THEN
964       FND_MESSAGE.SET_NAME('GMI','IC_API_DEC_NOT_ALLOWED');
965       FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
966       FND_MESSAGE.SET_TOKEN('LOT_NO',l_trans_rec.lot_no);
967       FND_MESSAGE.SET_TOKEN('SUBLOT_NO',l_trans_rec.sublot_no);
968       FND_MSG_PUB.Add;
969       RAISE FND_API.G_EXC_ERROR;
970     ELSIF ((l_sy_reas_cds_rec.reason_type = 2) AND
971 	(l_trans_rec.trans_qty > 0))
972     THEN
973       FND_MESSAGE.SET_NAME('GMI','IC_API_INC_NOT_ALLOWED');
974       FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
975       FND_MESSAGE.SET_TOKEN('LOT_NO',l_trans_rec.lot_no);
976       FND_MESSAGE.SET_TOKEN('SUBLOT_NO',l_trans_rec.sublot_no);
977       FND_MSG_PUB.Add;
978       RAISE FND_API.G_EXC_ERROR;
979     END IF;
980   END IF;
981 
982   -- Check move quantity if item is lot-indivisble
983   IF (l_ic_item_mst_rec.lot_indivisible = 1) AND
984      (l_trans_type = 3) AND
985      (l_ic_loct_inv_rec_from.loct_onhand <> l_trans_rec.trans_qty)
986   THEN
987     FND_MESSAGE.SET_NAME('GMI','IC_API_LOT_INDIVISIBLE');
988     FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
989     FND_MESSAGE.SET_TOKEN('LOT_NO',l_trans_rec.lot_no);
990     FND_MESSAGE.SET_TOKEN('SUBLOT_NO',l_trans_rec.sublot_no);
991     FND_MESSAGE.SET_TOKEN('WHSE_CODE',l_trans_rec.from_whse_code);
992     FND_MESSAGE.SET_TOKEN('LOCATION',l_trans_rec.from_location);
993     FND_MSG_PUB.Add;
994     RAISE FND_API.G_EXC_ERROR;
995   END IF;
996 
997   -- If moving inventory, check inventory at to warehouse /location
998   IF (l_trans_type = 3)
999   THEN
1000     GMI_GLOBAL_GRP.Get_loct_inv
1001                    (  p_item_id     =>l_item_id
1002                     , p_whse_code   =>l_trans_rec.to_whse_code
1003                     , p_lot_id      =>l_lot_id
1004                     , p_location    =>l_trans_rec.to_location
1005                     , x_ic_loct_inv =>l_ic_loct_inv_rec_to
1006 		       );
1007   -- If location inventory not found then insert row into IC_LOCT_INV
1008     IF (l_ic_loct_inv_rec_to.item_id = 0)
1009     THEN
1010       l_trans_rec.lot_status := l_ic_loct_inv_rec_from.lot_status;
1011   -- If location inventory found then check lot_status if status
1012   -- controlled item
1013     ELSE
1014       IF (l_ic_item_mst_rec.status_ctl = 1)
1015       THEN
1016         IF (l_ic_loct_inv_rec_from.lot_status <>
1017             l_ic_loct_inv_rec_to.lot_status)
1018 	THEN
1019           IF (l_ic_loct_inv_rec_to.loct_onhand = 0 AND
1020               IC$MOVEDIFFSTAT = '2')
1021           THEN
1022             l_trans_rec.lot_status := l_ic_loct_inv_rec_from.lot_status;
1023           ELSIF (IC$MOVEDIFFSTAT = '1')
1024 	  THEN
1025             l_trans_rec.lot_status := l_ic_loct_inv_rec_to.lot_status;
1026           ELSE
1027             FND_MESSAGE.SET_NAME('GMI','IC_API_MOVE_STATUS_ERR');
1028             FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
1029             FND_MESSAGE.SET_TOKEN('LOT_NO',l_trans_rec.lot_no);
1030             FND_MESSAGE.SET_TOKEN('SUBLOT_NO',l_trans_rec.sublot_no);
1031             FND_MSG_PUB.Add;
1032             RAISE FND_API.G_EXC_ERROR;
1033           END IF;
1034         ELSE
1035           l_trans_rec.lot_status := l_ic_loct_inv_rec_from.lot_status;
1036         END IF;
1037       END IF;
1038     END IF;
1039   END IF;
1040 
1041   -- Validate lot status for change lot status transaction
1042   IF (l_trans_type = 4)
1043   THEN
1044     IF NOT GMI_VALID_GRP.Validate_lot_status (  l_trans_rec.lot_status
1045                                         , l_ic_item_mst_rec.status_ctl
1046 				       )
1047     THEN
1048       FND_MESSAGE.SET_NAME('GMI','IC_API_INVALID_LOT_STATUS');
1049       FND_MESSAGE.SET_TOKEN('LOT_STATUS',l_trans_rec.lot_status);
1050       FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
1051       FND_MSG_PUB.Add;
1052       RAISE FND_API.G_EXC_ERROR;
1053     END IF;
1054     -- Check for unposted journals with different lot status
1055     IF Check_unposted_jnl_lot_status
1056        ( p_item_id          => l_item_id
1057        , p_lot_id           => l_lot_id
1058        , p_whse_code        => l_trans_rec.from_whse_code
1059        , p_location         => l_trans_rec.from_location
1060        , p_lot_status       => l_trans_rec.lot_status
1061        )
1062     THEN
1063       FND_MESSAGE.SET_NAME('GMI','IC_API_UNPOSTED_JNL_LOT_STATUS');
1064       FND_MESSAGE.SET_TOKEN('LOT_STATUS',l_trans_rec.lot_status);
1065       FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
1066       FND_MSG_PUB.Add;
1067       RAISE FND_API.G_EXC_ERROR;
1068     END IF;
1069   END IF;
1070 
1071     -- Validate QC grade for change QC grade transaction
1072   IF (l_trans_type = 5) OR (l_trans_type = 1)
1073   THEN
1074     IF NOT GMI_VALID_GRP.Validate_qc_grade (  l_trans_rec.qc_grade
1075                                       , l_ic_item_mst_rec.grade_ctl
1076 				     )
1077     THEN
1078       FND_MESSAGE.SET_NAME('GMI','IC_API_INVALID_QC_GRADE');
1079       FND_MESSAGE.SET_TOKEN('QC_GRADE',l_trans_rec.qc_grade);
1080       FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
1081       FND_MSG_PUB.Add;
1082       RAISE FND_API.G_EXC_ERROR;
1083     END IF;
1084     -- Check for unposted journals with different QC grade
1085     IF Check_unposted_jnl_qc_grade
1086        ( p_item_id          => l_item_id
1087        , p_lot_id           => l_lot_id
1088        , p_qc_grade         => l_trans_rec.qc_grade
1089        )
1090     THEN
1091       FND_MESSAGE.SET_NAME('GMI','IC_API_UNPOSTED_JNL_QC_GRADE');
1092       FND_MESSAGE.SET_TOKEN('QC_GRADE',l_trans_rec.qc_grade);
1093       FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
1094       FND_MSG_PUB.Add;
1095       RAISE FND_API.G_EXC_ERROR;
1096     END IF;
1097   END IF;
1098 
1099   -- Validate Company Code
1100   IF NOT GMA_VALID_GRP.Validate_co_code(l_trans_rec.co_code)
1101   THEN
1102     FND_MESSAGE.SET_NAME('GMI','IC_API_INVALID_CO_CODE');
1103     FND_MESSAGE.SET_TOKEN('CO_CODE',l_trans_rec.co_code);
1104     FND_MSG_PUB.Add;
1105     RAISE FND_API.G_EXC_ERROR;
1106   END IF;
1107 
1108   -- Validate Organisation Code belongs to Company Code
1109   IF NOT GMA_VALID_GRP.Validate_orgn_for_company (  l_trans_rec.orgn_code
1110                                                   , l_trans_rec.co_code
1111 						 )
1112   THEN
1113     FND_MESSAGE.SET_NAME('GMI','IC_API_INVALID_ORGN_CODE');
1114     FND_MESSAGE.SET_TOKEN('ORGN_CODE',l_trans_rec.orgn_code);
1115     FND_MSG_PUB.Add;
1116     RAISE FND_API.G_EXC_ERROR;
1117   END IF;
1118 
1119   -- Validate Transaction Date For Transactions
1120   -- That are not type 5 - GRADE CHANGE
1121   IF l_trans_rec.trans_type <> 5 THEN
1122     l_return_val := GMICCAL.trans_date_validate (  l_trans_rec.trans_date
1123                                                , l_trans_rec.orgn_code
1124                                                , l_trans_rec.from_whse_code
1125                                                  );
1126   END IF;
1127   IF (l_return_val <> 0)
1128   THEN
1129     FND_MESSAGE.SET_NAME('GMI','IC_API_CANNOT_POST_CLOSED');
1130     FND_MESSAGE.SET_TOKEN('ITEM_NO' , l_trans_rec.item_no);
1131     FND_MESSAGE.SET_TOKEN('TRANS_DATE', l_trans_rec.trans_date);
1132     FND_MSG_PUB.Add;
1133     RAISE FND_API.G_EXC_ERROR;
1134   ELSIF TRUNC(l_trans_rec.trans_date, 'DD') >
1135 	TRUNC(SYSDATE, 'DD')
1136   THEN
1137     FND_MESSAGE.SET_NAME('GMI','IC_API_CANNOT_POST_FUTURE');
1138     FND_MESSAGE.SET_TOKEN('ITEM_NO' , l_trans_rec.item_no);
1139     FND_MESSAGE.SET_TOKEN('TRANS_DATE', l_trans_rec.trans_date);
1140     FND_MSG_PUB.Add;
1141     RAISE FND_API.G_EXC_ERROR;
1142   END IF;
1143 
1144   -- If no errors then move local trans_rec to output parameter
1145   x_trans_rec    :=l_trans_rec;
1146 
1147 
1148   EXCEPTION
1149     WHEN FND_API.G_EXC_ERROR THEN
1150       x_return_status := FND_API.G_RET_STS_ERROR;
1151       FND_MSG_PUB.Count_AND_GET (  p_count =>  x_msg_count
1152                                  , p_data  =>  x_msg_data
1153                                 );
1154 
1155     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1156       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1157       FND_MSG_PUB.Count_AND_GET (  p_count =>  x_msg_count
1158                                  , p_data  =>  x_msg_data
1159                                 );
1160     WHEN OTHERS THEN
1161       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1162 --          IF   FND_MSG_PUB.check_msg_level
1163 --               (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
1164 --          THEN
1165 
1166       FND_MSG_PUB.Add_Exc_Msg (  G_PKG_NAME
1167                                , 'Validate_Inventory_posting'
1168                               );
1169 --         END IF;
1170       FND_MSG_PUB.Count_AND_GET (  p_count =>  x_msg_count
1171                                  , p_data  =>  x_msg_data
1172                                 );
1173 
1174 END Validate_Inventory_Posting;
1175 
1176 --+=========================================================================+
1177 --| FUNCTION NAME                                                           |
1178 --|    Insert_Ic_Jrnl_Mst                                                   |
1179 --|                                                                         |
1180 --| TYPE                                                                    |
1181 --|    PRIVATE                                                              |
1182 --|                                                                         |
1183 --| USAGE                                                                   |
1184 --|    Used to insert inventory journal header                              |
1185 --|                                                                         |
1186 --| DESCRIPTION                                                             |
1187 --|    This procedure is used to insert a row into IC_JRNL_MST              |
1188 --|                                                                         |
1189 --| PARAMETERS                                                              |
1190 --|    p_ic_jrnl_mst_rec   Record datatype containing row to be inserted    |
1191 --|                                                                         |
1192 --| RETURNS                                                                 |
1193 --|    Boolean                                                              |
1194 --|                                                                         |
1195 --| HISTORY                                                                 |
1196 --|    01-OCT-1998      M.Godfrey     Created                               |
1197 --+=========================================================================+
1198 FUNCTION Insert_Ic_Jrnl_Mst
1199 ( p_ic_jrnl_mst_rec  IN ic_jrnl_mst%ROWTYPE)
1200 RETURN BOOLEAN
1201 IS
1202 BEGIN
1203 
1204   INSERT INTO ic_jrnl_mst
1205   ( journal_id
1206   , journal_no
1207   , journal_comment
1208   , posting_id
1209   , print_cnt
1210   , posted_ind
1211   , orgn_code
1212   , creation_date
1213   , last_update_date
1214   , created_by
1215   , last_updated_by
1216   , delete_mark
1217   , text_code
1218   , in_use
1219   )
1220   VALUES
1221   ( p_ic_jrnl_mst_rec.journal_id
1222   , p_ic_jrnl_mst_rec.journal_no
1223   , p_ic_jrnl_mst_rec.journal_comment
1224   , p_ic_jrnl_mst_rec.posting_id
1225   , p_ic_jrnl_mst_rec.print_cnt
1226   , p_ic_jrnl_mst_rec.posted_ind
1227   , p_ic_jrnl_mst_rec.orgn_code
1228   , p_ic_jrnl_mst_rec.creation_date
1229   , p_ic_jrnl_mst_rec.last_update_date
1230   , p_ic_jrnl_mst_rec.created_by
1231   , p_ic_jrnl_mst_rec.last_updated_by
1232   , p_ic_jrnl_mst_rec.delete_mark
1233   , p_ic_jrnl_mst_rec.text_code
1234   , p_ic_jrnl_mst_rec.in_use
1235   );
1236 
1237   RETURN TRUE;
1238 
1239   EXCEPTION
1240     WHEN OTHERS THEN
1241 --       IF  FND_MSG_PUB.check_msg_level
1242 --           (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
1243 --       THEN
1244 
1245     FND_MSG_PUB.Add_Exc_Msg (  G_PKG_NAME
1246                              , 'Insert_IC_JRNL_MST'
1247                             );
1248 --       END IF;
1249     RETURN FALSE;
1250 
1251 END Insert_Ic_Jrnl_Mst;
1252 
1253 --+=========================================================================+
1254 --| FUNCTION NAME                                                           |
1255 --|    Insert_Ic_Adjs_Jnl                                                   |
1256 --|                                                                         |
1257 --| TYPE                                                                    |
1258 --|    PRIVATE                                                              |
1259 --|                                                                         |
1260 --| USAGE                                                                   |
1261 --|    Used to insert inventory journal detail                              |
1262 --|                                                                         |
1263 --| DESCRIPTION                                                             |
1264 --|    This procedure is used to insert a row into IC_ADJS_JNL              |
1265 --|                                                                         |
1266 --| PARAMETERS                                                              |
1267 --|    p_ic_adjs_jnl_rec   Record datatype containing row to be inserted    |
1268 --|                                                                         |
1269 --| RETURNS                                                                 |
1270 --|    Boolean                                                              |
1271 --|                                                                         |
1272 --| HISTORY                                                                 |
1273 --|    01-OCT-1998      M.Godfrey     Created                               |
1274 --+=========================================================================+
1275 FUNCTION Insert_Ic_Adjs_Jnl
1276 (  p_ic_adjs_jnl_rec  IN ic_adjs_jnl%ROWTYPE)
1277 RETURN BOOLEAN
1278 IS
1279 BEGIN
1280 
1281   INSERT INTO ic_adjs_jnl
1282   ( trans_type
1283   , trans_flag
1284   , doc_id
1285   , doc_line
1286   , journal_id
1287   , completed_ind
1288   , whse_code
1289   , reason_code
1290   , doc_date
1291   , item_id
1292   , item_um
1293   , item_um2
1294   , lot_id
1295   , location
1296   , qty
1297   , qty2
1298   , qc_grade
1299   , lot_status
1300   , line_type
1301   , line_id
1302   , co_code
1303   , orgn_code
1304   , no_inv
1305   , no_trans
1306   , creation_date
1307   , created_by
1308   , last_update_date
1309   , trans_cnt
1310   , last_updated_by
1311   )
1312   VALUES
1313   ( p_ic_adjs_jnl_rec.trans_type
1314   , p_ic_adjs_jnl_rec.trans_flag
1315   , p_ic_adjs_jnl_rec.doc_id
1316   , p_ic_adjs_jnl_rec.doc_line
1317   , p_ic_adjs_jnl_rec.journal_id
1318   , p_ic_adjs_jnl_rec.completed_ind
1319   , p_ic_adjs_jnl_rec.whse_code
1320   , p_ic_adjs_jnl_rec.reason_code
1321   , p_ic_adjs_jnl_rec.doc_date
1322   , p_ic_adjs_jnl_rec.item_id
1323   , p_ic_adjs_jnl_rec.item_um
1324   , p_ic_adjs_jnl_rec.item_um2
1325   , p_ic_adjs_jnl_rec.lot_id
1326   , p_ic_adjs_jnl_rec.location
1327   , p_ic_adjs_jnl_rec.qty
1328   , p_ic_adjs_jnl_rec.qty2
1329   , p_ic_adjs_jnl_rec.qc_grade
1330   , p_ic_adjs_jnl_rec.lot_status
1331   , p_ic_adjs_jnl_rec.line_type
1332   , p_ic_adjs_jnl_rec.line_id
1333   , p_ic_adjs_jnl_rec.co_code
1334   , p_ic_adjs_jnl_rec.orgn_code
1335   , p_ic_adjs_jnl_rec.no_inv
1336   , p_ic_adjs_jnl_rec.no_trans
1337   , p_ic_adjs_jnl_rec.creation_date
1338   , p_ic_adjs_jnl_rec.created_by
1339   , p_ic_adjs_jnl_rec.last_update_date
1340   , p_ic_adjs_jnl_rec.trans_cnt
1341   , p_ic_adjs_jnl_rec.last_updated_by
1342   );
1343 
1344   RETURN TRUE;
1345 
1346   EXCEPTION
1347     WHEN OTHERS THEN
1348 --       IF  FND_MSG_PUB.check_msg_level
1349 --           (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
1350 --       THEN
1351 
1352     FND_MSG_PUB.Add_Exc_Msg (  G_PKG_NAME
1353                              , 'Insert_IC_ADJS_JNL'
1354                             );
1355 --       END IF;
1356     RETURN FALSE;
1357 
1358 END Insert_Ic_Adjs_Jnl;
1359 
1360 --+=========================================================================+
1361 --| FUNCTION NAME                                                           |
1362 --|    Check_unposted_jnl_lot_status                                        |
1363 --|                                                                         |
1364 --| TYPE                                                                    |
1365 --|    PRIVATE                                                              |
1366 --|                                                                         |
1367 --| USAGE                                                                   |
1368 --|    Used to ascertain if any unposted journals exist for item / lot /    |
1369 --|    sublot / whse_code / location with a different lot status            |
1370 --|                                                                         |
1371 --| DESCRIPTION                                                             |
1372 --|    This procedure checks for unposted journals for item / lot / sublot  |
1373 --|    / whse_code / location with differnet lot status                     |
1374 --|                                                                         |
1375 --| PARAMETERS                                                              |
1376 --|    p_item_id           Surrogate key of item                            |
1377 --|    p_lot_id            Surrogate key of lot                             |
1378 --|    p_whse_code         Warehouse code                                   |
1379 --|    p_location          Location                                         |
1380 --|    p_lot_status        Lot status to be checked for                     |
1381 --|                                                                         |
1382 --| RETURNS                                                                 |
1383 --|    BOOLEAN                                                              |
1384 --|                                                                         |
1385 --| HISTORY                                                                 |
1386 --|    01-OCT-1998      M.Godfrey     Created                               |
1387 --+=========================================================================+
1388 FUNCTION Check_unposted_jnl_lot_status
1389 ( p_item_id      IN ic_item_mst.item_id%TYPE
1390 , p_lot_id       IN ic_lots_mst.lot_id%TYPE
1391 , p_whse_code    IN ic_whse_mst.whse_code%TYPE
1392 , p_location     IN ic_loct_mst.location%TYPE
1393 , p_lot_status   IN ic_lots_sts.lot_status%TYPE
1394 )
1395 RETURN BOOLEAN
1396 IS
1397 
1398 CURSOR ic_journal IS
1399 SELECT
1400   count(*)
1401 FROM
1402   ic_adjs_jnl a, ic_jrnl_mst j
1403 WHERE
1404   a.item_id    = p_item_id AND
1405   a.lot_id     = p_lot_id AND
1406   a.whse_code  = p_whse_code AND
1407   a.location   = p_location AND
1408   a.journal_id = j.journal_id AND
1409   j.posted_ind = 0 AND
1410   j.delete_mark = 0 AND
1411   p_lot_status <> a.lot_status;
1412 
1413 l_rows_found    NUMBER;
1414 
1415 BEGIN
1416 
1417   OPEN ic_journal;
1418 
1419   FETCH ic_journal INTO l_rows_found;
1420 
1421   IF (ic_journal%NOTFOUND)
1422   THEN
1423     l_rows_found  :=0;
1424   END IF;
1425 
1426   CLOSE ic_journal;
1427 
1428   IF l_rows_found > 0
1429   THEN
1430     RETURN TRUE;
1431   ELSE
1432     RETURN FALSE;
1433   END IF;
1434 
1435   EXCEPTION
1436     WHEN OTHERS THEN
1437       RAISE;
1438 
1439 END Check_unposted_jnl_lot_status;
1440 
1441 --+=========================================================================+
1442 --| FUNCTION NAME                                                           |
1443 --|    Check_unposted_jnl_qc_grade                                          |
1444 --|                                                                         |
1445 --| TYPE                                                                    |
1446 --|    PRIVATE                                                              |
1447 --|                                                                         |
1448 --| USAGE                                                                   |
1449 --|    Used to ascertain if any unposted journals exist for item / lot /    |
1450 --|    sublot / whse_code / location with a different QC grade              |
1451 --|                                                                         |
1452 --| DESCRIPTION                                                             |
1453 --|    This procedure checks for unposted journals for item / lot / sublot  |
1454 --|    / whse_code / location with differnet QC grade                       |
1455 --|                                                                         |
1456 --| PARAMETERS                                                              |
1457 --|    p_item_id           Surrogate key of item                            |
1458 --|    p_lot_id            Surrogate key of lot                             |
1459 --|    p_qc_grade          QC grade to be checked for                       |
1460 --|                                                                         |
1461 --| RETURNS                                                                 |
1462 --|    BOOLEAN                                                              |
1463 --|                                                                         |
1464 --| HISTORY                                                                 |
1465 --|    01-OCT-1998      M.Godfrey     Created                               |
1466 --+=========================================================================+
1467 FUNCTION Check_unposted_jnl_qc_grade
1468 ( p_item_id      IN ic_item_mst.item_id%TYPE
1469 , p_lot_id       IN ic_lots_mst.lot_id%TYPE
1470 , p_qc_grade     IN qc_grad_mst.qc_grade%TYPE
1471 )
1472 RETURN BOOLEAN
1473 IS
1474 
1475 CURSOR ic_journal IS
1476 SELECT
1477   count(*)
1478 FROM
1479   ic_adjs_jnl a, ic_jrnl_mst j
1480 WHERE
1481   a.item_id    = p_item_id AND
1482   a.lot_id     = p_lot_id AND
1483   a.journal_id = j.journal_id AND
1484   j.posted_ind = 0 AND
1485   j.delete_mark = 0 AND
1486   p_qc_grade   <> a.qc_grade;
1487 
1488 l_rows_found    NUMBER;
1489 
1490 BEGIN
1491 
1492   OPEN ic_journal;
1493 
1494   FETCH ic_journal INTO l_rows_found;
1495 
1496   IF (ic_journal%NOTFOUND)
1497   THEN
1498     l_rows_found  :=0;
1499   END IF;
1500 
1501   CLOSE ic_journal;
1502 
1503   IF l_rows_found > 0
1504   THEN
1505     RETURN TRUE;
1506   ELSE
1507     RETURN FALSE;
1508   END IF;
1509 
1510   EXCEPTION
1511     WHEN OTHERS THEN
1512       RAISE;
1513 
1514 END Check_unposted_jnl_qc_grade;
1515 
1516 END GMI_QUANTITY_PVT;